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-10-02 19:39:28 +0300
committerAli Labbene <ali.labbene@st.com>2020-10-02 19:42:14 +0300
commite3d0473c1588f1379ff0e4d7d1c78d081c352518 (patch)
tree5e7b1c9a08ca637ad7f62f0600bfd0a943034d5b
parent24ba9f167a82143a0a4fa8772cd4466070bcdb82 (diff)
Release v1.9.0v1.9.0
-rw-r--r--Middlewares/ST/STM32_WPAN/Release_Notes.html84
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/auto/ble_events.c2
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/auto/ble_events.h86
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gap_aci.c2
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gap_aci.h43
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gatt_aci.c2
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/auto/ble_gatt_aci.h62
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hal_aci.c2
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hal_aci.h2
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hci_le.c29
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hci_le.h72
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/auto/ble_l2cap_aci.c2
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/auto/ble_l2cap_aci.h6
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/auto/ble_types.h20
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/ble_bufsize.h40
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/ble_core.h10
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/ble_defs.h2
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/ble_legacy.h22
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/ble_std.h2
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/doc/STM32WB_BLE_Wireless_Interface.html275
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/template/ble_const.h9
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/template/compiler.h4
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/template/osal.c4
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/core/template/osal.h4
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CBC/aes_cbc.h84
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CCM/aes_ccm.h124
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CFB/aes_cfb.h80
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CMAC/aes_cmac.h86
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CTR/aes_ctr.h79
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/Common/aes_common.h119
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/Common/aes_low_level.h151
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/ECB/aes_ecb.h84
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/GCM/aes_gcm.h129
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/KEYWRAP/aes_keywrap.h84
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/OFB/aes_ofb.h82
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/XTS/aes_xts.h91
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/aes.h66
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ARC4/arc4.h89
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/C25519/c25519.h57
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/CHACHA/chacha.h89
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/CHACHA20-POLY1305/chacha20-poly1305.h92
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/err_codes.h252
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/macros.h295
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/sk.h106
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/types.h93
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_chacha20_poly1305/chacha20_core.h59
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_chacha20_poly1305/poly1305_core.h62
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/arith.h92
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/bn.h110
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/conv.h68
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/modular.h84
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/monty.h99
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/rng_bn.h66
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/math.h41
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ed25519_c25519/internals/fe25519.h91
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/CBC/des_cbc.h83
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/Common/des_common.h60
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/ECB/des_ecb.h84
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/des.h36
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ECC/LowLevel/elliptic.h100
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ECC/ecc.h260
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ED25519/ed25519.h52
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ED25519/internals/ge25519.h70
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ED25519/internals/sc25519.h71
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/Common/hash_common.h138
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/Common/sha256_sha224_transform.h41
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/Common/sha512_sha384_transform.h39
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/MD5/hmac_md5.h66
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/MD5/md5.h69
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/MD5/md5_low_level.h50
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA1/hmac_sha1.h68
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA1/sha1.h64
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA1/sha1_low_level.h48
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA224/hmac_sha224.h68
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA224/sha224.h61
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA224/sha224_low_level.h44
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA256/hmac_sha256.h67
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA256/sha256.h62
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA256/sha256_low_level.h44
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA384/hmac_sha384.h64
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA384/sha384.h103
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA384/sha384_low_level.h42
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA512/hkdf512.h68
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA512/hmac_sha512.h116
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA512/sha512.h102
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA512/sha512_low_level.h43
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/hash.h83
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/POLY1305/poly1305.h94
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RNG/DRBG_AES128/drbg.h93
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RNG/rng.h137
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RSA/LowLevel/rsa_low_level.h53
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RSA/PKCS#1v15/rsa_pkcs1v15.h94
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RSA/rsa.h31
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/CBC/tdes_cbc.h81
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/Common/tdes_common.h62
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/ECB/tdes_ecb.h81
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/tdes.h31
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/config.h408
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/crypto.h196
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_GCC.abin134442 -> 0 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_GCC_fpu.abin134462 -> 0 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_GCC_ot.abin192110 -> 0 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_GCC_ot_fpu.abin192154 -> 0 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_IARv8.abin359254 -> 0 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_IARv8_fpu.abin359242 -> 0 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_IARv8_otnsc.abin239764 -> 0 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_IARv8_otnsc_fpu.abin239752 -> 0 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_1elfspf.libbin209100 -> 0 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_1elfspf_fpu.libbin225024 -> 0 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_ot1elfspf.libbin222564 -> 0 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_ot1elfspf_fpu.libbin238236 -> 0 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Inc/appli_test.h36
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Inc/ble_mesh.h229
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Inc/mesh_cfg.h532
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Inc/pal_if.h34
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Inc/pal_nvm.h34
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Inc/serial_ctrl.h34
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Inc/serial_if.h34
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Inc/serial_prvn.h36
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Inc/serial_ut.h34
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Inc/types.h34
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_GCC.abin362110 -> 375372 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_GCC_DEBUG.abin3733564 -> 3820708 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_IAR.abin503998 -> 522942 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_IAR_DEBUG.abin2739334 -> 2857988 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_Keil.libbin529768 -> 552268 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_Keil_DEBUG.libbin3637472 -> 3724258 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/common.h592
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/config_client.h42
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/generic.h170
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/generic_client.h70
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/light.h377
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/light_client.h256
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/light_lc.h403
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/sensors.h403
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/sensors_client.h113
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/time_scene.h2
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/vendor.h23
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/common.c1462
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/config_client.c337
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic.c1514
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic_client.c768
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light.c2957
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_client.c2485
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_lc.c5019
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors.c4830
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors_client.c680
-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.c247
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Src/appli_test.c2
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Src/mesh_cfg.c969
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_ctrl.c102
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_if.c43
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_prvn.c22
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_ut.c85
-rw-r--r--Middlewares/ST/STM32_WPAN/ble/svc/Src/mesh.c313
-rw-r--r--Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.c138
-rw-r--r--Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci/shci.h76
-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.h23
-rw-r--r--Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/shci_tl.c95
-rw-r--r--Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_dbg_conf.h126
-rw-r--r--Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_mbox.c265
-rw-r--r--Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/jam_detection.c4
-rw-r--r--Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/openthread_api_wb.c28
-rw-r--r--Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/stm32wbxx_core_interface_def.h22
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/core/src/zigbee_core_wb.c4
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/lib/stm32wb_zigbee_wb_lib.abin4228136 -> 4248716 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/lib/stm32wb_zigbee_wb_lib_keil.libbin14217870 -> 14223266 bytes
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.alarm.h10
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.ballast.config.h9
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.basic.h4
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.commission.h222
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.device.temp.h6
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.diagnostics.h4
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.doorlock.h801
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.elec.meas.h37
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.fan.h50
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.groups.h8
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.meter.id.h9
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.occupancy.h4
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.ota.h8
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.power.config.h44
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.power.profile.h44
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.press.meas.h4
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.rssi.loc.h2
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.scenes.h44
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.temp.meas.h3
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.therm.h180
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.touchlink.h18
-rw-r--r--Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.h8
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Inc/app_conf.h27
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Inc/hw_conf.h84
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Inc/main.h1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Src/app_entry.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Src/main.c8
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/STM32_WPAN/App/app_ble.c42
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/STM32_WPAN/Target/hw_ipcc.c188
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Inc/app_conf.h29
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Inc/hw_conf.h88
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Inc/main.h1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Src/app_entry.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Src/main.c16
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Src/stm32wbxx_hal_msp.c20
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Src/stm32wbxx_it.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/STM32_WPAN/App/app_ble.c51
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/STM32_WPAN/Target/hw_ipcc.c188
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS/readme.txt2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/app_conf.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/hw_conf.h69
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Inc/stm32wbxx_it.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/app_debug.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/app_entry.c3
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/app_freertos.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/freertos_port.c92
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/main.c20
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/stm32wbxx_hal_msp.c20
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/stm32wbxx_hal_timebase_tim.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/stm32wbxx_it.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/app_ble.c6
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/dis_app.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/hrs_app.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/Target/hw_ipcc.c222
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/readme.txt16
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/app_conf.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/hw_conf.h69
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Inc/stm32wbxx_it.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/app_debug.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/app_entry.c3
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/main.c16
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/stm32wbxx_hal_msp.c20
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/Core/Src/stm32wbxx_it.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/app_ble.c6
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/dis_app.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/App/hrs_app.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/STM32_WPAN/Target/hw_ipcc.c222
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ANCS/readme.txt16
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/app_conf.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/hw_conf.h69
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/stm32wbxx_it.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/app_debug.c1
-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.c16
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/stm32wbxx_hal_msp.c20
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/stm32wbxx_it.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/STM32_WPAN/App/app_ble.c24
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/STM32_WPAN/App/dis_app.c1
-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.c186
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/readme.txt2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Inc/app_conf.h26
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Inc/hw_conf.h84
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Inc/main.h1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Src/app_entry.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Src/main.c14
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/MDK-ARM/BLE_Hid.uvoptx102
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/MDK-ARM/BLE_Hid.uvprojx3
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/STM32_WPAN/App/app_ble.c40
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/STM32_WPAN/Target/hw_ipcc.c190
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_conf.h33
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/hw_conf.h88
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/main.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/app_entry.c30
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/main.c9
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/EWARM/BLE_MeshLightingLPN.ewp7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/BLE_MeshLightingDemoLPN.uvoptx150
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/BLE_MeshLightingDemoLPN.uvprojx20
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32CubeIDE/.cproject18
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32CubeIDE/.project10
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/app_ble.c25
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_config_client.c150
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_config_client.h10
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic.c349
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic.h75
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic_client.c192
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic_client.h8
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light.c1189
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light.h247
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_client.c402
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_client.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_lc.c453
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_lc.h76
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_mesh.c300
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_mesh.h10
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_nvm.c179
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_nvm.h13
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensor.c1495
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensor.h224
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensors_client.c153
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensors_client.h42
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_vendor.c271
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_vendor.h8
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/hal_common.h6
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/mesh_cfg.h273
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/mesh_cfg_usr.h250
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/models_if.c737
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/models_if.h11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/pal_nvm.c20
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/sensor_cfg_usr.h685
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/tl_dbg_conf.h126
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/target/hw_ipcc.c186
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_conf.h29
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_conf.h88
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/main.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/app_entry.c34
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/main.c9
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/BLE_MeshLightingPRFNode.ewp7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/BLE_MeshLightingDemoPRFNode.uvoptx150
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/BLE_MeshLightingDemoPRFNode.uvprojx20
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32CubeIDE/.cproject10
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32CubeIDE/.project10
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/app_ble.c25
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_config_client.c150
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_config_client.h10
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic.c349
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic.h75
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic_client.c192
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic_client.h8
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light.c1189
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light.h247
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_client.c402
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_client.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_lc.c453
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_lc.h76
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_mesh.c298
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_mesh.h10
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_nvm.c179
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_nvm.h13
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensor.c1495
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensor.h224
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensors_client.c153
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensors_client.h42
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_vendor.c271
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_vendor.h8
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/hal_common.h6
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/mesh_cfg.h273
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/mesh_cfg_usr.h304
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/models_if.c737
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/models_if.h11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/pal_nvm.c18
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/sensor_cfg_usr.h685
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/tl_dbg_conf.h126
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/target/hw_ipcc.c186
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/app_conf.h29
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/hw_conf.h88
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/main.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/app_entry.c39
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Src/main.c9
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/EWARM/BLE_MeshLightingProvisioner.ewp8
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/MDK-ARM/BLE_MeshLightingDemoProvisioner.uvoptx156
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/MDK-ARM/BLE_MeshLightingDemoProvisioner.uvprojx20
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32CubeIDE/.cproject10
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32CubeIDE/.project10
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/app_ble.c25
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_config_client.c309
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_config_client.h10
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_generic.c349
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_generic.h75
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_generic_client.c192
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_generic_client.h8
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light.c1189
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light.h247
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light_client.c402
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light_client.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light_lc.c453
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_light_lc.h76
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_mesh.c299
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_mesh.h9
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_nvm.c157
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_nvm.h13
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_sensor.c1495
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_sensor.h224
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_sensors_client.c153
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_sensors_client.h42
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_vendor.c271
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_vendor.h8
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/hal_common.h6
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/mesh_cfg.h277
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/mesh_cfg_usr.h305
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/models_if.c739
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/models_if.h11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/pal_nvm.c4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/sensor_cfg_usr.h685
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/tl_dbg_conf.h126
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/target/hw_ipcc.c186
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Inc/app_conf.h29
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Inc/hw_conf.h36
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Inc/stm32wbxx_it.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Src/app_entry.c24
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Src/main.c16
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Src/stm32wbxx_hal_msp.c20
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Src/stm32wbxx_it.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/app_ble_cl.c35
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/app_ble_common.c20
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/app_ble_hr.c37
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/app_ble_sv.c37
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/dis_app.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/hrs_app.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/p2p_client_app.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/p2p_server_app.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/uart_app.c45
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/Target/hw_ipcc.c190
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/Core/Inc/app_conf.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/Core/Inc/hw_conf.h87
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/Core/Inc/main.h3
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/Core/Src/app_entry.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/Core/Src/main.c32
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/STM32_WPAN/App/app_ble.c6
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/STM32_WPAN/Target/hw_ipcc.c190
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/readme.txt5
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Inc/app_conf.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Inc/hw_conf.h75
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Inc/stm32wbxx_it.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Src/hw_ipcc.c416
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Src/main.c14
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Src/stm32wbxx_it.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Inc/app_conf.h25
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Inc/hw_conf.h84
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Inc/main.h1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Src/app_entry.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Src/main.c10
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/STM32_WPAN/App/app_ble.c40
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/STM32_WPAN/Target/hw_ipcc.c186
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/app_conf.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/hw_conf.h22
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/stm32wbxx_it.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/app_debug.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/app_entry.c31
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/main.c16
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/stm32wbxx_hal_msp.c20
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Src/stm32wbxx_it.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/App/app_ble.c6
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/App/p2p_server_app.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/STM32_WPAN/Target/hw_ipcc.c186
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/readme.txt2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pClient/readme.txt3
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer/readme.txt2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/app_conf.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/hw_conf.h22
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/stm32wbxx_it.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/app_debug.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/app_entry.c3
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/main.c16
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/stm32wbxx_hal_msp.c20
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/stm32wbxx_it.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/App/app_ble.c24
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/App/p2p_server_app.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/Target/hw_ipcc.c186
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/readme.txt2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/app_common.h124
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/app_conf.h625
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/app_entry.h53
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/hw_conf.h249
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/hw_if.h250
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/main.h38
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/stm32_lpm_if.h81
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/stm32wbxx_hal_conf.h349
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/stm32wbxx_it.h62
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/stm_logging.h67
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/utilities_conf.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Src/app_entry.c516
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Src/hw_timerserver.c893
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Src/hw_uart.c465
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Src/main.c320
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Src/stm32_lpm_if.c295
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Src/stm32wbxx_it.c188
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Src/stm_logging.c213
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Src/system_stm32wbxx.c343
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/EWARM/ble_thread_dyn.ewd1419
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/EWARM/ble_thread_dyn.ewp1389
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/EWARM/ble_thread_dyn.eww7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/EWARM/startup_stm32wb55xx_cm4.s528
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/EWARM/stm32wb55xx_flash_cm4.icf40
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/app_ble.c1148
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/app_ble.h92
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/app_thread.c1004
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/app_thread.h108
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/ble_conf.h70
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/ble_dbg_conf.h199
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/p2p_server_app.c398
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/p2p_server_app.h81
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/Target/hw_ipcc.c675
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/readme.txt188
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/app_common.h124
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/app_conf.h625
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/app_entry.h53
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/hw_conf.h249
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/hw_if.h250
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/main.h38
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/stm32_lpm_if.h81
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/stm32wbxx_hal_conf.h349
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/stm32wbxx_it.h62
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/stm_logging.h67
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/utilities_conf.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/app_entry.c516
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/hw_timerserver.c893
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/hw_uart.c465
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/main.c320
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/stm32_lpm_if.c295
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/stm32wbxx_it.c188
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/stm_logging.c213
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/system_stm32wbxx.c343
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/EWARM/ble_thread_Dyn_SED.ewd1419
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/EWARM/ble_thread_Dyn_SED.ewp1389
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/EWARM/ble_thread_Dyn_SED.eww7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/EWARM/startup_stm32wb55xx_cm4.s528
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/EWARM/stm32wb55xx_flash_cm4.icf40
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/app_ble.c1148
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/app_ble.h92
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/app_thread.c1029
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/app_thread.h108
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/ble_conf.h70
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/ble_dbg_conf.h199
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/p2p_server_app.c398
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/p2p_server_app.h81
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/Target/hw_ipcc.c675
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/readme.txt164
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/Core/Src/app_entry.c3
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/STM32_WPAN/App/app_ble.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/STM32_WPAN/App/app_thread.c36
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/STM32_WPAN/App/p2p_server_app.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/STM32_WPAN/Target/hw_ipcc.c186
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/app_common.h124
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/app_conf.h640
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/app_entry.h53
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/hw_conf.h221
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/hw_if.h250
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/main.h38
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/stm32_lpm_if.h81
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/stm32wbxx_hal_conf.h349
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/stm32wbxx_it.h62
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/stm_logging.h66
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/utilities_conf.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Src/app_entry.c504
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Src/hw_timerserver.c893
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Src/hw_uart.c465
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Src/main.c321
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Src/stm32_lpm_if.c295
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Src/stm32wbxx_it.c185
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Src/stm_logging.c213
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Src/system_stm32wbxx.c343
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/EWARM/BLE_Zigbee_Dyn.ewd1419
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/EWARM/BLE_Zigbee_Dyn.ewp1313
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/EWARM/BLE_Zigbee_Dyn.eww7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/EWARM/startup_stm32wb55xx_cm4.s528
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/EWARM/stm32wb55xx_flash_cm4.icf41
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/App/app_ble.c1266
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/App/app_ble.h90
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/App/app_zigbee.c1170
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/App/app_zigbee.h66
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/App/ble_conf.h70
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/App/ble_dbg_conf.h199
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/App/p2p_server_app.c397
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/App/p2p_server_app.h81
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/Target/hw_ipcc.c675
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/readme.txt149
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/app_common.h120
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/app_conf.h642
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/app_entry.h53
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/ee.h213
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/ee_cfg.h29
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/flash_driver.h198
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/hw_conf.h241
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/hw_if.h250
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/main.h38
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/stm32_lpm_if.h81
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/stm32wbxx_hal_conf.h349
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/stm32wbxx_it.h62
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/stm_logging.h63
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/utilities_conf.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/app_entry.c494
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/ee.c700
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/flash_driver.c384
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/hw_flash.c121
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/hw_timerserver.c893
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/hw_uart.c465
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/main.c320
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/stm32_lpm_if.c275
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/stm32wbxx_it.c188
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/stm_logging.c213
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/system_stm32wbxx.c343
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/EWARM/BLE_Zigbee_Dyn_NVM.ewd1419
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/EWARM/BLE_Zigbee_Dyn_NVM.ewp1331
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/EWARM/BLE_Zigbee_Dyn_NVM.eww7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/EWARM/startup_stm32wb55xx_cm4.s528
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/EWARM/stm32wb55xx_flash_cm4.icf41
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/App/app_ble.c1236
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/App/app_ble.h92
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/App/app_zigbee.c1192
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/App/app_zigbee.h69
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/App/ble_conf.h70
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/App/ble_dbg_conf.h199
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/App/p2p_server_app.c397
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/App/p2p_server_app.h81
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/Target/hw_ipcc.c675
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/readme.txt161
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/app_common.h124
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/app_conf.h640
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/app_entry.h53
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/hw_conf.h221
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/hw_if.h250
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/main.h38
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/stm32_lpm_if.h81
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/stm32wbxx_hal_conf.h349
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/stm32wbxx_it.h62
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/stm_logging.h66
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/utilities_conf.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/app_entry.c504
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/hw_timerserver.c893
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/hw_uart.c465
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/main.c321
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/stm32_lpm_if.c295
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/stm32wbxx_it.c185
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/stm_logging.c213
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/system_stm32wbxx.c343
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/EWARM/ble_zigbee_SED_Dyn.ewd1419
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/EWARM/ble_zigbee_SED_Dyn.ewp1313
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/EWARM/ble_zigbee_SED_Dyn.eww7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/EWARM/startup_stm32wb55xx_cm4.s528
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/EWARM/stm32wb55xx_flash_cm4.icf41
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/app_ble.c1266
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/app_ble.h90
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/app_zigbee.c986
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/app_zigbee.h66
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/ble_conf.h70
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/ble_dbg_conf.h199
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/p2p_server_app.c397
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/p2p_server_app.h81
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/tl_dbg_conf.h84
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/Target/hw_ipcc.c523
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/readme.txt149
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/Core/Src/app_entry.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/STM32_WPAN/App/app_ble.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/STM32_WPAN/App/app_zigbee.c5
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/STM32_WPAN/App/app_zigbee.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/STM32_WPAN/App/p2p_server_app.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/STM32_WPAN/Target/hw_ipcc.c195
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/readme.txt2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/app_common.h124
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/app_conf.h348
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/app_entry.h69
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/gpio_lld.h91
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/hw_conf.h90
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/hw_if.h115
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/main.h107
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/stm32_lpm_if.h79
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/stm32wbxx_hal_conf.h353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/stm32wbxx_it.h88
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/stm_logging.h63
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/utilities_conf.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/app_entry.c476
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/app_lld_ble_iar_asm.s86
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/gpio_lld.c613
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/hw_uart.c484
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/main.c605
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/stm32_lpm_if.c288
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/stm32wbxx_hal_msp.c289
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/stm32wbxx_it.c377
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/stm_logging.c211
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/system_stm32wbxx.c357
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/EWARM/LLD_BLE_Chat.ewd1419
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/EWARM/LLD_BLE_Chat.ewp1214
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/EWARM/LLD_BLE_Chat.eww7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/EWARM/startup_stm32wb55xx_cm4.s517
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/EWARM/stm32wb55xx_flash_cm4.icf41
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/STM32_WPAN/App/app_lld_ble.c1757
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/STM32_WPAN/App/app_lld_ble.h89
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/STM32_WPAN/App/lld_ble.c443
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/STM32_WPAN/App/lld_ble.h229
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/STM32_WPAN/Target/hw_ipcc.c675
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/readme.txt154
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/app_common.h124
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/app_conf.h345
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/app_entry.h69
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/gpio_lld.h91
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/hw_conf.h90
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/hw_if.h115
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/main.h107
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/stm32_lpm_if.h79
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/stm32wbxx_hal_conf.h353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/stm32wbxx_it.h88
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/stm_logging.h63
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/utilities_conf.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/app_entry.c476
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/app_lld_ble_iar_asm.s86
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/gpio_lld.c613
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/hw_uart.c484
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/main.c605
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/stm32_lpm_if.c288
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/stm32wbxx_hal_msp.c289
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/stm32wbxx_it.c377
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/stm_logging.c211
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/system_stm32wbxx.c357
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/EWARM/LLD_BLE_Pressbutton.ewd1419
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/EWARM/LLD_BLE_Pressbutton.ewp1214
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/EWARM/LLD_BLE_Pressbutton.eww7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/EWARM/startup_stm32wb55xx_cm4.s517
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/EWARM/stm32wb55xx_flash_cm4.icf41
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/STM32_WPAN/App/app_lld_ble.c1835
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/STM32_WPAN/App/app_lld_ble.h89
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/STM32_WPAN/App/lld_ble.c443
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/STM32_WPAN/App/lld_ble.h229
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/STM32_WPAN/Target/hw_ipcc.c675
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/readme.txt168
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/app_common.h124
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/app_conf.h347
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/app_entry.h69
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/gpio_lld.h91
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/hw_conf.h90
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/hw_if.h115
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/main.h107
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/stm32_lpm_if.h79
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/stm32wbxx_hal_conf.h353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/stm32wbxx_it.h88
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/stm_logging.h63
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/utilities_conf.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/app_entry.c476
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/app_lld_ble_iar_asm.s86
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/gpio_lld.c613
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/hw_uart.c484
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/main.c605
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/stm32_lpm_if.c288
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/stm32wbxx_hal_msp.c289
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/stm32wbxx_it.c377
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/stm_logging.c211
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/system_stm32wbxx.c357
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/EWARM/LLD_BLE_Proximity.ewd1419
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/EWARM/LLD_BLE_Proximity.ewp1214
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/EWARM/LLD_BLE_Proximity.eww7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/EWARM/startup_stm32wb55xx_cm4.s517
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/EWARM/stm32wb55xx_flash_cm4.icf41
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/STM32_WPAN/App/app_lld_ble.c1805
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/STM32_WPAN/App/app_lld_ble.h89
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/STM32_WPAN/App/lld_ble.c443
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/STM32_WPAN/App/lld_ble.h229
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/STM32_WPAN/Target/hw_ipcc.c675
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/readme.txt155
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_FFD/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_FFD/Core/Src/app_entry.c2
-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/STM32CubeIDE/.cproject46
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_FFD/STM32CubeIDE/.project24
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_FFD/STM32_WPAN/Target/hw_ipcc.c186
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/Core/src/app_entry.c2
-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.c8
-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/target/hw_ipcc.c186
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_RFD/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_RFD/Core/Src/app_entry.c2
-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/STM32CubeIDE/.cproject45
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_RFD/STM32CubeIDE/.project24
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_RFD/STM32_WPAN/Target/hw_ipcc.c186
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/app_common.h120
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/app_conf.h358
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/app_entry.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/app_lld_tests.h98
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/gpio_lld.h114
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/hw_conf.h90
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/hw_if.h100
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/main.h99
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/stm32_lpm_if.h81
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/stm32wbxx_hal_conf.h353
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/stm32wbxx_it.h87
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/stm_logging.h63
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/utilities_conf.h68
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/app_entry.c441
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/app_lld_tests.c1060
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/app_lld_tests_iar_asm.s86
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/gpio_lld.c726
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/hw_ipcc.c675
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/hw_uart.c387
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/main.c728
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/stm32_lpm_if.c334
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/stm32wbxx_hal_msp.c255
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/stm32wbxx_it.c367
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/stm_logging.c211
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/system_stm32wbxx.c357
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/EWARM/Phy_802_15_4_Cli.ewd1419
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/EWARM/Phy_802_15_4_Cli.ewp1194
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/EWARM/Phy_802_15_4_Cli.eww7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/EWARM/startup_stm32wb55xx_cm4.s517
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/EWARM/stm32wb55xx_flash_cm4.icf40
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/readme.txt151
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Cli_Cmd/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Cli_Cmd/Core/Inc/stm32wbxx_hal_conf.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Cli_Cmd/Core/Src/app_entry.c3
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Cli_Cmd/STM32_WPAN/App/app_thread.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Cli_Cmd/STM32_WPAN/Target/hw_ipcc.c184
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/stm32wbxx_hal_conf.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/app_entry.c3
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/app_thread.c104
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/Target/hw_ipcc.c184
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic/Core/Inc/stm32wbxx_hal_conf.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic/Core/Src/app_entry.c3
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic/STM32_WPAN/App/app_thread.c93
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic/STM32_WPAN/Target/hw_ipcc.c184
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Inc/stm32wbxx_hal_conf.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Inc/stm32wbxx_it.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Src/app_entry.c3
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Src/main.c16
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Src/stm32wbxx_hal_msp.c24
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Src/stm32wbxx_it.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/STM32_WPAN/App/app_thread.c95
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/STM32_WPAN/Target/hw_ipcc.c186
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_MultiBoard/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_MultiBoard/Core/Inc/stm32wbxx_hal_conf.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_MultiBoard/Core/Src/app_entry.c3
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_MultiBoard/STM32_WPAN/App/app_thread.c73
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_MultiBoard/STM32_WPAN/Target/hw_ipcc.c184
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Commissioning/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Commissioning/Core/Inc/stm32wbxx_hal_conf.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Commissioning/Core/Src/app_entry.c3
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Commissioning/STM32_WPAN/App/app_thread.c6
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Commissioning/STM32_WPAN/Target/hw_ipcc.c184
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_FTD_Coap_Multicast/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_FTD_Coap_Multicast/Core/Inc/stm32wbxx_hal_conf.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_FTD_Coap_Multicast/Core/Src/app_entry.c3
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_FTD_Coap_Multicast/STM32_WPAN/App/app_thread.c26
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_FTD_Coap_Multicast/STM32_WPAN/Target/hw_ipcc.c184
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Inc/stm32wbxx_hal_conf.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Inc/stm32wbxx_it.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Src/app_entry.c3
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Src/main.c16
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Src/stm32wbxx_hal_msp.c24
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Src/stm32wbxx_it.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/STM32_WPAN/App/app_thread.c50
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/STM32_WPAN/Target/hw_ipcc.c186
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Inc/stm32wbxx_hal_conf.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Inc/stm32wbxx_it.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Src/app_entry.c3
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Src/main.c16
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Src/stm32wbxx_hal_msp.c24
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Src/stm32wbxx_it.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/STM32_WPAN/App/app_thread.c100
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/STM32_WPAN/Target/hw_ipcc.c186
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Inc/stm32wbxx_hal_conf.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Src/app_entry.c3
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Src/app_freertos.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Src/freertos_port.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Src/stm32wbxx_hal_timebase_tim.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/STM32_WPAN/App/app_thread.c25
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/STM32_WPAN/Target/hw_ipcc.c184
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_Multicast/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_Multicast/Core/Inc/stm32wbxx_hal_conf.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_Multicast/Core/Src/app_entry.c3
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_Multicast/STM32_WPAN/App/app_thread.c25
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_Multicast/STM32_WPAN/Target/hw_ipcc.c184
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/stm32wbxx_hal_conf.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Inc/stm32wbxx_it.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/app_entry.c3
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/main.c16
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/stm32wbxx_hal_msp.c24
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/Core/Src/stm32wbxx_it.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/STM32_WPAN/App/app_thread.c1
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Udp/STM32_WPAN/Target/hw_ipcc.c186
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/USB_Device/CDC_Standalone/Core/Src/system_stm32wbxx.c25
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/USB_Device/DFU_Standalone/Core/Src/system_stm32wbxx.c25
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/USB_Device/HID_Standalone/Core/Src/system_stm32wbxx.c25
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/USB_Device/MSC_Standalone/Core/Src/system_stm32wbxx.c25
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Coord/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Coord/Core/Src/app_entry.c11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Coord/EWARM/Zigbee_APS_Coord.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Coord/STM32_WPAN/App/app_zigbee.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Coord/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Router/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Router/Core/Src/app_entry.c11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Router/EWARM/Zigbee_APS_Router.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Router/STM32_WPAN/App/app_zigbee.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Router/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/Core/Src/app_entry.c11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/EWARM/Zigbee_Commissioning_Client_Coord.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/STM32_WPAN/App/app_zigbee.c20
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Client_Coord/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/Core/Src/app_entry.c11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/EWARM/Zigbee_Commissioning_Server_Router.ewp4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/STM32_WPAN/App/app_zigbee.c60
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Commissioning_Server_Router/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/Core/Src/app_entry.c11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/EWARM/Zigbee_DevTemp_Client_Router.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/STM32_WPAN/App/app_zigbee.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/readme.txt10
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/Core/Src/app_entry.c11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/EWARM/Zigbee_DevTemp_Server_Coord.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/STM32_WPAN/App/app_zigbee.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/readme.txt12
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/Core/Src/app_entry.c11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/EWARM/Zigbee_Diagnostic_Client_Router.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/STM32_WPAN/App/app_zigbee.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Client_Router/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/Core/Src/app_entry.c11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/EWARM/Zigbee_Diagnostic_Server_Coord.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/STM32_WPAN/App/app_zigbee.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_Diagnostic_Server_Coord/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/Core/Src/app_entry.c11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/EWARM/Zigbee_DoorLock_Client_Router.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/STM32_WPAN/App/app_zigbee.c26
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Client_Router/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/Core/Src/app_entry.c11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/EWARM/Zigbee_DoorLock_Server_Coord.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/STM32_WPAN/App/app_zigbee.c88
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DoorLock_Server_Coord/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/Core/Src/app_entry.c11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/EWARM/Zigbee_IAS_WD_Client_Router.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/STM32_WPAN/App/app_zigbee.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Client_Router/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/Core/Src/app_entry.c11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/EWARM/Zigbee_IAS_WD_Server_Coord.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/STM32_WPAN/App/app_zigbee.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_IAS_WD_Server_Coord/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Client_Router/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Client_Router/Core/Src/app_entry.c11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Client_Router/EWARM/Zigbee_MeterId_Client_Router.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Client_Router/STM32_WPAN/App/app_zigbee.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Client_Router/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Server_Coord/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Server_Coord/Core/Src/app_entry.c11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Server_Coord/EWARM/Zigbee_MeterId_Server_Coord.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Server_Coord/STM32_WPAN/App/app_zigbee.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Server_Coord/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Client_Router/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Client_Router/Core/Src/app_entry.c20
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Client_Router/EWARM/Zigbee_OTA_Client_Router.ewp4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Client_Router/STM32_WPAN/App/app_zigbee.c6
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Client_Router/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Client_Router/readme.txt2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Server_Coord/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Server_Coord/Core/Src/app_entry.c20
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Server_Coord/EWARM/Zigbee_OTA_Server_Coord.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Server_Coord/STM32_WPAN/App/app_zigbee.c4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Server_Coord/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Server_Coord/readme.txt2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Distrib/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Distrib/Core/Src/app_entry.c11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Distrib/EWARM/Zigbee_OnOff_Client_Distrib.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Distrib/STM32_WPAN/App/app_zigbee.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Distrib/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/app_common.h9
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/app_conf.h74
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/hw_conf.h6
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/stm32wbxx_hal_conf.h36
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/stm_logging.h51
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/utilities_conf.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/app_entry.c160
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/main.c245
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/stm32_lpm_if.c12
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/stm32wbxx_hal_msp.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/stm32wbxx_it.c5
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/stm_logging.c54
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/EWARM/Zigbee_OnOff_Client_Router.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/STM32_WPAN/App/app_zigbee.c227
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/STM32_WPAN/App/app_zigbee.h40
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router_Ota/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router_Ota/Core/Src/app_entry.c11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router_Ota/EWARM/Zigbee_OnOff_Client_Router_Ota.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router_Ota/STM32_WPAN/App/app_zigbee.c7
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router_Ota/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_SED/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_SED/Core/Src/app_entry.c84
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_SED/EWARM/Zigbee_OnOff_Client_SED.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_SED/STM32_WPAN/App/app_zigbee.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_SED/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Coord_NVM/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Coord_NVM/Core/Src/app_entry.c18
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Coord_NVM/EWARM/Zigbee_OnOff_Coord_NVM.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Coord_NVM/STM32_WPAN/App/app_zigbee.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Coord_NVM/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Coord_NVM/readme.txt18
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Router_NVM/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Router_NVM/Core/Src/app_entry.c20
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Router_NVM/EWARM/Zigbee_OnOff_Router_NVM.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Router_NVM/STM32_WPAN/App/app_zigbee.c6
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Router_NVM/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Router_NVM/readme.txt16
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/app_common.h9
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/app_conf.h73
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/hw_conf.h6
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/stm32wbxx_hal_conf.h36
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/stm_logging.h51
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/utilities_conf.h2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/app_entry.c160
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/main.c245
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/stm32_lpm_if.c12
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/stm32wbxx_hal_msp.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/stm32wbxx_it.c5
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/stm_logging.c54
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/EWARM/Zigbee_OnOff_Server_Coord.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/STM32_WPAN/App/app_zigbee.c301
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/STM32_WPAN/App/app_zigbee.h40
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Distrib/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Distrib/Core/Src/app_entry.c11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Distrib/EWARM/Zigbee_OnOff_Server_Distrib.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Distrib/STM32_WPAN/App/app_zigbee.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Distrib/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/Core/Src/app_entry.c11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/EWARM/Zigbee_PollControl_Client_Coord.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/STM32_WPAN/App/app_zigbee.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Client_Coord/readme.txt2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/Core/Src/app_entry.c11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/EWARM/Zigbee_PollControl_Server_SED.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/STM32_WPAN/App/app_zigbee.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PollControl_Server_SED/readme.txt2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/Core/Src/app_entry.c11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/EWARM/Zigbee_PowerProfile_Client_Coord.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/STM32_WPAN/App/app_zigbee.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/readme.txt2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/Core/Src/app_entry.c11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/EWARM/Zigbee_PowerProfile_Server_Router.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/STM32_WPAN/App/app_zigbee.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/readme.txt2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/Core/Src/app_entry.c11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/EWARM/Zigbee_PressMeas_Client_Router.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/STM32_WPAN/App/app_zigbee.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/readme.txt28
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/Core/Src/app_entry.c11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/EWARM/Zigbee_PressMeas_Server_Coord.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/STM32_WPAN/App/app_zigbee.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/readme.txt14
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/Core/Src/app_entry.c11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/EWARM/Zigbee_SE_Msg_Client_Coord.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/STM32_WPAN/App/app_zigbee.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/STM32_WPAN/Target/hw_ipcc.c322
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/readme.txt6
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/Core/Src/app_entry.c11
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/EWARM/Zigbee_SE_Msg_Server_Router.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/STM32_WPAN/App/app_zigbee.c2
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/readme.txt6
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Release_Notes.html36
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/Core/Inc/app_conf.h26
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/Core/Inc/hw_conf.h84
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/Core/Inc/main.h1
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/Core/Src/app_entry.c2
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/Core/Src/main.c9
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/STM32_WPAN/App/app_ble.c43
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/STM32_WPAN/Target/hw_ipcc.c186
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_conf.h30
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/hw_conf.h88
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/main.h2
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/app_entry.c5
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/main.c9
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/EWARM/BLE_MeshLightingLPN.ewp7
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/BLE_MeshLightingDemoLPN.uvoptx216
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/BLE_MeshLightingDemoLPN.uvprojx40
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32CubeIDE/.cproject34
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32CubeIDE/.project30
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/app_ble.c26
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_config_client.c150
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_config_client.h10
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic.c349
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic.h75
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic_client.c192
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic_client.h8
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light.c1205
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light.h247
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_client.c402
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_client.h4
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_lc.c453
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_lc.h76
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_mesh.c293
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_mesh.h10
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_nvm.c181
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_nvm.h13
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensor.c1495
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensor.h224
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensors_client.c153
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensors_client.h42
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_vendor.c271
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_vendor.h8
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/hal_common.h6
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/mesh_cfg.h273
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/mesh_cfg_usr.h260
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/models_if.c737
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/models_if.h11
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/pal_nvm.c36
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/sensor_cfg_usr.h685
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/tl_dbg_conf.h126
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/target/hw_ipcc.c186
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_conf.h24
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_conf.h88
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/main.h2
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/vcp_conf.h2
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/app_entry.c5
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/main.c9
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/EWARM/BLE_MeshLightingPRFNode.ewp8
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/BLE_MeshLightingDemoPRFNode.uvoptx216
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/BLE_MeshLightingDemoPRFNode.uvprojx40
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32CubeIDE/.cproject6
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32CubeIDE/.project30
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/app_ble.c26
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_config_client.c150
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_config_client.h10
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic.c349
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic.h75
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic_client.c192
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic_client.h8
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light.c1189
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light.h247
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_client.c402
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_client.h4
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_lc.c453
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_lc.h76
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_mesh.c293
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_mesh.h10
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_nvm.c179
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_nvm.h13
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensor.c1495
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensor.h224
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensors_client.c153
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensors_client.h42
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_vendor.c271
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_vendor.h8
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/hal_common.h6
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/mesh_cfg.h273
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/mesh_cfg_usr.h331
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/models_if.c737
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/models_if.h11
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/pal_nvm.c18
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/sensor_cfg_usr.h685
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/tl_dbg_conf.h126
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/target/hw_ipcc.c186
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_TransparentModeVCP/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_TransparentModeVCP/Core/Inc/app_conf.h2
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_TransparentModeVCP/Core/Inc/hw_conf.h84
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_TransparentModeVCP/STM32_WPAN/Target/hw_ipcc.c186
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/Core/Inc/app_conf.h27
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/Core/Inc/hw_conf.h84
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/Core/Inc/main.h1
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/Core/Src/app_entry.c2
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/Core/Src/main.c10
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/STM32_WPAN/App/app_ble.c41
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/STM32_WPAN/Target/hw_ipcc.c186
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/readme.txt2
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Inc/app_conf.h25
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Inc/hw_conf.h84
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Inc/main.h1
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Src/app_entry.c2
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Src/main.c9
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/STM32_WPAN/App/app_ble.c41
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/STM32_WPAN/Target/hw_ipcc.c186
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/Core/Inc/app_conf.h26
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/Core/Inc/hw_conf.h84
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/Core/Inc/main.h1
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/Core/Src/app_entry.c2
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/Core/Src/main.c10
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/STM32_WPAN/App/app_ble.c41
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/STM32_WPAN/Target/hw_ipcc.c186
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/readme.txt2
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Cli_Cmd/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Cli_Cmd/Core/Src/app_entry.c3
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Cli_Cmd/STM32_WPAN/Target/hw_ipcc.c186
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/Core/Src/app_entry.c2
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/App/app_thread.c115
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_DataTransfer/STM32_WPAN/Target/hw_ipcc.c186
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_Generic/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_Generic/Core/Src/app_entry.c2
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_Generic/STM32_WPAN/App/app_thread.c81
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_Generic/STM32_WPAN/Target/hw_ipcc.c186
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_FTD_Coap_Multicast/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_FTD_Coap_Multicast/Core/Src/app_entry.c2
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_FTD_Coap_Multicast/STM32_WPAN/App/app_thread.c33
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_FTD_Coap_Multicast/STM32_WPAN/Target/hw_ipcc.c186
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_SED_Coap_Multicast/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_SED_Coap_Multicast/Core/Src/app_entry.c2
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_SED_Coap_Multicast/STM32_WPAN/App/app_thread.c33
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_SED_Coap_Multicast/STM32_WPAN/Target/hw_ipcc.c186
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_MeterId_Server_Coord/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_MeterId_Server_Coord/Core/Src/app_entry.c2
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_MeterId_Server_Coord/EWARM/Zigbee_MeterId_Server_Coord.ewp8
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_MeterId_Server_Coord/STM32_WPAN/App/app_zigbee.c2
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_MeterId_Server_Coord/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/app_entry.c2
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Client_Router/EWARM/Zigbee_OnOff_Client_Router.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Client_Router/STM32_WPAN/App/app_zigbee.c2
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Client_Router/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/app_entry.c2
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Server_Coord/EWARM/Zigbee_OnOff_Server_Coord.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Server_Coord/STM32_WPAN/App/app_zigbee.c2
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Server_Coord/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/Core/Inc/app_common.h4
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/Core/Src/app_entry.c2
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/EWARM/Zigbee_PowerProfile_Server_Router.ewp2
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/STM32_WPAN/App/app_zigbee.c2
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/STM32_WPAN/Target/hw_ipcc.c318
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/readme.txt2
-rw-r--r--Projects/P-NUCLEO-WB55.USBDongle/Release_Notes.html23
-rw-r--r--Projects/STM32CubeProjectsList.html100
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/Release_Notes.html126
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_BLE_HCILayer_fw.binbin97308 -> 79112 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_BLE_HCI_AdvScan_fw.binbin0 -> 40012 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_BLE_Stack_full_fw.binbin164988 -> 166036 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_BLE_Stack_light_fw.binbin122576 -> 123156 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_Mac_802_15_4_fw.binbin67324 -> 96624 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_Thread_FTD_fw.binbin354824 -> 361536 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_Thread_MTD_fw.binbin265664 -> 271276 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/Release_Notes.html356
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_HCILayer_fw.binbin97308 -> 79112 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_HCI_AdvScan_fw.binbin0 -> 40012 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_LLD_fw.binbin0 -> 35360 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Stack_full_fw.binbin164988 -> 166036 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Stack_light_fw.binbin122576 -> 123156 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Thread_dynamic_fw.binbin0 -> 519732 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Thread_static_fw.binbin512916 -> 510576 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Zigbee_FFD_dynamic_fw.binbin0 -> 502476 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Zigbee_FFD_static_fw.binbin0 -> 495068 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Zigbee_RFD_dynamic_fw.binbin0 -> 443160 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Zigbee_RFD_static_fw.binbin0 -> 435880 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Zigbee_static_fw.binbin493676 -> 0 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Mac_802_15_4_fw.binbin67324 -> 96624 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Phy_802_15_4_fw.binbin0 -> 87552 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Thread_FTD_fw.binbin354824 -> 361536 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Thread_MTD_fw.binbin265664 -> 271276 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Zigbee_FFD_fw.binbin311476 -> 336760 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Zigbee_RFD_fw.binbin251452 -> 277592 bytes
-rw-r--r--Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_rfmonitor_phy802_15_4_fw.binbin30096 -> 0 bytes
-rw-r--r--Release_Notes.html613
-rw-r--r--package.xml2
1278 files changed, 182781 insertions, 34403 deletions
diff --git a/Middlewares/ST/STM32_WPAN/Release_Notes.html b/Middlewares/ST/STM32_WPAN/Release_Notes.html
index 4d6911c4c..1dd7b5bf2 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]-->
@@ -56,10 +56,72 @@
<div class="col-sm-12 col-lg-8">
<h1 id="update-history">Update History</h1>
<div class="collapse">
-<input type="checkbox" id="collapse-section10" checked aria-hidden="true"> <label for="collapse-section10" aria-hidden="false">V1.8.0 / 22-June-2020</label>
+<input type="checkbox" id="collapse-section11" checked aria-hidden="true"> <label for="collapse-section11" aria-hidden="false">V1.9.0 / 21-September-2020</label>
<div>
<h2 id="main-changes">Main Changes</h2>
<ul>
+<li>BLE-Mesh library version 1.13.000
+<ul>
+<li>New Development:
+<ul>
+<li>Light LC Server model</li>
+<li>New state transition functions and structures in common, new TID check &amp; update functions in common</li>
+<li>Disable No OOB authentication</li>
+<li>Multi-element support in Friendship</li>
+<li>Use of hardware cryptogrphic functions instead of ST Cryptographic Library</li>
+<li>Remove hci_reset() function calls during provisionning</li>
+</ul></li>
+<li>Improvements:
+<ul>
+<li>Logs optimization and clean up of Server models</li>
+<li>ATLLC &amp; ATSNR modified to ATUT</li>
+<li>Server model publication modifications</li>
+<li>Serial_ut moved to middleware</li>
+<li>Fixed firmware for crash issue with the publish message</li>
+<li>Model flash data saving for multi-element</li>
+<li>APIs update, naming convention updated in light.c</li>
+<li>Unused code commented in model_generic.c</li>
+<li>NULL checks added in remaining exposed functions to avoid hardfault in case sensor server is not initialized or failed to initialize</li>
+</ul></li>
+<li>Bug fix:
+<ul>
+<li>Generic OnOff bug when Generic Default Transition Time is enabled</li>
+<li>Element index update for Generic OnOff</li>
+<li>Generic OnOff Transition bug, LED not turning off</li>
+<li>Ongoing Transition should be turned off if any other on/off command received in between</li>
+<li>The Light Lightness model appears to behave in a non compliant way in the case a new Light_Lightness_Set command is received during an ongoing transition of the Light Level. This causes also the ā€˜Light Lightness Lastā€™ value to get a wrong value.</li>
+<li>API MobleConfigModel_SendAppKeyList updated in model_config.c &amp; pal_crypto.c to get the list of all appKeys bounded with a netKey if number of appKeys is&gt;1</li>
+<li>Bug related to AppKey Delete resolved</li>
+<li>Bug related to Memory Leak resolved</li>
+<li>Checkpoint has been added in API ApplicationGetVendorModelList if someone commented ENABLE_VENDOR_MODEL_SERVER in mesh_cfg_usr.h</li>
+</ul></li>
+</ul></li>
+<li>BLE WPAN updates
+<ul>
+<li><strong>ID 88523</strong> - SHCI_C2_BLE_Init() return value type wrong</li>
+<li><strong>ID 91533</strong> - Improve the SHCI_GetWirelessFwInfo() to decode the Device Information Table when FUS is running on CPU2</li>
+</ul></li>
+<li>Thread
+<ul>
+<li><strong>IDĀ 91267</strong>Ā - Fix CoAP OpenThread API exposed on application side
+<ul>
+<li>The CoAP API is now compliant with OpenThread definition and mContext parameter is then correctly returnedĀ to the application.</li>
+</ul></li>
+</ul></li>
+<li>Zigbee
+<ul>
+<li>Update on PICS for following clusters : Power Configuration, Diagnostics, Scenes</li>
+<li>APIs renaming on the Door Lock cluster</li>
+<li>Parameter range checking updates on several clusters (Power config, Door lock, Commissioning, Color)</li>
+</ul></li>
+</ul>
+</div>
+</div>
+<div class="collapse">
+<input type="checkbox" id="collapse-section10" aria-hidden="true"> <label for="collapse-section10" aria-hidden="false">V1.8.0 / 22-June-2020</label>
+<div>
+<h2 id="main-changes-1">Main Changes</h2>
+<ul>
<li>BLE-Mesh library version 1.12.008
<ul>
<li>Mesh Model Client &amp; Server Certification Passed ā€“ TCRL 2019-2</li>
@@ -94,7 +156,7 @@
<div class="collapse">
<input type="checkbox" id="collapse-section9" aria-hidden="true"> <label for="collapse-section9" aria-hidden="false">V1.7.0 / 11-May-2020</label>
<div>
-<h2 id="main-changes-1">Main Changes</h2>
+<h2 id="main-changes-2">Main Changes</h2>
<p>BLE-Mesh:</p>
<ul>
<li>BLE Mesh Models Fixe/Update</li>
@@ -104,7 +166,7 @@
<div class="collapse">
<input type="checkbox" id="collapse-section8" aria-hidden="true"> <label for="collapse-section8" aria-hidden="false">V1.6.0 / 27-March-2020</label>
<div>
-<h2 id="main-changes-2">Main Changes</h2>
+<h2 id="main-changes-3">Main Changes</h2>
<p>BLE-Mesh:</p>
<ul>
<li>BLE-Mesh library version 1.12.007
@@ -376,7 +438,7 @@
<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-3">Main Changes</h2>
+<h2 id="main-changes-4">Main Changes</h2>
<p>Interface:</p>
<ul>
<li>Added new commmand SHCI_C2_SetFlashActivityControl() to configure BLE timing protection</li>
@@ -419,7 +481,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-4">Main Changes</h2>
+<h2 id="main-changes-5">Main Changes</h2>
<p>Interface:</p>
<ul>
<li>Added new commmand SHCI_C2_ExtpaConfig() to support external PA</li>
@@ -435,7 +497,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-5">Main Changes</h2>
+<h2 id="main-changes-6">Main Changes</h2>
<p>General:</p>
<ul>
<li>Introducing support of Zigbee</li>
@@ -473,7 +535,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-6">Main Changes</h2>
+<h2 id="main-changes-7">Main Changes</h2>
<p>General:</p>
<ul>
<li>Following utilities : Scheduler and Low Power Manager reworked and moved to ā€œUtilitiesā€ directory</li>
@@ -499,7 +561,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-7">Main Changes</h2>
+<h2 id="main-changes-8">Main Changes</h2>
<p>BLE:</p>
<ul>
<li>Fix race condition in transport layer when an operating system is used.</li>
@@ -545,7 +607,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-8">Main Changes</h2>
+<h2 id="main-changes-9">Main Changes</h2>
<p>General:</p>
<ul>
<li>Licenses in utilities and patterns moved from sla0044 to 3-clauses BSD</li>
@@ -571,7 +633,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-9">Main Changes</h2>
+<h2 id="main-changes-10">Main Changes</h2>
<p>First release</p>
</div>
</div>
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 bb2b1c2b3..4d4912bed 100644
--- a/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_events.c
+++ b/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_events.c
@@ -1,6 +1,6 @@
/******************************************************************************
* @file ble_events.c
- * @author MCD Application Team
+ * @author MCD
* @brief STM32WB BLE API (event callbacks)
* Auto-generated file: do not edit!
******************************************************************************
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 d385cfedc..4ed31854c 100644
--- a/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_events.h
+++ b/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_events.h
@@ -1,6 +1,6 @@
/******************************************************************************
* @file ble_events.h
- * @author MCD Application Team
+ * @author MCD
* @brief STM32WB BLE API (event callbacks)
* Auto-generated file: do not edit!
******************************************************************************
@@ -82,7 +82,7 @@ void hci_disconnection_complete_event( uint8_t Status,
* (See Bluetooth Specification v.5.0, Vol. 2, Part E, 7.7.8)
*
* @param Status Status error code.
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Encryption_Enabled Link Level Encryption.
@@ -117,7 +117,7 @@ void hci_encryption_change_event( uint8_t Status,
* (See Bluetooth Specification v.5.0, Vol. 2, Part E, 7.7.12)
*
* @param Status Status error code.
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Version Version of the Current LMP in the remote Controller
@@ -190,7 +190,7 @@ void hci_number_of_completed_packets_event( uint8_t Number_of_Handles,
* the Role Change event.
*
* @param Status Status error code.
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @return None
@@ -216,8 +216,7 @@ void hci_encryption_key_refresh_complete_event( uint8_t Status,
* 7.7.65.1
*
* @param Status Status error code.
- * @param Connection_Handle Connection handle to be used to identify the
- * connection with the peer device.
+ * @param Connection_Handle Connection handle for which the event applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Role Role of the local device in the connection.
@@ -294,8 +293,7 @@ void hci_le_advertising_report_event( uint8_t Num_Reports,
* sent. See Bluetooth spec 5.0 vol 2 [part E] 7.7.65.3
*
* @param Status Status error code.
- * @param Connection_Handle Connection handle to be used to identify the
- * connection with the peer device.
+ * @param Connection_Handle Connection handle for which the event applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Conn_Interval Connection interval used on this connection.
@@ -329,8 +327,7 @@ void hci_le_connection_update_complete_event( uint8_t Status,
* See Bluetooth spec 5.0 vol 2 [part E] 7.7.65.4
*
* @param Status Status error code.
- * @param Connection_Handle Connection handle to be used to identify the
- * connection with the peer device.
+ * @param Connection_Handle Connection handle for which the event applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param LE_Features Bit Mask List of used LE features. For details see LE
@@ -349,8 +346,7 @@ void hci_le_read_remote_features_complete_event( uint8_t Status,
* (See [Vol 6] Part B, Section 5.1.3)and Bluetooth spec 5.0 vol 2 [part E]
* 7.7.65.5
*
- * @param Connection_Handle Connection handle to be used to identify the
- * connection with the peer device.
+ * @param Connection_Handle Connection handle for which the event applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Random_Number 64-bit random number
@@ -371,8 +367,7 @@ void hci_le_long_term_key_request_event( uint16_t Connection_Handle,
* corresponding parameter has a lower value.
* See Bluetooth spec 5.0 vol 2 [part E] 7.7.65.7
*
- * @param Connection_Handle Connection handle to be used to identify the
- * connection with the peer device.
+ * @param Connection_Handle Connection handle for which the event applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param MaxTxOctets The maximum number of payload octets in a Link Layer
@@ -448,8 +443,7 @@ void hci_le_generate_dhkey_complete_event( uint8_t Status,
* See Bluetooth spec 5.0 vol 2 [part E] 7.7.65.10
*
* @param Status Status error code.
- * @param Connection_Handle Connection handle to be used to identify the
- * connection with the peer device.
+ * @param Connection_Handle Connection handle for which the event applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Role Role of the local device in the connection.
@@ -715,7 +709,6 @@ void aci_gap_addr_not_resolved_event( uint16_t Connection_Handle );
* application has to respond with the ACI_GAP_NUMERIC_COMPARISON_RESP command.
*
* @param Connection_Handle Connection handle related to the underlying Pairing
-
* @return None
*/
void aci_gap_numeric_comparison_value_event( uint16_t Connection_Handle,
@@ -789,7 +782,7 @@ void aci_gatt_proc_timeout_event( uint16_t Connection_Handle );
* This event is generated in response to an Exchange MTU request. See
* ACI_GATT_EXCHANGE_CONFIG.
*
- * @param Connection_Handle Connection handle related to the response.
+ * @param Connection_Handle Connection handle for which the event applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Server_RX_MTU Attribute server receive MTU size
@@ -805,7 +798,7 @@ void aci_att_exchange_mtu_resp_event( uint16_t Connection_Handle,
* spec. This event is also generated in response to
* ACI_GATT_DISC_ALL_CHAR_DESC
*
- * @param Connection_Handle Connection handle related to the response.
+ * @param Connection_Handle Connection handle for which the event applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Format Format of the hanndle-uuid pairs
@@ -824,7 +817,7 @@ void aci_att_find_info_resp_event( uint16_t Connection_Handle,
* @brief ACI_ATT_FIND_BY_TYPE_VALUE_RESP_EVENT
* This event is generated in response to a ACI_ATT_FIND_BY_TYPE_VALUE_REQ
*
- * @param Connection_Handle Connection handle related to the response.
+ * @param Connection_Handle Connection handle for which the event applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Num_of_Handle_Pair Number of attribute, group handle pairs
@@ -840,7 +833,7 @@ void aci_att_find_by_type_value_resp_event( uint16_t Connection_Handle,
* This event is generated in response to a ACI_ATT_READ_BY_TYPE_REQ. See
* ACI_GATT_FIND_INCLUDED_SERVICES and ACI_GATT_DISC_ALL_CHAR_DESC.
*
- * @param Connection_Handle Connection handle related to the response.
+ * @param Connection_Handle Connection handle for which the event applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Handle_Value_Pair_Length The size of each attribute handle-value pair
@@ -861,7 +854,7 @@ void aci_att_read_by_type_resp_event( uint16_t Connection_Handle,
* This event is generated in response to a Read Request. See
* ACI_GATT_READ_CHAR_VALUE.
*
- * @param Connection_Handle Connection handle related to the response.
+ * @param Connection_Handle Connection handle for which the event applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Event_Data_Length Length of following data
@@ -877,7 +870,7 @@ void aci_att_read_resp_event( uint16_t Connection_Handle,
* This event can be generated during a read long characteristic value
* procedure. See ACI_GATT_READ_LONG_CHAR_VALUE.
*
- * @param Connection_Handle Connection handle related to the response.
+ * @param Connection_Handle Connection handle for which the event applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Event_Data_Length Length of following data
@@ -892,7 +885,7 @@ void aci_att_read_blob_resp_event( uint16_t Connection_Handle,
* @brief ACI_ATT_READ_MULTIPLE_RESP_EVENT
* This event is generated in response to a Read Multiple Request.
*
- * @param Connection_Handle Connection handle related to the response.
+ * @param Connection_Handle Connection handle for which the event applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Event_Data_Length Length of following data
@@ -910,7 +903,7 @@ void aci_att_read_multiple_resp_event( uint16_t Connection_Handle,
* This event is generated in response to a Read By Group Type Request. See
* ACI_GATT_DISC_ALL_PRIMARY_SERVICES.
*
- * @param Connection_Handle Connection handle related to the response.
+ * @param Connection_Handle Connection handle for which the event applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Attribute_Data_Length The size of each attribute data
@@ -930,7 +923,7 @@ void aci_att_read_by_group_type_resp_event( uint16_t Connection_Handle,
* @brief ACI_ATT_PREPARE_WRITE_RESP_EVENT
* This event is generated in response to a ACI_ATT_PREPARE_WRITE_REQ.
*
- * @param Connection_Handle Connection handle related to the response.
+ * @param Connection_Handle Connection handle for which the event applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Attribute_Handle The handle of the attribute to be written
@@ -949,7 +942,7 @@ void aci_att_prepare_write_resp_event( uint16_t Connection_Handle,
* @brief ACI_ATT_EXEC_WRITE_RESP_EVENT
* This event is generated in response to an Execute Write Request.
*
- * @param Connection_Handle Connection handle related to the response.
+ * @param Connection_Handle Connection handle for which the event applies.
* Values:
* - 0x0000 ... 0x0EFF
* @return None
@@ -960,7 +953,7 @@ void aci_att_exec_write_resp_event( uint16_t Connection_Handle );
* @brief ACI_GATT_INDICATION_EVENT
* This event is generated when an indication is received from the server.
*
- * @param Connection_Handle Connection handle related to the response.
+ * @param Connection_Handle Connection handle for which the event applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Attribute_Handle The handle of the attribute
@@ -977,7 +970,7 @@ void aci_gatt_indication_event( uint16_t Connection_Handle,
* @brief ACI_GATT_NOTIFICATION_EVENT
* This event is generated when a notification is received from the server.
*
- * @param Connection_Handle Connection handle related to the response.
+ * @param Connection_Handle Connection handle for which the event applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Attribute_Handle The handle of the attribute
@@ -995,7 +988,7 @@ void aci_gatt_notification_event( uint16_t Connection_Handle,
* This event is generated when a GATT client procedure completes either with
* error or successfully.
*
- * @param Connection_Handle Connection handle related to the response.
+ * @param Connection_Handle Connection handle for which the event applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Error_Code Indicates whether the procedure completed with an error or
@@ -1012,7 +1005,7 @@ void aci_gatt_proc_complete_event( uint16_t Connection_Handle,
* discovery procedures. This does not mean that the procedure ended with an
* error, but this error event is part of the procedure itself.
*
- * @param Connection_Handle Connection handle related to the response.
+ * @param Connection_Handle Connection handle for which the event applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Req_Opcode The request that generated this error response
@@ -1054,7 +1047,7 @@ void aci_gatt_error_resp_event( uint16_t Connection_Handle,
* By UUID" has been started. It will be the value of the Characteristic if a*
* "Read using Characteristic UUID" has been performed.
*
- * @param Connection_Handle Connection handle related to the response.
+ * @param Connection_Handle Connection handle for which the event applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Attribute_Handle The handle of the attribute
@@ -1089,8 +1082,9 @@ void aci_gatt_disc_read_char_by_uuid_resp_event( uint16_t Connection_Handle,
* In case of write/signed write commands, no response is sent to the client
* but the attribute is not modified.
*
- * @param Connection_Handle Handle of the connection on which there was the
- * request to write the attribute
+ * @param Connection_Handle Connection handle for which the event applies.
+ * Values:
+ * - 0x0000 ... 0x0EFF
* @param Attribute_Handle The handle of the attribute
* @param Data_Length Length of Data field
* @param Data The data that the client has requested to write
@@ -1111,7 +1105,7 @@ void aci_gatt_write_permit_req_event( uint16_t Connection_Handle,
* if it desires and when done, it has to send the ACI_GATT_ALLOW_READ command
* to indicate to the stack that it can send the response to the client.
*
- * @param Connection_Handle Connection handle related to the response.
+ * @param Connection_Handle Connection handle for which the event applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Attribute_Handle The handle of the attribute
@@ -1135,7 +1129,6 @@ void aci_gatt_read_permit_req_event( uint16_t Connection_Handle,
*
* @param Connection_Handle Handle of the connection which requested to read
* the attribute
-
* @param Handle_Item See @ref Handle_Item_t
* @return None
*/
@@ -1150,7 +1143,9 @@ void aci_gatt_read_multi_permit_req_event( uint16_t Connection_Handle,
* there are at least two buffers available for notifications or write
* commands.
*
- * @param Connection_Handle Connection handle related to the request
+ * @param Connection_Handle Connection handle for which the event applies.
+ * Values:
+ * - 0x0000 ... 0x0EFF
* @param Available_Buffers Number of buffers available
* @return None
*/
@@ -1162,7 +1157,9 @@ void aci_gatt_tx_pool_available_event( uint16_t Connection_Handle,
* This event is generated when the client has sent the confirmation to a
* previously sent indication
*
- * @param Connection_Handle Connection handle related to the event
+ * @param Connection_Handle Connection handle for which the event applies.
+ * Values:
+ * - 0x0000 ... 0x0EFF
* @return None
*/
void aci_gatt_server_confirmation_event( uint16_t Connection_Handle );
@@ -1181,8 +1178,9 @@ void aci_gatt_server_confirmation_event( uint16_t Connection_Handle );
* will not be modified and an error response will be sent to the client, with
* the error code as specified by the application.
*
- * @param Connection_Handle Handle of the connection on which there was the
- * request to write the attribute
+ * @param Connection_Handle Connection handle for which the event applies.
+ * Values:
+ * - 0x0000 ... 0x0EFF
* @param Attribute_Handle The handle of the attribute
* @param Offset The offset from which the prepare write has been requested
* @param Data_Length Length of Data field
@@ -1204,7 +1202,7 @@ void aci_gatt_prepare_write_permit_req_event( uint16_t Connection_Handle,
* (BLE_EVT_MAX_PARAM_LEN - 4) i.e. ATT_MTU > 251 for BLE_EVT_MAX_PARAM_LEN
* default value.
*
- * @param Connection_Handle Connection handle related to the response.
+ * @param Connection_Handle Connection handle for which the event applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Offset Bits 14-0: offset in octets from which Attribute_Value data
@@ -1228,7 +1226,7 @@ void aci_gatt_read_ext_event( uint16_t Connection_Handle,
* > (BLE_EVT_MAX_PARAM_LEN - 4) i.e. ATT_MTU > 251 for BLE_EVT_MAX_PARAM_LEN
* default value.
*
- * @param Connection_Handle Connection handle related to the response.
+ * @param Connection_Handle Connection handle for which the event applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Attribute_Handle The handle of the attribute
@@ -1254,7 +1252,7 @@ void aci_gatt_indication_ext_event( uint16_t Connection_Handle,
* ATT_MTU > (BLE_EVT_MAX_PARAM_LEN - 4) i.e. ATT_MTU > 251 for
* BLE_EVT_MAX_PARAM_LEN default value.
*
- * @param Connection_Handle Connection handle related to the response.
+ * @param Connection_Handle Connection handle for which the event applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Attribute_Handle The handle of the attribute
@@ -1280,7 +1278,6 @@ void aci_gatt_notification_ext_event( uint16_t Connection_Handle,
*
* @param Connection_Handle Connection handle referring to the COS Channel
* where the Disconnection has been received.
-
* @return None
*/
void aci_l2cap_connection_update_resp_event( uint16_t Connection_Handle,
@@ -1295,7 +1292,6 @@ void aci_l2cap_connection_update_resp_event( uint16_t Connection_Handle,
* @param Connection_Handle Handle of the connection related to this L2CAP
* procedure.
* @param Data_Length Length of following data
-
* @return None
*/
void aci_l2cap_proc_timeout_event( uint16_t Connection_Handle,
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 94efa8de8..04cf10de9 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,6 +1,6 @@
/******************************************************************************
* @file ble_gap_aci.c
- * @author MCD Application Team
+ * @author MCD
* @brief STM32WB BLE API (gap_aci)
* Auto-generated file: do not edit!
******************************************************************************
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 d06ea25dd..a394e4595 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,6 +1,6 @@
/******************************************************************************
* @file ble_gap_aci.h
- * @author MCD Application Team
+ * @author MCD
* @brief STM32WB BLE API (gap_aci)
* Auto-generated file: do not edit!
******************************************************************************
@@ -266,11 +266,15 @@ tBleStatus aci_gap_set_discoverable( uint8_t Advertising_Type,
* @param Advertising_Interval_Min Minimum advertising interval.
* Time = N * 0.625 msec.
* Values:
- * - 0x0020 (20.000 ms) ... 0x4000 (10240.000 ms)
+ * - 0x0006 (3.750 ms) : for High Duty Cycle Directed Advertising
+ * - 0x0020 (20.000 ms) ... 0x4000 (10240.000 ms) : for Low Duty Cycle
+ * Directed Advertising
* @param Advertising_Interval_Max Maximum advertising interval.
* Time = N * 0.625 msec.
* Values:
- * - 0x0020 (20.000 ms) ... 0x4000 (10240.000 ms)
+ * - 0x0006 (3.750 ms) : for High Duty Cycle Directed Advertising
+ * - 0x0020 (20.000 ms) ... 0x4000 (10240.000 ms) : for Low Duty Cycle
+ * Directed Advertising
* @return Value indicating success or error code.
*/
tBleStatus aci_gap_set_direct_connectable( uint8_t Own_Address_Type,
@@ -361,7 +365,7 @@ tBleStatus aci_gap_set_authentication_requirement( uint8_t Bonding_Mode,
* given when connected to a device if authorization is required to access
* services which require authorization.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Authorization_Enable Enable the authorization in the device and when
@@ -384,7 +388,7 @@ tBleStatus aci_gap_set_authorization_requirement( uint16_t Connection_Handle,
* ACI_GAP_PASS_KEY_REQ_EVENT event. The command parameter contains the pass
* key which will be used during the pairing process.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Pass_Key Pass key that will be used during the pairing process.
@@ -401,7 +405,7 @@ tBleStatus aci_gap_pass_key_resp( uint16_t Connection_Handle,
* Authorize a device to access attributes. This command should be send by the
* host in response to ACI_GAP_AUTHORIZATION_REQ_EVENT event.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Authorize Authorization response.
@@ -518,7 +522,7 @@ tBleStatus aci_gap_set_undirected_connectable( uint16_t Advertising_Interval_Min
* requirements of the slave. The master may encrypt the link, initiate the
* pairing procedure, or reject the request.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @return Value indicating success or error code.
@@ -555,7 +559,7 @@ tBleStatus aci_gap_delete_ad_type( uint8_t ADType );
* @brief ACI_GAP_GET_SECURITY_LEVEL
* This command can be used to get the current security settings of the device.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param[out] Security_Mode Security mode.
@@ -613,7 +617,7 @@ tBleStatus aci_gap_configure_whitelist( void );
* HCI_DISCONNECTION_COMPLETE_EVENT event is generated when the link is
* disconnected.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Reason The reason for ending the connection.
@@ -646,7 +650,7 @@ tBleStatus aci_gap_clear_security_db( void );
* successfully. If this command is not given on receiving the event, the
* bonding procedure will timeout.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @return Value indicating success or error code.
@@ -1167,7 +1171,7 @@ tBleStatus aci_gap_create_connection( uint16_t LE_Scan_Interval,
/**
* @brief ACI_GAP_TERMINATE_GAP_PROC
- * Terminate the specified GATT procedure. An ACI_GAP_PROC_COMPLETE_EVENT event
+ * Terminate the specified GAP procedure. An ACI_GAP_PROC_COMPLETE_EVENT event
* is returned with the procedure code set to the corresponding procedure.
*
* @param Procedure_Code GAP procedure bitmap.
@@ -1192,7 +1196,7 @@ tBleStatus aci_gap_terminate_gap_proc( uint8_t Procedure_Code );
* On completion of the procedure, an HCI_LE_CONNECTION_UPDATE_COMPLETE_EVENT
* event is returned to the upper layer.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Conn_Interval_Min Minimum value for the connection event interval.
@@ -1244,7 +1248,7 @@ tBleStatus aci_gap_start_connection_update( uint16_t Connection_Handle,
* A ACI_GAP_PAIRING_COMPLETE_EVENT event is returned after the pairing process
* is completed.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Force_Rebond If 1, Pairing request will be sent even if the device
@@ -1406,11 +1410,12 @@ tBleStatus aci_gap_get_bonded_devices( uint8_t* Num_of_Addresses,
* command, is bonded. If the device is using a resolvable private address and
* it has been bonded, then the command will return BLE_STATUS_SUCCESS.
*
- * @param Peer_Address_Type Address type.
+ * @param Peer_Address_Type Identity address type.
* Values:
- * - 0x00: Public Device Address
- * - 0x01: Random Device Address
- * @param Peer_Address Address used by the peer device while advertising
+ * - 0x00: Public Identity Address
+ * - 0x01: Random (static) Identity Address
+ * @param Peer_Address Public or Random (static) Identity address of the peer
+ * device
* @return Value indicating success or error code.
*/
tBleStatus aci_gap_is_device_bonded( uint8_t Peer_Address_Type,
@@ -1421,7 +1426,7 @@ tBleStatus aci_gap_is_device_bonded( uint8_t Peer_Address_Type,
* This command allows the User to validate/confirm or not the Numeric
* Comparison value showed through the ACI_GAP_Numeric_Comparison_Value_Event.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Confirm_Yes_No 0 : The Numeric Values showed on both local and peer
@@ -1441,7 +1446,7 @@ tBleStatus aci_gap_numeric_comparison_value_confirm_yesno( uint16_t Connection_H
* This command permits to signal to the Stack the input type detected during
* Passkey input.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Input_Type Passkey input type detected
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 a0fd2eff9..22b00d587 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,6 +1,6 @@
/******************************************************************************
* @file ble_gatt_aci.c
- * @author MCD Application Team
+ * @author MCD
* @brief STM32WB BLE API (gatt_aci)
* Auto-generated file: do not edit!
******************************************************************************
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 a3f06a827..c3cfcc2bf 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,6 +1,6 @@
/******************************************************************************
* @file ble_gatt_aci.h
- * @author MCD Application Team
+ * @author MCD
* @brief STM32WB BLE API (gatt_aci)
* Auto-generated file: do not edit!
******************************************************************************
@@ -334,7 +334,7 @@ tBleStatus aci_gatt_set_event_mask( uint32_t GATT_Evt_Mask );
* ACI_GATT_PROC_COMPLETE_EVENT event is also generated to indicate the end of
* the procedure.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @return Value indicating success or error code.
@@ -349,7 +349,7 @@ tBleStatus aci_gatt_exchange_config( uint16_t Connection_Handle );
* ACI_ATT_FIND_INFO_RESP_EVENT event. The end of the procedure is indicated by
* a ACI_GATT_PROC_COMPLETE_EVENT event.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Start_Handle First requested handle number
@@ -370,7 +370,7 @@ tBleStatus aci_att_find_info_req( uint16_t Connection_Handle,
* The end of the procedure is indicated by a ACI_GATT_PROC_COMPLETE_EVENT
* event.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Start_Handle First requested handle number
@@ -395,7 +395,7 @@ tBleStatus aci_att_find_by_type_value_req( uint16_t Connection_Handle,
* the attribute type is known but the handle is not known.
* The responses are given through the ACI_ATT_READ_BY_TYPE_RESP_EVENT event.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Start_Handle First requested handle number
@@ -421,7 +421,7 @@ tBleStatus aci_att_read_by_type_req( uint16_t Connection_Handle,
* ACI_ATT_READ_BY_GROUP_TYPE_RESP_EVENT event.
* The end of the procedure is indicated by a ACI_GATT_PROC_COMPLETE_EVENT.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Start_Handle First requested handle number
@@ -445,7 +445,7 @@ tBleStatus aci_att_read_by_group_type_req( uint16_t Connection_Handle,
* ACI_ATT_PREPARE_WRITE_RESP_EVENT event.
* The end of the procedure is indicated by a ACI_GATT_PROC_COMPLETE_EVENT.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Attr_Handle Handle of the attribute to be written
@@ -472,7 +472,7 @@ tBleStatus aci_att_prepare_write_req( uint16_t Connection_Handle,
* The end of the procedure is indicated by a ACI_GATT_PROC_COMPLETE_EVENT
* event.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Execute Execute or cancel writes.
@@ -491,7 +491,7 @@ tBleStatus aci_att_execute_write_req( uint16_t Connection_Handle,
* The responses of the procedure are given through the
* ACI_ATT_READ_BY_GROUP_TYPE_RESP_EVENT event.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @return Value indicating success or error code.
@@ -507,7 +507,7 @@ tBleStatus aci_gatt_disc_all_primary_services( uint16_t Connection_Handle );
* The end of the procedure is indicated by a ACI_GATT_PROC_COMPLETE_EVENT
* event.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param UUID_Type UUID type: 0x01 = 16 bits UUID while 0x02 = 128 bits UUID
@@ -526,7 +526,7 @@ tBleStatus aci_gatt_disc_primary_service_by_uuid( uint16_t Connection_Handle,
* The end of the procedure is indicated by a ACI_GATT_PROC_COMPLETE_EVENT
* event.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Start_Handle Start attribute handle of the service
@@ -544,7 +544,7 @@ tBleStatus aci_gatt_find_included_services( uint16_t Connection_Handle,
* generated. Before procedure completion the response packets are given
* through ACI_ATT_READ_BY_TYPE_RESP_EVENT event.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Start_Handle Start attribute handle of the service
@@ -562,7 +562,7 @@ tBleStatus aci_gatt_disc_all_char_of_service( uint16_t Connection_Handle,
* generated. Before procedure completion the response packets are given
* through ACI_GATT_DISC_READ_CHAR_BY_UUID_RESP_EVENT event.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Start_Handle Start attribute handle of the service
@@ -585,7 +585,7 @@ tBleStatus aci_gatt_disc_char_by_uuid( uint16_t Connection_Handle,
* generated. Before procedure completion the response packets are given
* through ACI_ATT_FIND_INFO_RESP_EVENT event.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Char_Handle Handle of the characteristic value
@@ -603,7 +603,7 @@ tBleStatus aci_gatt_disc_all_char_desc( uint16_t Connection_Handle,
* generated. Before procedure completion the response packet is given through
* ACI_ATT_READ_RESP_EVENT event.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Attr_Handle Handle of the characteristic value to be read
@@ -624,7 +624,7 @@ tBleStatus aci_gatt_read_char_value( uint16_t Connection_Handle,
* BLE_EVT_MAX_PARAM_LEN - 7 i.e. 248 bytes for default value of
* BLE_EVT_MAX_PARAM_LEN.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Start_Handle Starting handle of the range to be searched
@@ -646,7 +646,7 @@ tBleStatus aci_gatt_read_using_char_uuid( uint16_t Connection_Handle,
* generated. Before procedure completion the response packets are given
* through ACI_ATT_READ_BLOB_RESP_EVENT event.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Attr_Handle Handle of the characteristic value to be read
@@ -666,7 +666,7 @@ tBleStatus aci_gatt_read_long_char_value( uint16_t Connection_Handle,
* generated. Before procedure completion the response packets are given
* through ACI_ATT_READ_MULTIPLE_RESP_EVENT event.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Number_of_Handles The number of handles for which the value has to be
@@ -684,7 +684,7 @@ tBleStatus aci_gatt_read_multiple_char_value( uint16_t Connection_Handle,
* When the procedure is completed, a ACI_GATT_PROC_COMPLETE_EVENT event is
* generated.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Attr_Handle Handle of the characteristic value to be written
@@ -704,7 +704,7 @@ tBleStatus aci_gatt_write_char_value( uint16_t Connection_Handle,
* generated. During the procedure, ACI_ATT_PREPARE_WRITE_RESP_EVENT and
* ACI_ATT_EXEC_WRITE_RESP_EVENT events are raised.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Attr_Handle Handle of the characteristic value to be written
@@ -726,7 +726,7 @@ tBleStatus aci_gatt_write_long_char_value( uint16_t Connection_Handle,
* generated. During the procedure, ACI_ATT_PREPARE_WRITE_RESP_EVENT and
* ACI_ATT_EXEC_WRITE_RESP_EVENT events are raised.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Attr_Handle Handle of the attribute to be written
@@ -748,7 +748,7 @@ tBleStatus aci_gatt_write_char_reliable( uint16_t Connection_Handle,
* generated. During the procedure, ACI_ATT_PREPARE_WRITE_RESP_EVENT and
* ACI_ATT_EXEC_WRITE_RESP_EVENT events are raised.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Attr_Handle Handle of the attribute to be written
@@ -770,7 +770,7 @@ tBleStatus aci_gatt_write_long_char_desc( uint16_t Connection_Handle,
* generated. Before procedure completion the response packets are given
* through ACI_ATT_READ_BLOB_RESP_EVENT event.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Attr_Handle Handle of the characteristic descriptor
@@ -787,7 +787,7 @@ tBleStatus aci_gatt_read_long_char_desc( uint16_t Connection_Handle,
* When the procedure is completed, a ACI_GATT_PROC_COMPLETE_EVENT event is
* generated.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Attr_Handle Handle of the attribute to be written
@@ -808,7 +808,7 @@ tBleStatus aci_gatt_write_char_desc( uint16_t Connection_Handle,
* Before procedure completion the response packet is given through
* ACI_ATT_READ_RESP_EVENT event.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Attr_Handle Handle of the descriptor to be read
@@ -825,7 +825,7 @@ tBleStatus aci_gatt_read_char_desc( uint16_t Connection_Handle,
* 3); it must also not exceed (BLE_EVT_MAX_PARAM_LEN - 5) i.e. 250 for
* BLE_EVT_MAX_PARAM_LEN default value.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Attr_Handle Handle of the characteristic value to be written
@@ -847,7 +847,7 @@ tBleStatus aci_gatt_write_without_resp( uint16_t Connection_Handle,
* not exceed (ATT_MTU - 15); it must also not exceed (BLE_EVT_MAX_PARAM_LEN -
* 5) i.e. 250 for BLE_EVT_MAX_PARAM_LEN default value.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Attr_Handle Handle of the characteristic value to be written
@@ -865,7 +865,7 @@ tBleStatus aci_gatt_signed_write_without_resp( uint16_t Connection_Handle,
* Allow application to confirm indication. This command has to be sent when
* the application receives the event ACI_GATT_INDICATION_EVENT.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @return Value indicating success or error code.
@@ -881,7 +881,7 @@ tBleStatus aci_gatt_confirm_indication( uint16_t Connection_Handle );
* then the status has to be set to 1 and the error code has to be set to the
* error code that has to be passed to the client.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Attr_Handle Handle of the attribute that was passed in the event
@@ -919,7 +919,7 @@ tBleStatus aci_gatt_write_resp( uint16_t Connection_Handle,
* should perform the required operations within 30 seconds. Otherwise the GATT
* procedure will be timeout.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @return Value indicating success or error code.
@@ -1042,7 +1042,7 @@ tBleStatus aci_gatt_update_char_value_ext( uint16_t Conn_Handle_To_Notify,
* ACI_GATT_READ_PERMIT_REQ_EVENT or ACI_GATT_READ_MULTI_PERMIT_REQ_EVENT
* events; otherwise the GATT procedure issues a timeout.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Error_Code Error code for the command
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 f962d53a8..5932cf4c2 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,6 +1,6 @@
/******************************************************************************
* @file ble_hal_aci.c
- * @author MCD Application Team
+ * @author MCD
* @brief STM32WB BLE API (hal_aci)
* Auto-generated file: do not edit!
******************************************************************************
diff --git a/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hal_aci.h b/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hal_aci.h
index 645f35f89..60eca38fa 100644
--- a/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hal_aci.h
+++ b/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hal_aci.h
@@ -1,6 +1,6 @@
/******************************************************************************
* @file ble_hal_aci.h
- * @author MCD Application Team
+ * @author MCD
* @brief STM32WB BLE API (hal_aci)
* Auto-generated file: do not edit!
******************************************************************************
diff --git a/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hci_le.c b/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hci_le.c
index be122eaa8..98ad5f45e 100644
--- a/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hci_le.c
+++ b/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_hci_le.c
@@ -1,6 +1,6 @@
/******************************************************************************
* @file ble_hci_le.c
- * @author MCD Application Team
+ * @author MCD
* @brief STM32WB BLE API (hci_le)
* Auto-generated file: do not edit!
******************************************************************************
@@ -1518,3 +1518,30 @@ tBleStatus hci_le_enhanced_transmitter_test( uint8_t TX_Frequency,
return status;
}
+tBleStatus hci_le_set_privacy_mode( uint8_t Peer_Identity_Address_Type,
+ const uint8_t* Peer_Identity_Address,
+ uint8_t Privacy_Mode )
+{
+ struct hci_request rq;
+ uint8_t cmd_buffer[BLE_CMD_MAX_PARAM_LEN];
+ hci_le_set_privacy_mode_cp0 *cp0 = (hci_le_set_privacy_mode_cp0*)(cmd_buffer);
+ tBleStatus status = 0;
+ int index_input = 0;
+ cp0->Peer_Identity_Address_Type = Peer_Identity_Address_Type;
+ index_input += 1;
+ Osal_MemCpy( (void*)&cp0->Peer_Identity_Address, (const void*)Peer_Identity_Address, 6 );
+ index_input += 6;
+ cp0->Privacy_Mode = Privacy_Mode;
+ index_input += 1;
+ Osal_MemSet( &rq, 0, sizeof(rq) );
+ rq.ogf = 0x08;
+ rq.ocf = 0x04e;
+ rq.cparam = cmd_buffer;
+ rq.clen = index_input;
+ rq.rparam = &status;
+ rq.rlen = 1;
+ if ( hci_send_req(&rq, FALSE) < 0 )
+ return BLE_STATUS_TIMEOUT;
+ return status;
+}
+
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 fb68845f0..dea91a6b7 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,6 +1,6 @@
/******************************************************************************
* @file ble_hci_le.h
- * @author MCD Application Team
+ * @author MCD
* @brief STM32WB BLE API (hci_le)
* Auto-generated file: do not edit!
******************************************************************************
@@ -34,7 +34,7 @@
* connection on the same physical connection is disconnected.
* (See Bluetooth Specification v.5.0, Vol. 2, Part E, 7.1.6)
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Reason The reason for ending the connection.
@@ -57,8 +57,7 @@ tBleStatus hci_disconnect( uint16_t Connection_Handle,
* Connection_Handle must be a Connection_Handle for an ACL or LE connection.
* (See Bluetooth Specification v.5.0, Vol. 2, Part E, 7.1.23)
*
- * @param Connection_Handle Specifies which Connection_Handle's version
- * information to get.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @return Value indicating success or error code.
@@ -115,8 +114,7 @@ tBleStatus hci_reset( void );
* Connection_Handle for an ACL connection.
* (See Bluetooth Specification v.5.0, Vol. 2, Part E, 7.3.35)
*
- * @param Connection_Handle Specifies which Connection_Handle's Transmit Power
- * Level setting to read.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Type Current or maximum transmit power level.
@@ -349,7 +347,7 @@ tBleStatus hci_read_bd_addr( uint8_t* BD_ADDR );
* RSSI cannot be read, the RSSI metric shall be set to 127.
* (See Bluetooth Specification v.5.0, Vol. 2, Part E, 7.5.4)
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param[out] RSSI N Size: 1 Octet (signed integer)
@@ -909,8 +907,7 @@ tBleStatus hci_le_clear_white_list( void );
* Values:
* - 0x00: Public Device Address
* - 0x01: Random Device Address
- * @param Address Public Device Address or Random Device Address of the device
- * to be added to the white list.
+ * @param Address Public Device Address or Random Device Address.
* @return Value indicating success or error code.
*/
tBleStatus hci_le_add_device_to_white_list( uint8_t Address_Type,
@@ -932,8 +929,7 @@ tBleStatus hci_le_add_device_to_white_list( uint8_t Address_Type,
* Values:
* - 0x00: Public Device Address
* - 0x01: Random Device Address
- * @param Address Public Device Address or Random Device Address of the device
- * to be removed from the white list.
+ * @param Address Public Device Address or Random Device Address.
* @return Value indicating success or error code.
*/
tBleStatus hci_le_remove_device_from_white_list( uint8_t Address_Type,
@@ -960,7 +956,7 @@ tBleStatus hci_le_remove_device_from_white_list( uint8_t Address_Type,
* the parameter values provided by the Host through this command.
* (See Bluetooth Specification v.5.0, Vol. 2, Part E, 7.8.18)
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Conn_Interval_Min Minimum value for the connection event interval.
@@ -1038,7 +1034,7 @@ tBleStatus hci_le_set_host_channel_classification( const uint8_t* LE_Channel_Map
* acknowledgement.
* (See Bluetooth Specification v.5.0, Vol. 2, Part E, 7.8.20)
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param[out] LE_Channel_Map This parameter contains 37 1-bit fields.
@@ -1060,7 +1056,7 @@ tBleStatus hci_le_read_channel_map( uint16_t Connection_Handle,
* This command may be issued on both the master and slave.
* (See Bluetooth Specification v.5.0, Vol. 2, Part E, 7.8.21)
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @return Value indicating success or error code.
@@ -1114,7 +1110,7 @@ tBleStatus hci_le_rand( uint8_t* Random_Number );
* This command shall only be used when the local device's role is Master.
* (See Bluetooth Specification v.5.0, Vol. 2, Part E, 7.8.24)
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Random_Number 64 bit random number.
@@ -1135,7 +1131,7 @@ tBleStatus hci_le_start_encryption( uint16_t Connection_Handle,
* is used as defined in [Vol 6] Part B, Section 5.1.3.
* (See Bluetooth Specification v.5.0, Vol. 2, Part E, 7.8.25)
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Long_Term_Key 128 bit long term key.
@@ -1151,7 +1147,7 @@ tBleStatus hci_le_long_term_key_request_reply( uint16_t Connection_Handle,
* provide a Long Term Key for this Connection_Handle.
* (See Bluetooth Specification v.5.0, Vol. 2, Part E, 7.8.26)
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @return Value indicating success or error code.
@@ -1248,7 +1244,7 @@ tBleStatus hci_le_test_end( uint16_t* Number_Of_Packets );
* 6] Part B, Section 4.5.10) to be used for a given connection. The Controller
* may use smaller or larger values based on local information.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param TxOctets Preferred maximum number of payload octets that the local
@@ -1493,7 +1489,7 @@ tBleStatus hci_le_read_local_resolvable_address( uint8_t Peer_Identity_Address_T
* - Advertising is enabled
* - Scanning is enabled
* - Create connection command is outstanding
- * (See Bluetooth Specification v.5.0, Vol. 2, Part E, 7.8.44)
+ * (See Bluetooth Specification v.5.0, Vol. 2, Part E, Section 7.8.44)
*
* @param Address_Resolution_Enable Enable/disable address resolution in the
* controller.
@@ -1512,7 +1508,7 @@ tBleStatus hci_le_set_address_resolution_enable( uint8_t Address_Resolution_Enab
* the controller uses a Resolvable Private Address before a new resolvable
* private address is generated and starts being used. This timeout applies to
* all addresses generated by the controller.
- * (See Bluetooth Specification v.5.0, Vol. 2, Part E, 7.8.45)
+ * (See Bluetooth Specification v.5.0 [Vol 2] Part E, Section 7.8.45)
*
* @param RPA_Timeout RPA_Timeout measured in seconds.
* Range for N: 0x0001 - 0xA1B8 (1 sec - approximately 11.5 hours)
@@ -1560,9 +1556,9 @@ tBleStatus hci_le_read_maximum_data_length( uint16_t* supportedMaxTxOctets,
* @brief HCI_LE_READ_PHY
* The LE_Read_PHY command is used to read the current transmitter PHY and
* receiver PHY on the connection identified by the Connection_Handle. see
- * Bluetooth Specification [vol2] part E Section 7.8.47
+ * Bluetooth Specification [Vol 2] part E, Section 7.8.47
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param[out] TX_PHY Transmitter PHY in use
@@ -1649,9 +1645,9 @@ tBleStatus hci_le_set_default_phy( uint8_t ALL_PHYS,
* the LE Coded PHY.
* The Host may specify a preferred coding even if it prefers not to use the LE
* Coded transmitter PHY since the Controller may override the PHY preference.
- * see Bluetooth Specification v5.0 [Vol 6] Part B, Section 7.8.49
+ * (See Bluetooth Specification v5.0 [Vol 6] Part B, Section 7.8.49)
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param ALL_PHYS Host preferences for TX PHY and RX PHY
@@ -1663,7 +1659,7 @@ tBleStatus hci_le_set_default_phy( uint8_t ALL_PHYS,
* @param RX_PHYS Host preferences for RX PHY (no LE coded support)
* Values:
* - 0x00 ... 0x03
- * @param PHY_options Not Supported by STM32WB
+ * @param PHY_options Not supported
* @return Value indicating success or error code.
*/
tBleStatus hci_le_set_phy( uint16_t Connection_Handle,
@@ -1677,7 +1673,7 @@ tBleStatus hci_le_set_phy( uint16_t Connection_Handle,
* This command is used to start a test where the DUT receives test reference
* packets at a fixed interval. The tester generates the test reference
* packets.
- * see Bluetooth Specification v5.0 [Vol 6] Part B, Section 7.8.50
+ * (See Bluetooth Specification v5.0 [Vol 6] Part B, Section 7.8.50)
*
* @param RX_Frequency N = (F - 2402) / 2
* Frequency Range : 2402 MHz to 2480 MHz
@@ -1709,7 +1705,7 @@ tBleStatus hci_le_enhanced_receiver_test( uint8_t RX_Frequency,
* supporting the LE Coded PHY shall also support Packet_Payload value 0x04
* (not supported by STM32WB). An LE Controller may support other values of
* Packet_Payload.
- * see Bluetooth Specification v5.0 [Vol 6] Part B, Section 7.8.51
+ * (See Bluetooth Specification v5.0 [Vol 6] Part B, Section 7.8.51)
*
* @param TX_Frequency N = (F - 2402) / 2
* Frequency Range : 2402 MHz to 2480 MHz
@@ -1742,5 +1738,27 @@ tBleStatus hci_le_enhanced_transmitter_test( uint8_t TX_Frequency,
uint8_t Packet_Payload,
uint8_t PHY );
+/**
+ * @brief HCI_LE_SET_PRIVACY_MODE
+ * This command is used to allow the Host to specify the privacy mode to be
+ * used for a given entry on the resolving list.
+ * (See Bluetooth Specification v.5.0 [Vol 2] Part E, Section 7.8.77)
+ *
+ * @param Peer_Identity_Address_Type Identity address type.
+ * Values:
+ * - 0x00: Public Identity Address
+ * - 0x01: Random (static) Identity Address
+ * @param Peer_Identity_Address Public or Random (static) Identity address of
+ * the peer device
+ * @param Privacy_Mode Privacy Mode.
+ * Values:
+ * - 0x00: Use Network Privacy Mode
+ * - 0x01: Use Device Privacy Mode
+ * @return Value indicating success or error code.
+ */
+tBleStatus hci_le_set_privacy_mode( uint8_t Peer_Identity_Address_Type,
+ const uint8_t* Peer_Identity_Address,
+ uint8_t Privacy_Mode );
+
#endif /* BLE_HCI_LE_H__ */
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 88960d4bc..d33c7c0d1 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,6 +1,6 @@
/******************************************************************************
* @file ble_l2cap_aci.c
- * @author MCD Application Team
+ * @author MCD
* @brief STM32WB BLE API (l2cap_aci)
* Auto-generated file: do not edit!
******************************************************************************
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 dd12b9b85..0f9ab4ea7 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,6 +1,6 @@
/******************************************************************************
* @file ble_l2cap_aci.h
- * @author MCD Application Team
+ * @author MCD
* @brief STM32WB BLE API (l2cap_aci)
* Auto-generated file: do not edit!
******************************************************************************
@@ -30,7 +30,7 @@
* An ACI_L2CAP_CONNECTION_UPDATE_RESP_EVENT event is raised when the master
* responds to the request (accepts or rejects).
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Conn_Interval_Min Minimum value for the connection event interval.
@@ -64,7 +64,7 @@ tBleStatus aci_l2cap_connection_parameter_update_req( uint16_t Connection_Handle
* controller. The accept parameter has to be set if the connection parameters
* given in the event are acceptable.
*
- * @param Connection_Handle Connection handle for which the command is given.
+ * @param Connection_Handle Connection handle for which the command applies.
* Values:
* - 0x0000 ... 0x0EFF
* @param Conn_Interval_Min Minimum value for the connection event interval.
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 2b50803b8..e8469e6e1 100644
--- a/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_types.h
+++ b/Middlewares/ST/STM32_WPAN/ble/core/auto/ble_types.h
@@ -1,6 +1,6 @@
/******************************************************************************
* @file ble_types.h
- * @author MCD Application Team
+ * @author MCD
* @brief STM32WB BLE command/event types
* Auto-generated file: do not edit!
******************************************************************************
@@ -58,8 +58,7 @@ typedef PACKED(struct)
*/
uint8_t Peer_Address_Type;
/**
- * Public Device Address or Random Device Address of the device to be added
- * to the white list.
+ * Public Device Address or Random Device Address.
*/
uint8_t Peer_Address[6];
} Whitelist_Entry_t;
@@ -75,8 +74,7 @@ typedef PACKED(struct)
*/
uint8_t Address_Type;
/**
- * Public Device Address or Random Device Address of the device to be added
- * to the white list.
+ * Public Device Address or Random Device Address.
*/
uint8_t Address[6];
} Bonded_Device_Entry_t;
@@ -944,6 +942,18 @@ typedef PACKED(struct)
typedef PACKED(struct)
{
+ uint8_t Peer_Identity_Address_Type;
+ uint8_t Peer_Identity_Address[6];
+ uint8_t Privacy_Mode;
+} hci_le_set_privacy_mode_cp0;
+
+typedef PACKED(struct)
+{
+ uint8_t Status;
+} hci_le_set_privacy_mode_rp0;
+
+typedef PACKED(struct)
+{
uint8_t Status;
uint16_t Build_Number;
} aci_hal_get_fw_build_number_rp0;
diff --git a/Middlewares/ST/STM32_WPAN/ble/core/ble_bufsize.h b/Middlewares/ST/STM32_WPAN/ble/core/ble_bufsize.h
index c5a5d5690..bf9ea29f4 100644
--- a/Middlewares/ST/STM32_WPAN/ble/core/ble_bufsize.h
+++ b/Middlewares/ST/STM32_WPAN/ble/core/ble_bufsize.h
@@ -1,11 +1,11 @@
/*****************************************************************************
* @file ble_bufsize.h
- * @author MCD Application Team
+ * @author MCD
* @brief Definition of BLE stack buffers size
*****************************************************************************
* @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
@@ -26,11 +26,6 @@
#define BLE_DEFAULT_ATT_MTU 23
/*
- * BLE_DEFAULT_MAX_ATT_MTU: maximum supported ATT MTU size.
- */
-#define BLE_DEFAULT_MAX_ATT_MTU 158
-
-/*
* BLE_DEFAULT_MAX_ATT_SIZE: maximum attribute size.
*/
#define BLE_DEFAULT_MAX_ATT_SIZE 512
@@ -82,13 +77,6 @@
BLE_MBLOCKS_SECURE_CONNECTIONS))
/*
- * BLE_DEFAULT_MBLOCKS_COUNT: default memory blocks count
- */
-#define BLE_DEFAULT_MBLOCKS_COUNT(n_link) \
- BLE_MBLOCKS_CALC(BLE_DEFAULT_PREP_WRITE_LIST_SIZE, \
- BLE_DEFAULT_MAX_ATT_MTU, n_link)
-
-/*
* BLE_FIXED_BUFFER_SIZE_BYTES:
* A part of the RAM, is dinamically allocated by initilizing all the pointers
* defined in a global context variable "mem_alloc_ctx_p".
@@ -102,23 +90,27 @@
* - a part, that may be considered "fixed", i.e. independent from the above
* mentioned parameters.
*/
-#if (SLAVE_ONLY == 0) && (LL_ONLY == 0)
-#define BLE_FIXED_BUFFER_SIZE_BYTES 6960 /* Full stack */
-#elif SLAVE_ONLY == 0
-#define BLE_FIXED_BUFFER_SIZE_BYTES 6256 /* LL only */
+#if (BEACON_ONLY != 0)
+#define BLE_FIXED_BUFFER_SIZE_BYTES 6212 /* Beacon only */
+#elif (LL_ONLY != 0)
+#define BLE_FIXED_BUFFER_SIZE_BYTES 6272 /* LL only */
+#elif (SLAVE_ONLY != 0)
+#define BLE_FIXED_BUFFER_SIZE_BYTES 6712 /* Slave only */
#else
-#define BLE_FIXED_BUFFER_SIZE_BYTES 6696 /* Slave only */
+#define BLE_FIXED_BUFFER_SIZE_BYTES 6976 /* Full stack */
#endif
/*
* BLE_PER_LINK_SIZE_BYTES: additional memory size used per link
*/
-#if (SLAVE_ONLY == 0) && (LL_ONLY == 0)
-#define BLE_PER_LINK_SIZE_BYTES 380 /* Full stack */
-#elif SLAVE_ONLY == 0
+#if (BEACON_ONLY != 0)
+#define BLE_PER_LINK_SIZE_BYTES 148 /* Beacon only */
+#elif (LL_ONLY != 0)
#define BLE_PER_LINK_SIZE_BYTES 196 /* LL only */
-#else
+#elif (SLAVE_ONLY != 0)
#define BLE_PER_LINK_SIZE_BYTES 332 /* Slave only */
+#else
+#define BLE_PER_LINK_SIZE_BYTES 380 /* Full stack */
#endif
/*
@@ -158,4 +150,4 @@
(40 * (num_gatt_attributes)) + (48 * (num_gatt_services)))
-#endif /* ! BLE_BUFSIZE_H__ */
+#endif /* BLE_BUFSIZE_H__ */
diff --git a/Middlewares/ST/STM32_WPAN/ble/core/ble_core.h b/Middlewares/ST/STM32_WPAN/ble/core/ble_core.h
index bcc666dfb..b8d072326 100644
--- a/Middlewares/ST/STM32_WPAN/ble/core/ble_core.h
+++ b/Middlewares/ST/STM32_WPAN/ble/core/ble_core.h
@@ -1,11 +1,11 @@
/*****************************************************************************
* @file ble_core.h
- * @author MCD Application Team
+ * @author MCD
* @brief This file contains the definitions for BLE stack
*****************************************************************************
* @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
@@ -23,7 +23,7 @@
/* BLE standard definitions */
#include "ble_std.h"
-/* BLE API definitions */
+/* BLE stack API definitions */
#include "ble_defs.h"
#include "auto/ble_gap_aci.h"
#include "auto/ble_gatt_aci.h"
@@ -35,10 +35,10 @@
/* BLE stack buffer size definitions */
#include "ble_bufsize.h"
-/* BLE legacy definitions */
+/* BLE stack legacy definitions */
#include "ble_legacy.h"
-#endif /* ! BLE_CORE_H__ */
+#endif /* BLE_CORE_H__ */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE***/
diff --git a/Middlewares/ST/STM32_WPAN/ble/core/ble_defs.h b/Middlewares/ST/STM32_WPAN/ble/core/ble_defs.h
index 8e3c723f4..ad05eeb76 100644
--- a/Middlewares/ST/STM32_WPAN/ble/core/ble_defs.h
+++ b/Middlewares/ST/STM32_WPAN/ble/core/ble_defs.h
@@ -1,6 +1,6 @@
/*****************************************************************************
* @file ble_defs.h
- * @author MCD Application Team
+ * @author MCD
* @brief This file contains definitions used for BLE Stack interface.
*****************************************************************************
* @attention
diff --git a/Middlewares/ST/STM32_WPAN/ble/core/ble_legacy.h b/Middlewares/ST/STM32_WPAN/ble/core/ble_legacy.h
index d99fd65b7..9cc4b7dad 100644
--- a/Middlewares/ST/STM32_WPAN/ble/core/ble_legacy.h
+++ b/Middlewares/ST/STM32_WPAN/ble/core/ble_legacy.h
@@ -1,6 +1,6 @@
/*****************************************************************************
* @file ble_legacy.h
- * @author MCD Application Team
+ * @author MCD
* @brief This file contains legacy definitions used for BLE.
*****************************************************************************
* @attention
@@ -229,6 +229,26 @@ typedef uint8_t tBDAddr[6];
#define ADV_INTERVAL_HIGHEST 0X4000
#define ADV_INTERVAL_LOWEST_NONCONN 0X00A0
+
+/* ------------------------------------------------------------------------- */
+
+
+/*
+ * BLE_DEFAULT_MAX_ATT_MTU: maximum supported ATT MTU size.
+ */
+#define BLE_DEFAULT_MAX_ATT_MTU 158
+
+/*
+ * BLE_DEFAULT_MBLOCKS_COUNT: default memory blocks count
+ */
+#define BLE_DEFAULT_MBLOCKS_COUNT(n_link) \
+ BLE_MBLOCKS_CALC(BLE_DEFAULT_PREP_WRITE_LIST_SIZE, \
+ BLE_DEFAULT_MAX_ATT_MTU, n_link)
+
+
+#define TOTAL_DEVICE_ID_DATA_SIZE 56
+
+
/* ------------------------------------------------------------------------- */
diff --git a/Middlewares/ST/STM32_WPAN/ble/core/ble_std.h b/Middlewares/ST/STM32_WPAN/ble/core/ble_std.h
index 81649cb6e..245b179f9 100644
--- a/Middlewares/ST/STM32_WPAN/ble/core/ble_std.h
+++ b/Middlewares/ST/STM32_WPAN/ble/core/ble_std.h
@@ -1,6 +1,6 @@
/******************************************************************************
* @file ble_std.h
- * @author MCD Application Team
+ * @author MCD
* @brief BLE standard definitions
******************************************************************************
* @attention
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 067f287ee..83e09da30 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><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 - Added GAP scan timeout value</p><p>April 2020 - Rev 1.16 - Fixed various format issues; Added LO and SO columns for command and event tables.</p><p>May 2020 - Rev 1.17 - Updated "slave only" stack features; Added comment in HCI_LE_ADVERTISING_REPORT_EVENT description.</p><p>June 2020 - Rev 1.18 - Added BO column for command and event tables; Fixed advertising commands description; Fixed various format issues.</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><p>Note: in the command tables, a "Y" in the "LO" (resp. "SO" or "BO") column, means that the corresponding command applies to the "Link Layer Only" (resp. "Slave Only" or "Beacon Only") variant of the BLE stack.</p><h2><a name="HCI commands_anchor">HCI commands</a></h2><h2></h2><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 - Added GAP scan timeout value</p><p>April 2020 - Rev 1.16 - Fixed various format issues; Added LO and SO columns for command and event tables.</p><p>May 2020 - Rev 1.17 - Updated "slave only" stack features; Added comment in HCI_LE_ADVERTISING_REPORT_EVENT description.</p><p>June 2020 - Rev 1.18 - Added BO column for command and event tables; Fixed advertising commands description; Fixed various format issues.</p><p>June 2020 - Rev 1.19 - Completed interval possible values for ACI_GAP_SET_DIRECT_CONNECTABLE.</p><p>July 2020 - Rev 1.20 - Added HCI_LE_SET_PRIVACY_MODE.</p><p>July 2020 - Rev 1.21 - Updated "beacon only" stack features.</p><p>September 2020 - Rev 1.22 - Fixed various minor issues.</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><p>Note: in the command tables, a "Y" in the "LO" (resp. "SO" or "BO") column, means that the corresponding command applies to the "Link Layer Only" (resp. "Slave Only" or "Beacon Only") variant of the BLE stack.</p><h2><a name="HCI commands_anchor">HCI commands</a></h2><h2></h2><table width="800" border="1" class="reference">
<tr><th>Command</th><th>Opcode</th><th>LO</th><th>SO</th><th>BO</th></tr>
<tr><td><a href="#HCI_DISCONNECT_anchor">HCI_DISCONNECT</a></td><td><p>0x0406</p>
</td><td><p>Y</p>
@@ -700,7 +700,8 @@ td.gsib_a {padding:0px;padding-top:4px;padding-left:3px;}
</td></tr>
<tr><td><a href="#HCI_LE_READ_BUFFER_SIZE_anchor">HCI_LE_READ_BUFFER_SIZE</a></td><td><p>0x2002</p>
</td><td><p>Y</p>
-</td><td></td><td></td></tr>
+</td><td></td><td><p>Y</p>
+</td></tr>
<tr><td><a href="#HCI_LE_READ_LOCAL_SUPPORTED_FEATURES_anchor">HCI_LE_READ_LOCAL_SUPPORTED_FEATURES</a></td><td><p>0x2003</p>
</td><td><p>Y</p>
</td><td><p>Y</p>
@@ -853,11 +854,14 @@ td.gsib_a {padding:0px;padding-top:4px;padding-left:3px;}
<tr><td><a href="#HCI_LE_SET_PHY_anchor">HCI_LE_SET_PHY</a></td><td><p>0x2032</p>
</td><td><p>Y</p>
</td><td></td><td></td></tr>
+<tr><td><a href="#HCI_LE_SET_PRIVACY_MODE_anchor">HCI_LE_SET_PRIVACY_MODE</a></td><td><p>0x204E</p>
+</td><td><p>Y</p>
+</td><td></td><td></td></tr>
</table><h2><a name="HCI_DISCONNECT_anchor">HCI_DISCONNECT</a></h2><h3>Description</h3><p>The <a href="#HCI_DISCONNECT_anchor">HCI_DISCONNECT</a> is used to terminate an existing connection. The Connection_Handle command parameter indicates which connection is to be disconnected. The Reason command parameter indicates the reason for ending the connection. The remote Controller will receive the Reason command parameter in the <a href="#HCI_DISCONNECTION_COMPLETE_EVENT_anchor">HCI_DISCONNECTION_COMPLETE_EVENT</a> event. All synchronous connections on a physical link should be disconnected before the ACL connection on the same physical connection is disconnected.<br>(See Bluetooth Specification v.5.0, Vol. 2, Part E, 7.1.6)</p><h3>Input 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>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Reason</p>
</td><td><p>1</p>
@@ -873,7 +877,7 @@ td.gsib_a {padding:0px;padding-top:4px;padding-left:3px;}
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Specifies which Connection_Handle's version information to get.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</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>
@@ -903,7 +907,7 @@ td.gsib_a {padding:0px;padding-top:4px;padding-left:3px;}
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Specifies which Connection_Handle's Transmit Power Level setting to read.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Type</p>
</td><td><p>1</p>
@@ -917,7 +921,7 @@ td.gsib_a {padding:0px;padding-top:4px;padding-left:3px;}
</td><td></td></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle related to the response.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Transmit_Power_Level</p>
</td><td><p>1</p>
@@ -1041,7 +1045,7 @@ Unsupported or undefined commands shall be set to 0.</p>
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</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>
@@ -1051,7 +1055,7 @@ Unsupported or undefined commands shall be set to 0.</p>
</td><td></td></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle related to the response.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>RSSI</p>
</td><td><p>1</p>
@@ -1384,7 +1388,7 @@ Time = N * 0.625 msec.</p>
</td><td><li>0x00: Public Device Address</li><li>0x01: Random Device Address</li></td></tr>
<tr><td><p>Address</p>
</td><td><p>6</p>
-</td><td><p>Public Device Address or Random Device Address of the device to be added to the white list.</p>
+</td><td><p>Public Device Address or Random Device Address.</p>
</td><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>
@@ -1400,7 +1404,7 @@ Time = N * 0.625 msec.</p>
</td><td><li>0x00: Public Device Address</li><li>0x01: Random Device Address</li></td></tr>
<tr><td><p>Address</p>
</td><td><p>6</p>
-</td><td><p>Public Device Address or Random Device Address of the device to be removed from the white list.</p>
+</td><td><p>Public Device Address or Random Device Address.</p>
</td><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>
@@ -1412,7 +1416,7 @@ Time = N * 0.625 msec.</p>
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Conn_Interval_Min</p>
</td><td><p>2</p>
@@ -1471,7 +1475,7 @@ At least one channel shall be marked as unknown.</p>
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</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>
@@ -1481,7 +1485,7 @@ At least one channel shall be marked as unknown.</p>
</td><td></td></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle related to the response.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>LE_Channel_Map</p>
</td><td><p>5</p>
@@ -1496,7 +1500,7 @@ The most significant bits are reserved and shall be set to 0.</p>
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</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>
@@ -1538,7 +1542,7 @@ The most significant bits are reserved and shall be set to 0.</p>
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Random_Number</p>
</td><td><p>8</p>
@@ -1562,7 +1566,7 @@ The most significant bits are reserved and shall be set to 0.</p>
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Long_Term_Key</p>
</td><td><p>16</p>
@@ -1576,13 +1580,13 @@ The most significant bits are reserved and shall be set to 0.</p>
</td><td></td></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle related to the response.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
</table><h3>Events generated</h3><li><a href="#HCI_COMMAND_COMPLETE_EVENT_anchor">HCI_COMMAND_COMPLETE_EVENT</a></li><h2><a name="HCI_LE_LONG_TERM_KEY_REQUESTED_NEGATIVE_REPLY_anchor">HCI_LE_LONG_TERM_KEY_REQUESTED_NEGATIVE_REPLY</a></h2><h3>Description</h3><p>The LE_Long_Term_Key_Request_Negative_Reply command is used to reply to an LE Long Term Key Request event from the Controller if the Host cannot provide a Long Term Key for this Connection_Handle.<br>(See Bluetooth Specification v.5.0, Vol. 2, Part E, 7.8.26)</p><h3>Input 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>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</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>
@@ -1592,7 +1596,7 @@ The most significant bits are reserved and shall be set to 0.</p>
</td><td></td></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle related to the response.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
</table><h3>Events generated</h3><li><a href="#HCI_COMMAND_COMPLETE_EVENT_anchor">HCI_COMMAND_COMPLETE_EVENT</a></li><h2><a name="HCI_LE_READ_SUPPORTED_STATES_anchor">HCI_LE_READ_SUPPORTED_STATES</a></h2><h3>Description</h3><p>The LE_Read_Supported_States command reads the states and state combinations that the link layer supports. See [Vol 6] Part B, Section 1.1.1.<br>LE_States is an 8-octet bit field. If a bit is set to 1 then this state or state combination is supported by the Controller. Multiple bits in LE_States may be set to 1 to indicate support for multiple state and state combinations.<br>All the Advertising type with the Initiate State combinations shall be set only if the corresponding Advertising types and Master Role combination are set.<br>All the Scanning types and the Initiate State combinations shall be set only if the corresponding Scanning types and Master Role combination are set.<br>(See Bluetooth Specification v.5.0, Vol. 2, Part E, 7.8.27)</p><h3>Input parameters</h3><p>None</p><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>
@@ -1609,7 +1613,7 @@ See Core v5.0, Vol.2, part E, Ch. 7.8.27.</p>
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>TxOctets</p>
</td><td><p>2</p>
@@ -1627,7 +1631,7 @@ See Core v5.0, Vol.2, part E, Ch. 7.8.27.</p>
</td><td></td></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle related to the response.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
</table><h3>Events generated</h3><li><a href="#HCI_COMMAND_COMPLETE_EVENT_anchor">HCI_COMMAND_COMPLETE_EVENT</a></li><h2><a name="HCI_LE_READ_SUGGESTED_DEFAULT_DATA_LENGTH_anchor">HCI_LE_READ_SUGGESTED_DEFAULT_DATA_LENGTH</a></h2><h3>Description</h3><p>The LE_Read_Suggested_Default_Data_Length command allows the Host to read the Host's suggested values (SuggestedMaxTxOctets and SuggestedMaxTxTime) for the Controller's maximum transmitted number of payload octets and maximum packet transmission time to be used for new connections (see Bluetooth Specification v5.0 [Vol 6] Part B, Section 4.5.10). </p><h3>Input parameters</h3><p>None</p><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>
@@ -1776,7 +1780,7 @@ Little Endian Format</p>
</td><td><p>6</p>
</td><td><p>Resolvable Private Address being used by the local device</p>
</td><td></tr>
-</table><h3>Events generated</h3><li><a href="#HCI_COMMAND_COMPLETE_EVENT_anchor">HCI_COMMAND_COMPLETE_EVENT</a></li><h2><a name="HCI_LE_SET_ADDRESS_RESOLUTION_ENABLE_anchor">HCI_LE_SET_ADDRESS_RESOLUTION_ENABLE</a></h2><h3>Description</h3><p>The LE_Set_Address_Resolution_Enable command is used to enable resolution of Resolvable Private Addresses in the Controller. This causes the Controller to use the resolving list whenever the Controller receives a local or peer Resolvable Private Address.<br>This command can be used at any time except when:<br>- Advertising is enabled<br>- Scanning is enabled<br>- Create connection command is outstanding<br>(See Bluetooth Specification v.5.0, Vol. 2, Part E, 7.8.44)</p><h3>Input parameters</h3><table width="800" border="1" class="reference">
+</table><h3>Events generated</h3><li><a href="#HCI_COMMAND_COMPLETE_EVENT_anchor">HCI_COMMAND_COMPLETE_EVENT</a></li><h2><a name="HCI_LE_SET_ADDRESS_RESOLUTION_ENABLE_anchor">HCI_LE_SET_ADDRESS_RESOLUTION_ENABLE</a></h2><h3>Description</h3><p>The LE_Set_Address_Resolution_Enable command is used to enable resolution of Resolvable Private Addresses in the Controller. This causes the Controller to use the resolving list whenever the Controller receives a local or peer Resolvable Private Address.<br>This command can be used at any time except when:<br>- Advertising is enabled<br>- Scanning is enabled<br>- Create connection command is outstanding<br>(See Bluetooth Specification v.5.0, Vol. 2, Part E, Section 7.8.44)</p><h3>Input 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>Address_Resolution_Enable</p>
</td><td><p>1</p>
@@ -1790,7 +1794,7 @@ Little Endian Format</p>
</td><td><p>1</p>
</td><td><p>Status error code.</p>
</td><td></td></tr>
-</table><h3>Events generated</h3><li><a href="#HCI_COMMAND_COMPLETE_EVENT_anchor">HCI_COMMAND_COMPLETE_EVENT</a></li><h2><a name="HCI_LE_SET_RESOLVABLE_PRIVATE_ADDRESS_TIMEOUT_anchor">HCI_LE_SET_RESOLVABLE_PRIVATE_ADDRESS_TIMEOUT</a></h2><h3>Description</h3><p>The LE_Set_Resolvable_Private_Address_Timeout command set the length of time the controller uses a Resolvable Private Address before a new resolvable private address is generated and starts being used. This timeout applies to all addresses generated by the controller.<br>(See Bluetooth Specification v.5.0, Vol. 2, Part E, 7.8.45)</p><h3>Input parameters</h3><table width="800" border="1" class="reference">
+</table><h3>Events generated</h3><li><a href="#HCI_COMMAND_COMPLETE_EVENT_anchor">HCI_COMMAND_COMPLETE_EVENT</a></li><h2><a name="HCI_LE_SET_RESOLVABLE_PRIVATE_ADDRESS_TIMEOUT_anchor">HCI_LE_SET_RESOLVABLE_PRIVATE_ADDRESS_TIMEOUT</a></h2><h3>Description</h3><p>The LE_Set_Resolvable_Private_Address_Timeout command set the length of time the controller uses a Resolvable Private Address before a new resolvable private address is generated and starts being used. This timeout applies to all addresses generated by the controller.<br>(See Bluetooth Specification v.5.0 [Vol 2] Part E, Section 7.8.45)</p><h3>Input 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>RPA_Timeout</p>
</td><td><p>2</p>
@@ -1826,11 +1830,11 @@ Default: N= 0x0384 (900 secs or 15 minutes)</p>
</td><td><p>2</p>
</td><td><p>Maximum time, in microseconds, that the local Controller supports for reception of a single Link Layer packet on a data connection.</p>
</td><td><li>0x0148 ... 0x4290</li></td></tr>
-</table><h3>Events generated</h3><li><a href="#HCI_COMMAND_COMPLETE_EVENT_anchor">HCI_COMMAND_COMPLETE_EVENT</a></li><h2><a name="HCI_LE_READ_PHY_anchor">HCI_LE_READ_PHY</a></h2><h3>Description</h3><p>The LE_Read_PHY command is used to read the current transmitter PHY and receiver PHY on the connection identified by the Connection_Handle. see Bluetooth Specification [vol2] part E Section 7.8.47</p><h3>Input parameters</h3><table width="800" border="1" class="reference">
+</table><h3>Events generated</h3><li><a href="#HCI_COMMAND_COMPLETE_EVENT_anchor">HCI_COMMAND_COMPLETE_EVENT</a></li><h2><a name="HCI_LE_READ_PHY_anchor">HCI_LE_READ_PHY</a></h2><h3>Description</h3><p>The LE_Read_PHY command is used to read the current transmitter PHY and receiver PHY on the connection identified by the Connection_Handle. see Bluetooth Specification [Vol 2] part E, Section 7.8.47</p><h3>Input 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>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</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>
@@ -1840,7 +1844,7 @@ Default: N= 0x0384 (900 secs or 15 minutes)</p>
</td><td></td></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle related to the response.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>TX_PHY</p>
</td><td><p>1</p>
@@ -1872,11 +1876,11 @@ Default: N= 0x0384 (900 secs or 15 minutes)</p>
</td><td><p>1</p>
</td><td><p>Status error code.</p>
</td><td></td></tr>
-</table><h3>Events generated</h3><li><a href="#HCI_COMMAND_COMPLETE_EVENT_anchor">HCI_COMMAND_COMPLETE_EVENT</a></li><h2><a name="HCI_LE_SET_PHY_anchor">HCI_LE_SET_PHY</a></h2><h3>Description</h3><p>The LE_Set_PHY command is used to set the PHY preferences for the connection identified by the Connection_Handle. The Controller might not be able to make the change (e.g. because the peer does not support the requested PHY) or may decide that the current PHY is preferable.<br>The ALL_PHYS parameter is a bit field that allows the Host to specify, for each direction, whether it has no preference among the PHYs that the Controller supports in a given direction or whether it has specified particular PHYs that it prefers in the TX_PHYS or RX_PHYS parameter.<br>The TX_PHYS parameter is a bit field that indicates the transmitter PHYs that the Host prefers the Controller to use. If the ALL_PHYS parameter specifies that the Host has no preference, the TX_PHYS parameter is ignored; otherwise at least one bit shall be set to 1.<br>The RX_PHYS parameter is a bit field that indicates the receiver PHYs that the Host prefers the Controller to use. If the ALL_PHYS parameter specifies that the Host has no preference, the RX_PHYS parameter is ignored; otherwise at least one bit shall be set to 1.<br>If, for at least one direction, the Host has specified a preference and the current PHY is not one of those preferred, the Controller shall request a change. Otherwise the Controller may, but need not, request a change.<br>The PHY preferences provided by the LE Set PHY command override those provided via the LE Set Default PHY command (Section 7.8.48) or any preferences previously set using the LE Set PHY command on the same connection.<br>The PHY_options parameter is a bit field that allows the Host to specify options for PHYs. The default value for a new connection shall be all zero bits. The Controller may override any preferred coding for transmitting on the LE Coded PHY.<br>The Host may specify a preferred coding even if it prefers not to use the LE Coded transmitter PHY since the Controller may override the PHY preference.<br>see Bluetooth Specification v5.0 [Vol 6] Part B, Section 7.8.49 </p><h3>Input parameters</h3><table width="800" border="1" class="reference">
+</table><h3>Events generated</h3><li><a href="#HCI_COMMAND_COMPLETE_EVENT_anchor">HCI_COMMAND_COMPLETE_EVENT</a></li><h2><a name="HCI_LE_SET_PHY_anchor">HCI_LE_SET_PHY</a></h2><h3>Description</h3><p>The LE_Set_PHY command is used to set the PHY preferences for the connection identified by the Connection_Handle. The Controller might not be able to make the change (e.g. because the peer does not support the requested PHY) or may decide that the current PHY is preferable.<br>The ALL_PHYS parameter is a bit field that allows the Host to specify, for each direction, whether it has no preference among the PHYs that the Controller supports in a given direction or whether it has specified particular PHYs that it prefers in the TX_PHYS or RX_PHYS parameter.<br>The TX_PHYS parameter is a bit field that indicates the transmitter PHYs that the Host prefers the Controller to use. If the ALL_PHYS parameter specifies that the Host has no preference, the TX_PHYS parameter is ignored; otherwise at least one bit shall be set to 1.<br>The RX_PHYS parameter is a bit field that indicates the receiver PHYs that the Host prefers the Controller to use. If the ALL_PHYS parameter specifies that the Host has no preference, the RX_PHYS parameter is ignored; otherwise at least one bit shall be set to 1.<br>If, for at least one direction, the Host has specified a preference and the current PHY is not one of those preferred, the Controller shall request a change. Otherwise the Controller may, but need not, request a change.<br>The PHY preferences provided by the LE Set PHY command override those provided via the LE Set Default PHY command (Section 7.8.48) or any preferences previously set using the LE Set PHY command on the same connection.<br>The PHY_options parameter is a bit field that allows the Host to specify options for PHYs. The default value for a new connection shall be all zero bits. The Controller may override any preferred coding for transmitting on the LE Coded PHY.<br>The Host may specify a preferred coding even if it prefers not to use the LE Coded transmitter PHY since the Controller may override the PHY preference.<br>(See Bluetooth Specification v5.0 [Vol 6] Part B, Section 7.8.49)</p><h3>Input 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>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>ALL_PHYS</p>
</td><td><p>1</p>
@@ -1892,28 +1896,51 @@ Default: N= 0x0384 (900 secs or 15 minutes)</p>
</td><td><li>0x00 ... 0x03</li></td></tr>
<tr><td><p>PHY_options</p>
</td><td><p>2</p>
-</td><td><p>Not Supported by STM32WB</p>
+</td><td><p>Not supported</p>
+</td><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>
+</td><td><p>1</p>
+</td><td><p>Status error code.</p>
+</td><td></td></tr>
+</table><h3>Events generated</h3><li><a href="#HCI_COMMAND_STATUS_EVENT_anchor">HCI_COMMAND_STATUS_EVENT</a></li><li><a href="#HCI_LE_PHY_UPDATE_COMPLETE_EVENT_anchor">HCI_LE_PHY_UPDATE_COMPLETE_EVENT</a></li><h2><a name="HCI_LE_SET_PRIVACY_MODE_anchor">HCI_LE_SET_PRIVACY_MODE</a></h2><h3>Description</h3><p>This command is used to allow the Host to specify the privacy mode to be used for a given entry on the resolving list.<br>(See Bluetooth Specification v.5.0 [Vol 2] Part E, Section 7.8.77)</p><h3>Input 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>Peer_Identity_Address_Type</p>
+</td><td><p>1</p>
+</td><td><p>Identity address type.</p>
+</td><td><li>0x00: Public Identity Address</li><li>0x01: Random (static) Identity Address</li></td></tr>
+<tr><td><p>Peer_Identity_Address</p>
+</td><td><p>6</p>
+</td><td><p>Public or Random (static) Identity address of the peer device</p>
</td><td></tr>
+<tr><td><p>Privacy_Mode</p>
+</td><td><p>1</p>
+</td><td><p>Privacy Mode.</p>
+</td><td><li>0x00: Use Network Privacy Mode</li><li>0x01: Use Device Privacy Mode</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>
</td><td><p>1</p>
</td><td><p>Status error code.</p>
</td><td></td></tr>
-</table><h3>Events generated</h3><li><a href="#HCI_COMMAND_STATUS_EVENT_anchor">HCI_COMMAND_STATUS_EVENT</a></li><li><a href="#HCI_LE_PHY_UPDATE_COMPLETE_EVENT_anchor">HCI_LE_PHY_UPDATE_COMPLETE_EVENT</a></li><h2><a name="HCI TESTING commands_anchor">HCI TESTING commands</a></h2><h2></h2><table width="800" border="1" class="reference">
+</table><h3>Events generated</h3><li><a href="#HCI_COMMAND_COMPLETE_EVENT_anchor">HCI_COMMAND_COMPLETE_EVENT</a></li><h2><a name="HCI TESTING commands_anchor">HCI TESTING commands</a></h2><h2></h2><table width="800" border="1" class="reference">
<tr><th>Command</th><th>Opcode</th><th>LO</th><th>SO</th><th>BO</th></tr>
<tr><td><a href="#HCI_LE_RECEIVER_TEST_anchor">HCI_LE_RECEIVER_TEST</a></td><td><p>0x201D</p>
</td><td><p>Y</p>
</td><td><p>Y</p>
-</td><td></td></tr>
+</td><td><p>Y</p>
+</td></tr>
<tr><td><a href="#HCI_LE_TRANSMITTER_TEST_anchor">HCI_LE_TRANSMITTER_TEST</a></td><td><p>0x201E</p>
</td><td><p>Y</p>
</td><td><p>Y</p>
-</td><td></td></tr>
+</td><td><p>Y</p>
+</td></tr>
<tr><td><a href="#HCI_LE_TEST_END_anchor">HCI_LE_TEST_END</a></td><td><p>0x201F</p>
</td><td><p>Y</p>
</td><td><p>Y</p>
-</td><td></td></tr>
+</td><td><p>Y</p>
+</td></tr>
<tr><td><a href="#HCI_LE_ENHANCED_RECEIVER_TEST_anchor">HCI_LE_ENHANCED_RECEIVER_TEST</a></td><td><p>0x2033</p>
</td><td><p>Y</p>
</td><td></td><td></td></tr>
@@ -1964,7 +1991,7 @@ Frequency Range : 2402 MHz to 2480 MHz</p>
</td><td><p>2</p>
</td><td><p>Number of packets received</p>
</td><td></tr>
-</table><h3>Events generated</h3><li><a href="#HCI_COMMAND_COMPLETE_EVENT_anchor">HCI_COMMAND_COMPLETE_EVENT</a></li><h2><a name="HCI_LE_ENHANCED_RECEIVER_TEST_anchor">HCI_LE_ENHANCED_RECEIVER_TEST</a></h2><h3>Description</h3><p>This command is used to start a test where the DUT receives test reference packets at a fixed interval. The tester generates the test reference packets.<br>see Bluetooth Specification v5.0 [Vol 6] Part B, Section 7.8.50 </p><h3>Input parameters</h3><table width="800" border="1" class="reference">
+</table><h3>Events generated</h3><li><a href="#HCI_COMMAND_COMPLETE_EVENT_anchor">HCI_COMMAND_COMPLETE_EVENT</a></li><h2><a name="HCI_LE_ENHANCED_RECEIVER_TEST_anchor">HCI_LE_ENHANCED_RECEIVER_TEST</a></h2><h3>Description</h3><p>This command is used to start a test where the DUT receives test reference packets at a fixed interval. The tester generates the test reference packets.<br>(See Bluetooth Specification v5.0 [Vol 6] Part B, Section 7.8.50)</p><h3>Input 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>RX_Frequency</p>
</td><td><p>1</p>
@@ -1985,7 +2012,7 @@ Frequency Range : 2402 MHz to 2480 MHz</p>
</td><td><p>1</p>
</td><td><p>Status error code.</p>
</td><td></td></tr>
-</table><h3>Events generated</h3><li><a href="#HCI_COMMAND_COMPLETE_EVENT_anchor">HCI_COMMAND_COMPLETE_EVENT</a></li><h2><a name="HCI_LE_ENHANCED_TRANSMITTER_TEST_anchor">HCI_LE_ENHANCED_TRANSMITTER_TEST</a></h2><h3>Description</h3><p>This command is used to start a test where the DUT generates test reference packets at a fixed interval. The Controller shall transmit at maximum power.<br>An LE Controller supporting the LE_Enhanced Transmitter_Test command shall support Packet_Payload values 0x00, 0x01 and 0x02. An LE Controller supporting the LE Coded PHY shall also support Packet_Payload value 0x04 (not supported by STM32WB). An LE Controller may support other values of Packet_Payload.<br>see Bluetooth Specification v5.0 [Vol 6] Part B, Section 7.8.51</p><h3>Input parameters</h3><table width="800" border="1" class="reference">
+</table><h3>Events generated</h3><li><a href="#HCI_COMMAND_COMPLETE_EVENT_anchor">HCI_COMMAND_COMPLETE_EVENT</a></li><h2><a name="HCI_LE_ENHANCED_TRANSMITTER_TEST_anchor">HCI_LE_ENHANCED_TRANSMITTER_TEST</a></h2><h3>Description</h3><p>This command is used to start a test where the DUT generates test reference packets at a fixed interval. The Controller shall transmit at maximum power.<br>An LE Controller supporting the LE_Enhanced Transmitter_Test command shall support Packet_Payload values 0x00, 0x01 and 0x02. An LE Controller supporting the LE Coded PHY shall also support Packet_Payload value 0x04 (not supported by STM32WB). An LE Controller may support other values of Packet_Payload.<br>(See Bluetooth Specification v5.0 [Vol 6] Part B, Section 7.8.51)</p><h3>Input 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>TX_Frequency</p>
</td><td><p>1</p>
@@ -2633,12 +2660,12 @@ connIntervalmax = Slave_Conn_Interval_Max x 1.25ms</p>
</td><td><p>2</p>
</td><td><p>Minimum advertising interval.
Time = N * 0.625 msec.</p>
-</td><td><li>0x0020 (20.000 ms) ... 0x4000 (10240.000 ms) </li></td></tr>
+</td><td><li>0x0006 (3.750 ms) : for High Duty Cycle Directed Advertising</li><li>0x0020 (20.000 ms) ... 0x4000 (10240.000 ms) : for Low Duty Cycle Directed Advertising</li></td></tr>
<tr><td><p>Advertising_Interval_Max</p>
</td><td><p>2</p>
</td><td><p>Maximum advertising interval.
Time = N * 0.625 msec.</p>
-</td><td><li>0x0020 (20.000 ms) ... 0x4000 (10240.000 ms) </li></td></tr>
+</td><td><li>0x0006 (3.750 ms) : for High Duty Cycle Directed Advertising</li><li>0x0020 (20.000 ms) ... 0x4000 (10240.000 ms) : for Low Duty Cycle Directed Advertising</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>
@@ -2708,7 +2735,7 @@ Any random value between 0 to 999999</p>
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Authorization_Enable</p>
</td><td><p>1</p>
@@ -2724,7 +2751,7 @@ Any random value between 0 to 999999</p>
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Pass_Key</p>
</td><td><p>4</p>
@@ -2741,7 +2768,7 @@ Must be a six-digit decimal number.</p>
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Authorize</p>
</td><td><p>1</p>
@@ -2839,7 +2866,7 @@ Time = N * 0.625 msec.</p>
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</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>
@@ -2879,7 +2906,7 @@ Time = N * 0.625 msec.</p>
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</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>
@@ -2917,7 +2944,7 @@ Time = N * 0.625 msec.</p>
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Reason</p>
</td><td><p>1</p>
@@ -2939,7 +2966,7 @@ Time = N * 0.625 msec.</p>
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</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>
@@ -3131,7 +3158,7 @@ Time = N * 0.625 msec.</p>
</td><td><li>0x00: Public Device Address</li><li>0x01: Random Device Address</li></td></tr>
<tr><td><p>Peer_Address[i]</p>
</td><td><p>6</p>
-</td><td><p>Public Device Address or Random Device Address of the device to be added to the white list.</p>
+</td><td><p>Public Device Address or Random Device Address.</p>
</td><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>
@@ -3239,7 +3266,7 @@ Time = N * 0.625 msec.</p>
</td><td><li>0x00: Public Device Address</li><li>0x01: Random Device Address</li></td></tr>
<tr><td><p>Peer_Address[i]</p>
</td><td><p>6</p>
-</td><td><p>Public Device Address or Random Device Address of the device to be added to the white list.</p>
+</td><td><p>Public Device Address or Random Device Address.</p>
</td><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>
@@ -3311,7 +3338,7 @@ Time = N * 0.625 msec.</p>
</td><td><p>1</p>
</td><td><p>Status error code.</p>
</td><td></td></tr>
-</table><h3>Events generated</h3><li><a href="#HCI_COMMAND_STATUS_EVENT_anchor">HCI_COMMAND_STATUS_EVENT</a></li><li><a href="#HCI_LE_CONNECTION_COMPLETE_EVENT_anchor">HCI_LE_CONNECTION_COMPLETE_EVENT</a></li><h2><a name="ACI_GAP_TERMINATE_GAP_PROC_anchor">ACI_GAP_TERMINATE_GAP_PROC</a></h2><h3>Description</h3><p>Terminate the specified GATT procedure. An <a href="#ACI_GAP_PROC_COMPLETE_EVENT_anchor">ACI_GAP_PROC_COMPLETE_EVENT</a> event is returned with the procedure code set to the corresponding procedure.</p><h3>Input parameters</h3><table width="800" border="1" class="reference">
+</table><h3>Events generated</h3><li><a href="#HCI_COMMAND_STATUS_EVENT_anchor">HCI_COMMAND_STATUS_EVENT</a></li><li><a href="#HCI_LE_CONNECTION_COMPLETE_EVENT_anchor">HCI_LE_CONNECTION_COMPLETE_EVENT</a></li><h2><a name="ACI_GAP_TERMINATE_GAP_PROC_anchor">ACI_GAP_TERMINATE_GAP_PROC</a></h2><h3>Description</h3><p>Terminate the specified GAP procedure. An <a href="#ACI_GAP_PROC_COMPLETE_EVENT_anchor">ACI_GAP_PROC_COMPLETE_EVENT</a> event is returned with the procedure code set to the corresponding procedure.</p><h3>Input 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>Procedure_Code</p>
</td><td><p>1</p>
@@ -3327,7 +3354,7 @@ Time = N * 0.625 msec.</p>
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Conn_Interval_Min</p>
</td><td><p>2</p>
@@ -3369,7 +3396,7 @@ Time = N * 0.625 msec.</p>
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Force_Rebond</p>
</td><td><p>1</p>
@@ -3439,7 +3466,7 @@ If Privacy is enabled, then the address can be a resolvable private address or a
</td><td><li>0x00: Public Device Address</li><li>0x01: Random Device Address</li></td></tr>
<tr><td><p>Peer_Address[i]</p>
</td><td><p>6</p>
-</td><td><p>Public Device Address or Random Device Address of the device to be added to the white list.</p>
+</td><td><p>Public Device Address or Random Device Address.</p>
</td><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>
@@ -3511,17 +3538,17 @@ Time = N * 0.625 msec.</p>
</td><td><li>0x00: Public Device Address</li><li>0x01: Random Device Address</li></td></tr>
<tr><td><p>Address[i]</p>
</td><td><p>6</p>
-</td><td><p>Public Device Address or Random Device Address of the device to be added to the white list.</p>
+</td><td><p>Public Device Address or Random Device Address.</p>
</td><td></tr>
</table><h3>Events generated</h3><li><a href="#HCI_COMMAND_COMPLETE_EVENT_anchor">HCI_COMMAND_COMPLETE_EVENT</a></li><h2><a name="ACI_GAP_IS_DEVICE_BONDED_anchor">ACI_GAP_IS_DEVICE_BONDED</a></h2><h3>Description</h3><p>The command finds whether the device, whose address is specified in the command, is bonded. If the device is using a resolvable private address and it has been bonded, then the command will return BLE_STATUS_SUCCESS.</p><h3>Input 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>Peer_Address_Type</p>
</td><td><p>1</p>
-</td><td><p>Address type.</p>
-</td><td><li>0x00: Public Device Address</li><li>0x01: Random Device Address</li></td></tr>
+</td><td><p>Identity address type.</p>
+</td><td><li>0x00: Public Identity Address</li><li>0x01: Random (static) Identity Address</li></td></tr>
<tr><td><p>Peer_Address</p>
</td><td><p>6</p>
-</td><td><p>Address used by the peer device while advertising</p>
+</td><td><p>Public or Random (static) Identity address of the peer device</p>
</td><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>
@@ -3533,7 +3560,7 @@ Time = N * 0.625 msec.</p>
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Confirm_Yes_No</p>
</td><td><p>1</p>
@@ -3550,7 +3577,7 @@ Time = N * 0.625 msec.</p>
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Input_Type</p>
</td><td><p>1</p>
@@ -4045,7 +4072,7 @@ If the Val_Offset is set to a value greater than 0, then the length of the attri
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</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>
@@ -4057,7 +4084,7 @@ If the Val_Offset is set to a value greater than 0, then the length of the attri
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Start_Handle</p>
</td><td><p>2</p>
@@ -4077,7 +4104,7 @@ If the Val_Offset is set to a value greater than 0, then the length of the attri
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Start_Handle</p>
</td><td><p>2</p>
@@ -4109,7 +4136,7 @@ If the Val_Offset is set to a value greater than 0, then the length of the attri
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Start_Handle</p>
</td><td><p>2</p>
@@ -4137,7 +4164,7 @@ If the Val_Offset is set to a value greater than 0, then the length of the attri
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Start_Handle</p>
</td><td><p>2</p>
@@ -4165,7 +4192,7 @@ If the Val_Offset is set to a value greater than 0, then the length of the attri
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Attr_Handle</p>
</td><td><p>2</p>
@@ -4193,7 +4220,7 @@ If the Val_Offset is set to a value greater than 0, then the length of the attri
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Execute</p>
</td><td><p>1</p>
@@ -4209,7 +4236,7 @@ If the Val_Offset is set to a value greater than 0, then the length of the attri
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</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>
@@ -4221,7 +4248,7 @@ If the Val_Offset is set to a value greater than 0, then the length of the attri
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>UUID_Type</p>
</td><td><p>1</p>
@@ -4241,7 +4268,7 @@ If the Val_Offset is set to a value greater than 0, then the length of the attri
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Start_Handle</p>
</td><td><p>2</p>
@@ -4261,7 +4288,7 @@ If the Val_Offset is set to a value greater than 0, then the length of the attri
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Start_Handle</p>
</td><td><p>2</p>
@@ -4281,7 +4308,7 @@ If the Val_Offset is set to a value greater than 0, then the length of the attri
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Start_Handle</p>
</td><td><p>2</p>
@@ -4309,7 +4336,7 @@ If the Val_Offset is set to a value greater than 0, then the length of the attri
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Char_Handle</p>
</td><td><p>2</p>
@@ -4329,7 +4356,7 @@ If the Val_Offset is set to a value greater than 0, then the length of the attri
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Attr_Handle</p>
</td><td><p>2</p>
@@ -4345,7 +4372,7 @@ If the Val_Offset is set to a value greater than 0, then the length of the attri
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Start_Handle</p>
</td><td><p>2</p>
@@ -4373,7 +4400,7 @@ If the Val_Offset is set to a value greater than 0, then the length of the attri
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Attr_Handle</p>
</td><td><p>2</p>
@@ -4393,7 +4420,7 @@ If the Val_Offset is set to a value greater than 0, then the length of the attri
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Number_of_Handles</p>
</td><td><p>1</p>
@@ -4413,7 +4440,7 @@ If the Val_Offset is set to a value greater than 0, then the length of the attri
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Attr_Handle</p>
</td><td><p>2</p>
@@ -4437,7 +4464,7 @@ If the Val_Offset is set to a value greater than 0, then the length of the attri
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Attr_Handle</p>
</td><td><p>2</p>
@@ -4465,7 +4492,7 @@ If the Val_Offset is set to a value greater than 0, then the length of the attri
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Attr_Handle</p>
</td><td><p>2</p>
@@ -4493,7 +4520,7 @@ If the Val_Offset is set to a value greater than 0, then the length of the attri
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Attr_Handle</p>
</td><td><p>2</p>
@@ -4521,7 +4548,7 @@ If the Val_Offset is set to a value greater than 0, then the length of the attri
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Attr_Handle</p>
</td><td><p>2</p>
@@ -4541,7 +4568,7 @@ If the Val_Offset is set to a value greater than 0, then the length of the attri
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Attr_Handle</p>
</td><td><p>2</p>
@@ -4565,7 +4592,7 @@ If the Val_Offset is set to a value greater than 0, then the length of the attri
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Attr_Handle</p>
</td><td><p>2</p>
@@ -4581,7 +4608,7 @@ If the Val_Offset is set to a value greater than 0, then the length of the attri
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Attr_Handle</p>
</td><td><p>2</p>
@@ -4605,7 +4632,7 @@ If the Val_Offset is set to a value greater than 0, then the length of the attri
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Attr_Handle</p>
</td><td><p>2</p>
@@ -4629,7 +4656,7 @@ If the Val_Offset is set to a value greater than 0, then the length of the attri
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</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>
@@ -4641,7 +4668,7 @@ If the Val_Offset is set to a value greater than 0, then the length of the attri
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Attr_Handle</p>
</td><td><p>2</p>
@@ -4673,7 +4700,7 @@ If the Val_Offset is set to a value greater than 0, then the length of the attri
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</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>
@@ -4813,7 +4840,7 @@ In case of a variable size characteristic, this field specifies the new length o
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Error_Code</p>
</td><td><p>1</p>
@@ -4856,7 +4883,7 @@ In case of a variable size characteristic, this field specifies the new length o
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Conn_Interval_Min</p>
</td><td><p>2</p>
@@ -4886,7 +4913,7 @@ Time = N * 1.25 msec.</p>
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Conn_Interval_Min</p>
</td><td><p>2</p>
@@ -4988,7 +5015,7 @@ Time = N * 0.625 msec.</p>
</td><td></td></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Encryption_Enabled</p>
</td><td><p>1</p>
@@ -5002,7 +5029,7 @@ Time = N * 0.625 msec.</p>
</td><td></td></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Version</p>
</td><td><p>1</p>
@@ -5048,7 +5075,7 @@ Error code 3 is internal FIFO full.</p>
</td><td></td></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle for which the command is given.</p>
+</td><td><p>Connection handle for which the command applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
</table><h2><a name="HCI_COMMAND_COMPLETE_EVENT_anchor">HCI_COMMAND_COMPLETE_EVENT</a></h2><h3>Description</h3><p>The Command Complete event is used by the Controller for most commands to transmit return status of a command and the other event parameters that are specified for the issued HCI command.<br>The Num_HCI_Command_Packets event parameter allows the Controller to indicate the number of HCI command packets the Host can send to the Controller.<br>If the Controller requires the Host to stop sending commands, the Num_HCI_Command_Packets event parameter will be set to zero. To indicate to the Host that the Controller is ready to receive HCI command packets, the Controller generates a Command Complete event with the Command_Opcode 0x0000, and the Num_HCI_Command_Packets event parameter is set to 1 or more. See each command for the parameters that are returned by this event.</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>
@@ -5131,7 +5158,7 @@ Error code 3 is internal FIFO full.</p>
</td><td></td></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle to be used to identify the connection with the peer device.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Role</p>
</td><td><p>1</p>
@@ -5213,7 +5240,7 @@ Units: dBm</p>
</td><td></td></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle to be used to identify the connection with the peer device.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Conn_Interval</p>
</td><td><p>2</p>
@@ -5238,7 +5265,7 @@ Time = N * 10 msec.</p>
</td><td></td></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle to be used to identify the connection with the peer device.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>LE_Features</p>
</td><td><p>8</p>
@@ -5248,7 +5275,7 @@ Time = N * 10 msec.</p>
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle to be used to identify the connection with the peer device.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Random_Number</p>
</td><td><p>8</p>
@@ -5262,7 +5289,7 @@ Time = N * 10 msec.</p>
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle to be used to identify the connection with the peer device.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>MaxTxOctets</p>
</td><td><p>2</p>
@@ -5308,7 +5335,7 @@ Time = N * 10 msec.</p>
</td><td></td></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle to be used to identify the connection with the peer device.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Role</p>
</td><td><p>1</p>
@@ -5608,7 +5635,7 @@ Units: dBm</p>
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle related to the response.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Server_RX_MTU</p>
</td><td><p>2</p>
@@ -5618,7 +5645,7 @@ Units: dBm</p>
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle related to the response.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Format</p>
</td><td><p>1</p>
@@ -5636,7 +5663,7 @@ Units: dBm</p>
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle related to the response.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Num_of_Handle_Pair</p>
</td><td><p>1</p>
@@ -5654,7 +5681,7 @@ Units: dBm</p>
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle related to the response.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Handle_Value_Pair_Length</p>
</td><td><p>1</p>
@@ -5672,7 +5699,7 @@ Units: dBm</p>
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle related to the response.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Event_Data_Length</p>
</td><td><p>1</p>
@@ -5686,7 +5713,7 @@ Units: dBm</p>
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle related to the response.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Event_Data_Length</p>
</td><td><p>1</p>
@@ -5700,7 +5727,7 @@ Units: dBm</p>
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle related to the response.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Event_Data_Length</p>
</td><td><p>1</p>
@@ -5715,7 +5742,7 @@ A concatenation of attribute values for each of the attribute handles in the req
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle related to the response.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Attribute_Data_Length</p>
</td><td><p>1</p>
@@ -5733,7 +5760,7 @@ A concatenation of attribute values for each of the attribute handles in the req
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle related to the response.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Attribute_Handle</p>
</td><td><p>2</p>
@@ -5755,13 +5782,13 @@ A concatenation of attribute values for each of the attribute handles in the req
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle related to the response.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
</table><h2><a name="ACI_GATT_INDICATION_EVENT_anchor">ACI_GATT_INDICATION_EVENT</a></h2><h3>Description</h3><p>This event is generated when an indication is received from the server.</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>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle related to the response.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Attribute_Handle</p>
</td><td><p>2</p>
@@ -5779,7 +5806,7 @@ A concatenation of attribute values for each of the attribute handles in the req
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle related to the response.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Attribute_Handle</p>
</td><td><p>2</p>
@@ -5797,7 +5824,7 @@ A concatenation of attribute values for each of the attribute handles in the req
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle related to the response.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Error_Code</p>
</td><td><p>1</p>
@@ -5807,7 +5834,7 @@ A concatenation of attribute values for each of the attribute handles in the req
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle related to the response.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Req_Opcode</p>
</td><td><p>1</p>
@@ -5825,7 +5852,7 @@ A concatenation of attribute values for each of the attribute handles in the req
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle related to the response.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Attribute_Handle</p>
</td><td><p>2</p>
@@ -5844,8 +5871,8 @@ It will be the value of the Characteristic if a &quot;Read using Characteristic
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Handle of the connection on which there was the request to write the attribute</p>
-</td><td></tr>
+</td><td><p>Connection handle for which the event applies.</p>
+</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Attribute_Handle</p>
</td><td><p>2</p>
</td><td><p>The handle of the attribute</p>
@@ -5862,7 +5889,7 @@ It will be the value of the Characteristic if a &quot;Read using Characteristic
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle related to the response.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Attribute_Handle</p>
</td><td><p>2</p>
@@ -5888,8 +5915,8 @@ It will be the value of the Characteristic if a &quot;Read using Characteristic
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle related to the request</p>
-</td><td></tr>
+</td><td><p>Connection handle for which the event applies.</p>
+</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Available_Buffers</p>
</td><td><p>2</p>
</td><td><p>Number of buffers available</p>
@@ -5898,14 +5925,14 @@ It will be the value of the Characteristic if a &quot;Read using Characteristic
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle related to the event</p>
-</td><td></tr>
+</td><td><p>Connection handle for which the event applies.</p>
+</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
</table><h2><a name="ACI_GATT_PREPARE_WRITE_PERMIT_REQ_EVENT_anchor">ACI_GATT_PREPARE_WRITE_PERMIT_REQ_EVENT</a></h2><h3>Description</h3><p>This event is given to the application when a prepare write request is received by the server from the client. This event will be given to the application only if the event bit for this event generation is set when the characteristic was added.<br>When this event is received, the application has to check whether the value being requested for write can be allowed to be written and respond with the command <a href="#ACI_GATT_WRITE_RESP_anchor">ACI_GATT_WRITE_RESP</a>. Based on the response from the application, the attribute value will be modified by the stack.<br>If the write is rejected by the application, then the value of the attribute will not be modified and an error response will be sent to the client, with the error code as specified by the application.</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>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Handle of the connection on which there was the request to write the attribute</p>
-</td><td></tr>
+</td><td><p>Connection handle for which the event applies.</p>
+</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Attribute_Handle</p>
</td><td><p>2</p>
</td><td><p>The handle of the attribute</p>
@@ -5926,7 +5953,7 @@ It will be the value of the Characteristic if a &quot;Read using Characteristic
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle related to the response.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Offset</p>
</td><td><p>2</p>
@@ -5944,7 +5971,7 @@ It will be the value of the Characteristic if a &quot;Read using Characteristic
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle related to the response.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Attribute_Handle</p>
</td><td><p>2</p>
@@ -5966,7 +5993,7 @@ It will be the value of the Characteristic if a &quot;Read using Characteristic
<tr><th>Parameter</th><th>Size</th><th>Description</th><th>Possible values</th></tr>
<tr><td><p>Connection_Handle</p>
</td><td><p>2</p>
-</td><td><p>Connection handle related to the response.</p>
+</td><td><p>Connection handle for which the event applies.</p>
</td><td><li>0x0000 ... 0x0EFF</li></td></tr>
<tr><td><p>Attribute_Handle</p>
</td><td><p>2</p>
diff --git a/Middlewares/ST/STM32_WPAN/ble/core/template/ble_const.h b/Middlewares/ST/STM32_WPAN/ble/core/template/ble_const.h
index ff3842a52..285538bcf 100644
--- a/Middlewares/ST/STM32_WPAN/ble/core/template/ble_const.h
+++ b/Middlewares/ST/STM32_WPAN/ble/core/template/ble_const.h
@@ -1,11 +1,11 @@
/*****************************************************************************
* @file ble_const.h
- * @author MCD Application Team
+ * @author MCD
* @brief This file contains the definitions which are compiler dependent.
*****************************************************************************
* @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,6 +34,9 @@
#ifndef SLAVE_ONLY
#define SLAVE_ONLY 0
#endif
+#ifndef BEACON_ONLY
+#define BEACON_ONLY 0
+#endif
/* Size of command/events buffers:
@@ -114,6 +117,6 @@ extern int hci_send_req( struct hci_request* req, uint8_t async );
#endif
-#endif /* ! BLE_CONST_H__ */
+#endif /* BLE_CONST_H__ */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE***/
diff --git a/Middlewares/ST/STM32_WPAN/ble/core/template/compiler.h b/Middlewares/ST/STM32_WPAN/ble/core/template/compiler.h
index 0f01c7f32..ffe7bd8b8 100644
--- a/Middlewares/ST/STM32_WPAN/ble/core/template/compiler.h
+++ b/Middlewares/ST/STM32_WPAN/ble/core/template/compiler.h
@@ -1,6 +1,6 @@
/*****************************************************************************
* @file compiler.h
- * @author MCD Application Team
+ * @author MCD
* @brief This file contains the definitions which are compiler dependent.
*****************************************************************************
* @attention
@@ -150,6 +150,6 @@
#endif
-#endif /* ! COMPILER_H__ */
+#endif /* COMPILER_H__ */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE***/
diff --git a/Middlewares/ST/STM32_WPAN/ble/core/template/osal.c b/Middlewares/ST/STM32_WPAN/ble/core/template/osal.c
index 850566bcf..8eb093e51 100644
--- a/Middlewares/ST/STM32_WPAN/ble/core/template/osal.c
+++ b/Middlewares/ST/STM32_WPAN/ble/core/template/osal.c
@@ -1,12 +1,12 @@
/*****************************************************************************
* @file osal.c
- * @author MCD Application Team
+ * @author MCD
* @brief Implements the interface defined in "osal.h" needed by the stack.
* Actually, only memset, memcpy and memcmp wrappers are implemented.
*****************************************************************************
* @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/template/osal.h b/Middlewares/ST/STM32_WPAN/ble/core/template/osal.h
index 665200a08..197bf013c 100644
--- a/Middlewares/ST/STM32_WPAN/ble/core/template/osal.h
+++ b/Middlewares/ST/STM32_WPAN/ble/core/template/osal.h
@@ -1,6 +1,6 @@
/*****************************************************************************
* @file osal.h
- * @author MCD Application Team
+ * @author MCD
* @brief This header file defines the OS abstraction layer used by
* the BLE stack. OSAL defines the set of functions which needs to be
* ported to target operating system and target platform.
@@ -8,7 +8,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/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
deleted file mode 100644
index 7dc35c6ca..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CBC/aes_cbc.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/**
- ******************************************************************************
- * @file aes_cbc.h
- * @author MCD Application Team
- * @brief AES in CBC Mode
- ******************************************************************************
- * @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 __CRL_AES_CBC_H__
-#define __CRL_AES_CBC_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /** @ingroup AESCBC
- * @{
- */
-
- /* Exported functions --------------------------------------------------------*/
-#ifdef INCLUDE_ENCRYPTION
- /* load the key and ivec, eventually performs key schedule, etc. */
- int32_t AES_CBC_Encrypt_Init (AESCBCctx_stt *P_pAESCBCctx, \
- const uint8_t *P_pKey, \
- const uint8_t *P_pIv);
-
- /* launch crypto operation , can be called several times */
- int32_t AES_CBC_Encrypt_Append (AESCBCctx_stt *P_pAESCBCctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
- \
-
- /* Possible final output */
- int32_t AES_CBC_Encrypt_Finish (AESCBCctx_stt *P_pAESCBCctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-#endif
-
-#ifdef INCLUDE_DECRYPTION
- /* load the key and ivec, eventually performs key schedule, etc. */
- int32_t AES_CBC_Decrypt_Init (AESCBCctx_stt *P_pAESCBCctx, \
- const uint8_t *P_pKey, \
- const uint8_t *P_pIv);
- \
-
- /* launch crypto operation , can be called several times */
- int32_t AES_CBC_Decrypt_Append (AESCBCctx_stt *P_pAESCBCctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /* Possible final output */
- int32_t AES_CBC_Decrypt_Finish (AESCBCctx_stt *P_pAESCBCctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-#endif
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __CRL_AES_CBC_H__*/
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 727e24ad5..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CCM/aes_ccm.h
+++ /dev/null
@@ -1,124 +0,0 @@
-/**
- ******************************************************************************
- * @file aes_ccm.h
- * @author MCD Application Team
- * @brief AES in CCM (Counter with CBC-MAC) Mode
- ******************************************************************************
- * @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 __CRL_AES_CCM_H__
-#define __CRL_AES_CCM_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /** @ingroup AESCCM
- * @{
- */
-
- /* Exported types ------------------------------------------------------------*/
- /** Structure used only for AES-GCM. Used to store the expanded key and, eventually,
- * precomputed tables, according the the defined value of CRL_GFMUL in config.h */
- typedef struct
- {
- /** Unique ID of this AES-GCM Context. \b Not \b used in current implementation. */
- uint32_t mContextId;
- /** 32 bit mFlags, used to perform keyschedule */
- SKflags_et mFlags;
- /** Pointer to original Key buffer */
- const uint8_t *pmKey;
- /** Pointer to original Nonce buffer */
- const uint8_t *pmNonce;
- /** Size of the Nonce in bytes. This must be set by the caller prior to calling Init.
- Possible values are {7,8,9,10,11,12,13} */
- int32_t mNonceSize;
- /** This is the current IV value for encryption.*/
- uint32_t amIvCTR[4];
- /** This is the current IV value for authentication.*/
- uint32_t amIvCBC[4];
- /** AES Key length in bytes. This must be set by the caller prior to calling Init */
- int32_t mKeySize;
- /** Pointer to Authentication TAG. This value must be set in decryption, and this TAG will be verified */
- const uint8_t *pmTag;
- /** Size of the Tag to return. This must be set by the caller prior to calling Init.
- Possible values are values are {4,6,8,10,12,14,16} */
- int32_t mTagSize;
- /** Size of the associated data to be processed yet. This must be set by the caller prior to calling Init.*/
- int32_t mAssDataSize;
- /** Size of the payload data to be processed yet size. This must be set by the caller prior to calling Init. */
- int32_t mPayloadSize;
- /** AES Expanded key. For internal use. */
- uint32_t amExpKey[CRL_AES_MAX_EXPKEY_SIZE];
- /** Temp Buffer */
- uint32_t amTmpBuf[CRL_AES_BLOCK/sizeof(uint32_t)];
- /** Number of bytes actually in use */
- int32_t mTmpBufUse;
- }
- AESCCMctx_stt;
-
- /* Exported functions --------------------------------------------------------*/
- /* load the key and ivec, eventually performs key schedule, etc. */
- int32_t AES_CCM_Encrypt_Init (AESCCMctx_stt *P_pAESCCMctx, \
- const uint8_t *P_pKey, \
- const uint8_t *P_pNonce);
-
- /* Header Processing Function */
- int32_t AES_CCM_Header_Append (AESCCMctx_stt *P_pAESCCMctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize);
-
- /* launch crypto operation , can be called several times */
- int32_t AES_CCM_Encrypt_Append (AESCCMctx_stt *P_pAESCCMctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /* Possible final output */
- int32_t AES_CCM_Encrypt_Finish (AESCCMctx_stt *P_pAESCCMctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /* load the key and ivec, eventually performs key schedule, etc. */
- int32_t AES_CCM_Decrypt_Init (AESCCMctx_stt *P_pAESCCMctx, \
- const uint8_t *P_pKey, \
- const uint8_t *P_pNonce);
-
- /* launch crypto operation , can be called several times */
- int32_t AES_CCM_Decrypt_Append (AESCCMctx_stt *P_pAESCCMctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /* Possible final output */
- int32_t AES_CCM_Decrypt_Finish (AESCCMctx_stt *P_pAESCCMctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __CRL_AES_CCM_H__ */
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 4571d7e1b..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CFB/aes_cfb.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- ******************************************************************************
- * @file aes_cfb.h
- * @author MCD Application Team
- * @brief AES in CFB Mode
- ******************************************************************************
- * @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 __CRL_AES_CFB_H__
-#define __CRL_AES_CFB_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /** @ingroup AESCFB
- * @{
- */
-
- /** CFB context = CBC context. AESCFBctx_stt is equal to AESCBCctx_stt */
- typedef AESCBCctx_stt AESCFBctx_stt;
-
-#ifdef INCLUDE_ENCRYPTION
- /* load the key and ivec, eventually performs key schedule, etc. */
- int32_t AES_CFB_Encrypt_Init (AESCFBctx_stt *P_pAESCFBctx, \
- const uint8_t *P_pKey, \
- const uint8_t *P_pIv);
-
- /* launch crypto operation , can be called several times */
- int32_t AES_CFB_Encrypt_Append (AESCFBctx_stt *P_pAESCFBctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /* Possible final output */
- int32_t AES_CFB_Encrypt_Finish (AESCFBctx_stt *P_pAESCFBctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-#endif
-#ifdef INCLUDE_DECRYPTION
- /* load the key and ivec, eventually performs key schedule, etc. */
- int32_t AES_CFB_Decrypt_Init (AESCFBctx_stt *P_pAESCFBctx, const uint8_t *P_pKey, const uint8_t *P_pIv);
-
- /* launch crypto operation , can be called several times */
- int32_t AES_CFB_Decrypt_Append (AESCFBctx_stt *P_pAESCFBctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /* Possible final output */
- int32_t AES_CFB_Decrypt_Finish (AESCFBctx_stt *P_pAESCFBctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-#endif
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __CRL_AES_CFB_H__*/
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 954fc90cb..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CMAC/aes_cmac.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/**
- ******************************************************************************
- * @file aes_cmac.h
- * @author MCD Application Team
- * @brief AES in CMAC Mode
- ******************************************************************************
- * @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 __CRL_AES_CMAC_H__
-#define __CRL_AES_CMAC_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /** @ingroup AESCMAC
- * @{
- */
-
- /* Exported types ------------------------------------------------------------*/
- typedef struct
- {
- uint32_t mContextId; /*!< Unique ID of this context. \b Not \b used in current implementation. */
- SKflags_et mFlags; /*!< 32 bit mFlags, used to perform keyschedule and future use */
- const uint8_t *pmKey; /*!< Pointer to original Key buffer */
- const uint8_t *pmIv; /*!< Pointer to original Initialization Vector buffer */
- int32_t mIvSize; /*!< Size of the Initialization Vector in bytes */
- uint32_t amIv[4]; /*!< Temporary result/IV */
- int32_t mKeySize; /*!< Key length in bytes */
- uint32_t amExpKey[CRL_AES_MAX_EXPKEY_SIZE]; /*!< Expanded AES key */
- const uint8_t *pmTag; /*!< Pointer to Authentication TAG. This value must be set in decryption, and this TAG will be verified */
- int32_t mTagSize; /*!< Size of the Tag to return. This must be set by the caller prior to calling Init */
- }
- AESCMACctx_stt; /*<! AES context structure for CMAC mode */
-
- /* Exported functions --------------------------------------------------------*/
- int32_t AES_CMAC_Encrypt_Init (AESCMACctx_stt *P_pAESCMACctx);
-
- int32_t AES_CMAC_Encrypt_Append(AESCMACctx_stt *P_pAESCMACctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize);
- \
-
- int32_t AES_CMAC_Encrypt_Finish(AESCMACctx_stt *P_pAESCMACctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
- \
-
- int32_t AES_CMAC_Decrypt_Init (AESCMACctx_stt *P_pAESCMACctx);
-
- int32_t AES_CMAC_Decrypt_Append(AESCMACctx_stt *P_pAESCMACctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize);
- \
-
- int32_t AES_CMAC_Decrypt_Finish(AESCMACctx_stt *P_pAESCMACctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
- \
-
-
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __CRL_AES_CMAC_H__ */
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 19fafc300..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/CTR/aes_ctr.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/**
- ******************************************************************************
- * @file aes_ctr.h
- * @author MCD Application Team
- * @brief AES in CTR Mode
- ******************************************************************************
- * @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 __CRL_AES_CTR_H__
-#define __CRL_AES_CTR_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /** @ingroup AESCTR
- * @{
- */
-
- /* Exported types ------------------------------------------------------------*/
- /** CTR context = CBC context. AESCTRctx_stt is equal to AESCBCctx_stt */
- typedef AESCBCctx_stt AESCTRctx_stt;
- /* Exported functions --------------------------------------------------------*/
- /* load the key and ivec, eventually performs key schedule, etc. */
- int32_t AES_CTR_Encrypt_Init (AESCTRctx_stt *P_pAESCTRctx, \
- const uint8_t *P_pKey, \
- const uint8_t *P_pIv);
-
- /* launch crypto operation , can be called several times */
- int32_t AES_CTR_Encrypt_Append (AESCTRctx_stt *P_pAESCTRctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /* Possible final output */
- int32_t AES_CTR_Encrypt_Finish (AESCTRctx_stt *P_pAESCTRctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /* load the key and ivec, eventually performs key schedule, etc. */
- int32_t AES_CTR_Decrypt_Init (AESCTRctx_stt *P_pAESCTRctx, \
- const uint8_t *P_pKey, \
- const uint8_t *P_pIv);
-
- /* launch crypto operation , can be called several times */
- int32_t AES_CTR_Decrypt_Append (AESCTRctx_stt *P_pAESCTRctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /* Possible final output */
- int32_t AES_CTR_Decrypt_Finish (AESCTRctx_stt *P_pAESCTRctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /** @} */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __CRL_AES_CTR_H__ */
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 5a64beab8..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/Common/aes_common.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/**
- ******************************************************************************
- * @file aes_common.h
- * @author MCD Application Team
- * @brief AES common functions and definitions
- ******************************************************************************
- * @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 __AES_COMMON_H__
-#define __AES_COMMON_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-
- /** @addtogroup AES
- * @{
- */
- /* Exported constants --------------------------------------------------------*/
-#define CRL_AES128_KEY 16 /*!< Number of bytes (uint8_t) necessary to store an AES key of 128 bits. */
-#define CRL_AES128_EXPANDED_KEY 44 /*!< Number of ints (uint32_t) necessary to store an expanded AES key of 128 bits. */
-#define CRL_AES192_KEY 24 /*!< Number of bytes (uint8_t) necessary to store an AES key of 192 bits. */
-#define CRL_AES192_EXPANDED_KEY 52 /*!< Number of ints (uint32_t) necessary to store an expanded AES key of 192 bits. */
-#define CRL_AES256_KEY 32 /*!< Number of bytes (uint8_t) necessary to store an AES key of 256 bits. */
-#define CRL_AES256_EXPANDED_KEY 60 /*!< Number of ints (uint32_t) necessary to store an expanded AES key of 256 bits. */
-
-
-#define CRL_AES_BLOCK 16 /*!< Number of bytes (uint8_t) necessary to store an AES block. */
-
-#ifdef INCLUDE_AES256
-# define CRL_AES_MAX_EXPKEY_SIZE 60 /*!< The max size of the AES expanded key (in uint32_t) according to the INCLUDE OPTIONS */
-# else
-# ifdef INCLUDE_AES192
-# define CRL_AES_MAX_EXPKEY_SIZE 52 /*!< The max size of the AES expanded key (in uint32_t) according to the INCLUDE OPTIONS */
-# else
-# define CRL_AES_MAX_EXPKEY_SIZE 44 /*!< The max size of the AES expanded key (in uint32_t) according to the INCLUDE OPTIONS */
-# endif
-#endif /*include aes 256 */
-
- /**
- * @}
- */
-
- /* Exported types ------------------------------------------------------------*/
- /** @addtogroup AESCBC
- * @{
- */
- typedef struct
- {
- uint32_t mContextId; /*!< Unique ID of this context. \b Not \b used in current implementation. */
- SKflags_et mFlags; /*!< 32 bit mFlags, used to perform keyschedule */
- const uint8_t *pmKey; /*!< Pointer to original Key buffer */
- const uint8_t *pmIv; /*!< Pointer to original Initialization Vector buffer */
- int32_t mIvSize; /*!< Size of the Initialization Vector in bytes */
- uint32_t amIv[4]; /*!< Temporary result/IV */
- int32_t mKeySize; /*!< Key length in bytes */
- uint32_t amExpKey[CRL_AES_MAX_EXPKEY_SIZE]; /*!< Expanded AES key */
- }
- AESCBCctx_stt; /*!< AES context structure for CBC mode */
-
- /**
- * @}
- */
-
- /* Exported functions --------------------------------------------------------*/
-#ifdef INCLUDE_ENCRYPTION
-void AES_keyschedule_enc (const uint8_t *P_pKey, \
- uint32_t *P_pExpKey, \
- int32_t P_keySize);
-
-void AES_general_SW_enc (const uint32_t* P_pInputBuffer,\
- uint32_t* P_pOutputBuffer, \
- const uint32_t* P_pExpKey, \
- int32_t P_keySize);
-#endif
-
-#ifdef INCLUDE_DECRYPTION
-void AES_keyschedule_dec (const uint8_t *P_pKey, \
- uint32_t *P_pExpKey, \
- int32_t P_keySize);
-
-void AES_general_SW_dec (const uint32_t* P_pInputBuffer,\
- uint32_t* P_pOutputBuffer, \
- const uint32_t* P_pExpKey, \
- int32_t P_keySize);
-#endif
- /** @addtogroup AESlowlevel AES
- * @{
- */
-
-
-
- /**
- * @}
- */
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*__AES_COMMON_H__*/
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 7eef9a5ac..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/Common/aes_low_level.h
+++ /dev/null
@@ -1,151 +0,0 @@
-/**
- ******************************************************************************
- * @file aes_low_level.h
- * @author MCD Application Team
- * @brief AES low level functions
- ******************************************************************************
- * @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 __AES_LOW_LEVEL_H__
-#define __AES_LOW_LEVEL_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /** @addtogroup AESlowlevel
- * @{
- */
-
- /*------------------------------------------------------------------------------
- AES - Advanced Encryption Standard
- ------------------------------------------------------------------------------*/
- /* key size: 16 bytes (aes128), 24 bytes (aes192) or 32 bytes (aes256)
- * block size: 16 bytes */
-
-#define AES_BLOCK_SIZE 4 /*!< Number of (uint32_t) 32 bit words to store an AES block. */
-
- /*---------------------------AES MACROS---------------------------------------*/
-
- /** @defgroup AESmacros AES Macros
- * @{
- */
-
- /** Multiply for 2 each byte of a uint32_t working in parallel mode on each one. */
-#define Xtime(x) ((((x) & 0x7F7F7F7Fu) << 1) ^ ((((x) & 0x80808080u) >> 7) * 0x0000001Bu))
-
- /** Right shift x of n bytes. */
-#define upr(x,n) ((x) >> (8*(n))) | ((x) << (32 - (8*(n))))
-
- /** Develop of the matrix necessary for the MixColomn procedure. */
-#define fwd_mcol(x) (Xtime(x)^(upr(((x)^Xtime(x)),3)) ^ (upr((x),2)) ^ (upr((x),1)))
-
- /** Develop of the matrix necessary for the InvMixColomn procedure. */
-#define inv_mcol(x) (f2=Xtime(x),f4=Xtime(f2),f8=Xtime(f4),(x)^=f8, f2^=f4^f8^(upr((f2^(x)),3))^(upr((f4^(x)),2))^(upr((x),1)))
-
-
- /** Defines right rotation of a uint32_t by 3.*/
-#define rot3(x) (((x) << 8 ) | ((x) >> 24))
- /** Defines right rotation of a uint32_t by 2.*/
-#define rot2(x) (((x) << 16) | ((x) >> 16))
- /** Defines right rotation of a uint32_t by 1.*/
-#define rot1(x) (((x) << 24) | ((x) >> 8 ))
-
- /**
- * @}
- */
-
-
- /**
- * @}
- */
-
-
-
- /*----- AES 128 ---------------------------------------------------------------- */
- /** @ingroup AES128
- * @{
- */
-
-#define AES_KEY_SIZE 4 /*!< Number of (uint32_t) 32 bit words to store an AES128 key. */
-#define AES_EXPKEY_SIZE 44 /*!< Number of (uint32_t) 32 bit words to store an AES128 expanded key. */
-
- /* According to key computes the expanded key exp for AES128 encryption. */
- void AES128_keyschedule_enc(const uint32_t* key, uint32_t* expkey) ;
- /* According to key computes the expanded key exp for AES128 decryption. */
- void AES128_keyschedule_dec(const uint32_t* key, uint32_t* expkey) ;
- /* AES128 encryption of an AES128 block. */
- void AES128_encrypt(const uint32_t* input_pointer, uint32_t* output_pointer, const uint32_t* expkey) ;
- /* AES128 decryption of an AES128 block. */
- void AES128_decrypt(const uint32_t* input_pointer, uint32_t* output_pointer, const uint32_t* expkey) ;
-
- /**
- * @}
- */
-
- /*----- AES 192 ----------------------------------------------------------------*/
- /** @ingroup AES192
- * @{
- */
-
-#define AES192_BLOCK_SIZE 4 /*!< Number of (uint32_t) 32 bit words to store an AES192 block. */
-#define AES192_KEY_SIZE 6 /*!< Number of (uint32_t) 32 bit words to store an AES192 key. */
-#define AES192_EXPKEY_SIZE 52 /*!< Number of (uint32_t) 32 bit words to store an AES192 expanded key. */
-
- /* According to key computes the expanded key exp for AES192 encryption.*/
- void AES192_keyschedule_enc(const uint32_t* key, uint32_t* exp) ;
- /* According to key computes the expanded key exp for AES192 decryption. */
- void AES192_keyschedule_dec(const uint32_t* key, uint32_t* exp) ;
- /* AES192 encryption of an AES192 block. */
- void AES192_encrypt(const uint32_t* input_pointer, uint32_t* output_pointer, const uint32_t* expkey) ;
- /* AES192 decryption of an AES192 block. */
- void AES192_decrypt(const uint32_t* input_pointer, uint32_t* output_pointer, const uint32_t* expkey) ;
-
- /**
- * @}
- */
-
- /*----- AES 256 ----------------------------------------------------------------*/
- /** @ingroup AES256
- * @{
- */
-
-#define AES256_BLOCK_SIZE 4 /*!< Number of (uint32_t) 32 bit words to store an AES256 block. */
-#define AES256_KEY_SIZE 8 /*!< Number of (uint32_t) 32 bit words to store an AES256 key. */
-#define AES256_EXPKEY_SIZE 60 /*!< Number of (uint32_t) 32 bit words to store an AES256 expanded key. */
-
- /* According to key computes the expanded key exp for AES256 encryption. */
- void AES256_keyschedule_enc(const uint32_t* key, uint32_t* exp) ;
- /* According to key computes the expanded key exp for AES256 decryption. */
- void AES256_keyschedule_dec(const uint32_t* key, uint32_t* exp) ;
- /* AES256 encryption of an AES256 block. */
- void AES256_encrypt(const uint32_t* input_pointer, uint32_t* output_pointer, const uint32_t* expkey) ;
- /* AES256 decryption of an AES256 block. */
- void AES256_decrypt(const uint32_t* input_pointer, uint32_t* output_pointer, const uint32_t* expkey) ;
-
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /*__AES_LOW_LEVEL_H__*/
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 76af3c58d..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/ECB/aes_ecb.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/**
- ******************************************************************************
- * @file aes_ecb.h
- * @author MCD Application Team
- * @brief AES in ECB Mode
- ******************************************************************************
- * @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 __CRL_AES_ECB_H__
-#define __CRL_AES_ECB_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /** @ingroup AESECB
- * @{
- */
-
- /* Exported types ------------------------------------------------------------*/
- /** ECB context = CBC context. AESECBctx_stt is equal to AESCBCctx_stt */
- typedef AESCBCctx_stt AESECBctx_stt;
-
- /* Exported functions --------------------------------------------------------*/
-#ifdef INCLUDE_ENCRYPTION
- /* load the key and ivec, eventually performs key schedule, etc. */
- int32_t AES_ECB_Encrypt_Init (AESECBctx_stt *P_pAESECBctx, \
- const uint8_t *P_pKey, \
- const uint8_t *P_pIv);
-
- /* launch crypto operation , can be called several times */
- int32_t AES_ECB_Encrypt_Append (AESECBctx_stt *P_pAESECBctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /* Possible final output */
- int32_t AES_ECB_Encrypt_Finish (AESECBctx_stt *P_pAESECBctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-#endif /* ECB Encryption */
-
-#ifdef INCLUDE_DECRYPTION
- /* load the key and ivec, eventually performs key schedule, etc. */
- int32_t AES_ECB_Decrypt_Init (AESECBctx_stt *P_pAESECBctx, \
- const uint8_t *P_pKey, \
- const uint8_t *P_pIv);
-
- /* launch crypto operation , can be called several times */
- int32_t AES_ECB_Decrypt_Append (AESECBctx_stt *P_pAESECBctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /* Possible final output */
- int32_t AES_ECB_Decrypt_Finish (AESECBctx_stt *P_pAESECBctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-#endif /* ECB Decryption */
-
- /** @} */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*__CRL_AES_ECB_H__*/
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index e828b0203..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/GCM/aes_gcm.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/**
- ******************************************************************************
- * @file aes_gcm.h
- * @author MCD Application Team
- * @brief AES in GCM Mode
- ******************************************************************************
- * @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 __CRL_AES_GCM_H__
-#define __CRL_AES_GCM_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /** @ingroup AESGCMlowlevel
- * @{
- */
- /* Exported types ------------------------------------------------------------*/
- typedef uint32_t poly_t[4]; /*!< Definition of the way a polynomial of max degree 127 is represented */
-
-#if CRL_GFMUL==1
- typedef poly_t table16_t[16]; /*!< Definition of the type used for the precomputed table */
-#elif CRL_GFMUL==2
- typedef poly_t table8x16_t[8][16]; /*!< Definition of the type used for the precomputed table */
-#elif CRL_GFMUL==0
-#else
-#error "A value for CRL_GFMUL MUST be provided when INCLUDE_GCM is defined"
-#endif
-
- /** @} */
-
- /** @ingroup AESGCM
- * @{
- */
-
- typedef struct
- {
- uint32_t mContextId; /*!< Unique ID of this AES-GCM Context. \b Not \b used in current implementation. */
- SKflags_et mFlags; /*!< 32 bit mFlags, used to perform keyschedule */
- const uint8_t *pmKey; /*!< Pointer to original Key buffer */
- const uint8_t *pmIv; /*!< Pointer to original Initialization Vector buffer */
- int32_t mIvSize; /*!< Size of the Initialization Vector in bytes. This must be set by the caller prior to calling Init */
- uint32_t amIv[4]; /*!< This is the current IV value.*/
- int32_t mKeySize; /*!< AES Key length in bytes. This must be set by the caller prior to calling Init */
- const uint8_t *pmTag; /*!< Pointer to Authentication TAG. This value must be set in decryption, and this TAG will be verified */
- int32_t mTagSize; /*!< Size of the Tag to return. This must be set by the caller prior to calling Init */
- int32_t mAADsize; /*!< Additional authenticated data size. For internal use. */
- int32_t mPayloadSize; /*!< Payload size. For internal use. */
- poly_t mPartialAuth; /*!< Partial authentication value. For internal use. */
- uint32_t amExpKey[CRL_AES_MAX_EXPKEY_SIZE]; /*!< AES Expanded key. For internal use. */
-
-#if CRL_GFMUL==0
- poly_t mPrecomputedValues; /*!< (CRL_GFMUL==0) No precomputed tables, just the polynomial. For internal use. */
-#elif CRL_GFMUL==1
- table16_t mPrecomputedValues; /*!< (CRL_GFMUL==1) Precomputation of polynomial according to Shoup's 4-bit table\n (Requires 256 bytes of key-dependent data and 32 bytes of constant data). For internal use. */
-#elif CRL_GFMUL==2
- table8x16_t mPrecomputedValues; /*!< (CRL_GFMUL==2) Precomputation of polynomial according to Shoup's 8-bit table\n (Requires 4096 bytes of key-dependent data and 512 bytes of constant data). For internal use. */
-#endif
- }
- AESGCMctx_stt; /*!< Structure used only for AES-GCM. Used to store the expanded key and, eventually,
- precomputed tables, according the the defined value of CRL_GFMUL in config.h */
-
- /* Exported functions --------------------------------------------------------*/
- /* load the key and ivec, eventually performs key schedule, etc. */
- int32_t AES_GCM_Encrypt_Init(AESGCMctx_stt *P_pAESGCMctx, \
- const uint8_t *P_pKey, \
- const uint8_t *P_pIv);
-
- /* Header Processing Function */
- int32_t AES_GCM_Header_Append(AESGCMctx_stt *P_pAESGCMctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize);
-
- /* launch crypto operation , can be called several times */
- int32_t AES_GCM_Encrypt_Append (AESGCMctx_stt *P_pAESGCMctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /* Possible final output */
- int32_t AES_GCM_Encrypt_Finish (AESGCMctx_stt *P_pAESGCMctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
- \
-
- /* load the key and ivec, eventually performs key schedule, etc. */
- int32_t AES_GCM_Decrypt_Init (AESGCMctx_stt *P_pAESGCMctx, \
- const uint8_t *P_pKey, \
- const uint8_t *P_pIv);
- \
-
- /* launch crypto operation , can be called several times */
- int32_t AES_GCM_Decrypt_Append (AESGCMctx_stt *P_pAESGCMctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
- \
-
- /* Possible final output */
- int32_t AES_GCM_Decrypt_Finish (AESGCMctx_stt *P_pAESGCMctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
-
- /** @} */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __CRL_AES_GCM_H__ */
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 3273be89a..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/KEYWRAP/aes_keywrap.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/**
- ******************************************************************************
- * @file aes_keywrap.h
- * @author MCD Application Team
- * @brief AES in KeyWrap Mode
- ******************************************************************************
- * @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 __CRL_AES_KEYWRAP_H__
-#define __CRL_AES_KEYWRAP_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /** @ingroup AESKEYWRAP
- * @{
- */
-
- /* Exported types ------------------------------------------------------------*/
- /** AES context structure for Key Wrap mode */
- typedef AESCBCctx_stt AESKWctx_stt;
- /* Exported constants --------------------------------------------------------*/
- /** Number of uint32_t words in a Key Wrap Block */
-#define CRL_KWRAP_BLOCK_SIZE 2
- /** Number of uint8_t bytes in a Key Wrap Block */
-#define CRL_AES_KWRAP_BLOCK 8
-
- /* Exported functions --------------------------------------------------------*/
-#ifdef INCLUDE_ENCRYPTION
- /* load the key and ivec, eventually performs key schedule, etc. */
- int32_t AES_KeyWrap_Encrypt_Init (AESKWctx_stt *P_pAESKWctx, const uint8_t *P_pKey, const uint8_t *P_pIv);
-
- /* launch crypto operation , can be called just one times */
- int32_t AES_KeyWrap_Encrypt_Append (AESKWctx_stt *P_pAESKWctx,
- const uint8_t *P_pInputBuffer,
- int32_t P_inputSize,
- uint8_t *P_pOutputBuffer,
- int32_t *P_pOutputSize);
-
- /* Possible final output */
- int32_t AES_KeyWrap_Encrypt_Finish (AESKWctx_stt *P_pAESKWctx,
- uint8_t *P_pOutputBuffer,
- int32_t *P_pOutputSize);
-#endif /* ENC */
-#ifdef INCLUDE_DECRYPTION
- /* load the key and ivec, eventually performs key schedule, etc. */
- int32_t AES_KeyWrap_Decrypt_Init (AESKWctx_stt *P_pAESKWctx, const uint8_t *P_pKey, const uint8_t *P_pIv);
-
- /* launch crypto operation , can be called several times */
- int32_t AES_KeyWrap_Decrypt_Append (AESKWctx_stt *P_pAESKWctx,
- const uint8_t *P_pInputBuffer,
- int32_t P_inputSize,
- uint8_t *P_pOutputBuffer,
- int32_t *P_pOutputSize);
-
- /* Possible final output */
- int32_t AES_KeyWrap_Decrypt_Finish (AESKWctx_stt *P_pAESKWctx,
- uint8_t *P_pOutputBuffer,
- int32_t *P_pOutputSize);
-#endif
-
- /** @} */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*__CRL_AES_KEYWRAP_H__ */
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 7ec98ca23..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/OFB/aes_ofb.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
- ******************************************************************************
- * @file aes_ofb.h
- * @author MCD Application Team
- * @brief AES in OFB Mode
- ******************************************************************************
- * @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 __CRL_AES_OFB_H__
-#define __CRL_AES_OFB_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /** @ingroup AESOFB
- * @{
- */
-
- /** OFB context = CBC context. AESOFBctx_stt is equal to AESCBCctx_stt */
- typedef AESCBCctx_stt AESOFBctx_stt;
-
-#ifdef INCLUDE_ENCRYPTION
- /* load the key and ivec, eventually performs key schedule, etc. */
- int32_t AES_OFB_Encrypt_Init (AESOFBctx_stt *P_pAESOFBctx, \
- const uint8_t *P_pKey, \
- const uint8_t *P_pIv);
-
- /* launch crypto operation , can be called several times */
- int32_t AES_OFB_Encrypt_Append (AESOFBctx_stt *P_pAESOFBctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /* Possible final output */
- int32_t AES_OFB_Encrypt_Finish (AESOFBctx_stt *P_pAESOFBctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-#endif
-#ifdef INCLUDE_DECRYPTION
- /* load the key and ivec, eventually performs key schedule, etc. */
- int32_t AES_OFB_Decrypt_Init (AESOFBctx_stt *P_pAESOFBctx, \
- const uint8_t *P_pKey, \
- const uint8_t *P_pIv);
-
- /* launch crypto operation , can be called several times */
- int32_t AES_OFB_Decrypt_Append (AESOFBctx_stt *P_pAESOFBctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /* Possible final output */
- int32_t AES_OFB_Decrypt_Finish (AESOFBctx_stt *P_pAESOFBctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-#endif
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __CRL_AES_OFB_H__*/
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index bb58d3458..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/XTS/aes_xts.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- ******************************************************************************
- * @file aes_xts.h
- * @author MCD Application Team
- * @brief AES in XTS Mode
- ******************************************************************************
- * @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 __CRL_AES_XTS_H__
-#define __CRL_AES_XTS_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /** @ingroup AESXTS
- * @{
- */
-
- typedef struct
- {
- uint32_t mContextId; /*!< Unique ID of this context. \b Not \b used in current implementation. */
- SKflags_et mFlags; /*!< 32 bit mFlags, used to perform keyschedule */
- const uint8_t *pmKey; /*!< Pointer to original XTS Key buffer */
- const uint8_t *pmTweak; /*!< Pointer to original Tweak buffer */
- int32_t mTweakSize; /*!< Size of the Tweak in bytes */
- uint32_t amTweak[4]; /*!< Temporary result/Tweak */
- int32_t mKeySize; /*!< Size of half of the XTS Key in bytes */
- uint32_t amExpKey[CRL_AES_MAX_EXPKEY_SIZE]; /*!< Expanded AES Key 1 */
- uint32_t amExpKey2[CRL_AES_MAX_EXPKEY_SIZE]; /*!< Expanded AES Key 2 */
- }
- AESXTSctx_stt; /*!< AES context structure for CBC mode */
-
- /* Exported functions --------------------------------------------------------*/
- /* load the key and ivec, eventually performs key schedule, etc. */
- int32_t AES_XTS_Encrypt_Init (AESXTSctx_stt *P_pAESXTSctx, \
- const uint8_t *P_pKey, \
- const uint8_t *P_pTweak);
-
- /* launch crypto operation , can be called several times */
- int32_t AES_XTS_Encrypt_Append (AESXTSctx_stt *P_pAESXTSctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /* Possible final output */
- int32_t AES_XTS_Encrypt_Finish (AESXTSctx_stt *P_pAESXTSctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
-#ifdef INCLUDE_DECRYPTION
- /* load the key and ivec, eventually performs key schedule, etc. */
- int32_t AES_XTS_Decrypt_Init (AESXTSctx_stt *P_pAESXTSctx, const uint8_t *P_pKey, const uint8_t *P_pIv);
-
- /* launch crypto operation , can be called several times */
- int32_t AES_XTS_Decrypt_Append (AESXTSctx_stt *P_pAESXTSctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /* Possible final output */
- int32_t AES_XTS_Decrypt_Finish (AESXTSctx_stt *P_pAESXTSctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-#endif
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __CRL_AES_XTS_H__*/
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/aes.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/aes.h
deleted file mode 100644
index 7aacda42f..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/AES/aes.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- ******************************************************************************
- * @file aes.h
- * @author MCD Application Team
- * @brief Container for the 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
- *
- ******************************************************************************
- */
-
-/* Includes ------------------------------------------------------------------*/
-#include "Common/aes_low_level.h"
-#include "Common/aes_common.h"
-
-
-#ifdef INCLUDE_ECB
-#include "ECB/aes_ecb.h"
-#endif
-
-#ifdef INCLUDE_CBC
-#include "CBC/aes_cbc.h"
-#endif
-
-#ifdef INCLUDE_CTR
-#include "CTR/aes_ctr.h"
-#endif
-
-#ifdef INCLUDE_CFB
-#include "CFB/aes_cfb.h"
-#endif
-
-#ifdef INCLUDE_OFB
-#include "OFB/aes_ofb.h"
-#endif
-
-#ifdef INCLUDE_XTS
-#include "XTS/aes_xts.h"
-#endif
-
-#ifdef INCLUDE_GCM
-#include "GCM/aes_gcm.h"
-#endif
-
-#ifdef INCLUDE_CCM
-#include "CCM/aes_ccm.h"
-#endif
-
-#ifdef INCLUDE_CMAC
-#include "CMAC/aes_cmac.h"
-#endif
-
-#ifdef INCLUDE_KEY_WRAP
-#include "KEYWRAP/aes_keywrap.h"
-#endif
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ARC4/arc4.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ARC4/arc4.h
deleted file mode 100644
index e22d688d3..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ARC4/arc4.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/**
- ******************************************************************************
- * @file arc4.h
- * @author MCD Application Team
- * @brief ARC4
- ******************************************************************************
- * @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 __CRL_ARC4_H__
-#define __CRL_ARC4_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /** @ingroup ARC4
- * @{
- */
-
-
- /**
- * @brief Structure describing an ARC4 context
- */
- /* Exported types ------------------------------------------------------------*/
- typedef struct
- {
- uint32_t mContextId; /*!< Unique ID of this AES-GCM Context. \b Not \b used in current implementation. */
- SKflags_et mFlags; /*!< 32 bit mFlags, for future use */
- const uint8_t *pmKey; /*!< Pointer to original Key buffer */
- int32_t mKeySize; /*!< ARC4 Key length in bytes. This must be set by the caller prior to calling Init */
- uint8_t mX; /*!< Internal members: This describe one of two index variables of the ARC4 state */
- uint8_t mY; /*!< Internal members: This describe one of two index variables of the ARC4 state */
- uint8_t amState[256]; /*!< Internal members: This describe the 256 bytes State Matrix */
- }
- ARC4ctx_stt;
-
-
- /* Exported functions --------------------------------------------------------*/
-
- int32_t ARC4_Encrypt_Init(ARC4ctx_stt *P_pARC4ctx, \
- const uint8_t *P_pKey, \
- const uint8_t *P_pIv);
-
- int32_t ARC4_Encrypt_Append(ARC4ctx_stt *P_pARC4ctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- int32_t ARC4_Encrypt_Finish(ARC4ctx_stt *P_pARC4ctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- int32_t ARC4_Decrypt_Init(ARC4ctx_stt *P_pARC4ctx, \
- const uint8_t *P_pKey, \
- const uint8_t *P_pIv);
-
- int32_t ARC4_Decrypt_Append(ARC4ctx_stt *P_pARC4ctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- int32_t ARC4_Decrypt_Finish (ARC4ctx_stt *P_pARC4ctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /** @} */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*__CRL_AES_ECB_H__*/
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/C25519/c25519.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/C25519/c25519.h
deleted file mode 100644
index f0635051d..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/C25519/c25519.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- ******************************************************************************
- * @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__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /** @addtogroup C25519
- * @{
- */
- /* Includes ------------------------------------------------------------------*/
-#include <stdint.h>
- /* Exported types ------------------------------------------------------------*/
- /* Exported constants --------------------------------------------------------*/
- /* Exported macro ------------------------------------------------------------*/
- /* Exported functions ------------------------------------------------------- */
- int32_t C25519keyGen (uint8_t *P_pPrivateKey, \
- uint8_t *P_pPublicKey);
- \
-
- int32_t C25519keyExchange (uint8_t *P_pSharedSecret, \
- const uint8_t *P_pPrivateKey, \
- const uint8_t *P_pPublicKey);
- /**
- * @}
- */
- /* Lower level functionality. Useful for testing, might be used in real world if there is small NVM */
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __C25519_H__ */
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/CHACHA/chacha.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/CHACHA/chacha.h
deleted file mode 100644
index 391a37426..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/CHACHA/chacha.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/**
- ******************************************************************************
- * @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__
-#define __CHACHA_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /** @addtogroup CHACHA
- * @{
- */
- /* Includes ------------------------------------------------------------------*/
-#include <stdint.h>
- /* Exported types ------------------------------------------------------------*/
-
- typedef struct
- {
- uint32_t mContextId; /*!< Unique ID of this context. \b Not \b used in current implementation. */
- SKflags_et mFlags; /*!< 32 bit mFlags, used to perform keyschedule and future use */
- const uint8_t *pmKey; /*!< Pointer to original Key buffer */
- const uint8_t *pmIv; /*!< Pointer to original Initialization Vector buffer */
- int32_t mIvSize; /*!< Size of the Initialization Vector in bytes */
- int32_t mKeySize; /*!< Key length in bytes */
- uint64_t mCounter; /*!< Value for counter, will allow to process not contiguous data. Set flag E_SK_SET_COUNTER to use it, otherwise it's ignored */
- uint32_t amState[16]; /*!< ChaCha Internal State */
- }
- CHACHActx_stt; /*!< Chacha context structure */
-
- /* Exported constants --------------------------------------------------------*/
-#define CRL_CHACHA128_KEY 16 /*!< Number of bytes (uint8_t) necessary to store a ChaCha key of 128 bits. */
-#define CRL_CHACHA256_KEY 32 /*!< Number of bytes (uint8_t) necessary to store a Chacha key of 256 bits. */
-#define CRL_CHACHA_NONCE 8 /*!< Number of bytes (uint8_t) necessary to store a Chacha Nonce of 64 bits. */
- /* Exported macro ------------------------------------------------------------*/
- /* Exported functions ------------------------------------------------------- */
- int32_t CHACHA_Encrypt_Init(CHACHActx_stt *P_pCHACHActx, const uint8_t *P_pKey, const uint8_t *P_pIv);
-
- int32_t CHACHA_Encrypt_Append(CHACHActx_stt *P_pCHACHActx,
- const uint8_t *P_pInputBuffer,
- int32_t P_inputSize,
- uint8_t *P_pOutputBuffer,
- int32_t *P_pOutputSize);
-
- int32_t CHACHA_Encrypt_Finish(CHACHActx_stt *P_pCHACHActx,
- uint8_t *P_pOutputBuffer,
- int32_t *P_pOutputSize);
-
- int32_t CHACHA_Decrypt_Init(CHACHActx_stt *P_pCHACHActx, const uint8_t *P_pKey, const uint8_t *P_pIv);
-
- int32_t CHACHA_Decrypt_Append(CHACHActx_stt *P_pCHACHActx,
- const uint8_t *P_pInputBuffer,
- int32_t P_inputSize,
- uint8_t *P_pOutputBuffer,
- int32_t *P_pOutputSize);
-
- int32_t CHACHA_Decrypt_Finish(CHACHActx_stt *P_pCHACHActx,
- uint8_t *P_pOutputBuffer,
- int32_t *P_pOutputSize);
-
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __CHACHA_H__ */
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index f69222677..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/CHACHA20-POLY1305/chacha20-poly1305.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/**
- ******************************************************************************
- * @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__
-#define __CHACHA20_POLY1305_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /** @addtogroup CHACHA20POLY1305
- * @{
- */
- /* Includes ------------------------------------------------------------------*/
-#include <stdint.h>
- /* Exported types ------------------------------------------------------------*/
-
- /**
- * @brief Structure for ChaCha20-Poly1305 context
- */
-
- typedef struct
- {
- uint32_t mContextId; /*!< Unique ID of this context. \b Not \b used in current implementation. */
- SKflags_et mFlags; /*!< 32 bit mFlags, used to perform keyschedule and future use */
- const uint8_t *pmKey; /*!< Pointer to original 32 bytes Key buffer */
- const uint8_t *pmNonce; /*!< Pointer to original 12 bytes Nonce buffer */
- const uint8_t *pmTag; /*!< Pointer to Authentication TAG. This value must be set in decryption, and this TAG will be verified */
- uint32_t mAadSize; /*!< Size of the processed AAD */
- uint32_t mCipherSize; /*!< Size of the processed CipherText */
- uint32_t r[5]; /*!< Internal: value of r */
- uint32_t h[5]; /*!< Internal: value of h */
- uint32_t pad[4]; /*!< Internal: value of Poly nonce */
- uint32_t amState[16]; /*!< Internal: ChaCha Internal State */
- }
- ChaCha20Poly1305ctx_stt;
-
- /* Exported constants --------------------------------------------------------*/
- /* Exported macro ------------------------------------------------------------*/
- /* Exported functions ------------------------------------------------------- */
-
- int32_t ChaCha20Poly1305_Encrypt_Init(ChaCha20Poly1305ctx_stt *P_pChaCha20Poly1305ctx, const uint8_t *P_pKey, const uint8_t *P_pNonce);
-
- int32_t ChaCha20Poly1305_Encrypt_Append(ChaCha20Poly1305ctx_stt *P_pChaCha20Poly1305ctx,
- const uint8_t *P_pInputBuffer,
- int32_t P_inputSize,
- uint8_t *P_pOutputBuffer,
- int32_t *P_pOutputSize);
-
- int32_t ChaCha20Poly1305_Header_Append(ChaCha20Poly1305ctx_stt *P_pChaCha20Poly1305ctx, const uint8_t *P_pInputBuffer, int32_t P_inputSize);
-
- int32_t ChaCha20Poly1305_Encrypt_Finish(ChaCha20Poly1305ctx_stt *P_pChaCha20Poly1305ctx, uint8_t *P_pOutputBuffer, int32_t *P_pOutputSize);
-
- int32_t ChaCha20Poly1305_Decrypt_Init(ChaCha20Poly1305ctx_stt *P_pChaCha20Poly1305ctx, const uint8_t *P_pKey, const uint8_t *P_pNonce);
-
- int32_t ChaCha20Poly1305_Decrypt_Append(ChaCha20Poly1305ctx_stt *P_pChaCha20Poly1305ctx,
- const uint8_t *P_pInputBuffer,
- int32_t P_inputSize,
- uint8_t *P_pOutputBuffer,
- int32_t *P_pOutputSize);
-
- int32_t ChaCha20Poly1305_Decrypt_Finish(ChaCha20Poly1305ctx_stt *P_pChaCha20Poly1305ctx, uint8_t *P_pOutputBuffer, int32_t *P_pOutputSize);
-
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __CHACHA20_POLY1305_H__ */
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 039e71e0d..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/err_codes.h
+++ /dev/null
@@ -1,252 +0,0 @@
-/**
- ******************************************************************************
- * @file err_codes.h
- * @author MCD Application Team
- * @brief Provides defines for error codes
- ******************************************************************************
- * @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 __CRL_ERR_CODES_H__
-#define __CRL_ERR_CODES_H__
-
-#ifdef __cplusplus
- extern "C" {
-#endif
-
-/* Includes ------------------------------------------------------------------*/
-#include "config.h"
-#include "types.h"
-#include "err_codes.h"
-
-
-/** @addtogroup UserAPI User Level API
- * @{
- */
-
-/** @addtogroup ErrCodes Error Codes Definitions
- * @{
- */
-
-/** @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 */
-#define SIGNATURE_INVALID AUTHENTICATION_FAILED /*!< Signature is NOT valid */
-#define ERR_MEMORY_FAIL (int32_t) (1005) /*!< Problems with dynamic allocation (there's no more available memory) */
-/**
- * @}
- */
-
-/** @defgroup AESError AES Error Codes
- * @{
- */
-#define AES_SUCCESS (int32_t) (0) /*!< AES of PRIVKEY Success */
-#define AES_ERR_BAD_INPUT_SIZE (int32_t) (3101) /*!< AES of PRIVKEY Invalid input size */
-#define AES_ERR_BAD_OPERATION (int32_t) (3102) /*!< AES of PRIVKEY Invalid operation */
-#define AES_ERR_BAD_CONTEXT (int32_t) (3103) /*!< AES of PRIVKEY The AES context contains some invalid or uninitialized values */
-#define AES_ERR_BAD_PARAMETER (int32_t) (3104) /*!< AES of PRIVKEY One of the expected function parameters is invalid */
-/**
- * @}
- */
-/** @defgroup CHACHAError ChaCha Error Codes
-* @{
-*/
-#define CHACHA_SUCCESS (int32_t) (0) /*!< ChaCha Success */
-#define CHACHA_ERR_BAD_INPUT_SIZE (int32_t) (3201) /*!< ChaCha Invalid input size */
-#define CHACHA_ERR_BAD_OPERATION (int32_t) (3202) /*!< ChaCha Invalid operation */
-#define CHACHA_ERR_BAD_CONTEXT (int32_t) (3203) /*!< ChaCha The AES context contains some invalid or uninitialized values */
-#define CHACHA_ERR_BAD_PARAMETER (int32_t) (3204) /*!< ChaCha One of the expected function parameters is invalid */
-/**
-* @}
-*/
-
-/** @defgroup POLY1305Error POLY1305 Error Codes
-* @{
-*/
-#define POLY1305_SUCCESS (int32_t) (0) /*!< POLY1305 Success */
-#define POLY1305_ERR_BAD_OPERATION (int32_t) (3102) /*!< POLY1305 Invalid operation */
-#define POLY1305_ERR_BAD_CONTEXT (int32_t) (3103) /*!< POLY1305 The context contains some invalid or uninitialized values */
-#define POLY1305_ERR_BAD_PARAMETER (int32_t) (3104) /*!< POLY1305 One of the expected function parameters is invalid */
-/**
-* @}
-*/
-
-
-/** @defgroup ARC4Error ARC4 Error Codes
- * @{
- */
-#define ARC4_SUCCESS (int32_t) (0) /*!< ARC4 of PRIVKEY Success*/
-#define ARC4_ERR_BAD_OPERATION (int32_t) (3202) /*!< ARC4 of PRIVKEY Invalid operation */
-#define ARC4_ERR_BAD_CONTEXT (int32_t) (3203) /*!< ARC4 of PRIVKEY The ARC4 context contains some invalid or uninitialized values */
-#define ARC4_ERR_BAD_PARAMETER (int32_t) (3204) /*!< ARC4 of PRIVKEY One of the expected function parameters is invalid */
-/**
- * @}
- */
-
-/** @defgroup DESError DES Error Codes
- * @{
- */
-#define DES_SUCCESS (int32_t) (0) /*!< DES of PRIVKEY Success */
-#define DES_ERR_BAD_INPUT_SIZE (int32_t) (3301) /*!< DES of PRIVKEY Invalid input size, it must be multiple of 8 */
-#define DES_ERR_BAD_OPERATION (int32_t) (3302) /*!< DES of PRIVKEY Invalid operation */
-#define DES_ERR_BAD_CONTEXT (int32_t) (3303) /*!< DES of PRIVKEY The DES context contains some invalid or uninitialized values */
-#define DES_ERR_BAD_PARAMETER (int32_t) (3304) /*!< DES of PRIVKEY One of the expected function parameters is invalid*/
-/**
- * @}
- */
-
-/** @defgroup TDESError TDES Error Codes
- * @{
- */
-#define TDES_SUCCESS (int32_t) (0) /*!< TDES of PRIVKEY Success */
-#define TDES_ERR_BAD_INPUT_SIZE (int32_t) (3311) /*!< TDES of PRIVKEY Invalid input size, it must be multiple of 8 */
-#define TDES_ERR_BAD_OPERATION (int32_t) (3312) /*!< TDES of PRIVKEY Invalid operation */
-#define TDES_ERR_BAD_CONTEXT (int32_t) (3313) /*!< TDES of PRIVKEY The TDES context contains some invalid or uninitialized values */
-#define TDES_ERR_BAD_PARAMETER (int32_t) (3314) /*!< TDES of PRIVKEY One of the expected function parameters is invalid */
-/**
- * @}
- */
-
-/** @defgroup HASHError HASH Error Codes
- * @{
- */
-#define HASH_SUCCESS (int32_t) (0) /*!< hash Success */
-#define HASH_ERR_BAD_OPERATION (int32_t) (4001) /*!< hash Invalid operation */
-#define HASH_ERR_BAD_CONTEXT (int32_t) (4002) /*!< hash The HASH context contains some invalid or uninitialized values */
-#define HASH_ERR_BAD_PARAMETER (int32_t) (4003) /*!< hash One of the expected function parameters is invalid */
-#define HASH_ERR_INTERNAL (int32_t) (4011) /*!< hash Generic internal error */
-/**
- * @}
- */
-
-/** @defgroup RSAError RSA Error Codes
- * @{
- */
-#define RSA_SUCCESS (int32_t) (0) /*!< RSA Success */
-#define RSA_ERR_BAD_OPERATION (int32_t) (5102) /*!< RSA Invalid operation */
-#define RSA_ERR_BAD_KEY (int32_t) (5103) /*!< RSA Invalid Key */
-#define RSA_ERR_BAD_PARAMETER (int32_t) (5104) /*!< RSA One of the expected function parameters is invalid */
-#define RSA_ERR_UNSUPPORTED_HASH (int32_t) (5105) /*!< RSA The hash function is not supported */
-#define RSA_ERR_MESSAGE_TOO_LONG (int32_t) (5106) /*!< RSA Message too long */
-#define RSA_ERR_MODULUS_TOO_SHORT (int32_t) (5107) /*!< RSA modulus too short */
-#define RSA_ERR_GENERIC (int32_t) (5108) /*!< RSA Generic Error */
-/**
- * @}
- */
-
-/** @defgroup ECCError ECC Error Codes
- * @{
- */
-#define ECC_SUCCESS (int32_t) (0) /*!< ecc Success */
-#define ECC_ERR_BAD_OPERATION (int32_t) (5202) /*!< ecc Invalid operation */
-#define ECC_ERR_BAD_CONTEXT (int32_t) (5203) /*!< ecc The ECC context contains some invalid or initialized parameters */
-#define ECC_ERR_BAD_PARAMETER (int32_t) (5204) /*!< ecc One of the expected function parameters is invalid */
-#define ECC_ERR_BAD_PUBLIC_KEY (int32_t) (5205) /*!< ecc Invalid Public Key */
-#define ECC_ERR_BAD_PRIVATE_KEY (int32_t) (5206) /*!< ecc Invalid Private Key */
-#define ECC_ERR_MISSING_EC_PARAMETER (int32_t) (5207) /*!< ecc The EC parameters structure miss some parameter required by the function */
-#define ECC_WARN_POINT_AT_INFINITY (int32_t) (5208) /*!< ecc Returned Point is the point at infinity */
-/**
- * @}
- */
-
-/** @defgroup RNGError Random Number Error Codes
- * @{
- */
-#define RNG_SUCCESS (int32_t) (0) /*!< RNG Success */
-#define RNG_ERR_UNINIT_STATE (int32_t) (6001) /*!< RNG has not been correctly initialized */
-#define RNG_ERR_BAD_OPERATION (int32_t) (6002) /*!< RNG Invalid operation */
-#define RNG_ERR_RESEED_NEEDED (int32_t) (6003) /*!< RNG Reseed is needed */
-#define RNG_ERR_BAD_PARAMETER (int32_t) (6004) /*!< RNG One of the expected function parameters is invalid */
-#define RNG_ERR_BAD_ENTROPY_SIZE (int32_t) (6006) /*!< RNG Check the size of the entropy string */
-#define RNG_ERR_BAD_PERS_STRING_SIZE (int32_t) (6007) /*!< RNG Check the size of the personalization string */
-#define RNG_ERR_BAD_ADD_INPUT_SIZE (int32_t) (6008) /*!< RNG Check the size of the additional input string */
-#define RNG_ERR_BAD_REQUEST (int32_t) (6009) /*!< RNG Check the size of the random request */
-#define RNG_ERR_BAD_NONCE_SIZE (int32_t) (6010) /*!< RNG Check the size of the nocne */
-#define RNG_ERR_INTERNAL (int32_t) (6011) /*!< RNG Generic internal RNG error */
-
-
-
-
-
-/** @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
-* @{
-*/
-#define C25519_SUCCESS (int32_t) (0) /*!< Curve25519 Success */
-#define C25519_ERR_BAD_POINT (int32_t) (5605) /*!< Curve25519 Invalid Packet Point */
-#define C25519_ERR_BAD_PARAMETER (int32_t) (5604) /*!< Curve25519 One of the expected function parameters is invalid */
-
-
-/**
-* @}
-*/
-
-/** @defgroup MathError Mathemtical Error Codes
- * @{
- */
-#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_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 */
-
-/**
- * @}
- */
-
-/** @defgroup CHACHA20POLY1305Error ChaCha20-Poly1305 Error Codes
-* @{
-*/
-#define CHACHA20POLY1305_SUCCESS (int32_t) (0) /*!< ChaCha20-Poly1305 Success */
-#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
-
-#endif /* __CRL_ERR_CODES_H__ */
-/**
- * @}
- */
-
-/**
- * @}
- */
-
-/**
- * @}
- */
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/macros.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/macros.h
deleted file mode 100644
index 167b5aaa8..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/macros.h
+++ /dev/null
@@ -1,295 +0,0 @@
-/**
- ******************************************************************************
- * @file macros.h
- * @author MCD Application Team
- * @brief Support Macros for functions of the Cryptolib
- ******************************************************************************
- * @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 __CRL_MACROS_H__
-#define __CRL_MACROS_H__
-
-#ifdef __cplusplus
- extern "C" {
-#endif
-
-/* Includes ------------------------------------------------------------------*/
-/* Exported types --------------------------------------------------------*/
-/* Exported constants --------------------------------------------------------*/
-/* Exported macro ------------------------------------------------------------*/
-/** @addtogroup InternalAPI Internal functions
- * @{
- */
-
-/** @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
- * @param b Number of bytes
- * @retval Number of words required to store a variable of size b
- */
-#define WORD_COUNT(b) ((int32_t) ((uint32_t) b + 3u) / 4u)
-
-/**
- * @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
- * @retval Max(a,b)
- */
-#define MAX(a,b) ((((uint32_t)(a)) > ((uint32_t)(b))) ? (a) : (b))
-
-/**
- * @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
- * @retval Min(a,b)
- */
-#define MIN(a,b) ((((uint32_t)(a)) > ((uint32_t)(b))) ? (b) : (a))
-
-
-/**
- * @brief This macro is used to rotate left a 32bit variable by bits bits
- * @param value The 32 bit value to rotate left
- * @param bits The number of bits to rotate left
- * @retval Roteted 32 bit value
- */
-#ifdef CL_ON_STM32
-#define ROL(value, bits) (uint32_t) __ROR((value),32 - (bits))
-#else
-#define ROL(value, bits) (uint32_t) (((value) << (bits)) | ((value) >> (32 - (bits))))
-#endif
-
-/**
- * @brief This macro is used to rotate right a 32bit variable by bits bits
- * @param value The 32 bit value to rotate right
- * @param bits The number of bits to rotate right
- * @retval Roteted 32 bit value
- */
-#ifdef CL_ON_STM32
-#define ROR(value, bits) (uint32_t) __ROR((value),(bits))
-#else
-#define ROR(value, bits) (uint32_t) (((value) >> (bits)) | ((value) << (32 - (bits))))
-#endif
-
-/**
- * @brief This macro returns the least significant byte from an int32_t
- * @param P_word The 32-bit from which the least significant byte is taken
- * @retval Least significant byte of P_word
- */
-#define BYTE_3(P_word) (uint8_t) (P_word & 0xFFu)
-
-/**
- * @brief This macro returns the second least significant byte from an int32_t
- * @param P_word The 32-bit from which the second least significant byte is taken
- * @retval Second least significant byte of P_word
- */
-#define BYTE_2(P_word) (uint8_t) ((P_word >> 8) & 0xFFu)
-
-/**
- * @brief This macro returns the second most significant byte from an int32_t
- * @param P_word The 32-bit from which the second most significant byte is taken
- * @retval Second most significant byte of P_word
- */
-#define BYTE_1(P_word) (uint8_t) ((P_word >> 16) & 0xFFu)
-
-/**
- * @brief This macro returns the most significant byte from an int32_t
- * @param P_word The 32-bit from which the most significant byte is taken
- * @retval Most significant byte of x
- */
-#define BYTE_0(P_word) (uint8_t) ((P_word >> 24) & 0xFFu)
-
-/**
- * @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
- * @retval Selected P_n byte from P_word
- */
-#define BYTE_X(P_word, P_n) (uint8_t) ((P_word >> (24 - (8 * (P_n)))) & 0xFFu)
-
-
-/**
- * @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_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
- * @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)
-
-
-/**
- * @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_b2 The second 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))
-
-#if CRL_ENDIANNESS==1
-
-/**
- * @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
- * @retval The converted 32 bits value
- */
-#ifdef CL_ON_STM32
-#define LE_CONVERT_W32(VariableToConvert) (uint32_t) (__REV(VariableToConvert))
-#else
-#define LE_CONVERT_W32(VariableToConvert) (uint32_t) ((ROL( (uint32_t) VariableToConvert,24) & 0xFF00FF00u ) | (ROL( (uint32_t) VariableToConvert,8) & 0x00FF00FFu ))
-#endif
-
-#elif CRL_ENDIANNESS==2
-
-/**
- * @brief This macro doesn't do anything. It exist for compatibility with
- * little endian cpus.
- * @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.
- */
-#define LE_CONVERT_W32(VariableToConvert) (VariableToConvert)
-#else /* CRL_ENDIANNESS NOT SET */
-#error "Please select endianness in config.h"
-#endif /* #if CRL_ENDIANNESS */
-
-
-/* Support macro for rand.c for big endian cpus */
-#if CRL_ENDIANNESS==2
-
-/**
- * @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
- */
-#define BE_CONVERT_W32(VariableToConvert) ((ROL(VariableToConvert,24)&0xFF00FF00) | (ROL(VariableToConvert,8)&0x00FF00FF))
-#endif
-
-#ifdef CRL_CPU_SUPPORT_MISALIGNED
-
-/**
- * @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
- * @retval The 32 bits value
- * @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)))))
-/**
-* @brief This macro is used to read a 4 bytes from a byte array and return
-* it as a 32-bit word with reversed endiannes
-* @param P_pInputBuffer Pointer to the input byte buffer
-* @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
-*/
-#define BUFFER_2_LEW32(P_pInputBuffer,P_index) ((*((const uint32_t *) ((P_pInputBuffer)+(P_index)))))
-
-/**
- * @brief This macro is used to write a 32bit integer into a byte buffer,
- * 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
- * @retval none
- * @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
-* @retval none
-* @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
-
-/**
- * @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
- * @retval The 32 bits value
- * @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]))
-
-/**
-* @brief This macro is used to read a 4 bytes from a byte array and return
-* it as a 32-bit word with reversed endiannes
-* @param P_pInputBuffer Pointer to the input byte buffer
-* @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
-*/
-#define BUFFER_2_LEW32(P_pInputBuffer,P_index) (WORD8_TO_WORD32((P_pInputBuffer)[(P_index)+3],(P_pInputBuffer)[(P_index)+2],(P_pInputBuffer)[(P_index)+1],(P_pInputBuffer)[(P_index)]))
-
-/**
- * @brief This macro is used to write a 32bit integer into a byte buffer,
- * 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
- * @retval none
- * @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)])
-
-/**
-* @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
-* @retval none
-* @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
-
-/**
- * @}
- */
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-/* Exported functions ------------------------------------------------------- */
-
-#endif /*__CRL_MACROS_H__*/
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/sk.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/sk.h
deleted file mode 100644
index 3af71f54f..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/sk.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/**
- ******************************************************************************
- * @file sk.h
- * @author MCD Application Team
- * @brief Symmetric Key Common Definitions
- ******************************************************************************
- * @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 __CRL_SK_H__
-#define __CRL_SK_H__
-
-
-#ifdef __cplusplus
- extern "C" {
-#endif
-
-/* Includes ------------------------------------------------------------------*/
-
-/** @addtogroup SymKey
- * @{
- */
-/* 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 */
- 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. */
- 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_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
- It is set when the last header append has been called. Used where the header append is called with an InputSize not
- multiple of the block size, which means that is the last input.*/
- E_SK_APPEND_DONE = (uint32_t) (0x00000040), /*!< Internal Flag (not to be set/read by user): only for CMAC.It is set when the first append has been called */
- E_SK_SET_COUNTER = (uint32_t)(0x00000080), /*!< User Flag: With ChaCha20 this is used to indicate a value for the counter, used to process non contiguous blocks (i.e. jump ahead)*/
-
-} SKflags_et; /*!< Type definitation for Symmetric Key Flags */
-
-/**
- * @}
- */
-
-/** @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 */
-#define C_ECB (uint32_t) (0x00000002) /*!< Internal contant indicating "ECB" */
-#define C_CBC (uint32_t) (0x00000004) /*!< Internal contant indicating "CBC" */
-#define C_CTR (uint32_t) (0x00000006) /*!< Internal contant indicating "CTR" */
-#define C_MODE_MASK (uint32_t) (0x00000006) /*!< Internal mask for ECB/CBC/CTR */
-#define C_DES (uint32_t) (0x00000008) /*!< Internal contant indicating "DES" */
-#define C_TDES (uint32_t) (0x00000010) /*!< Internal contant indicating "TDES" */
-#define C_AES (uint32_t) (0x00000018) /*!< Internal contant indicating "AES" */
-#define C_ALGO_MASK (uint32_t) (0x00000018) /*!< Internal mask for DES/TDES/AES */
-#define C_AES128 (uint32_t) (0x10000000) /*!< Internal contant indicating "AES with key of 128" */
-#define C_AES192 (uint32_t) (0x18000000) /*!< Internal contant indicating "AES with key of 192" */
-#define C_AES256 (uint32_t) (0x20000000) /*!< Internal contant indicating "AES with key of 256" */
-#define C_AES_KEY_MASK (uint32_t) (0x00000038) /*!< Internal mask for AES128/AES192/AES256 */
-
-
-/* Directions of the operations */
-#define CRL_ENC 0 /*!< Used to specify an encryption operation. */
-#define CRL_DEC 1 /*!< Used to specify a decryption operation. */
-
-/* Modes of operation */
-#define CRL_ECB 0 /*!< Used to specify the Electronic Code Book mode of operation. */
-#define CRL_CBC 1 /*!< Used to specify the Cipher Block Chaining mode of operation. */
-#define CRL_CTR 2 /*!< Used to specify the Counter mode of operation (for AES only). */
-
-/**
- * @}
- */
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* __CRL_SK_H__ */
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/types.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/types.h
deleted file mode 100644
index b655259eb..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common/types.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/**
- ******************************************************************************
- * @file types.h
- * @author MCD Application Team
- * @brief Define the various basic types needed by the Library
- ******************************************************************************
- * @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 __CRL_TYPES_H__
-#define __CRL_TYPES_H__
-
-
-#ifdef __cplusplus
- extern "C" {
-#endif
-
-/* Includes ------------------------------------------------------------------*/
-
-/** @addtogroup UserAPI User Level API
- * @{
- */
-
-/** @addtogroup TYPES Data Types Definitions
- * @{
- */
-
-#if !defined(_STDINT_H) && !defined(__stdint_h) && !defined(_STDINT)
-
-#ifndef __uint8_t_defined
-
-typedef unsigned int uint32_t; /*!< stdint.h defintion of uint32_t */
-typedef unsigned char uint8_t; /*!< stdint.h defintion of uint8_t */
-typedef unsigned short int uint16_t; /*!< stdint.h defintion of uint16_t */
-typedef unsigned long long uint64_t; /*!< stdint.h defintion of uint64_t */
-
-#define __uint8_t_defined
-#define __uint16_t_defined
-#define __uint32_t_defined
-#define __uint64_t_defined
-#endif /*!< __uint8_t_defined */
-
-#ifndef __int8_t_defined
-
-typedef signed long long int64_t; /*!< stdint.h defintion of int64_t */
-typedef signed int int32_t; /*!< stdint.h defintion of int32_t */
-typedef signed short int int16_t; /*!< stdint.h defintion of int16_t */
-typedef signed char int8_t; /*!< stdint.h defintion of int8_t */
-#define __int8_t_defined
-#define __int16_t_defined
-#define __int32_t_defined
-#define __int64_t_defined
-#endif /* __int8_t_defined */
-
-#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
-{
- 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 */
- uint16_t mUsed; /*!< Currently used portion of the buffer, should be inititalized by user to zero */
-}
-membuf_stt;
-
-/**
- * @}
- */
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* __CRL_TYPES_H__ */
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 5d2e457f6..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_chacha20_poly1305/chacha20_core.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- ******************************************************************************
- * @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
-* Which was released in Public domain.
-*/
-#ifndef __CHACHA20_CORE_H__
-#define __CHACHA20_CORE_H__
-
-/* Includes ------------------------------------------------------------------*/
-
-/* Private typedef -----------------------------------------------------------*/
-/* Private define ------------------------------------------------------------*/
-/* Private macro -------------------------------------------------------------*/
-
-/** @addtogroup SymKeylowlevel
-* @{
-*/
-
-/** @defgroup CHACHAlowlevel ChaCha
-* @brief Internal ChaCha Functions and Macros
-* @{
-*/
-
-/* Private function prototypes -----------------------------------------------*/
-/* Private functions ---------------------------------------------------------*/
-
-void salsa20_wordtobyte(uint8_t output[64],\
- const uint32_t input[16]);
-
-/**
-* @} SymKeylowlevel
-*/
-
-/**
-* @} CHACHAlowlevel
-*/
-#endif /* __CHACHA20_CORE_H__ */
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 5bb2a924a..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_chacha20_poly1305/poly1305_core.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- ******************************************************************************
- * @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__
-
-/* Includes ------------------------------------------------------------------*/
-
-/* Private typedef -----------------------------------------------------------*/
-/* Private define ------------------------------------------------------------*/
-/* Private macro -------------------------------------------------------------*/
-
-/* Private variables ---------------------------------------------------------*/
-
-/* Private function prototypes -----------------------------------------------*/
-/* Private functions ---------------------------------------------------------*/
-
-/** @addtogroup SymKeylowlevel
-* @{
-*/
-
-/** @defgroup POLY1305lowlevel Poly1305-AES
-* @brief Internal Poly1305-AES Function
-* @{
-*/
-
-void Poly1305_Core_Update (uint32_t *P_h, \
- const uint32_t *P_r, \
- const uint8_t *P_pInput,\
- uint32_t P_LastBlock);
-
-void Poly1305_Core_Finish(uint32_t *P_h, \
- const uint32_t *P_pad,\
- uint32_t *P_pTag);
-
-/**
-* @}
-*/
-
-/**
-* @}
-*/
-
-#endif /* __POLY1305_CORE_H__ */
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 575ae1504..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/arith.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/**
- ******************************************************************************
- * @file arith.h
- * @author MCD Application Team
- * @brief Basic Arithmetic Functions for Big Numbers (Multi Precision Integers)
- ******************************************************************************
- * @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 __CRL_ARITH_H__
-#define __CRL_ARITH_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Includes ------------------------------------------------------------------*/
-#include "bn.h"
-
- /** @ingroup Arith
- * @{
- */
-
- /* Exported functions ------------------------------------------------------- */
-
- /* z=x+y.**********************************************************************/
- int32_t AddBig (const BigNum_stt *P_pAddend1BN, \
- const BigNum_stt *P_pAddend2BN, \
- BigNum_stt *P_pSumBN, \
- membuf_stt *P_pMemBuf);
-
- /* z=x-y. *********************************************************************/
- int32_t SubBig (const BigNum_stt *P_pMinuendBN, \
- const BigNum_stt *P_pSubtrahendBN, \
- BigNum_stt * P_pDifferenceBN, \
- membuf_stt *P_pMemBuf);
-
- /* x=x<<1.
- * Left shift of 1 bit. */
- int32_t FastMul2 (BigNum_stt *P_pBN);
-
- void FastDiv2 (BigNum_stt *P_pBN);
-
- /* x=x<<(esp words). Left shift of esp words. ********************************/
- int32_t FastMulInnerBase (BigNum_stt *P_pBN, \
- uint16_t P_exp);
-
- /* x=x>>(esp words). Right shift of esp words. *******************************/
- void FastDivInnerBase (BigNum_stt * P_pBN, \
- uint16_t P_exp);
-
- /* x=x<<shift. Left shift of 'shift' bits. Condition: 0<shift<32. *************/
- int32_t LeftShift (BigNum_stt * P_pBN, \
- uint32_t P_shift);
- \
-
- void RightShift (BigNum_stt *P_pBN, \
- uint32_t P_shift);
-
- /* x=x*y. *********************************************************************/
- int32_t MulBigbyUnInt (BigNum_stt *P_pBN, \
- uint32_t P_factor2);
- \
-
-
- /* Core Subtraction function, the signs are not used. P_difference = |P_minuend| - |P_subtrahend| */
- int32_t Sub_Moduli_Big (const BigNum_stt *P_pMinuendBN, \
- const BigNum_stt *P_pSubtrahendBN, \
- BigNum_stt *P_pDifferenceBN);
-
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*__CRL_BIG_H__*/
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 45cd53d29..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/bn.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/**
- ******************************************************************************
- * @file bn.h
- * @author MCD Application Team
- * @brief Basic Functions for Big Numbers (Multi Precision Integers)
- ******************************************************************************
- * @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 __CRL_BN_H__
-#define __CRL_BN_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /** @ingroup BN
- * @{
- */
-
- /* Exported types ------------------------------------------------------------*/
- /**
- * @brief Structure used to store a BigNum_stt * integer.
- */
- typedef struct
- {
- uint32_t *pmDigit; /*!< Used to represent the BigNum_stt * integer value; pmDigit[0] = least significant word. */
- uint16_t mNumDigits; /*!< Number of significant words of the vector pmDigit used to represent the actual value. */
- uint8_t mSize; /*!< Number of words allocated for the integer */
- int8_t mSignFlag; /*!< Is the integer mSignFlag: SIGN_POSITIVE positive, SIGN_NEGATIVE negative. */
- }
- BigNum_stt;
-
- /* Exported constants --------------------------------------------------------*/
-
-#define NBIT_DIGIT 32u /*!< Bit Size of a BigNum digit (should equal to CPU word size, works for 32). */
-#define MSBIT_MASK 0x80000000u /*!< Mask for the most significant bit in a digit */
-#define MSBYTE_MASK 0xFF000000u /*!< Mask for the most significant byte in a digit */
-#define LSBIT_MASK 0x00000001u /*!< Mask for the least significant bit in a digit */
-#define MAX_DIGIT_VALUE 0xFFFFFFFFu /*!< Mask for all bit to 1 in a word */
-#define SIGN_POSITIVE 0 /*!< Used to denote a positive Big Number. */
-#define SIGN_NEGATIVE 1 /*!< Used to denote a negative Big Number. */
-
- /* Exported functions ------------------------------------------------------- */
- /* Big Number Operations ******************************************************/
-
- /* Alloc big *****************************************************************/
- int32_t StAllocBig(BigNum_stt **P_ppBignum, \
- int32_t P_wordSize, \
- membuf_stt *P_pMembuf);
-
- /* StFree big ****************************************************************/
- void StFreeBig (BigNum_stt **P_pBignum, \
- membuf_stt *P_pMembuf);
-
- /* x = initial_value. Sets the words x->pmDigit[1]_ _ _x->pmDigit[MAX_LEN_BIG-1] to 0. */
- void InitBig (BigNum_stt * P_pBN, \
- int32_t P_initialValue);
-
- /* y=x. ***********************************************************************/
- int32_t CopyBig (const BigNum_stt *P_pInputBN, \
- BigNum_stt *P_pOutputBN);
-
- /* Returns 1 if x==0, 0 otherwise. ********************************************/
- int32_t IsZeroBig (const BigNum_stt *P_pInputBN);
-
- /* x=0. ***********************************************************************/
- void SetZeroBig (BigNum_stt * P_pInputBN);
-
- /* Returns 1 if x>=0, returns 0 if x<0. ***************************************/
- int32_t SignBig (const BigNum_stt *P_pInputBN);
-
- int32_t EvenBig (const BigNum_stt *P_pBN);
-
- /* Compares two BigNum_stt * integer. *****************************************/
- int32_t CompareBig(const BigNum_stt *P_pInput1BN, \
- const BigNum_stt *P_pInput2BN);
-
- /* If x==0 returns 1. ********************************************************/
- int32_t CountBits (const BigNum_stt *P_pInputBN);
-
- int32_t CountBytes(const BigNum_stt * P_pInputBN);
-
- /* Returns the value of the pos-th bit of x. **********************************/
- uint16_t GiveBit (const BigNum_stt *P_pBN, \
- uint32_t P_pos);
-
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*__CRL_BN_H__*/
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 8ac262c3f..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/conv.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- ******************************************************************************
- * @file conv.h
- * @author MCD Application Team
- * @brief Functions used to convert data representation from/to
- * Big Numbers and byte (octect) arrays
- ******************************************************************************
- * @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 __CRL_CONV_H__
-#define __CRL_CONV_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Includes ------------------------------------------------------------------*/
-#include "bn.h"
-
- /** @ingroup Conv
- * @{
- */
-
- /* Exported functions ------------------------------------------------------- */
- /* Converts a vector of 32 bits words ("in") to a vector of 8 bits words ("out"). */
- void W32_to_W8 (const uint32_t *P_pArrayIn, \
- uint8_t *P_pArrayOut, \
- int32_t P_ReqW8);
-
- /* Converts a vector of 8 bits words ("in") to a BigNum_stt * ("out"). ********/
- int32_t W8_to_Big (const uint8_t *P_pArrayIn, \
- uint32_t P_ArrayInSize, \
- BigNum_stt * P_outBig);
-
- /* Converts a BigNum_stt * ("in") to a vector of 8 bits words ("out").*********/
- void Big_to_W8 (BigNum_stt * P_inBig, \
- uint8_t *P_pArrayOut, \
- int32_t *P_pArrayOutSize);
-
- /* Converts a BigNum_stt * ("in") to a vector of 8 bits words of fixed size("out") */
- int32_t Big_to_fixedW8 (BigNum_stt * P_pInBig, \
- uint8_t *P_pArrayOut, \
- int32_t P_pArrayOutSize);
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*__CRL_CONV_H__*/
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 897b58af7..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/modular.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/**
- ******************************************************************************
- * @file modular.h
- * @author MCD Application Team
- * @brief Provides Base Modular Arithmetic Operations
- ******************************************************************************
- * @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 __CRL_MODULAR_H__
-#define __CRL_MODULAR_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Includes ------------------------------------------------------------------*/
-
- /** @ingroup Modular
- * @{
- */
-
- /* Exported types ------------------------------------------------------------*/
- /* Exported functions ------------------------------------------------------- */
- /* Modular addition ***********************************************************/
- int32_t ModularAddBig (const BigNum_stt * P_pAddend1BN, \
- const BigNum_stt * P_pAddend2BN, \
- BigNum_stt * P_pModSumBN, \
- const BigNum_stt * P_pModBN, \
- membuf_stt *P_pMemBuf);
- \
-
- /* Modular Subtraction ********************************************************/
- int32_t ModularSubBig (const BigNum_stt * P_pMinuendBN, \
- const BigNum_stt * P_pSubtrahendBN, \
- BigNum_stt * P_pModDiffBN, \
- const BigNum_stt * P_pModBN, \
- membuf_stt *P_pMemBuf);
- \
-
- /* Fast Modular multiplication by 2 *******************************************/
- int32_t ModularFastMul2 (BigNum_stt * P_pBN, \
- const BigNum_stt * P_pModBN, \
- membuf_stt *P_pMemBuf);
- \
-
- /* Modular inversion **********************************************************/
- int32_t ModularInvBig (const BigNum_stt *P_pInputBN, \
- BigNum_stt *P_pInverseBN, \
- const BigNum_stt *P_pModBN, \
- membuf_stt *P_pMemBuf );
- \
-
- /* Modular exponentiation *****************************************************/
- int32_t ModularExpSlidWin(BigNum_stt * P_pBaseBN, \
- const BigNum_stt * P_pExpBN, \
- const BigNum_stt * P_pModulusBN, \
- BigNum_stt *P_pOutputBN, \
- membuf_stt *P_pMemBuf);
- \
-
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*__CRL_MODULAR_H__*/
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index c36983f4f..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/monty.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/**
- ******************************************************************************
- * @file monty.h
- * @author MCD Application Team
- * @brief Provides Montgomery Operations
- ******************************************************************************
- * @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 __CRL_MONTY_H__
-#define __CRL_MONTY_H__
-
-/* When multiplications are required the routines called are: MultiplyBig() and SquareBig().
-* The implementation of these two functions depends by the value of the constant
-* BASIC_MUL_BIG defined in MulDiv.h. */
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Includes ------------------------------------------------------------------*/
-
- /** @ingroup Monty
- * @{
- */
-
- /* Exported types ------------------------------------------------------------*/
-
- /**
- * @brief Structure used to store Montgomery domain parameters.
- */
- typedef struct
- {
- const BigNum_stt *pmModulusBN; /*!< The modulus on which are reffered the parameters. */
- BigNum_stt *pmR2; /*!< The Montgomery Parameter */
- uint32_t mModInvLSW; /*!< The least significant word of -(modulus^(-1)) (mod MontRadix). */
- membuf_stt *pmMemBuf;
- }
- montyParams_stt;
-
- /* Exported functions ------------------------------------------------------- */
-
- /* Montgomery Modular Operations **********************************************/
-
- /* Comment: given an integer x in Zm, the Montgomery residue (o M-residue) is:
- * xR (mod m), get as: MontyExit(A = x*R^2,T) or
- * MontyMul(x,R^2,Residuo_x). */
-
- /* Initializes Montgomery parameters according to the modulus m. (different implementation) */
- int32_t MontyInit (const BigNum_stt *P_pModulusBN, \
- montyParams_stt *P_pMontyParams, \
- membuf_stt *P_pMemBuf);
- \
- /* Free R^2 inside the montgomery parameters contained in a montyParams_stt structure */
- void MontyKillR2 (montyParams_stt * P_pMontyParams);
-
- /* Sets to zero all Montgomery parameters. ************************************/
- void MontyKillAll (montyParams_stt *P_pMontyParams);
-
- /* y=x(R^-1) (mod m); x from the Montgomery domain it is carried to integer modulo m. */
- int32_t MontyExit (const BigNum_stt *P_pMontyBN, \
- BigNum_stt *P_pNormalBN, \
- const montyParams_stt *P_pMontyParams);
- \
-
- /* Montgomery cios multiplication *********************************************/
- int32_t MontyMul (const BigNum_stt * P_pFactor1BN, \
- const BigNum_stt * P_pFactor2BN, \
- BigNum_stt * P_pProductBN, \
- const montyParams_stt *P_pMontyParams);
- \
-
- /* Exported macros ------------------------------------------------------- */
- /* Squaring in monty domain ***************************************************/
-#define MontySqr(P_Base,P_Square,P_pMontyParams) MontyMul((P_Base),(P_Base),(P_Square),(P_pMontyParams))
-
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*__CRL_MONTY_H__*/
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index ecc76f923..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/BN/rng_bn.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- ******************************************************************************
- * @file rng_bn.h
- * @author MCD Application Team
-
- * @brief Random Generation of BigNumers
- ******************************************************************************
- * @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 __CRL_RNG_BN_H__
-#define __CRL_RNG_BN_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Includes ------------------------------------------------------------------*/
-#include "bn.h"
-#include "../../../RNG/rng.h"
-
- /** @ingroup RNGBN
- * @{
- */
- /* Exported types --------------------------------------------------------*/
- /* Exported constants --------------------------------------------------------*/
- /* Exported macro ------------------------------------------------------------*/
- /* Exported functions ------------------------------------------------------- */
-
- /* Generate random number of P_nBits bits */
- int32_t GenRndBN (int32_t P_nBits, \
- BigNum_stt *P_pRandBN, \
- RNGstate_stt *P_pRandomState);
- \
-
-
- /* Generate random big number smaller than P_pModBN ********************************/
- int32_t GenRndBNmodN (BigNum_stt *P_pRandBN, \
- const BigNum_stt *P_pModBN, \
- RNGstate_stt *P_pRandomState);
- \
-
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*__CRL_RNG_BN_H__*/
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 0b8ba0576..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ecc_rsa/MATH/math.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- ******************************************************************************
- * @file math.h
- * @author MCD Application Team
- * @brief Container for the mathematical 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
- *
- ******************************************************************************
- */
-
-/** @ingroup Math
- * @{
- */
-/* Includes ------------------------------------------------------------------*/
-#include "BN/bn.h"
-#include "BN/conv.h"
-#include "BN/arith.h"
-#include "BN/monty.h"
-#include "BN/modular.h"
-#ifdef INCLUDE_RNG
-#include "BN/rng_bn.h"
-#endif
-
-/* Exported types ------------------------------------------------------------*/
-/* Exported constants --------------------------------------------------------*/
-/* Exported macro ------------------------------------------------------------*/
-/* Exported functions ------------------------------------------------------- */
-/**
- * @} Math
- */
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 46ad2b114..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/Common_ed25519_c25519/internals/fe25519.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- ******************************************************************************
- * @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__
-#define __FE25519_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** @addtogroup FE25519 fe25519
-* @brief Arithmetic in GF(2^255-19)
-* @{
- */
-
-/* Includes ------------------------------------------------------------------*/
-/* Exported types ------------------------------------------------------------*/
-
-typedef struct
-{
- uint32_t v[8]; /*!< uint32_t array representing the number in low endian format */
-} fe25519; /*!< Representation of a number in GF(2^255-19) */
-
-/* Exported constants --------------------------------------------------------*/
-/* Exported macro ------------------------------------------------------------*/
-/* Exported functions ------------------------------------------------------- */
-
-void fe25519_freeze(fe25519 *r);
-
-void fe25519_unpack(fe25519 *r, const uint8_t x[32]);
-
-void fe25519_pack(uint8_t r[32], const fe25519 *x);
-
-int32_t fe25519_iszero(const fe25519 *x);
-
-int32_t fe25519_iseq_vartime(const fe25519 *x, const fe25519 *y);
-
-void fe25519_cmov(fe25519 *r, const fe25519 *x, uint8_t b);
-
-void fe25519_copy(fe25519 *r, const fe25519 *x);
-
-void fe25519_setone(fe25519 *r);
-
-void fe25519_setzero(fe25519 *r);
-
-void fe25519_neg(fe25519 *r, const fe25519 *x);
-
-uint8_t fe25519_getparity(const fe25519 *x);
-
-void fe25519_add(fe25519 *r, const fe25519 *x, const fe25519 *y);
-
-void fe25519_sub(fe25519 *r, const fe25519 *x, const fe25519 *y);
-
-void fe25519_mul(fe25519 *r, const fe25519 *x, const fe25519 *y);
-
-void fe25519_square(fe25519 *r, const fe25519 *x);
-
-void fe25519_invert(fe25519 *r, const fe25519 *x);
-
-void fe25519_pow2523(fe25519 *r, const fe25519 *x);
-
-void fe25519_mult121665(fe25519 *r, const fe25519 *x);
-
-/**
-* @} fe25519
-*/
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __FE25519_H__ */
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 26cf34b4d..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/CBC/des_cbc.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- ******************************************************************************
- * @file des_cbc.h
- * @author MCD Application Team
- * @brief DES in CBC Mode
- ******************************************************************************
- * @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 __CRL_DES_CBC_H__
-#define __CRL_DES_CBC_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /** @ingroup DESCBC
- * @{
- */
- /* Exported types ------------------------------------------------------------*/
- /* Exported constants --------------------------------------------------------*/
- /* Exported macro ------------------------------------------------------------*/
- /* Exported functions ------------------------------------------------------- */
-#ifdef INCLUDE_ENCRYPTION
- /* load the key and ivec, eventually performs key schedule, etc. *****/
- int32_t DES_CBC_Encrypt_Init (DESCBCctx_stt *P_pDESCBCctx, \
- const uint8_t *P_pKey, \
- const uint8_t *P_pIv);
-
- /* launch crypto operation , can be called several times **********************/
- int32_t DES_CBC_Encrypt_Append (DESCBCctx_stt *P_pDESCBCctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /* Possible final output ******************************************************/
- int32_t DES_CBC_Encrypt_Finish (DESCBCctx_stt *P_pDESCBCctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-#endif
-#ifdef INCLUDE_DECRYPTION
- /* load the key and ivec, eventually performs key schedule, etc. *****/
- int32_t DES_CBC_Decrypt_Init (DESCBCctx_stt *P_pDESCBCctx, \
- const uint8_t *P_pKey, \
- const uint8_t *P_pIv);
-
- /* launch crypto operation , can be called several times **********************/
- int32_t DES_CBC_Decrypt_Append (DESCBCctx_stt *P_pDESCBCctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /* Possible final output ******************************************************/
- int32_t DES_CBC_Decrypt_Finish (DESCBCctx_stt *P_pDESCBCctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-#endif /* decryption */
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __CRL_DES_CBC_H__*/
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index a05d22b91..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/Common/des_common.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- ******************************************************************************
- * @file des_common.h
- * @author MCD Application Team
- * @brief DES common functions and definitions
- ******************************************************************************
- * @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 __DES_COMMON_H__
-#define __DES_COMMON_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-
- /** @addtogroup DES
- * @{
- */
- /* Exported constants --------------------------------------------------------*/
-#define CRL_DES_BLOCK 8 /*!< Number of bytes (uint8_t) necessary to store a DES block. */
-#define CRL_DES_KEY 8 /*!< Number of bytes (uint8_t) necessary to store a DES key. */
- /* Exported types ------------------------------------------------------------*/
- typedef struct
- {
- uint32_t mContextId; /*!< Unique ID of this context. \b Not \b used in current implementation. */
- SKflags_et mFlags; /*!< 32 bit mFlags, used to perform keyschedule */
- const uint8_t *pmKey; /*!< Pointer to original Key buffer */
- const uint8_t *pmIv; /*!< Pointer to original Initialization Vector buffer */
- int32_t mIvSize; /*!< Size of the Initialization Vector in bytes */
- uint32_t amIv[2]; /*!< Temporary result/IV */
- uint32_t amExpKey[32]; /*!< Expanded DES key */
- }
- DESCBCctx_stt; /*!< Structure for the context of a DES operation */
- /* Exported macro ------------------------------------------------------------*/
- /* Exported functions ------------------------------------------------------- */
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*__DES_COMMON_H__*/
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 705750275..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/ECB/des_ecb.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/**
- ******************************************************************************
- * @file des_ecb.h
- * @author MCD Application Team
- * @brief DES in ECB Mode
- ******************************************************************************
- * @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 __CRL_DES_ECB_H__
-#define __CRL_DES_ECB_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /** @ingroup DESECB
- * @{
- */
- /* Exported types ------------------------------------------------------------*/
- typedef DESCBCctx_stt DESECBctx_stt; /*!< Structure for the context of a DES operation */
- /* Exported constants --------------------------------------------------------*/
- /* Exported macro ------------------------------------------------------------*/
- /* Exported functions ------------------------------------------------------- */
-#ifdef INCLUDE_ENCRYPTION
- /* load the key and ivec, eventually performs key schedule, etc. *****/
- int32_t DES_ECB_Encrypt_Init(DESECBctx_stt *P_pDESECBctx, \
- const uint8_t *P_pKey, \
- const uint8_t *P_pIv);
-
- /* launch crypto operation , can be called several times **********************/
- int32_t DES_ECB_Encrypt_Append (DESECBctx_stt *P_pDESECBctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /* Possible final output ******************************************************/
- int32_t DES_ECB_Encrypt_Finish (DESECBctx_stt *P_pDESECBctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-#endif /* ECB Encryption */
-#ifdef INCLUDE_DECRYPTION
- /* load the key and ivec, eventually performs key schedule, etc. *****/
- int32_t DES_ECB_Decrypt_Init (DESECBctx_stt *P_pDESECBctx, \
- const uint8_t *P_pKey, \
- const uint8_t *P_pIv);
-
- /* launch crypto operation , can be called several times **********************/
- int32_t DES_ECB_Decrypt_Append (DESECBctx_stt *P_pDESECBctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /* Possible final output ******************************************************/
- int32_t DES_ECB_Decrypt_Finish (DESECBctx_stt *P_pDESECBctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-#endif /* ECB Decryption */
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __CRL_DES_ECB_H__*/
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/des.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/des.h
deleted file mode 100644
index d94ac6dca..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/DES/des.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- ******************************************************************************
- * @file des.h
- * @author MCD Application Team
- * @brief Container for the DES 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
- *
- ******************************************************************************
- */
-
-/* Includes ------------------------------------------------------------------*/
-#include "Common/des_common.h"
-
-#ifdef INCLUDE_ECB
-#include "ECB/des_ecb.h"
-#endif
-
-#ifdef INCLUDE_CBC
-#include "CBC/des_cbc.h"
-#endif
-
-/* Exported types ------------------------------------------------------------*/
-/* Exported constants --------------------------------------------------------*/
-/* Exported macro ------------------------------------------------------------*/
-/* Exported functions ------------------------------------------------------- */
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 5930facd8..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ECC/LowLevel/elliptic.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/**
- ******************************************************************************
- * @file elliptic.h
- * @author MCD Application Team
- * @brief Provides Elliptic Curve Cryptography (ECC) primitives.
- ******************************************************************************
- * @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 __CRL_ELLIPTIC_H__
-#define __CRL_ELLIPTIC_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-
- /** @addtogroup ECClowlevel
- * @{
- */
-
-
- /* Exported types ------------------------------------------------------------*/
- /* Note:
- * Elliptic curve equation over GF(p): y^2 = x^3+ax+b.
- * All the NIST elliptic curves have a=-3 for performance reasons.
- * The point number for an elliptic curve is given by n*h where
- * h is the co-factor; it's usual for standard curves h=1.
- * n is always a prime number and represents the curve order.
- */
-
-
- /* Exported functions ------------------------------------------------------- */
- /* Computes the symmetric of the point P_Point ********************************/
- int32_t ECCsymmetricPoint(const ECpoint_stt *P_pECpnt,
- ECpoint_stt *P_pECsymmetricPnt,
- const EC_stt *P_pECctx,
- membuf_stt *P_pMemBuf);
-
- /* PA=normalized PP. **********************************************************/
- int32_t Normalize(const ECpoint_stt *P_pECinputPnt,
- ECpoint_stt *P_pECnormPnt,
- const montyParams_stt* P_pMontyParams);
-
- /* Converts the x coordinates from integers modulo p to the Montgomery domain */
- int32_t ECCpoint2Monty(ECpoint_stt *P_pECpnt, const montyParams_stt *P_pMontyParams);
-
- /* Converts the x coordinates from the Montgomery domain to integers modulo p */
- int32_t ECCpointFromMonty(ECpoint_stt *P_pECpnt, const montyParams_stt *P_pMontyParams);
-
- /* Point addition in Jacobian Projective coordinates and in the Montgomery domain. */
- int32_t MontyJacProjAddPoints(const ECpoint_stt *P_pECpnt1,
- const ECpoint_stt *P_pECpnt2,
- ECpoint_stt *P_pECpntSum,
- const EC_stt *P_pECctx,
- const montyParams_stt *P_pMontyParams);
-
- /* Point doubling in Jacobian Projective coordinates and in the Montgomery domain. P2=2*P1*/
- int32_t MontyJacProjDoublePoint(const ECpoint_stt *P_pECpnt,
- ECpoint_stt *P_pECpntDoubled,
- const EC_stt *P_pECctx,
- const montyParams_stt *P_pMontyParams);
-
-
- int32_t NAF_Binary_PointMul(const BigNum_stt *P_pBNk,
- const ECpoint_stt * P_pECbasePnt,
- ECpoint_stt * P_pECresultPnt,
- const EC_stt *P_pECctx,
- const montyParams_stt *P_pMontyParams);
- int32_t Binary_DoublePointMul(const BigNum_stt *P_pBNk1,
- ECpoint_stt * P_pECbase1Pnt,
- const BigNum_stt *P_pBNk2,
- const ECpoint_stt * P_pECbase2Pnt,
- ECpoint_stt * P_pECresultPnt,
- const EC_stt *P_pECctx,
- const montyParams_stt *P_pMontyParams);
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /*__CRL_ELLIPTIC_H__ */
-
-/**
- * @}
- */
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ECC/ecc.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ECC/ecc.h
deleted file mode 100644
index 6edb39140..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ECC/ecc.h
+++ /dev/null
@@ -1,260 +0,0 @@
-/**
- ******************************************************************************
- * @file ecc.h
- * @author MCD Application Team
- * @brief Provides Elliptic Curve Cryptography (ECC) primitives
- ******************************************************************************
- * @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 __CRL_ECC_H__
-#define __CRL_ECC_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Includes ------------------------------------------------------------------*/
-#include "../Common_ecc_rsa/MATH/math.h"
-
- /** @addtogroup ECC
- * @{
- */
-
- /**
- * @brief Structure continaing the BigNum_stt that describes the parameters of an Elliptic Curve and its generator
- */
- typedef struct
- {
- BigNum_stt *pmA; /*!< Parameter a of the curve equation. */
- BigNum_stt *pmB; /*!< Parameter b of the curve equation. */
- BigNum_stt *pmP; /*!< Modulus p. */
- BigNum_stt *pmN; /*!< Order of the curve n. */
- BigNum_stt *pmGx; /*!< Coordinate pmX of curve's generator */
- BigNum_stt *pmGy; /*!< Coordinate pmY of curve's generator*/
- }
- intEC_stt;
-
-
- /**
- * @brief Structure that keeps the Elliptic Curve Parameter
- */
- typedef struct
- {
- const uint8_t *pmA; /*!< pointer to paramter "a" */
-
- int32_t mAsize; /*!< size of paramter "a" */
-
- const uint8_t *pmB; /*!< pointer to paramter "b" */
-
- int32_t mBsize; /*!< size of paramter "b" */
-
- const uint8_t *pmP; /*!<pointer to paramter "p" */
-
- int32_t mPsize; /*!<size of paramter "p" */
-
- const uint8_t *pmN; /*!< pointer to paramter "n" */
-
- int32_t mNsize; /*!< size of paramter "n" */
-
- const uint8_t *pmGx; /*!< pointer to x coordinate of generator point */
-
- int32_t mGxsize; /*!< size of x coordinate of generator point */
-
- const uint8_t *pmGy; /*!< pointer to y coordinate of generator point */
-
- int32_t mGysize; /*!< size of y coordinate of generator point */
-
- intEC_stt *pmInternalEC; /*!< Pointer to internal structure for handling the parameters */
- }
- EC_stt;
-
-
- /**
- * @brief Enumeration to specify the possible flags for an Elliptic Curve Point
- */
- typedef enum ECPntFlags_e
- {
-
- E_POINT_GENERAL = 0, /*!< The point is not normalized (Coordinate Z != 1) */
-
- E_POINT_NORMALIZED = 1, /*!< The point is normalized (Coordinate Z == 1)*/
-
- E_POINT_INFINITY = 2, /*!< The point is the O point */
-
- E_POINT_MONTY = 4 /*!< The point's coordinates are expressed in Montgomery domain */
- } ECPntFlags_et;
-
- /**
- * @brief Object used to store an elliptic curve point.
- */
- typedef struct
- {
-
- BigNum_stt *pmX ; /*!< pmX coordinate. */
-
- BigNum_stt *pmY ; /*!< pmY coordinate. */
-
- BigNum_stt *pmZ ; /*!< pmZ coordinate, used in projective representations. */
-
- ECPntFlags_et mFlag; /*!< Point Flag, allowed values are: \n
- * - flag=CRL_EPOINT_GENERAL for a point which may have pmZ different from 1
- * - flag=CRL_EPOINT_NORMALIZED for a point which has pmZ equal to 1
- * - flag=CRL_EPOINT_INFINITY to denote the infinity point
- */
- }
- ECpoint_stt;
-
- /**
- * @brief Enumeration for the coordinates of an elliptic curve point
- */
- typedef enum ECcoordinate_e
- {
- E_ECC_POINT_COORDINATE_X = 0, /*!< Coordinate X */
-
- E_ECC_POINT_COORDINATE_Y = 1, /*!< Coordinate Y */
-
- E_ECC_POINT_COORDINATE_Z = 2, /*!< Coordinate Z */
- } ECcoordinate_et;
-
-
- /**
- * @brief Object used to store an ECC private key
- */
- typedef struct
- {
- BigNum_stt *pmD; /*!< BigNum Representing the Private Key */
- }
- ECCprivKey_stt;
-
- /**
- * @brief Object used to store an ECDSA signature
- */
- typedef struct
- {
- /** R */
- BigNum_stt *pmR ; /*!< pointer to paramter R*/
- /** S */
- BigNum_stt *pmS ; /*!< pointer to paramter S*/
- }
- ECDSAsignature_stt;
-
-
- /**
- * @brief Enumeration for the values inside the ECDSA signature
- */
- typedef enum ECDSAsignValues_e
- {
- E_ECDSA_SIGNATURE_R_VALUE = 0, /*!< Value R */
- E_ECDSA_SIGNATURE_S_VALUE = 1, /*!< Value S */
- } ECDSAsignValues_et;
-
- /**
- * @brief Structure used in ECDSA signature verification function
- */
- typedef struct
- {
-
- ECpoint_stt *pmPubKey; /*!< Pointer to the ECC Public Key used in the verification */
-
- EC_stt *pmEC; /*!< Pointer to Elliptic Curve parameters */
- }
- ECDSAverifyCtx_stt;
-
-
- /**
- * @brief Structure used in ECDSA signature generation function
- */
- typedef struct
- {
-
- ECCprivKey_stt *pmPrivKey; /*!< Pointer to the ECC Private Key used in the verification */
-
- EC_stt *pmEC; /*!< Pointer to Elliptic Curve parameters */
-
- RNGstate_stt *pmRNG; /*!< Pointer to an Initialized Random Engine Status */
- }
- ECDSAsignCtx_stt;
-
- /* Exported functions ------------------------------------------------------- */
- int32_t ECCinitEC(EC_stt *P_pECctx, membuf_stt *P_pMemBuf);
- int32_t ECCfreeEC(EC_stt *P_pECctx, membuf_stt *P_pMemBuf);
- int32_t ECCinitPoint(ECpoint_stt **P_ppECPnt, const EC_stt *P_pECctx, membuf_stt *P_pMemBuf);
- int32_t ECCfreePoint(ECpoint_stt **P_pECPnt, membuf_stt *P_pMemBuf);
- int32_t ECCsetPointCoordinate(ECpoint_stt *P_pECPnt,
- ECcoordinate_et P_Coordinate,
- const uint8_t *P_pCoordinateValue,
- int32_t P_coordinateSize);
- int32_t ECCgetPointCoordinate(const ECpoint_stt *P_pECPnt,
- ECcoordinate_et P_Coordinate,
- uint8_t *P_pCoordinateValue,
- int32_t *P_pCoordinateSize);
- int32_t ECCgetPointFlag(const 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);
- int32_t ECCinitPrivKey(ECCprivKey_stt **P_ppECCprivKey, const EC_stt *P_pECctx, membuf_stt *P_pMemBuf);
- int32_t ECCfreePrivKey(ECCprivKey_stt **P_pECCprivKey, membuf_stt *P_pMemBuf);
- int32_t ECCsetPrivKeyValue(ECCprivKey_stt *P_pECCprivKey,
- const uint8_t *P_pPrivateKey,
- int32_t P_privateKeySize);
- int32_t ECCgetPrivKeyValue(const ECCprivKey_stt *P_pECCprivKey,
- uint8_t *P_pPrivateKey,
- int32_t *P_pPrivateKeySize);
- int32_t ECCscalarMul(const ECpoint_stt *P_pECbasePnt,
- const ECCprivKey_stt *P_pECCprivKey,
- ECpoint_stt *P_pECresultPnt,
- const EC_stt *P_pECctx,
- membuf_stt *P_pMemBuf);
- int32_t ECDSAinitSign(ECDSAsignature_stt **P_ppSignature, const EC_stt *P_pECctx, membuf_stt *P_pMemBuf);
- int32_t ECDSAfreeSign(ECDSAsignature_stt **P_pSignature, membuf_stt *P_pMemBuf);
- int32_t ECDSAsetSignature(ECDSAsignature_stt *P_pSignature,
- ECDSAsignValues_et P_RorS,
- const uint8_t *P_pValue,
- int32_t P_valueSize);
- int32_t ECDSAgetSignature(const ECDSAsignature_stt *P_pSignature,
- ECDSAsignValues_et P_RorS,
- uint8_t *P_pValue,
- int32_t *P_pValueSize);
- int32_t ECDSAverify(const uint8_t *P_pDigest,
- int32_t P_digestSize,
- const ECDSAsignature_stt *P_pSignature,
- const ECDSAverifyCtx_stt *P_pVerifyCtx,
- membuf_stt *P_pMemBuf);
- int32_t ECCvalidatePubKey(const ECpoint_stt *pECCpubKey, const EC_stt *P_pECctx, membuf_stt *P_pMemBuf);
- int32_t ECCkeyGen(ECCprivKey_stt *P_pPrivKey,
- ECpoint_stt *P_pPubKey,
- RNGstate_stt * P_pRandomState,
- const EC_stt *P_pECctx,
- membuf_stt *P_pMemBuf);
- int32_t ECDSAsign(const uint8_t *P_pDigest,
- int32_t P_digestSize,
- const ECDSAsignature_stt *P_pSignature,
- const ECDSAsignCtx_stt *P_pSignCtx,
- membuf_stt *P_pMemBuf);
-
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __ECC_H */
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ED25519/ed25519.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ED25519/ed25519.h
deleted file mode 100644
index 7505f5ac5..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ED25519/ed25519.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/**
- ******************************************************************************
- * @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__
-#define __ED25519_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** @addtogroup ED25519
-* @{
-*/
-/* Includes ------------------------------------------------------------------*/
-#include <stdint.h>
-/* Exported types ------------------------------------------------------------*/
-
-/* Exported constants --------------------------------------------------------*/
-/* Exported macro ------------------------------------------------------------*/
-/* Exported functions ------------------------------------------------------- */
-int32_t ED25519keyGen(uint8_t *P_pPrivateKey, uint8_t *P_pPublicKey);
-int32_t ED25519sign(uint8_t *P_pSignature, const uint8_t *P_pInput, int32_t P_InputSize, const uint8_t *P_pPrivateKey);
-int32_t ED25519verify(const uint8_t *P_pInput, int32_t P_InputSize, const uint8_t *P_pSignature, const uint8_t *P_pPublicKey);
-
-/**
-* @}
-*/
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __ED25519_H__ */
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 1c7621ae8..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ED25519/internals/ge25519.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- ******************************************************************************
- * @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__
-#define __GE25519_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-/* Includes ------------------------------------------------------------------*/
-
-#include "../../Common_ed25519_c25519/internals/fe25519.h"
-#include "sc25519.h"
-
-/** @addtogroup GE25519
-* @{
-*/
-
-/* Exported types ------------------------------------------------------------*/
-
-typedef struct
-{
- fe25519 x; /*!< X Parameter of the representation */
- fe25519 y; /*!< Y Parameter of the representation */
- fe25519 z; /*!< Z Parameter of the representation */
- fe25519 t; /*!< T Parameter of the representation */
-} ge25519; /*!< Point on Twisted Edwards Curve ed25519 represented in extended coordinates */
-
-/* Exported constants --------------------------------------------------------*/
-/* Exported macro ------------------------------------------------------------*/
-/* Exported functions ------------------------------------------------------- */
-
-int32_t ge25519_unpackneg_vartime(ge25519 *r, const uint8_t p[32]);
-
-void ge25519_pack(uint8_t r[32], const ge25519 *p);
-
-void ge25519_double_scalarmult_vartime(ge25519 *r, const ge25519 *p1, const sc25519 *s1, const ge25519 *p2, const sc25519 *s2);
-
-void ge25519_scalarmult_base(ge25519 *r, const sc25519 *s);
-
-/**
-* @} ge25519
-*/
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __GE25519_H__ */
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 6dfc06647..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/ED25519/internals/sc25519.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/**
- ******************************************************************************
- * @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__
-#define __SC25519_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** @addtogroup sc25519
-* @{
-*/
-
-/* Includes ------------------------------------------------------------------*/
-/* Exported types ------------------------------------------------------------*/
-
-typedef struct
-{
- uint32_t v[8]; /*!< uint32_t array representing the number in low endian format */
-} sc25519; /*!< Representation of a number in GF(n = 2 ^ 252 + 27742317777372353535851937790883648493) */
-
-/* Exported constants --------------------------------------------------------*/
-/* Exported macro ------------------------------------------------------------*/
-/* Exported functions ------------------------------------------------------- */
-
-void sc25519_from32bytes(sc25519 *r, const unsigned char x[32]);
-
-void sc25519_from64bytes(sc25519 *r, const unsigned char x[64]);
-
-void sc25519_to32bytes(unsigned char r[32], const sc25519 *x);
-
-void sc25519_add(sc25519 *r, const sc25519 *x, const sc25519 *y);
-
-void sc25519_mul(sc25519 *r, const sc25519 *x, const sc25519 *y);
-
-
-#ifdef FAST_GE_COMPUTATION
-void sc25519_window3(signed char r[85], const sc25519 *s);
-
-void sc25519_2interleave2(unsigned char r[127], const sc25519 *s1, const sc25519 *s2);
-#endif
-
-/**
-* @} sc25519
-*/
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __SC25519_H__ */
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index bf0b69b32..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/Common/hash_common.h
+++ /dev/null
@@ -1,138 +0,0 @@
-/**
- ******************************************************************************
- * @file hash_common.h
- * @author MCD Application Team
- * @brief Provides common HASH/HMAC definitions
- ******************************************************************************
- * @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 __CRL_HASH_COMMON_H__
-#define __CRL_HASH_COMMON_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Exported types ------------------------------------------------------------*/
- /** @addtogroup HASH
- * @{
- */
-
- /**
- * @brief Enumeration of possible hash functions
- */
- typedef enum HashType_e
- {
- E_MD5, /*!< MD5 */
- E_SHA1, /*!< SHA-1 */
- E_SHA224, /*!< SHA-224 */
- E_SHA256, /*!< SHA-256 */
- E_SHA384, /*!< SHA-384 */
- E_SHA512, /*!< SHA-512 */
- } hashType_et;
-
-
- /**
- * @brief Type definitation for Hash/Hmac Flags
- */
-
- typedef enum HashFlags_e
- {
- E_HASH_DEFAULT = (uint32_t) (0x00000000), /*!< User Flag: No flag specified.
- This is the default value that should be set to this flag */
- E_HASH_DONT_PERFORM_KEY_SCHEDULE = (uint32_t) (0x00000001), /*!< User Flag: Used to force the init to not reperform key processing in HMAC mode. */
- E_HASH_OPERATION_COMPLETED = (uint32_t) (0x00000002), /*!< Internal Flag: used to check that the Finish function has been already called */
- E_HASH_NO_MORE_APPEND_ALLOWED = (uint32_t) (0x00000004), /*!< Internal Flag: 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.*/
- } HashFlags_et;
-
- /**
- * @brief Structure for HASH contextlags
- */
-
- typedef struct
- {
- uint32_t mContextId; /*!< Unique ID of this context. \b Not \b used in current implementation. */
- HashFlags_et mFlags; /*!< 32 bit mFlags, used to perform keyschedule */
- int32_t mTagSize; /*!< Size of the required Digest */
- uint8_t amBuffer[64]; /*!< Internal: It's a buffer with the data to be hashed */
- uint32_t amCount[2]; /*!< Internal: Keeps the count of processed bits */
- uint32_t amState[8]; /*!< Internal: Keeps the internal state */
- }
- HASHctx_stt;
- /**
- * @brief Structure for Large (SHA-512 based) HASH contexts
- */
-
- typedef struct
- {
- uint32_t mContextId; /*!< Unique ID of this context. \b Not \b used in current implementation. */
- HashFlags_et mFlags; /*!< 32 bit mFlags, used to perform keyschedule */
- int32_t mTagSize; /*!< Size of the required Digest */
- uint8_t amBuffer[128]; /*!< Internal: It's a buffer with the data to be hashed */
- uint32_t amCount[2]; /*!< Internal: Keeps the count of processed bits */
- uint64_t amState[8]; /*!< Internal: Keeps the internal state */
- }
- HASHLctx_stt;
-
-
- /**
- * @brief Structure for HMAC context
- */
- typedef struct
- {
- uint32_t mContextId; /*!< Unique ID of this context. \b Not \b used in current implementation. */
- HashFlags_et mFlags; /*!< 32 bit mFlags, used to perform keyschedule */
- int32_t mTagSize; /*!< Size of the required Digest */
- const uint8_t *pmKey; /*!< Pointer for the HMAC key */
- int32_t mKeySize; /*!< Size, in uint8_t (bytes) of the HMAC key */
- uint8_t amKey[64]; /*!< Internal: The HMAC key */
- HASHctx_stt mHASHctx_st; /*!< Internal: Hash Context */
- }
- HMACctx_stt;
- /**
- * @brief Structure for Large (SHA-512 based) HMAC context
- */
- typedef struct
- {
- uint32_t mContextId; /*!< Unique ID of this context. \b Not \b used in current implementation. */
- HashFlags_et mFlags; /*!< 32 bit mFlags, used to perform keyschedule */
- int32_t mTagSize; /*!< Size of the required Digest */
- const uint8_t *pmKey; /*!< Pointer for the HMAC key */
- int32_t mKeySize; /*!< Size, in uint8_t (bytes) of the HMAC key */
- uint8_t amKey[128]; /*!< Internal: The HMAC key */
- HASHLctx_stt mHASHctx_st; /*!< Internal: Hash Context */
- }
- HMACLctx_stt;
-
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*__CRL_HASH_COMMON_H__*/
-
-/* Exported constants --------------------------------------------------------*/
-/* Exported macro ------------------------------------------------------------*/
-/* Exported functions ------------------------------------------------------- */
-
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 2dfc7ffb2..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/Common/sha256_sha224_transform.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- ******************************************************************************
- * @file sha256_sha224_transform.h
- * @author MCD Application Team
- * @brief SHA-256 Update function
- ******************************************************************************
- * @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 __SHA256_TRANSFORM_H__
-#define __SHA256_TRANSFORM_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Exported functions ------------------------------------------------------- */
- /* SHA256 Update */
- void SHA256Update(HASHctx_stt* P_pSHA256ctx, \
- const uint8_t* P_pInput, \
- uint32_t P_inputSize);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*__SHA256_TRANSFORM_H__*/
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index b5da6a0f7..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/Common/sha512_sha384_transform.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- ******************************************************************************
- * @file sha512_sha384_transform.h
- * @author MCD Application Team
- * @brief SHA-512 Update function
- ******************************************************************************
- * @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 __SHA512_TRANSFORM_H__
-#define __SHA512_TRANSFORM_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Exported functions ------------------------------------------------------- */
- /* SHA512 Update */
- void SHA512Update(HASHLctx_stt* P_pSHA512ctx, const uint8_t* P_pInput, uint32_t P_inputSize);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*__SHA256_TRANSFORM_H__*/
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 72d1711fd..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/MD5/hmac_md5.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- ******************************************************************************
- * @file hmac_md5.h
- * @author MCD Application Team
- * @brief Provides HMAC-MD5 functions
- ******************************************************************************
- * @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 __CRL_HMAC_MD5_H__
-#define __CRL_HMAC_MD5_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Includes ------------------------------------------------------------------*/
-
- /** @ingroup HMAC_MD5
- * @{
- */
-
- /**
- * @brief HMAC-MD5 Context Structure
- */
- /* Exported types ------------------------------------------------------------*/
- typedef HMACctx_stt HMAC_MD5ctx_stt;
- /* Exported constants --------------------------------------------------------*/
- /* Exported macro ------------------------------------------------------------*/
- /* Exported functions ------------------------------------------------------- */
-
- int32_t HMAC_MD5_Init (HMAC_MD5ctx_stt *P_pHMAC_MD5ctx);
-
- int32_t HMAC_MD5_Append (HMAC_MD5ctx_stt *P_pHMAC_MD5ctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize);
-
- int32_t HMAC_MD5_Finish (HMAC_MD5ctx_stt *P_pHMAC_MD5ctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /**
- * @}
- */
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __CRL_HMAC_MD5_H__ */
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index b8573b1f3..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/MD5/md5.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- ******************************************************************************
- * @file md5.h
- * @author MCD Application Team
- * @brief Provides MD5 functions
- ******************************************************************************
- * @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 __CRL_MD5_H__
-#define __CRL_MD5_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Includes ------------------------------------------------------------------*/
-
- /** @ingroup MD5
- * @{
- */
-
- /* Exported constants --------------------------------------------------------*/
-#define CRL_MD5_SIZE 16 /*!< Number of bytes (uint8_t) to store a MD5 digest. */
-
- /**
- * @brief Structure for the MD5 context
- */
- /* Exported types ------------------------------------------------------------*/
-
- typedef HASHctx_stt MD5ctx_stt;
-
- /* Exported macro ------------------------------------------------------------*/
- /* Exported functions ------------------------------------------------------- */
- /* Initialization of Context */
- int32_t MD5_Init (MD5ctx_stt *P_pMD5ctx);
- /* Data processing function */
- int32_t MD5_Append (MD5ctx_stt *P_pMD5ctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize);
- \
- /* Returns digest */
- int32_t MD5_Finish (MD5ctx_stt *P_pMD5ctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
- \
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*__CRL_MD5_H__*/
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 93994f806..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/MD5/md5_low_level.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- ******************************************************************************
- * @file md5_low_level.h
- * @author MCD Application Team
- * @brief MD5 core functions
- ******************************************************************************
- * @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 __MD5_LOW_LEVEL_H__
-#define __MD5_LOW_LEVEL_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Exported types ------------------------------------------------------------*/
- /* Exported constants --------------------------------------------------------*/
- /* Exported macro ------------------------------------------------------------*/
- /* Exported functions ------------------------------------------------------- */
- /* MD5 - Initialize new context */
- void crl_u_MD5_Init (MD5ctx_stt *P_pMD5ctx);
- /* MD5 Update function */
- void crl_u_MD5_Update (MD5ctx_stt *P_pMD5ctx, \
- const uint8_t *P_pInput, \
- uint32_t P_inputSize);
- /* MD5 finalization function */
- void crl_u_MD5_Finish (MD5ctx_stt *P_pMD5ctx, \
- uint8_t *P_pDigest);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*__MD5_LOW_LEVEL_H__*/
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 00dc5bad8..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA1/hmac_sha1.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- ******************************************************************************
- * @file hmac_sha1.h
- * @author MCD Application Team
- * @brief Provides HMAC-SHA1 functions
- ******************************************************************************
- * @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 __CRL_HMAC_SHA1_H__
-#define __CRL_HMAC_SHA1_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Includes ------------------------------------------------------------------*/
-
- /** @ingroup HMAC_SHA1
- * @{
- */
-
- /**
- * @brief HMAC-SHA-1 Context Structure
- */
-
- /* Exported types ------------------------------------------------------------*/
- typedef HMACctx_stt HMAC_SHA1ctx_stt;
-
- /* Exported constants --------------------------------------------------------*/
- /* Exported macro ------------------------------------------------------------*/
- /* Exported functions ------------------------------------------------------- */
-
- int32_t HMAC_SHA1_Init (HMAC_SHA1ctx_stt *P_pHMAC_SHA1ctx);
-
- int32_t HMAC_SHA1_Append (HMAC_SHA1ctx_stt *P_pHMAC_SHA1ctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize);
-
- int32_t HMAC_SHA1_Finish (HMAC_SHA1ctx_stt *P_pHMAC_SHA1ctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /**
- * @}
- */
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __CRL_HMAC_SHA1_H__ */
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 70499c667..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA1/sha1.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- ******************************************************************************
- * @file sha1.h
- * @author MCD Application Team
- * @brief Provides SHA1 functions
- ******************************************************************************
- * @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 __CRL_SHA1_H__
-#define __CRL_SHA1_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Includes ------------------------------------------------------------------*/
-
- /** @ingroup SHA1
- * @{
- */
- /* Exported constants --------------------------------------------------------*/
-#define CRL_SHA1_SIZE 20 /*!< Number of bytes (uint8_t) to store a SHA-1 digest. */
-
- /* Exported types ------------------------------------------------------------*/
- /**
- * @brief Structure for the SHA-1 context
- */
- typedef HASHctx_stt SHA1ctx_stt;
- /* Exported functions --------------------------------------------------------*/
- /* Initialization of Context */
- int32_t SHA1_Init(SHA1ctx_stt *P_pSHA1ctx);
- /* Data processing function */
- int32_t SHA1_Append(SHA1ctx_stt *P_pSHA1ctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize);
- /* Returns digest */
- int32_t SHA1_Finish(SHA1ctx_stt *P_pSHA1ctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*__CRL_SHA1_H__*/
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index f0652ed5e..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA1/sha1_low_level.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- ******************************************************************************
- * @file sha1_low_level.h
- * @author MCD Application Team
- * @brief SHA-1 core functions
- ******************************************************************************
- * @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 __SHA1_LOW_LEVEL_H__
-#define __SHA1_LOW_LEVEL_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Exported functions ------------------------------------------------------- */
- /* SHA1Init - Initialize new context */
- void SHA1Init (SHA1ctx_stt *P_pHASHctx);
-
- /* SHA1 Update function */
- void SHA1Update(SHA1ctx_stt* P_pHASHctx, \
- const uint8_t* P_pInput, \
- uint32_t P_inputSize);
-
- /* SHA1: finalization function */
- void SHA1Final (SHA1ctx_stt* P_pHASHctx, \
- uint8_t *P_pDigest);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*__SHA1_LOW_LEVEL_H__*/
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index c1bb96d71..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA224/hmac_sha224.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- ******************************************************************************
- * @file hmac_sha224.h
- * @author MCD Application Team
- * @brief Provides HMAC-SHA224 functions
- ******************************************************************************
- * @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 __CRL_HMAC_SHA224_H__
-#define __CRL_HMAC_SHA224_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Includes ------------------------------------------------------------------*/
-
- /** @ingroup HMAC_SHA224
- * @{
- */
-
- /**
- * @brief HMAC-SHA-224 Context Structure
- */
- /* Exported constants --------------------------------------------------------*/
- /* Exported types ------------------------------------------------------------*/
- typedef HMACctx_stt HMAC_SHA224ctx_stt;
-
-
- /* Exported macro ------------------------------------------------------------*/
- /* Exported functions ------------------------------------------------------- */
-
- int32_t HMAC_SHA224_Init (HMAC_SHA224ctx_stt *P_pHMAC_SHA224ctx);
-
- int32_t HMAC_SHA224_Append (HMAC_SHA224ctx_stt *P_pHMAC_SHA224ctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize);
-
- int32_t HMAC_SHA224_Finish (HMAC_SHA224ctx_stt *P_pHMAC_SHA224ctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /**
- * @}
- */
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __CRL_HMAC_SHA224_H__ */
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 61bb2bce1..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA224/sha224.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- ******************************************************************************
- * @file sha224.h
- * @author MCD Application Team
- * @brief Provides SHA224 functions
- ******************************************************************************
- * @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 __CRL_SHA224_H__
-#define __CRL_SHA224_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Includes ------------------------------------------------------------------*/
-
- /** @ingroup SHA224
- * @{
- */
- /* Exported constants --------------------------------------------------------*/
-#define CRL_SHA224_SIZE 28 /*!< Number of bytes (uint8_t) to store a SHA-224 digest. */
-
- /* Exported functions --------------------------------------------------------*/
- /** Structure for the SHA-224 context */
- typedef HASHctx_stt SHA224ctx_stt;
- /* Initialization of Context */
- int32_t SHA224_Init (SHA224ctx_stt *P_pSHA224ctx);
- /* Data processing function */
- int32_t SHA224_Append (SHA224ctx_stt *P_pSHA224ctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize);
- /* Returns digest */
- int32_t SHA224_Finish (SHA224ctx_stt *P_pSHA224ctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*__CRL_SHA224_H__*/
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 914cf1d3e..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA224/sha224_low_level.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- ******************************************************************************
- * @file sha224_low_level.h
- * @author MCD Application Team
- * @brief SHA-224 core functions
- ******************************************************************************
- * @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 __SHA224_LOW_LEVEL_H__
-#define __SHA224_LOW_LEVEL_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Need this include for shared Update */
-
- /* Exported functions ------------------------------------------------------- */
- /* SHA-224 Initialize new context */
- void SHA224Init(SHA224ctx_stt* P_pSHA224ctx);
- /* SHA-224 finalization function */
- void SHA224Final(SHA224ctx_stt* P_pSHA224ctx, \
- uint8_t *P_pDigest);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*__SHA224_LOW_LEVEL_H__*/
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 5648fdf01..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA256/hmac_sha256.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/**
- ******************************************************************************
- * @file hmac_sha256.h
- * @author MCD Application Team
- * @brief Provides HMAC-SHA256 functions
- ******************************************************************************
- * @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 __CRL_HMAC_SHA256_H__
-#define __CRL_HMAC_SHA256_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Includes ------------------------------------------------------------------*/
-
- /** @ingroup HMAC_SHA256
- * @{
- */
-
- /**
- * @brief HMAC-SHA-256 Context Structure
- */
- /* Exported types ------------------------------------------------------------*/
- typedef HMACctx_stt HMAC_SHA256ctx_stt;
-
- /* Exported constants --------------------------------------------------------*/
- /* Exported macro ------------------------------------------------------------*/
- /* Exported functions ------------------------------------------------------- */
-
- int32_t HMAC_SHA256_Init (HMAC_SHA256ctx_stt *P_pHMAC_SHA256ctx);
-
- int32_t HMAC_SHA256_Append (HMAC_SHA256ctx_stt *P_pHMAC_SHA256ctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize);
-
- int32_t HMAC_SHA256_Finish (HMAC_SHA256ctx_stt *P_pHMAC_SHA256ctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /**
- * @}
- */
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __CRL_HMAC_SHA256_H__ */
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index e7a227860..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA256/sha256.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- ******************************************************************************
- * @file sha256.h
- * @author MCD Application Team
- * @brief Provides SHA256 functions
- ******************************************************************************
- * @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 __CRL_SHA256_H__
-#define __CRL_SHA256_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Includes ------------------------------------------------------------------*/
-
- /** @ingroup SHA256
- * @{
- */
- /* Exported constants --------------------------------------------------------*/
-#define CRL_SHA256_SIZE 32 /*!< Number of bytes (uint8_t) to store a SHA-256 digest. */
- /* Exported types ------------------------------------------------------------*/
- /** Structure for the SHA-256 context */
- typedef HASHctx_stt SHA256ctx_stt;
-
- /* Exported functions --------------------------------------------------------*/
-
- /* Initialization of Context */
- int32_t SHA256_Init(SHA256ctx_stt *P_pSHA256ctx);
- /* Data processing function */
- int32_t SHA256_Append(SHA256ctx_stt *P_pSHA256ctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize);
- /* Returns digest */
- int32_t SHA256_Finish(SHA256ctx_stt *P_pSHA256ctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*__CRL_SHA256_H__*/
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 5685ba36b..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA256/sha256_low_level.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- ******************************************************************************
- * @file sha256_low_level.h
- * @author MCD Application Team
- * @brief SHA-256 core functions
- ******************************************************************************
- * @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 __SHA256_LOW_LEVEL_H__
-#define __SHA256_LOW_LEVEL_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-
- /* Exported functions ------------------------------------------------------- */
- /* SHA-256 Initialize new context */
- void SHA256Init (SHA256ctx_stt* P_pSHA256ctx);
- /* SHA-256 finalization function */
- void SHA256Final (SHA256ctx_stt* P_pSHA256ctx, \
- uint8_t *P_pDigest);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*__SHA256_LOW_LEVEL_H__*/
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 7be147c4f..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA384/hmac_sha384.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- ******************************************************************************
- * @file hmac_sha384.h
- * @author MCD Application Team
- * @brief Provides HMAC-SHA384 functions
- ******************************************************************************
- * @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 __CRL_HMAC_SHA384_H__
-#define __CRL_HMAC_SHA384_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Includes ------------------------------------------------------------------*/
-
- /** @ingroup HMAC_SHA384
- * @{
- */
-
- /**
- * @brief HMAC-SHA-384 Context Structure
- */
- typedef HMACLctx_stt HMAC_SHA384ctx_stt;
-
-
- /* Exported macro ------------------------------------------------------------*/
- /* Exported functions ------------------------------------------------------- */
-
- int32_t HMAC_SHA384_Init(HMAC_SHA384ctx_stt *P_pHMAC_SHA384ctx);
- int32_t HMAC_SHA384_Append(HMAC_SHA384ctx_stt *P_pHMAC_SHA384ctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize);
- int32_t HMAC_SHA384_Finish(HMAC_SHA384ctx_stt *P_pHMAC_SHA384ctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /**
- * @}
- */
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __CRL_HMAC_SHA384_H__ */
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 889a0ca4f..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA384/sha384.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/**
- ******************************************************************************
- * @file sha384.h
- * @author MCD Application Team
- * @brief Provides SHA384 functions
- ******************************************************************************
- * @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
- *
- ******************************************************************************
- */
-
-/*! \page Tutorial_SHA384 SHA384 Tutorial
- *
- * Here follows an example of SHA384 functionality.
- * Please remember that before starting to call the Init function the context \b requires user
- * initialization. The mFlags and mTagSize member must be initialized prior to calling the
- * init function. Look at the each function documentation to see what is needed prior of calling.
- *
- * The API functions to be used are:
- * - \ref SHA384_Init initialize an \ref SHA384ctx_stt context with required digest size and flags.
- * - \ref SHA384_Append process input buffers.
- * It can be called multiple times.
- * - \ref SHA384_Finish can be called only one time for the digest generation process.
- *
- * The following code performs a SHA384 hash of a buffer of size 1024 in a single Append call
- * \code
- * #include <stdio.h>
- * #include "crypto.h"
- * int32_t main()
- * {
- * uint8_t message[1024]={...};
- * uint8_t digest[CRL_SHA384_SIZE]; // 48 byte buffer
- * // outSize is for digest output size, retval is for return value
- * int32_t outSize, retval;
- * SHA384ctx_stt context_st; // The SHA384 context
- *
- * // Initialize Context Flag with default value
- * context_st.mFlags = E_HASH_DEFAULT;
- * // Set the required digest size to be only of 4 bytes (while the maximum allowed by SHA384 is 48)
- * context_st.mTagSize = 4;
- *
- * // call init function
- * retval = SHA384_Init(&context_st);
- * if (retval != HASH_SUCCESS)
- * { ... }
- *
- * retval = SHA384_Append(&context_st, message, 1024);
- * if (retval != HASH_SUCCESS)
- * { ... }
- *
- * //Generate the message digest
- * //Note that only the requested number of bytes of the digest will be written, in this case 4.
- * retval = SHA384_Finish(&context_st, digest, &outSize );
- * if (retval != HASH_SUCCESS)
- * { ... }
- * }
- * \endcode
-*/
-
-/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __CRL_SHA384_H__
-#define __CRL_SHA384_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Includes ------------------------------------------------------------------*/
-
- /** @ingroup SHA384
- * @{
- */
-#define CRL_SHA384_SIZE 48 /*!< Number of bytes (uint8_t) to store a SHA-384 digest. */
-
- /** Structure for the SHA-384 context */
- typedef HASHLctx_stt SHA384ctx_stt;
- /* Initialization of Context */
- int32_t SHA384_Init(SHA384ctx_stt *P_pSHA384ctx);
- /* Data processing function */
- int32_t SHA384_Append(SHA384ctx_stt *P_pSHA384ctx, const uint8_t *P_pInputBuffer, int32_t P_inputSize);
- /* Returns digest */
- int32_t SHA384_Finish(SHA384ctx_stt *P_pSHA384ctx, uint8_t *P_pOutputBuffer, int32_t *P_pOutputSize);
-
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*__CRL_SHA384_H__*/
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index f82871ae6..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA384/sha384_low_level.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- ******************************************************************************
- * @file sha384_low_level.h
- * @author MCD Application Team
- * @brief SHA-384 core functions
- ******************************************************************************
- * @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 __SHA384_LOW_LEVEL_H__
-#define __SHA384_LOW_LEVEL_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Exported functions ------------------------------------------------------- */
- /* SHA-384 Initialize new context */
- void SHA384Init(SHA384ctx_stt* P_pSHA384ctx);
- /* SHA-384 finalization function */
- void SHA384Final(SHA384ctx_stt* P_pSHA384ctx, \
- uint8_t *P_pDigest);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*__SHA384_LOW_LEVEL_H__*/
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 65c7a7cb5..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA512/hkdf512.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- ******************************************************************************
- * @file hkdf512.h
- * @author MCD Application Team
- * @brief Provides HKDF-SHA512 functions
- ******************************************************************************
- * @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 __CRL_HKDF_SHA512_H__
-#define __CRL_HKDF_SHA512_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Includes ------------------------------------------------------------------*/
-#include "hmac_sha512.h"
-
- /** @ingroup HKDF_SHA512
- * @{
- */
-
-
- /**
- * @brief Structure HKDF-SHA-512 input
- */
- typedef struct
- {
- const uint8_t *pmKey; /*!< Pointer for the HKDF Key */
- int32_t mKeySize; /*!< Size of the HKDF Key */
- const uint8_t *pmSalt; /*!< Pointer for the HKDF Salt */
- int32_t mSaltSize; /*!< Size of the HKDF Salt */
- const uint8_t *pmInfo; /*!< Pointer for the HKDF Info */
- int32_t mInfoSize; /*!< Size of the HKDF Info */
- }
- HKDFinput_stt;
-
-
-
- /* Exported macro ------------------------------------------------------------*/
- /* Exported functions ------------------------------------------------------- */
- int32_t HKDF_SHA512(const HKDFinput_stt *P_pInputSt, uint8_t *P_pOutputBuffer, int32_t P_OutputSize);
- /**
- * @}
- */
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __CRL_HKDF_SHA512_H__ */
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index b8fec1404..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA512/hmac_sha512.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/**
- ******************************************************************************
- * @file hmac_sha512.h
- * @author MCD Application Team
- * @brief Provides HMAC-SHA512 functions
- ******************************************************************************
- * @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
- *
- ******************************************************************************
- */
-
-/*! \page Tutorial_HMACSHA512 HMAC-SHA512 Tutorial
- *
- * Here follows an example of HMAC-SHA512 functionality.
- * Please remember that before starting to call the Init function the context \b requires user
- * initialization. \n
- * The mFlags, mTagSize, pmKey and mKeySize members must be initialized prior to calling the
- * init function. Look at the each function documentation to see what is needed prior of calling.
- *
- * The API functions to be used are:
- * - \ref HMAC_SHA512_Init initialize an \ref HMAC_SHA512ctx_stt context with required tag size, pointer to the key, key size and flags.
- * - \ref HMAC_SHA512_Append process input buffers.
- * It can be called multiple times.
- * - \ref HMAC_SHA512_Finish can be called only one time for the tag generation process.
- *
- * The following code performs a HMAC-SHA512 authentication of a buffer of size 1024 in 4 Append calls.
- * \code
- * #include <stdio.h>
- * #include "crypto.h"
- * int32_t main()
- * {
- * uint8_t message[1024]={...};
- * uint8_t key[12]={...};
- * uint8_t tag[4]; // In this example we just need a 4 byte tag
- * // outSize is for digest output size, retval is for return value
- * int32_t outSize, retval;
- * HMAC_SHA512ctx_stt context_st; // The HMAC-SHA512 context
- *
- * // Initialize Context Flag with default value
- * context_st.mFlags = E_HASH_DEFAULT;
- * // Set the required digest size to 4
- * context_st.mTagSize = 4;
- * // Set the pointer to the Key to be used for the authentication
- * context_st.pmKey = key;
- * // Set the key size
- * context_st.mKeySize = sizeof(key);
- *
- * // call init function
- * retval = HMAC_SHA512_Init(&context_st);
- * if (retval != HASH_SUCCESS)
- * { ... }
- *
- * // Loop to perform four calls to SHA512_Append, each processing 256 bytes
- * for (i = 0; i < 1024; i += 256)
- * { //Process i bytes of the message.
- * retval = HMAC_SHA512_Append(&context_st, message+i, 256);
- * if (retval != HASH_SUCCESS)
- * { ... }
- * }
- * //Generate the message digest
- * retval = HMAC_SHA512_Finish(&context_st, tag, &outSize );
- * if (retval != HASH_SUCCESS)
- * { ... }
- * }
- * \endcode
-*/
-
-/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __CRL_HMAC_SHA512_H__
-#define __CRL_HMAC_SHA512_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Includes ------------------------------------------------------------------*/
-
- /** @ingroup HMAC_SHA512
- * @{
- */
-
- /**
- * @brief HMAC-SHA-512 Context Structure
- */
- typedef HMACLctx_stt HMAC_SHA512ctx_stt;
-
-
- /* Exported macro ------------------------------------------------------------*/
- /* Exported functions ------------------------------------------------------- */
-
- int32_t HMAC_SHA512_Init(HMAC_SHA512ctx_stt *P_pHMAC_SHA512ctx);
- int32_t HMAC_SHA512_Append(HMAC_SHA512ctx_stt *P_pHMAC_SHA512ctx, const uint8_t *P_pInputBuffer, int32_t P_inputSize);
- int32_t HMAC_SHA512_Finish(HMAC_SHA512ctx_stt *P_pHMAC_SHA512ctx, uint8_t *P_pOutputBuffer, int32_t *P_pOutputSize);
-
- /**
- * @}
- */
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __CRL_HMAC_SHA512_H__ */
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 7ec340240..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA512/sha512.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- ******************************************************************************
- * @file sha512.h
- * @author MCD Application Team
- * @brief Provides SHA512 functions
- ******************************************************************************
- * @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
- *
- ******************************************************************************
- */
-
-/*! \page Tutorial_SHA512 SHA512 Tutorial
- *
- * Here follows an example of SHA512 functionality.
- * Please remember that before starting to call the Init function the context \b requires user
- * initialization. The mFlags and mTagSize member must be initialized prior to calling the
- * init function. Look at the each function documentation to see what is needed prior of calling.
- *
- * The API functions to be used are:
- * - \ref SHA512_Init initialize an \ref SHA512ctx_stt context with required digest size and flags.
- * - \ref SHA512_Append process input buffers.
- * It can be called multiple times.
- * - \ref SHA512_Finish can be called only one time for the digest generation process.
- *
- * The following code performs a SHA512 hash of a zero-size buffer in a single Append call
- * \code
- * #include <stdio.h>
- * #include "crypto.h"
- * int32_t main()
- * {
- * uint8_t message[1024]={...};
- * uint8_t digest[CRL_SHA512_SIZE]; // 64 byte buffer
- * // outSize is for digest output size, retval is for return value
- * int32_t outSize, retval;
- * SHA512ctx_stt context_st; // The SHA512 context
- *
- * // Initialize Context Flag with default value
- * context_st.mFlags = E_HASH_DEFAULT;
- * // Set the required digest size to be of 32 byte
- * context_st.mTagSize = 32;
- *
- * // call init function
- * retval = SHA512_Init(&context_st);
- * if (retval != HASH_SUCCESS)
- * { ... }
- *
- * retval = SHA512_Append(&context_st, message, 0);
- * if (retval != HASH_SUCCESS)
- * { ... }
- *
- * //Generate the message digest
- * retval = SHA512_Finish(&context_st, digest, &outSize );
- * if (retval != HASH_SUCCESS)
- * { ... }
- * }
- * \endcode
-*/
-
-/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __CRL_SHA512_H__
-#define __CRL_SHA512_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Includes ------------------------------------------------------------------*/
-
- /** @ingroup SHA512
- * @{
- */
-#define CRL_SHA512_SIZE 64 /*!< Number of bytes (uint8_t) to store a SHA-512 digest. */
-
- /** Structure for the SHA-512 context */
- typedef HASHLctx_stt SHA512ctx_stt;
-
- /* Initialization of Context */
- int32_t SHA512_Init(SHA512ctx_stt *P_pSHA512ctx);
- /* Data processing function */
- int32_t SHA512_Append(SHA512ctx_stt *P_pSHA512ctx, const uint8_t *P_pInputBuffer, int32_t P_inputSize);
- /* Returns digest */
- int32_t SHA512_Finish(SHA512ctx_stt *P_pSHA512ctx, uint8_t *P_pOutputBuffer, int32_t *P_pOutputSize);
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*__CRL_SHA512_H__*/
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index ffe7cc812..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/SHA512/sha512_low_level.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- ******************************************************************************
- * @file sha512_low_level.h
- * @author MCD Application Team
- * @brief SHA-512 core functions
- ******************************************************************************
- * @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 __SHA512_LOW_LEVEL_H__
-#define __SHA512_LOW_LEVEL_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-
- /* Exported functions ------------------------------------------------------- */
- /* SHA-512 Initialize new context */
- void SHA512Init(SHA512ctx_stt* P_pSHA512ctx);
- /* SHA-512 finalization function */
- void SHA512Final(SHA512ctx_stt* P_pSHA512ctx, uint8_t *P_pDigest);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*__SHA512_LOW_LEVEL_H__*/
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/hash.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/hash.h
deleted file mode 100644
index 1d01f8713..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/HASH/hash.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- ******************************************************************************
- * @file hash.h
- * @author MCD Application Team
- * @brief Container for the HASH 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
- *
- ******************************************************************************
- */
-
-/* Includes ------------------------------------------------------------------*/
-#include "Common/hash_common.h"
-
-/** @ingroup HASH
- * @{
- */
-
-#ifdef INCLUDE_MD5
-#include "MD5/md5.h"
-#ifdef INCLUDE_HMAC
-#include "MD5/hmac_md5.h"
-#endif
-#endif
-
-#ifdef INCLUDE_SHA1
-#include "SHA1/sha1.h"
-#ifdef INCLUDE_HMAC
-#include "SHA1/hmac_sha1.h"
-#endif
-#endif
-
-#ifdef INCLUDE_SHA224
-#include "SHA224/sha224.h"
-#include "Common/sha256_sha224_transform.h"
-#ifdef INCLUDE_HMAC
-#include "SHA224/hmac_sha224.h"
-#endif
-#endif
-
-#ifdef INCLUDE_SHA256
-#include "SHA256/sha256.h"
-#include "Common/sha256_sha224_transform.h"
-#ifdef INCLUDE_HMAC
-#include "SHA256/hmac_sha256.h"
-#endif
-#endif
-
-
-#ifdef INCLUDE_SHA384
-#include "SHA384/sha384.h"
-#include "Common/sha512_sha384_transform.h"
-#ifdef INCLUDE_HMAC
-#include "SHA384/hmac_sha384.h"
-#endif
-#endif
-
-
-#ifdef INCLUDE_SHA512
-#include "SHA512/sha512.h"
-#include "Common/sha512_sha384_transform.h"
-#include "SHA512/hmac_sha512.h"
-#include "SHA512/hkdf512.h"
-#endif
-
-/**
- * @} HASH
- */
-/* Exported types ------------------------------------------------------------*/
-/* Exported constants --------------------------------------------------------*/
-/* Exported macro ------------------------------------------------------------*/
-/* Exported functions ------------------------------------------------------- */
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/POLY1305/poly1305.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/POLY1305/poly1305.h
deleted file mode 100644
index df40b6e02..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/POLY1305/poly1305.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/**
- ******************************************************************************
- * @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__
-#define __POLY1305_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /** @addtogroup POLY1305
- * @{
- */
- /* Includes ------------------------------------------------------------------*/
-#include <stdint.h>
- /* Exported types ------------------------------------------------------------*/
-
- /**
- * @brief Type definitation for Poly1305-AES Flags
- */
- typedef enum
- {
- E_POLY1305_DEFAULT = (uint32_t)(0x00000000), /*!< User Flag: No flag specified.
- This is the default value that should be set to this flag */
- E_POLY1305_OPERATION_COMPLETED = (uint32_t)(0x00000002), /*!< Internal Flag: used to check that the Finish function has been already called */
- E_POLY1305_NO_MORE_APPEND_ALLOWED = (uint32_t)(0x00000004), /*!< Internal Flag: 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.*/
- } PolyFlags_et;
-
- /**
- * @brief Structure for Poly1305-AES context
- */
- typedef struct
- {
- uint32_t mContextId; /*!< Unique ID of this context. \b Not \b used in current implementation. */
- PolyFlags_et mFlags; /*!< 32 bit mFlags, used to perform keyschedule */
- const uint8_t *pmKey; /*!< Pointer to original 32 bytes Key buffer */
- const uint8_t *pmNonce; /*!< Pointer to original 16 bytes Nonce buffer */
- const uint8_t *pmTag; /*!< Pointer to Authentication TAG. This value must be set in decryption, and this TAG will be verified */
- int32_t mTagSize; /*!< Size of the required Authentication TAG */
- uint32_t r[5]; /*!< Internal: value of r */
- uint32_t h[5]; /*!< Internal: value of h */
- uint32_t pad[4]; /*!< Internal: value of encrypted nonce */
- }
- Poly1305ctx_stt;
-
-
- /* Exported constants --------------------------------------------------------*/
- /* Exported macro ------------------------------------------------------------*/
- /* Exported functions ------------------------------------------------------- */
-
- int32_t Poly1305_Auth_Init(Poly1305ctx_stt *P_pPoly1305ctx, const uint8_t *P_pKey, const uint8_t *P_pNonce);
-
- int32_t Poly1305_Auth_Append(Poly1305ctx_stt *P_pPoly1305ctx, const uint8_t *P_pInputBuffer, int32_t P_inputSize);
-
- int32_t Poly1305_Auth_Finish(Poly1305ctx_stt *P_pPoly1305ctx, uint8_t *P_pOutputBuffer, int32_t *P_pOutputSize);
-
- int32_t Poly1305_Verify_Init(Poly1305ctx_stt *P_pPoly1305ctx, const uint8_t *P_pKey, const uint8_t *P_pNonce);
-
- int32_t Poly1305_Verify_Append(Poly1305ctx_stt *P_pPoly1305ctx, const uint8_t *P_pInputBuffer, int32_t P_inputSize);
-
- int32_t Poly1305_Verify_Finish(Poly1305ctx_stt *P_pPoly1305ctx, uint8_t *P_pOutputBuffer, int32_t *P_pOutputSize);
- /**
- * @}
- */
- /* Lower level functionality. Useful for testing, might be used in real world if there is small NVM */
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __POLY1305_H__ */
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index e5fc3574f..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RNG/DRBG_AES128/drbg.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/**
- ******************************************************************************
- * @file drbg.h
- * @author MCD Application Team
- * @brief Implements a pseudo random engine based on AES128-DRBG.
- ******************************************************************************
- * @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 __CRL_DRGB_H__
-#define __CRL_DRGB_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /** @ingroup DRBG-AES128
- * @{
- */
-
- /* Exported types ------------------------------------------------------------*/
- /**
- * @brief Structure to store the state/context of the DRBG_AES128
- */
- typedef struct
- {
- uint32_t v[4]; /*!< V value, a 128 bit value */
- uint32_t key[4]; /*!< K value, a 128 bit value */
- uint32_t reseed_counter; /*!< Reseed counter 32-bit of data */
- }
- drbg_aes128_state_stt;
-
- /* Exported constants --------------------------------------------------------*/
-
-
-#define CRL_DRBG_AES_MAX_BYTES_PER_REQUEST 65536u /*!< Maximum number of bytes (uint8_t) a generate request can output */
-#define CRL_DRBG_AES128_ENTROPY_MIN_LEN 16u /*!< Minimum number of bytes for the entropy input */
-#define CRL_DRBG_AES_ENTROPY_MAX_LEN 32u /*!< Maximum number of bytes for the entropy input */
-#define CRL_DRBG_AES_MAX_PERS_STR_LEN 32u /*!< Maximum number of bytes for the personalization string */
-#define CRL_DRBG_AES_MAX_ADD_INPUT_LEN CRL_DRBG_AES_MAX_PERS_STR_LEN /*!< Maximum number of bytes for the additional input */
-#define CRL_DRBG_AES_MAX_NONCE_LEN 16u /*!< Maximum number of bytes for the nonce */
-#define CRL_DRBG_AES_REQS_BTW_RESEEDS 0xFFFFFFFF /*!< Maximum number of request before a reseed is needed. Not supported. */
-#define CRL_DRBG_AES128_STATE_SIZE 36u /*!< Required size in bytes for a DRBG-AES128 state */
-
- /* Exported functions ------------------------------------------------------- */
- /* DRBG functions *************************************************************/
- /* Instantiate function for DRBG_AES128 ***************************************/
- int32_t crl_DRBG_AES128_Instantiate (uint8_t *P_pState, \
- const uint8_t *P_pEntropyInput, \
- int32_t P_entropySize, \
- const uint8_t *P_pNonce, \
- int32_t P_nonceSize, \
- const uint8_t *P_pPersStr, \
- int32_t P_persStrSize);
- \
-
- /* Generate function for DRBG_AES128 ******************************************/
- int32_t crl_DRBG_AES128_Generate (uint8_t *P_pState, \
- uint8_t *P_pOutput, \
- const uint8_t *P_pAddInput, \
- int32_t P_addInputSize, \
- int32_t P_nBytes);
- \
- /* Reseed *********************************************************************/
- int32_t crl_DRBG_AES128_Reseed (uint8_t *P_pState, \
- const uint8_t *P_pEntropyInput, \
- int32_t P_entropySize, \
- const uint8_t *P_pAddInput, \
- int32_t P_addInputSize);
- \
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*__DRGB_H__ */
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RNG/rng.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RNG/rng.h
deleted file mode 100644
index 96a456967..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RNG/rng.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/**
- ******************************************************************************
- * @file rng.h
- * @author MCD Application Team
- * @brief Provides the random engine to the crypto library
- ******************************************************************************
- * @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 __CRL_RNG_H__
-#define __CRL_RNG_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Includes ------------------------------------------------------------------*/
-#include "DRBG_AES128/drbg.h"
-
-
- /** @addtogroup RNG
- * @{
- */
- /* Exported constants ------------------------------------------------------- */
-
- /* Exported types ----------------------------------------------------------- */
- /**
- * @brief Structure that contains the RNG stat
- */
- typedef struct
- {
- uint8_t mRNGstate[CRL_DRBG_AES128_STATE_SIZE]; /*!< Underlying DRBG context. It is initialized by \ref RNGinit */
-
- int32_t mDRBGtype; /*!< Used to check if the random state has been mFlag */
-
- uint32_t mFlag; /*!< Used to check if the random state has been mFlag */
- }
- RNGstate_stt;
-
-
- /**
- * @brief Structure used by RNGinit to initialize a DRBG
- */
- typedef struct
- {
-
- uint8_t* pmEntropyData; /*!< The entropy data input */
-
- int32_t mEntropyDataSize; /*!< Size of the entropy data input */
-
- uint8_t* pmNonce; /*!< The Nonce data */
-
- int32_t mNonceSize; /*!< Size of the Nonce */
-
- uint8_t* pmPersData; /*!< Personalization String */
-
- int32_t mPersDataSize; /*!< Size of personalization string*/
- }
- RNGinitInput_stt;
-
-
- /**
- * @brief Structure used by RNGreseed to reseed a DRBG
- */
- typedef struct
- {
-
- uint8_t* pmEntropyData; /*!< The entropy data input */
-
- int32_t mEntropyDataSize; /*!< Size of the entropy data input */
-
- uint8_t* pmAddInput; /*!< Additional input */
-
- int32_t mAddInputSize; /*!< Size of additional input */
- }
- RNGreInput_stt;
-
- /**
- * @brief Structure used by RNGgenBytes or RNGgenWords to provide the optional additional input
- */
- typedef struct
- {
- uint8_t* pmAddInput; /*!< Additional input */
-
- int32_t mAddInputSize; /*!< Size of additional input */
- }
- RNGaddInput_stt;
-
-
- /* Exported functions ------------------------------------------------------- */
- /* Reseed random **************************************************************/
- int32_t RNGreseed (const RNGreInput_stt *P_pInputData, \
- RNGstate_stt *P_pRandomState);
-
- /* Initialize random **********************************************************/
- int32_t RNGinit (const RNGinitInput_stt *P_pInputData, \
- RNGstate_stt *P_pRandomState);
- /* Free random ****************************************************************/
- int32_t RNGfree (RNGstate_stt *P_pRandomState );
-
- /* Generate random octets to a buffer *****************************************/
- int32_t RNGgenBytes(RNGstate_stt *P_pRandomState, \
- const RNGaddInput_stt *P_pAddInput, \
- uint8_t *P_pOutput, \
- int32_t P_OutLen);
-
- /* Return a random int32_t ****************************************************/
- int32_t RNGgenWords(RNGstate_stt *P_pRandomState, \
- const RNGaddInput_stt *P_pAddInput, \
- uint32_t *P_pWordBuf, \
- int32_t P_BufSize);
-
-#ifdef __cplusplus
-}
-#endif
-
-/**
- * @}
- */
-
-
-#endif /* __CRL_RAND_H__ */
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index d56284f04..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RSA/LowLevel/rsa_low_level.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- ******************************************************************************
- * @file rsa_low_level.h
- * @author MCD Application Team
- * @brief Provides Low Level RSA operations
- ******************************************************************************
- * @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 __CRL_RSA_LOW_LEVEL_H__
-#define __CRL_RSA_LOW_LEVEL_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Includes ------------------------------------------------------------------*/
-
- /** @ingroup RSAlowlevel
- * @{
- */
-
-#define RSAEP(P_pPubKey, P_pInput, P_pOutput, P_pMemBuf) RSAVP1((P_pPubKey),(P_pInput),(P_pOutput), (P_pMemBuf)) /*!< Wrapper for RSAVP1*/
-#define RSADP(P_pPrivKey, P_pInput, P_pOutput, P_pMemBuf) RSASP1((P_pPrivKey),(P_pInput),(P_pOutput), (P_pMemBuf)) /*!< Wrapper for RSADP*/
-
-
- int32_t RSASP1(const RSAprivKey_stt *P_pPrivKey, const uint8_t * P_pEM, uint8_t *P_pOutput, membuf_stt *P_pMemBuf);
- int32_t RSAVP1(const RSApubKey_stt *P_pPubKey, const uint8_t * P_pSignature, uint8_t *P_pOutput, membuf_stt *P_pMemBuf);
-
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __CRL_RSA_LOW_LEVEL_H__ */
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 32515b209..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RSA/PKCS#1v15/rsa_pkcs1v15.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/**
- ******************************************************************************
- * @file rsa.h
- * @author MCD Application Team
- * @brief Provides RSA operations with support for PKCS#1v1.5
- ******************************************************************************
- * @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 __CRL_RSA_H__
-#define __CRL_RSA_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Includes ------------------------------------------------------------------*/
-
- /** @ingroup RSA
- * @{
- */
-
- /**
- * @brief Structure type for RSA public key
- */
- typedef struct
- {
- uint8_t *pmModulus; /*!< RSA Modulus */
- int32_t mModulusSize; /*!< Size of RSA Modulus */
- uint8_t *pmExponent; /*!< RSA Public Exponent */
- int32_t mExponentSize; /*!< Size of RSA Public Exponent */
- }
- RSApubKey_stt;
-
- /**
- * @brief Structure type for RSA private key
- */
- typedef struct
- {
- uint8_t *pmModulus; /*!< RSA Modulus */
- int32_t mModulusSize; /*!< Size of RSA Modulus */
- uint8_t *pmExponent; /*!< RSA Private Exponent */
- int32_t mExponentSize; /*!< Size of RSA Private Exponent */
- }
- RSAprivKey_stt;
-
- /**
- * @brief Structure type for input/output of PKCS#1 encryption/decryption operation
- */
- typedef struct
- {
- const uint8_t *pmInput; /*!< Pointer to input buffer */
- int32_t mInputSize; /*!< Size of input buffer */
- uint8_t *pmOutput; /*!< Pointer to output buffer */
- }
- RSAinOut_stt;
-
- int32_t RSA_PKCS1v15_Sign(const RSAprivKey_stt *P_pPrivKey, const uint8_t *P_pDigest, hashType_et P_hashType, uint8_t *P_pSignature, membuf_stt *P_pMemBuf);
-
- int32_t RSA_PKCS1v15_Verify(const RSApubKey_stt *P_pPubKey, const uint8_t *P_pDigest, hashType_et P_hashType, const uint8_t *P_pSignature, membuf_stt *P_pMemBuf);
-
- int32_t RSA_PKCS1v15_Encrypt (const RSApubKey_stt *P_pPubKey,
- RSAinOut_stt *P_pInOut_st,
- RNGstate_stt *P_pRandomState,
- membuf_stt *P_pMemBuf);
-
- int32_t RSA_PKCS1v15_Decrypt (const RSAprivKey_stt *P_pPrivKey,
- RSAinOut_stt *P_pInOut_st,
- int32_t *P_pOutputSize,
- membuf_stt *P_pMemBuf);
-
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __CRL_RSA_H__ */
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RSA/rsa.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RSA/rsa.h
deleted file mode 100644
index 45c16947d..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/RSA/rsa.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- ******************************************************************************
- * @file rsa.h
- * @author MCD Application Team
- * @brief Provides RSA operations with support for PKCS#1v1.5
- ******************************************************************************
- * @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
- *
- ******************************************************************************
- */
-
-/* Includes ------------------------------------------------------------------*/
-#include "PKCS#1v15/rsa_pkcs1v15.h"
-#include "LowLevel/rsa_low_level.h"
-/* Private typedef -----------------------------------------------------------*/
-/* Private define ------------------------------------------------------------*/
-/* Private macro -------------------------------------------------------------*/
-/* Private variables ---------------------------------------------------------*/
-/* Private function prototypes -----------------------------------------------*/
-/* Private functions ---------------------------------------------------------*/
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 537900acf..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/CBC/tdes_cbc.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/**
- ******************************************************************************
- * @file tdes_cbc.h
- * @author MCD Application Team
- * @brief TDES in CBC Mode
- ******************************************************************************
- * @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 __CRL_TDES_CBC_H__
-#define __CRL_TDES_CBC_H__
-
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /* Exported functions --------------------------------------------------------*/
- /** @ingroup TDESCBC
- * @{
- */
-#ifdef INCLUDE_ENCRYPTION
- /* load the key and ivec, eventually performs key schedule, etc. *****/
- int32_t TDES_CBC_Encrypt_Init (TDESCBCctx_stt *P_pTDESCBCctx, \
- const uint8_t *P_pKey, \
- const uint8_t *P_pIv);
-
- /* launch crypto operation , can be called several times **********************/
- int32_t TDES_CBC_Encrypt_Append (TDESCBCctx_stt *P_pTDESCBCctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /* Possible final output ******************************************************/
- int32_t TDES_CBC_Encrypt_Finish (TDESCBCctx_stt *P_pTDESCBCctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-#endif
-#ifdef INCLUDE_DECRYPTION
- /* load the key and ivec, eventually performs key schedule, etc. *****/
- int32_t TDES_CBC_Decrypt_Init (TDESCBCctx_stt *P_pTDESCBCctx, \
- const uint8_t *P_pKey, \
- const uint8_t *P_pIv);
-
- /* launch crypto operation , can be called several times **********************/
- int32_t TDES_CBC_Decrypt_Append (TDESCBCctx_stt *P_pTDESCBCctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /* Possible final output ******************************************************/
- int32_t TDES_CBC_Decrypt_Finish (TDESCBCctx_stt *P_pTDESCBCctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-#endif /* decryption */
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __CRL_TDES_CBC_H__*/
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index b5100d046..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/Common/tdes_common.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- ******************************************************************************
- * @file tdes_common.h
- * @author MCD Application Team
- * @brief TDES common functions and definitions
- ******************************************************************************
- * @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 __TDES_COMMON_H__
-#define __TDES_COMMON_H__
-
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-
-
- /** @addtogroup TDES
- * @{
- */
- /* Exported constants --------------------------------------------------------*/
-#define CRL_TDES_BLOCK 8 /*!< Number of bytes (uint8_t) necessary to store a Triple DES block. */
-#define CRL_TDES_KEY 24 /*!< Number of bytes (uint8_t) necessary to store a Triple DES key. */
- /* Exported types ------------------------------------------------------------*/
- typedef struct
- {
- uint32_t mContextId; /*!< Unique ID of this context. \b Not \b used in current implementation. */
- SKflags_et mFlags; /*!< 32 bit mFlags, used to perform keyschedule */
- const uint8_t *pmKey; /*!< Pointer to original Key buffer */
- const uint8_t *pmIv; /*!< Pointer to original Initialization Vector buffer */
- int32_t mIvSize; /*!< Size of the Initialization Vector in bytes */
- uint32_t amIv[2]; /*!< Temporary result/IV */
- uint32_t amExpKey[96]; /*!< Expanded DES key */
- }
- TDESCBCctx_stt; /*!< TDES context structure for ECB and CBC modes */
-
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*__TDES_COMMON_H__*/
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 56add265b..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/ECB/tdes_ecb.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/**
- ******************************************************************************
- * @file tdes_ecb.h
- * @author MCD Application Team
- * @brief TDES in ECB Mode
- ******************************************************************************
- * @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 __CRL_TDES_ECB_H__
-#define __CRL_TDES_ECB_H__
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
- /** @ingroup TDESECB
- * @{
- */
- /* Exported types ------------------------------------------------------------*/
- typedef TDESCBCctx_stt TDESECBctx_stt; /*!< TDES context structure for ECB and CBC modes */
- /* Exported functions --------------------------------------------------------*/
- /* load the key and ivec, eventually performs key schedule, etc. *****/
- int32_t TDES_ECB_Encrypt_Init (TDESECBctx_stt *P_pTDESECBctx, \
- const uint8_t *P_pKey, \
- const uint8_t *P_pIv);
-
- /* launch crypto operation , can be called several times **********************/
- int32_t TDES_ECB_Encrypt_Append (TDESECBctx_stt *P_pTDESECBctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /* Possible final output ******************************************************/
- int32_t TDES_ECB_Encrypt_Finish (TDESECBctx_stt *P_pTDESECBctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
-#ifdef INCLUDE_DECRYPTION
- /* load the key and ivec, eventually performs key schedule,, etc. *****/
- int32_t TDES_ECB_Decrypt_Init (TDESECBctx_stt *P_pTDESECBctx, \
- const uint8_t *P_pKey, \
- const uint8_t *P_pIv);
-
- /* launch crypto operation , can be called several times **********************/
- int32_t TDES_ECB_Decrypt_Append (TDESECBctx_stt *P_pTDESECBctx, \
- const uint8_t *P_pInputBuffer, \
- int32_t P_inputSize, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-
- /* Possible final output ******************************************************/
- int32_t TDES_ECB_Decrypt_Finish (TDESECBctx_stt *P_pTDESECBctx, \
- uint8_t *P_pOutputBuffer, \
- int32_t *P_pOutputSize);
-#endif /* ECB Decryption */
- /**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __CRL_TDES_ECB_H__*/
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/tdes.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/tdes.h
deleted file mode 100644
index 34ddcd572..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/TDES/tdes.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- ******************************************************************************
- * @file tdes.h
- * @author MCD Application Team
- * @brief Container for the TDES 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
- *
- ******************************************************************************
- */
-
-/* Includes ------------------------------------------------------------------*/
-#include "Common/tdes_common.h"
-
-#ifdef INCLUDE_ECB
-#include "ECB/tdes_ecb.h"
-#endif
-
-#ifdef INCLUDE_CBC
-#include "CBC/tdes_cbc.h"
-#endif
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/config.h b/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/config.h
deleted file mode 100644
index 165cd1dec..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/config.h
+++ /dev/null
@@ -1,408 +0,0 @@
-/**
- ******************************************************************************
- * @file config.h
- * @author MCD Application Team
- * @brief This file contains all the functions prototypes for the config firmware
- * library.
- ******************************************************************************
- * @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 __CRL_CONFIG_H__
-#define __CRL_CONFIG_H__
-
-/* Includes ------------------------------------------------------------------*/
-#include <stdint.h>
-#include "stm32wbxx.h"
-
-/* Exported types ------------------------------------------------------------*/
-
-/**
- * @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 CortexConf ; /*!< Used to get the Cortex.
- 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 */
- uint8_t IdeOptimization ; /*!< Used to get the compiler optimization.
- 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 */
- 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;
-
-/* Exported constants --------------------------------------------------------*/
-/* Exported macros -----------------------------------------------------------*/
-/* Exported functions ------------------------------------------------------- */
-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
- * @{
- */
-#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
- * 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
- * @{
- */
-#define SW ((uint8_t)0x01) /*!< This impelmentation is Full SW */
-/* #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
- * @{
- */
-/* #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
- * @{
- */
-#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
- * @{
- */
-#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 */
-#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
- * @{
- */
-
-#define CRL_ENDIANNESS 1 /*!< LITTLE 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
- * bytes to address not multiple by 4 then setting this flag to 1 will improve the performance
- * 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 + */
-
- /**
- * @} End of MisalignedConf
- */
-
- /**
- * @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
- */
-
- /**
- * @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_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_CHACHA20POLY1305 ((uint16_t)0x0080) /*!< oly1305-AES functions are included in the library */
-
- /**
- * @} End of SymKeyConf
- */
-
- /**
- * @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 */
-#define INCLUDE_CTR ((uint16_t)0x0004) /*!< AES high level functions for CTR mode are included in the library */
-#define INCLUDE_GCM ((uint16_t)0x0008) /*!< AES high level functions for GCM mode are included in the library */
-#define INCLUDE_KEY_WRAP ((uint16_t)0x0010) /*!< AES-KWRAP is included in the library */
-#define INCLUDE_CCM ((uint16_t)0x0020) /*!< AES-CCM is included in the library */
-#define INCLUDE_CMAC ((uint16_t)0x0040) /*!< AES-CMAC is included in the library */
-#define INCLUDE_XTS ((uint16_t)0x0080) /*!< AES-XTS is included in the library */
-#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
- */
-
- /**
- * @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
- */
-
- /**
- * @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 */
-#define INCLUDE_SHA224 ((uint16_t)0x0004) /*!< SHA-224 functions are included in the library */
-#define INCLUDE_SHA256 ((uint16_t)0x0008) /*!< SHA-256 functions are included in the library */
-#define INCLUDE_SHA384 ((uint16_t)0x0010) /*!< SHA-384 functions are included in the library */
-#define INCLUDE_SHA512 ((uint16_t)0x0020) /*!< SHA-512 functions are included in the library */
-#define INCLUDE_HMAC ((uint16_t)0x0040) /*!< Select if, for the selected hash algorithms, HMAC should be included in the library */
-#define INCLUDE_HKDF ((uint16_t)0x0080) /*!< Select if including the HKDF key derivation function, it requires HMAC */
-
-
- /**
- * @}
- */
-
- /**
- * @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
- * @{
- */
-#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
- */
-
-
-
-
-
-
- /**
- * @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 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
- * @{
- */
- /* #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
- */
-
-
-#endif /*__CRL_CONFIG_H__*/
-
-
- /************************ (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
deleted file mode 100644
index 9a9600b8b..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Inc/crypto.h
+++ /dev/null
@@ -1,196 +0,0 @@
-/**
- ******************************************************************************
- * @file crypto.h
- * @author MCD Application Team
- * @brief This file contains all the functions prototypes for the config firmware
- * library.
- ******************************************************************************
- * @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
- *
- ******************************************************************************
- */
-
-#include "config.h"
-
-/* List of automatically enabled defines and checks */
-#if defined ( __GNUC__ )
- #ifndef __weak
- #define __weak __attribute__((weak))
- #endif /* __weak */
-#endif
-
-/* INCLUDE_DRBG_AES128 requires AES128 with Encryption capabilities */
-#ifdef INCLUDE_DRBG_AES128
-#define INCLUDE_AES128 ((uint16_t)0x0004)
-#define INCLUDE_ENCRYPTION ((uint8_t)0x01)
-#endif
-
-#if defined(INCLUDE_AES128) || defined(INCLUDE_AES192) || defined(INCLUDE_AES256)
-#define INCLUDE_AES /*!< Automatically defined if AES has been selected */
-#endif
-
-#if defined(INCLUDE_DES) || defined(INCLUDE_TDES)
-#define INCLUDE_DES_CORE /*!< TripleDES and DES has the same core function, this flag enables it */
-#endif
-
-#if defined(INCLUDE_RSA) || defined (INCLUDE_ECC)
-#define INCLUDE_MATH /*!< The Multiprecision Math engine is included */
-#endif
-
-/** Hash functions are included */
-#ifdef INCLUDE_HKDF
-#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)
-#define INCLUDE_HASH /*!< Hash functions are included */
-#endif
-
-
-
-
-/*************************************************************************************************
-***-*-*-*-*--**- SOME CHECKS, DON'T MODIFY -**--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**
-*************************************************************************************************/
-#if (defined(INCLUDE_ENCRYPTION) || defined(INCLUDE_DECRYPTION)) && !(defined(INCLUDE_AES) || defined(INCLUDE_DES_CORE) || defined(INCLUDE_ARC4))
-#error "Either encryption or decryption has been specified but no AES or DES are present"
-#elif (!defined(INCLUDE_ENCRYPTION) && !defined(INCLUDE_DECRYPTION)) && (defined(INCLUDE_AES) || defined(INCLUDE_DES_CORE))
-#error "AES or DES are present but without encryption or decryption functionalities!"
-#endif
-
-#ifdef CRL_CPU_SUPPORT_MISALIGNED
- #ifndef CRL_ENDIANNESS
- #error "With CRL_CPU_SUPPORT_MISALIGNED=1 a definition for CRL_ENDIANNESS is required!"
- #endif
-#endif
-
-#if defined(INCLUDE_GCM) && !defined(INCLUDE_AES)
-#error "GCM is currently supported only by AES, but AES has not be included, please include AES or remove GCM"
-#endif
-
-#if defined(INCLUDE_CMAC) && !defined(INCLUDE_AES)
-#error "CMAC is currently supported only by AES, but AES has not be included, please include AES or remove GCM"
-#endif
-
-#if defined(INCLUDE_KEY_WRAP) && !defined(INCLUDE_AES)
-#error "KWRAP is currently supported only by AES, but AES has not be included, please include AES or remove KWRAP"
-#endif
-
-#if defined(INCLUDE_CTR) && !defined(INCLUDE_AES)
-#error "CTR is currently supported only by AES, but AES has not be included, please include AES or remove CTR"
-#endif
-
-#if defined(INCLUDE_CCM) && !defined(INCLUDE_AES)
-#error "CCM is currently supported only by AES, but AES has not be included, please include AES or remove CCM"
-#endif
-
-#if defined(INCLUDE_DRBG_AES128) && !defined(INCLUDE_AES128)
-#error "DRBG_AES128 requires INCLUDE_AES_128"
-#endif
-
-#if defined(INCLUDE_POLY1305) && !defined(INCLUDE_AES128)
-#error "POLY1305-AES requires INCLUDE_AES_128"
-#endif
-
-
-#if defined(INCLUDE_ED25519) && !defined(INCLUDE_SHA512)
-#error "ED25519 requires INCLUDE_SHA512"
-#endif
-
-#if defined(INCLUDE_ECC_SIGN) & !(defined(INCLUDE_DRBG_AES128))
-#error "To include ECC_SIGN functionalities you need a random generator. \n"
-#endif
-
-#if defined(INCLUDE_RSA) && !defined(RSA_WINDOW_SIZE)
-#define RSA_WINDOW_SIZE 1
-#endif
-
-/*************************************************************************************************
-***-*-*-*-*--**- STD PERIPHERAL DRIVERS INCLUSION -**--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-***
-*************************************************************************************************/
-#define CL_ON_STM32
-
-/*************************************************************************************************
-***-*-*-*-*--**- FAMILIES WITH HW CRYPTO -**--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-***
-*************************************************************************************************/
-
-#if defined(INCLUDE_DRBG_AES128)
-#define INCLUDE_RNG /*!< A Random Engine is present in the library */
-#endif
-
-/*************************************************************************************************
-***-*-*-*-*--**- CRYPTO LIBRARY INCLUSIONS -**-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-***
-*************************************************************************************************/
-#include <stdlib.h>
-#include <stdint.h>
-#include "Common/types.h"
-#include "Common/macros.h"
-#include "Common/err_codes.h"
-#include "Common/sk.h"
-
-#ifdef INCLUDE_AES
-#include "AES/aes.h"
-#endif
-
-#ifdef INCLUDE_DES
-#include "DES/des.h"
-#endif
-
-#ifdef INCLUDE_TDES
-#include "TDES/tdes.h"
-#endif
-
-#ifdef INCLUDE_ARC4
-#include "ARC4/arc4.h"
-#endif
-
-#ifdef INCLUDE_HASH
-#include "HASH/hash.h"
-#endif
-
-#ifdef INCLUDE_MATH
-#include "Common_ecc_rsa/MATH/math.h"
-#endif
-
-#ifdef INCLUDE_RSA
-#include "RSA/rsa.h"
-#endif
-
-#ifdef INCLUDE_RNG
-#include "RNG/rng.h"
-#endif
-
-#ifdef INCLUDE_ECC
-#include "ECC/ecc.h"
-#endif
-#ifdef INCLUDE_POLY1305
-#include "POLY1305/poly1305.h"
-#endif
-
-#ifdef INCLUDE_ED25519
-#include "ED25519/ed25519.h"
-#endif
-
-#ifdef INCLUDE_CURVE25519
-#include "C25519/c25519.h"
-#endif
-
-#ifdef INCLUDE_CHACHA
-#include "CHACHA/chacha.h"
-#endif
-
-#ifdef INCLUDE_CHACHA20POLY1305
-#include "CHACHA20-POLY1305/chacha20-poly1305.h"
-#endif
-
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index 34d45f45e..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_GCC.a
+++ /dev/null
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
deleted file mode 100644
index fc76e1993..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_GCC_fpu.a
+++ /dev/null
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
deleted file mode 100644
index 6b409d698..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_GCC_ot.a
+++ /dev/null
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
deleted file mode 100644
index 8840ada77..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_GCC_ot_fpu.a
+++ /dev/null
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
deleted file mode 100644
index 295b6ffb9..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_IARv8.a
+++ /dev/null
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
deleted file mode 100644
index a1cf36808..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_IARv8_fpu.a
+++ /dev/null
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
deleted file mode 100644
index a5775a677..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_IARv8_otnsc.a
+++ /dev/null
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
deleted file mode 100644
index 2ecacdbb8..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_IARv8_otnsc_fpu.a
+++ /dev/null
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
deleted file mode 100644
index cfaf18163..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_1elfspf.lib
+++ /dev/null
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
deleted file mode 100644
index be1b35d7d..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_1elfspf_fpu.lib
+++ /dev/null
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
deleted file mode 100644
index 3bc08690d..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_ot1elfspf.lib
+++ /dev/null
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
deleted file mode 100644
index 1544f71f6..000000000
--- a/Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_KEIL_ot1elfspf_fpu.lib
+++ /dev/null
Binary files differ
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/appli_test.h b/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/appli_test.h
index 86b854534..18cd591ae 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/appli_test.h
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/appli_test.h
@@ -2,39 +2,17 @@
******************************************************************************
* @file appli_test.h
* @author BLE Mesh Team
-* @version V1.12.000
-* @date 06-12-2019
* @brief Header file for the serial interface file
******************************************************************************
* @attention
*
-* <h2><center>&copy; COPYRIGHT(c) 2018 STMicroelectronics</center></h2>
+* <h2><center>&copy; Copyright (c) 2020 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. 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.
+* This software component is licensed by ST under Ultimate Liberty license
+* SLA0044, the "License"; You may not use this file except in compliance with
+* the License. You may obtain a copy of the License at:
+* www.st.com/SLA0044
*
******************************************************************************
*/
@@ -66,5 +44,5 @@ MOBLEUINT8 processDelay(MOBLEUINT16 waitPeriod);
#endif /* __RESPONSE_TEST_H */
-/******************* (C) COPYRIGHT 2018 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
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 3b9fac721..687480cc2 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/ble_mesh.h
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/ble_mesh.h
@@ -23,11 +23,11 @@
#include "types.h"
//#include "hal_types.h"
-#define BLE_MESH_APPLICATION_VERSION "1.12.008"
+#define BLE_MESH_APPLICATION_VERSION "1.13.000"
/**
* \mainpage ST BLE-Mesh Solutions Bluetooth LE Mesh Library
*
-* \version 1.12.008
+* \version 1.13.000
*
* \subsection contents_sec Contents
*
@@ -189,6 +189,7 @@ typedef struct
uint8_t pubKeyTypeOob; /* Used Public Key: OOB / No OOB */
const uint8_t *pubKey; /* Pointer to array containing Public Key of the device */
const uint8_t *privKey; /* Pointer to array containing Private Key of the device*/
+ uint8_t noOobAuthEnable; /* No OOB Authentication Enable */
uint8_t staticOobSize; /* Size of Static OOB array */
const uint8_t *staticOob; /* Pointer to array containing Static OOB info of the device */
uint8_t OutputOobSize; /* Size of Output OOB value */
@@ -223,6 +224,46 @@ typedef struct
MOBLEUINT8 rssi;
} neighbor_params_t;
+/**
+* Structure contains publication parameters of required model
+*/
+typedef struct
+{
+ MOBLEUINT8 elementAddress;
+ MOBLEUINT32 modelID;
+ MOBLEUINT16 publishAddress;
+ MOBLEUINT16 publishAppKeyIndex;
+ MOBLEUINT8 credentialFlag;
+ MOBLEUINT8 publishTTL;
+ MOBLEUINT8 publishPeriod;
+ MOBLEUINT8 publishRetransmitCount;
+ MOBLEUINT8 publishRetransmitIntervalSteps;
+} model_publicationparams_t;
+/** \brief of Message Header structure.
+ * This is the structure of message header for elementIndex, src-dst addresses,
+ * TTL, RSSI, NetKey & AppKey Offset
+ * \param[in] elementIndex: index of the element received from peer which is
+ * elementNumber-1
+ * \param[in] peer_addr: peer Source network address.
+ * \param[in] dst_peer : Destination address set by peer.
+ * \param[in] ttl: ttl of the received message.
+ * \param[in] rssi: rssi of the received message.
+ * \param[in] rcvdAppKeyOffset: AppKey Offset corresponding to received index.
+ * \param[in] rcvdNetKeyOffset: NetKey Offset corresponding to received index.
+ **/
+typedef struct
+{
+ MOBLEUINT8 elementIndex;
+ MOBLEUINT8 reserved[3];
+ MOBLE_ADDRESS peer_addr;
+ MOBLE_ADDRESS dst_peer;
+ MOBLEUINT8 ttl;
+ MOBLEUINT8 rssi;
+ MOBLEUINT8 rcvdAppKeyOffset;
+ MOBLEUINT8 rcvdNetKeyOffset;
+} MODEL_MessageHeader_t;
+
+
/** \brief Callback map */
typedef struct
{
@@ -231,15 +272,15 @@ typedef struct
* made via a call to \a BluenrgMesh_SetRemotePublication
* on a remote device.
* User is responsible for deserializing the data.
- * \param[in] peer Source network address.
- * \param[in] dst_peer Destination address set by peer.
+ * \param[in] *pmsgParam Pointer to structure of message header for parameters:
+ * src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* \param[in] offset Address of data in the data map.
* \param[in] data Data buffer. Contains vendor-specific representation of data.
* \param[in] length Data buffer length in bytes.
* \param[in] response Flag if response is required.
* \return MOBLE_RESULT_SUCCESS on success.
*/
- MOBLE_RESULT (*WriteLocalData)(MOBLE_ADDRESS peer, MOBLE_ADDRESS dst_peer,
+ MOBLE_RESULT (*WriteLocalData)(MODEL_MessageHeader_t *pmsgParams,
MOBLEUINT8 offset, MOBLEUINT8 const *data,
MOBLEUINT32 length, MOBLEBOOL response);
@@ -248,13 +289,13 @@ typedef struct
* made via a call to \a _ReadRemoteData on a remote device.
* User is responsible for serializing the data. After this callback
* successfully returns, data is sent back to the requesting peer.
- * \param[in] peer Source network address.
- * \param[in] dst_peer Destination address set by peer.
+ * \param[in] *pmsgParam Pointer to structure of message header for parameters:
+ * src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* \param[in] offset Address of data in the data map.
* \param[in] response Flag if response is required.
* \return MOBLE_RESULT_SUCCESS on success.
*/
- MOBLE_RESULT (*ReadLocalData)(MOBLE_ADDRESS peer, MOBLE_ADDRESS dst_peer,
+ MOBLE_RESULT (*ReadLocalData)(MODEL_MessageHeader_t *pmsgParams,
MOBLEUINT8 offset, MOBLEUINT8 const *data,
MOBLEUINT32 length, MOBLEBOOL response);
@@ -263,13 +304,13 @@ typedef struct
* made via a call to \a Send response on a remote device.
* User is responsible for serializing the data. After this callback
* successfully returns, data is sent back to the requesting peer.
- * \param[in] peer Source network address.
- * \param[in] dst_peer Destination address set by peer.
+ * \param[in] *pmsgParam Pointer to structure of message header for parameters:
+ * src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* \param[in] offset Address of data in the data map.
* \param[in] response Flag if response is required.
* \return MOBLE_RESULT_SUCCESS on success.
*/
- MOBLE_RESULT (*OnResponseData)(MOBLE_ADDRESS peer_addr, MOBLE_ADDRESS dst_peer,
+ MOBLE_RESULT (*OnResponseData)(MODEL_MessageHeader_t *pmsgParams,
MOBLEUINT8 command, MOBLEUINT8 const *pRxData,
MOBLEUINT32 dataLength, MOBLEBOOL response);
@@ -317,6 +358,15 @@ typedef struct
} MOBLE_USER_INTF_CB_MAP;
+/** \brief Config Model function Callback map */
+typedef struct
+{
+ /* Call back function to get the Publication Parameters when Publication Set
+ command received on Config Model*/
+ void (*GetPublicationParamsCb)(model_publicationparams_t*);
+
+} MOBLE_CONFIG_MODEL_CB_MAP;
+
/** \brief of opcode table structure.
* This is the structure of opcode of set, get and status message with the maximum
* and maximum parameter value for set,get and status messages.
@@ -330,14 +380,14 @@ typedef struct
**/
typedef struct
{
- MOBLEUINT32 model_id;
- MOBLEUINT32 opcode;
+ MOBLEUINT16 model_id;
+ MOBLEUINT16 opcode;
MOBLEBOOL reliable;
- MOBLEUINT16 min_payload_size;
- MOBLEUINT16 max_payload_size;
+ MOBLEUINT8 min_payload_size;
+ MOBLEUINT8 max_payload_size;
MOBLEUINT16 response_opcode;
- MOBLEUINT16 min_response_size;
- MOBLEUINT16 max_response_size;
+ MOBLEUINT8 min_response_size;
+ MOBLEUINT8 max_response_size;
} MODEL_OpcodeTableParam_t;
/** \brief Callback map */
@@ -357,16 +407,16 @@ typedef struct
/** \brief get message/status message process callback
* This function called when there will acknowleged message received or Get message is
* is received to get the status of the message.
- * \param[in] peer Source network address.
- * \param[in] dst_peer Destination address set by peer.
+ * \param[in] *pmsgParam Pointer to structure of message header for parameters:
+ * src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* \param[in] opcode to be processed
+ * \param[in] modelID to be processed
* \param[in] data Data buffer. to be sent back in status
* \param[in] length Data buffer length in bytes.
* \param[in] response Flag if response is required.
* \return MOBLE_RESULT_SUCCESS on success.
*/
- MOBLE_RESULT (*ModelSIG_GetRequestCb)(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+ MOBLE_RESULT (*ModelSIG_GetRequestCb)(MODEL_MessageHeader_t *pmsgParams,
MOBLEUINT16 opcode,
MOBLEUINT8 *data,
MOBLEUINT32 *res_length,
@@ -376,16 +426,15 @@ typedef struct
/** \brief set message process callback
* This function called when there will set message is received.
- * \param[in] peer Source network address.
- * \param[in] dst_peer Destination address set by peer.
+ * \param[in] *pmsgParam Pointer to structure of message header for parameters:
+ * src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* \param[in] opcode to be processed
* \param[in] data Data buffer. to be sent back in status
* \param[in] length Data buffer length in bytes.
* \param[in] response Flag if response is required.
* \return MOBLE_RESULT_SUCCESS on success.
*/
- MOBLE_RESULT (*ModelSIG_SetRequestCb)(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+ MOBLE_RESULT (*ModelSIG_SetRequestCb)(MODEL_MessageHeader_t *pmsgParams,
MOBLEUINT16 opcode,
MOBLEUINT8 const *data,
MOBLEUINT32 length,
@@ -411,16 +460,15 @@ typedef struct
/** \brief get message/status message process callback
* This function called when there will acknowleged message received or Get message is
* is received to get the status of the message.
- * \param[in] peer Source network address.
- * \param[in] dst_peer Destination address set by peer.
+ * \param[in] *pmsgParam Pointer to structure of message header for parameters:
+ * src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* \param[in] opcode to be processed
* \param[in] data Data buffer. to be sent back in status
* \param[in] length Data buffer length in bytes.
* \param[in] response Flag if response is required.
* \return MOBLE_RESULT_SUCCESS on success.
*/
- MOBLE_RESULT (*ModelVendor_GetRequestCb)(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+ MOBLE_RESULT (*ModelVendor_GetRequestCb)(MODEL_MessageHeader_t *pmsgParams,
MOBLEUINT16 opcode,
MOBLEUINT8 *data,
MOBLEUINT32 *res_length,
@@ -430,16 +478,15 @@ typedef struct
/** \brief set message process callback
* This function called when there will set message is received.
- * \param[in] peer Source network address.
- * \param[in] dst_peer Destination address set by peer.
+ * \param[in] *pmsgParam Pointer to structure of message header for parameters:
+ * src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* \param[in] opcode to be processed
* \param[in] data Data buffer. to be sent back in status
* \param[in] length Data buffer length in bytes.
* \param[in] response Flag if response is required.
* \return MOBLE_RESULT_SUCCESS on success.
*/
- MOBLE_RESULT (*ModelVendor_SetRequestCb)(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+ MOBLE_RESULT (*ModelVendor_SetRequestCb)(MODEL_MessageHeader_t *pmsgParams,
MOBLEUINT16 opcode,
MOBLEUINT8 const *data,
MOBLEUINT32 length,
@@ -549,7 +596,7 @@ MOBLE_RESULT BLEMesh_SetRemoteData(MOBLE_ADDRESS peer,
MOBLEUINT8 isVendor);
-/** \brief Set remote publication for the given Model ID & node Address
+/** \brief Set remote publication for the given Model ID to publish Address
* User is responsible for serializing data into \a data buffer. Vendor_WriteLocalDataCb
* callback will be called on the remote device.
* \param[in] modelId ID of the model.
@@ -568,6 +615,24 @@ MOBLE_RESULT BLEMesh_SetRemotePublication(MOBLEUINT32 modelId,
MOBLEBOOL response,
MOBLEUINT8 isVendor);
+/** \brief Send message for given Model ID & node Address
+* User is responsible for serializing data into \a data buffer
+* \param[in] srcAddress element Address of the Node
+* \param[in] peerAddress address of targeted node(s)
+* \param[in] opcode of message
+* \param[in] modelId ID of the model.
+* \param[in] data Data buffer.
+* \param[in] length Length of data in bytes.
+* \param[in] response If 'MOBLE_TRUE', used to get the response. If 'MOBLE_FALSE', no response
+* \return MOBLE_RESULT_SUCCESS on success.
+*/
+MOBLE_RESULT BLEMesh_ModelSendMessage(MOBLE_ADDRESS srcAddress,
+ MOBLE_ADDRESS peerAddress,
+ MOBLEUINT32 modelId,
+ MOBLEUINT16 opcode,
+ const MOBLEUINT8 *pData,
+ MOBLEUINT32 length);
+
/** \brief Vendor Model Set remote data on the given peer.
* User is responsible for serializing data into a data buffer.
* \param[in] peer Destination address. May be set to MOBLE_ADDRESS_ALL_NODES to broadcast data.
@@ -590,13 +655,12 @@ MOBLE_RESULT Vendor_WriteRemoteData (MOBLEUINT32 vendorModelId,
* User is responsible for serializing data into \a data buffer. Vendor_ReadLocalDataCb
* callback will be called on the remote device.
* It is reliable command
-* \param[in] peer Destination address. May be set to MOBLE_ADDRESS_ALL_NODES to broadcast data.
-* \param[in] elementIndex index of the element
+* \param[in] *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* \param[in] command vendor model commands
* \return MOBLE_RESULT_SUCCESS on success.
*/
-MOBLE_RESULT BLEMesh_ReadRemoteData(MOBLE_ADDRESS peer,
- MOBLEUINT8 elementIndex,
+MOBLE_RESULT BLEMesh_ReadRemoteData(MODEL_MessageHeader_t *pmsgParam,
MOBLEUINT16 command,
MOBLEUINT8 const * data,
MOBLEUINT32 length);
@@ -617,8 +681,8 @@ MOBLE_RESULT BLEMesh_SendResponse(MOBLE_ADDRESS peer,
MOBLEUINT32 length);
/** \brief Send response on received packet.
-* \param[in] peer Destination address. Must be a device address (0b0xxx xxxx xxxx xxxx, but not 0).
-* \param[in] dst Source Address of Node
+* \param[in] *pmsgParam Pointer to structure of message header for parameters:
+* src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* \param[in] status Status of response.
* \param[in] data Data buffer.
* \param[in] length Length of data in bytes. Maximum accepted length is 8.
@@ -626,26 +690,25 @@ MOBLE_RESULT BLEMesh_SendResponse(MOBLE_ADDRESS peer,
* \return MOBLE_RESULT_SUCCESS on success.
*/
MOBLE_RESULT VendorModel_SendResponse(MOBLEUINT16 vendorModelId,
- MOBLE_ADDRESS peer,
- MOBLE_ADDRESS dst,
+ MODEL_MessageHeader_t *pmsgParams,
MOBLEUINT8 status,
MOBLEUINT8 const * data,
MOBLEUINT32 length);
/** \brief Sensor Send response on received packet.
-* \param[in] peer Destination address. Must be a device address (0b0xxx xxxx xxxx xxxx, but not 0).
+* \param[in] *pmsgParam Pointer to structure of message header for parameters:
+* src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
+* \param[in] opcode to be send
* \param[in] data Data buffer.
* \param[in] length Length of data in bytes. Maximum accepted length is 8.
* If length is zero, no associated data is sent with the report.
* \return MOBLE_RESULT_SUCCESS on success.
*/
-MOBLE_RESULT Model_SendResponse(MOBLE_ADDRESS src_peer,
- MOBLE_ADDRESS dst_peer ,
+MOBLE_RESULT Model_SendResponse(MODEL_MessageHeader_t *pmsgParams,
MOBLEUINT16 opcode,
MOBLEUINT8 const *pData,
MOBLEUINT32 length);
-
/** \brief Config Model Send message to the remote
* \param[in] peer Destination address. Must be a device address (0b0xxx xxxx xxxx xxxx, but not 0).
* \param[in] data Data buffer.
@@ -726,6 +789,12 @@ MOBLE_RESULT BLEMesh_Unprovision(void);
*/
MOBLE_RESULT BLEMesh_BleHardwareInitCallBack(MOBLE_USER_BLE_CB_MAP const * _cb);
+/** \brief Set Config Model init callback
+* \param _cb callback
+* \return MOBLE_RESULT_SUCCESS on success, MOBLE_RESULT_FAIL if failure code.
+*/
+MOBLE_RESULT BLEMesh_BleConfigModelInitCallBack(MOBLE_CONFIG_MODEL_CB_MAP const * _cb);
+
/** \brief Get provisioning process state
* \return 0,1,2,3,4,5,6 during provisioning, else 7.
*/
@@ -748,9 +817,19 @@ MOBLE_ADDRESS BLEMesh_GetAddress(void);
* \return mesh address of a node.
*
*/
-MOBLE_ADDRESS BLEMesh_GetPublishAddress(MOBLEUINT8 elementNumber,
+MOBLE_ADDRESS BLEMesh_GetPublishAddress(MOBLEUINT8 elementIndex,
MOBLEUINT32 modelId);
+/** \brief Get Publish Parameters of a node
+*
+* This function gets publication parameters of required model of a element
+*
+* \return status of the command
+*
+*/
+MOBLE_RESULT BLEMesh_Get_PublicationParameters(model_publicationparams_t *pPublicationParams,
+ MOBLEUINT8 elementIndex, MOBLEUINT32 modelId);
+
/** \brief Get Subscription address of a node
*
* This function gets addresses of selected element.
@@ -760,9 +839,21 @@ MOBLE_ADDRESS BLEMesh_GetPublishAddress(MOBLEUINT8 elementNumber,
*/
MOBLE_RESULT BLEMesh_GetSubscriptionAddress(MOBLE_ADDRESS *addressList,
MOBLEUINT8 *sizeOfList,
- MOBLEUINT8 elementNumber,
+ MOBLEUINT8 elementIndex,
MOBLEUINT32 modelId);
+
+/** \brief Check Subscription address of a element for a model
+*
+* This function checks subscription of selected element.
+*
+* \return MOBLE_RESULT_SUCCESS on success, MOBLE_RESULT_FAIL if failure code
+*
+*/
+MOBLE_RESULT BLEMesh_ModelsCheckSubscription(MOBLE_ADDRESS dst_peer,
+ MOBLEUINT32 modelID,
+ MOBLEUINT8 elementIndex);
+
/** \brief Set default TTL value.
* When message is sent to mesh network, it contains TTL field. User shall call
* this function to set TTL value used during message transmission.
@@ -1001,6 +1092,14 @@ MOBLEBOOL BLEMesh_IsFlashReadyToErase(void);
*/
void BLEMesh_StopAdvScan(void);
+/** \brief Stop ongoing scan (if in scan mode) and advertisement (if in adv mode).
+*/
+void BLEMesh_SuspendAdvScan(void);
+
+/** \brief Stop ongoing scan (if in scan mode) and advertisement (if in adv mode).
+*/
+void BLEMesh_ResumeAdvScan(void);
+
/** \brief Set adv interval of provisioning service, 0 value results in stop.
* Default value: 1000 ms
* Actual value -> interval + random(16)
@@ -1088,7 +1187,7 @@ MOBLEUINT8 ApplicationGetCLIENTSigModelList(MOBLEUINT16* pModels_sig_ID,
* @param elementIndex: Index of the element for Model List
* retval Count of the SIG Model Servers enabled in the Application
*/
-MOBLE_RESULT BLEMeshSetSelfModelList(MOBLEUINT8 numberOfElements);
+MOBLEUINT8 BLEMeshSetSelfModelList(MOBLEUINT8 numberOfElements);
/**
* @brief ApplicationGetVendorModelList: This function provides the list of the
@@ -1180,6 +1279,36 @@ MOBLE_RESULT BLEMesh_SetFault(MOBLEUINT8 *pFaultArray,
MOBLE_RESULT BLEMesh_ClearFault(MOBLEUINT8 *pFaultArray,
MOBLEUINT8 faultArraySize);
+/** \brief Get the Number Of Elements.
+* \param[in] none
+* \return Number of Elements supported by Library
+*/
+MOBLEUINT8 BLEMesh_GetNumberOfElements(void);
+
+/** \brief Get the Models Count
+* \param[in] none
+* \return Number Of Models per element supported by Node
+*/
+MOBLEUINT8 BLEMesh_GetTotalModelsCount(void);
+
+/** \brief Get the Subscription Count per Model
+* \param[in] none
+* \return Number Of Subscription supported per Model of an Element
+*/
+MOBLEUINT8 BLEMesh_GetSubscriptionCount(void);
+
+/** \brief Get the App Keys Count
+* \param[in] none
+* \return Number of App Keys supported by Node
+*/
+MOBLEUINT8 BLEMesh_GetAppKeysCount(void);
+
+/** \brief Get Net Keys Count
+* \param[in] none
+* \return Number of Net Keys supported by Node
+*/
+MOBLEUINT8 BLEMesh_GetNetKeysCount(void);
+
/** \brief Bluetooth LE Mesh Library shutdown
*
* This function should be called to shutdown Bluetooth LE Mesh Library
@@ -1235,5 +1364,5 @@ void* GetMemoryDataBuffer(MOBLEUINT8 type, MOBLEUINT32 len);
#endif /* __BLE_MESH_ */
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/mesh_cfg.h b/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/mesh_cfg.h
new file mode 100644
index 000000000..d23fd65a7
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/mesh_cfg.h
@@ -0,0 +1,532 @@
+/**
+ ******************************************************************************
+ * @file mesh_cfg.h
+ * @author BLE Mesh Team
+ * @brief Header file for mesh_usr_cfg.c
+ ******************************************************************************
+ * @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 __MESH_CFG_H
+#define __MESH_CFG_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "mesh_cfg_usr.h"
+#include "app_conf.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
+
+/*
+* TRACE_M includes function name and clock
+*/
+void TraceHeader(const char* func_name, int mode);
+#define TraceB0(func_name, ...)
+#if ( CFG_DEBUG_TRACE != 0 )
+#define TraceB1(func_name, ...) do {TraceHeader(func_name, 0); printf( __VA_ARGS__);} while(0)
+#else
+#define TraceB1(func_name, ...)
+#endif
+#define TraceBX(flags, func_name, ...) TraceB ##flags(func_name, ##__VA_ARGS__)
+#define TRACE_M(flag, ...) TraceBX(flag, __func__, ##__VA_ARGS__)
+
+/*
+* TRACE_I does not include function name and clock
+*/
+#define TraceC0(...)
+#if ( CFG_DEBUG_TRACE != 0 )
+#define TraceC1(...) do { printf( __VA_ARGS__);} while(0)
+#else
+#define TraceC1(...)
+#endif
+//#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);
+
+
+/* No OOB Type Authentication Configuration */
+#ifdef ENABLE_AUTH_TYPE_NO_OOB
+#define AUTH_TYPE_NO_OOB_ENABLE_STATE TRUE
+#else
+#define AUTH_TYPE_NO_OOB_ENABLE_STATE FALSE
+#endif
+
+/* Static OOB Configurations */
+#ifdef ENABLE_AUTH_TYPE_STATIC_OOB
+#define SIZE_STATIC_OOB STATIC_OOB_SIZE
+#else
+#define SIZE_STATIC_OOB 0U
+#endif
+
+/* Output OOB Configurations */
+#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
+#define SIZE_OUTPUT_OOB OUTPUT_OOB_SIZE
+#define OUTPUT_OOB_ACTION OUTPUT_OOB_ACTION_BIT_BLINK
+#else
+#define SIZE_OUTPUT_OOB 0U
+#define OUTPUT_OOB_ACTION OUTPUT_OOB_ACTION_BIT_BLINK
+#endif
+
+/* Input OOB Configurations */
+#ifdef ENABLE_AUTH_TYPE_INPUT_OOB
+#define SIZE_INPUT_OOB INPUT_OOB_SIZE
+#define INPUT_OOB_ACTION INPUT_OOB_ACTION_BIT_PUSH
+#else
+#define SIZE_INPUT_OOB 0U
+#define INPUT_OOB_ACTION INPUT_OOB_ACTION_BIT_PUSH
+#endif
+
+#ifdef ENABLE_SENSOR_MODEL_SERVER
+#define ENABLE_SENSOR_MODEL_SERVER_SETUP ENABLE_SENSOR_MODEL_SERVER
+#endif
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+ #define ENABLE_LIGHT_MODEL_SERVER_LC_SETUP ENABLE_LIGHT_MODEL_SERVER_LC
+
+ #if (APPLICATION_NUMBER_OF_ELEMENTS < 2)
+ #error "Number of elements should be >= 2 with LC Server model"
+ #endif
+
+ #ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
+ #if (ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS == 0)
+ #error "Light model server should be present on at least 1 element"
+ #endif
+ #else
+ #error "Light model server should be present"
+#endif
+
+#endif
+
+#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 AD_TYPE_NAME 0x09
+
+#define DEVICE_NAME_PARAMS \
+{ \
+ DEVICE_NAME_SIZE, \
+ Device_Name \
+}
+
+#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, \
+ AUTH_TYPE_NO_OOB_ENABLE_STATE, \
+ SIZE_STATIC_OOB, \
+ StaticOobBuff, \
+ SIZE_OUTPUT_OOB, \
+ OUTPUT_OOB_ACTION, \
+ Appli_BleOutputOOBAuthCb, \
+ SIZE_INPUT_OOB, \
+ 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 */
+
+#ifdef ENABLE_NEIGHBOR_TABLE
+#define NEIGHBOR_TABLE_PARAMS \
+{ \
+ NEIGHBOR_COUNT, \
+ NEIGHBOR_ALIVE_TIME, \
+ NEIGHBOR_UNPRVND_DEV_BEACON_NTU, \
+ NEIGHBOR_SECURE_NET_BEACON_NTU, \
+ NEIGHBOR_MSG_TTLX_NTU \
+}
+#else
+#define NEIGHBOR_TABLE_PARAMS {0, 0, 0, 0, 0}
+#endif
+
+#if FRIEND_FEATURE
+#define FRIEND_BUFF_DYNAMIC_MEMORY_SIZE FN_NO_OF_LPNS*820+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 */
+
+
+/* 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_CLIENT_ONOFF) \
+ || defined (ENABLE_GENERIC_MODEL_CLIENT_LEVEL)
+
+ #define ENABLE_GENERIC_MODEL_CLIENT
+#endif
+
+#if defined (ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS) \
+ || defined (ENABLE_LIGHT_MODEL_CLIENT_CTL) \
+ || defined (ENABLE_LIGHT_MODEL_CLIENT_HSL)
+
+ #define ENABLE_LIGHT_MODEL_CLIENT
+#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 (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
+
+#if (ENABLE_SIG_MODELS_AT_COMMANDS == 1) \
+ || (ENABLE_VENDOR_MODELS_AT_COMMANDS == 1)
+ #define ENABLE_SERIAL_CONTROL 1
+#endif
+
+#if (ENABLE_VENDOR_MODELS_AT_COMMANDS == 1)
+ #define ENABLE_APPLI_TEST 1 /* Enable for Application Testing */
+#endif
+
+#if (ENABLE_SIG_MODELS_AT_COMMANDS == 1) \
+ || (ENABLE_VENDOR_MODELS_AT_COMMANDS == 1) \
+ || (ENABLE_UT == 1)
+ #define TF_SERIAL_PRINTS 1
+#endif
+
+/* Following Macros helps to align the Number Of Models set by User with the
+ Application Settings. DO NOT change the value */
+#define APPLICATION_SIG_MODELS_MAX_COUNT USER_SIG_MODELS_MAX_COUNT+1
+#define APPLICATION_VENDOR_MODELS_MAX_COUNT USER_VENDOR_MODELS_MAX_COUNT+1
+
+
+/******************************************************************************/
+/*
+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
+
+/**
+* Size of sensor server structure
+*/
+#define SIZE_OF_SENSOR_SERVER_T 12
+/**
+* Size of sensor parameters structure
+*/
+#define SIZE_OF_SENSOR_PARAMS_T 60
+/**
+* Size of sensor settings structure
+*/
+#define SIZE_OF_SENSOR_SETTINGS_T 8
+/**
+* Size of sensor series structure
+*/
+#define SIZE_OF_SENSOR_SERIES_COLUMN_T 4
+/**
+* Size of sensor buffer required for sensor server model
+*/
+#define TOTAL_SENSOR_SERVER_BUFF_SIZE (SIZE_OF_SENSOR_SERVER_T + \
+ SIZE_OF_SENSOR_PARAMS_T*TOTAL_SENSORS_COUNT + \
+ SIZE_OF_SENSOR_SETTINGS_T*TOTAL_SENSOR_SETTINGS_COUNT + \
+ SIZE_OF_SENSOR_SERIES_COLUMN_T*TOTAL_SENSOR_SERIES_COLUMN_COUNT)
+
+/**
+* Size of Light LC server structure
+*/
+#define SIZE_OF_LC_SERVER_T 156
+
+#if defined STEVAL_BLUENRG_1_BOARD_PWM_SELECTION || defined STEVAL_BLUENRG_2_BOARD_PWM_SELECTION
+ #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
+
+#ifdef CUSTOM_BOARD_PWM_SELECTION
+ #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
+
+#ifdef STEVAL_BLUEMIC_1_BOARD_PWM_SELECTION
+ #define SINGLE_LED PWM3
+// #define COOL_LED PWM0
+// #define WARM_LED PWM1
+ #define RED_LED PWM1
+ #define GREEN_LED PWM3
+ #define BLUE_LED PWM4
+#endif
+
+#ifdef BLUENRG_TILE
+ #define SINGLE_LED PWM3
+// #define COOL_LED PWM0
+// #define WARM_LED PWM1
+ #define RED_LED PWM1
+ #define GREEN_LED PWM3
+ #define BLUE_LED PWM4
+#endif
+
+/******************** Serial Interface Handling Control **********************/
+
+/* Exported variables ------------------------------------------------------- */
+extern const device_name_params_t DeviceNameParams;
+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;
+extern MOBLEUINT8 BufferSensorServer[];
+extern MOBLEUINT8 BufferLcServer[];
+
+/* Exported Functions Prototypes ---------------------------------------------*/
+MOBLEUINT8 ApplicationSetNodeSigModelList(void);
+MOBLE_RESULT ApplicationInitSigModelList(void);
+MOBLE_RESULT ApplicationInitVendorModelList(void);
+MOBLE_RESULT AppliCheck_EnabledModelsList(void);
+#endif /* __MESH_CFG_H */
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/pal_if.h b/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/pal_if.h
index cd331c231..a95435cf0 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/pal_if.h
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/pal_if.h
@@ -2,39 +2,17 @@
******************************************************************************
* @file pal_if.h
* @author BLE Mesh Team
-* @version V1.12.000
-* @date 06-12-2019
* @brief Header file for platform dependent functions
******************************************************************************
* @attention
*
-* <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
+* <h2><center>&copy; Copyright (c) 2020 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. 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.
+* This software component is licensed by ST under Ultimate Liberty license
+* SLA0044, the "License"; You may not use this file except in compliance with
+* the License. You may obtain a copy of the License at:
+* www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/pal_nvm.h b/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/pal_nvm.h
index d2f783b90..bd39bf008 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/pal_nvm.h
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/pal_nvm.h
@@ -2,39 +2,17 @@
******************************************************************************
* @file pal_nvm.h
* @author BLE Mesh Team
-* @version V1.12.000
-* @date 06-12-2019
* @brief Header file for pal_nvm.c
******************************************************************************
* @attention
*
-* <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
+* <h2><center>&copy; Copyright (c) 2020 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. 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.
+* This software component is licensed by ST under Ultimate Liberty license
+* SLA0044, the "License"; You may not use this file except in compliance with
+* the License. You may obtain a copy of the License at:
+* www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/serial_ctrl.h b/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/serial_ctrl.h
index 72b04a179..c99cf9ee1 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/serial_ctrl.h
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/serial_ctrl.h
@@ -2,39 +2,17 @@
******************************************************************************
* @file serial_if.h
* @author BLE Mesh Team
-* @version V1.12.000
-* @date 06-12-2019
* @brief Header file for the serial interface file
******************************************************************************
* @attention
*
-* <h2><center>&copy; COPYRIGHT(c) 2018 STMicroelectronics</center></h2>
+* <h2><center>&copy; Copyright (c) 2020 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. 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.
+* This software component is licensed by ST under Ultimate Liberty license
+* SLA0044, the "License"; You may not use this file except in compliance with
+* the License. You may obtain a copy of the License at:
+* www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/serial_if.h b/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/serial_if.h
index 87f3a42ae..4a7ec6255 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/serial_if.h
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/serial_if.h
@@ -2,39 +2,17 @@
******************************************************************************
* @file serial_if.h
* @author BLE Mesh Team
-* @version V1.12.000
-* @date 06-12-2019
* @brief Header file for the serial interface file
******************************************************************************
* @attention
*
-* <h2><center>&copy; COPYRIGHT(c) 2018 STMicroelectronics</center></h2>
+* <h2><center>&copy; Copyright (c) 2020 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. 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.
+* This software component is licensed by ST under Ultimate Liberty license
+* SLA0044, the "License"; You may not use this file except in compliance with
+* the License. You may obtain a copy of the License at:
+* www.st.com/SLA0044
*
******************************************************************************
*/
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 36769c5fd..a28f0ba8b 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/serial_prvn.h
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/serial_prvn.h
@@ -1,40 +1,18 @@
/**
******************************************************************************
-* @file embd_provision.h
+* @file serial_prvn.h
* @author BLE Mesh Team
-* @version V1.12.000
-* @date 06-12-2019
* @brief Header file for the serial interface file
******************************************************************************
* @attention
*
-* <h2><center>&copy; COPYRIGHT(c) 2018 STMicroelectronics</center></h2>
+* <h2><center>&copy; Copyright (c) 2020 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. 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.
+* This software component is licensed by ST under Ultimate Liberty license
+* SLA0044, the "License"; You may not use this file except in compliance with
+* the License. You may obtain a copy of the License at:
+* www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/serial_ut.h b/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/serial_ut.h
index 385e24932..5702d62ed 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/serial_ut.h
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/serial_ut.h
@@ -2,39 +2,17 @@
******************************************************************************
* @file serial_ut.h
* @author BLE Mesh Team
-* @version V1.12.000
-* @date 06-12-2019
* @brief Header file for the upper tester file
******************************************************************************
* @attention
*
-* <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
+* <h2><center>&copy; Copyright (c) 2020 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. 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.
+* This software component is licensed by ST under Ultimate Liberty license
+* SLA0044, the "License"; You may not use this file except in compliance with
+* the License. You may obtain a copy of the License at:
+* www.st.com/SLA0044
*
******************************************************************************
*/
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/types.h b/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/types.h
index 31f9ad33a..aab07a197 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/types.h
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Inc/types.h
@@ -2,39 +2,17 @@
******************************************************************************
* @file types.h
* @author BLE Mesh Team
-* @version V1.12.000
-* @date 06-12-2019
* @brief Header file for various type declarations
******************************************************************************
* @attention
*
-* <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
+* <h2><center>&copy; Copyright (c) 2020 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. 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.
+* This software component is licensed by ST under Ultimate Liberty license
+* SLA0044, the "License"; You may not use this file except in compliance with
+* the License. You may obtain a copy of the License at:
+* www.st.com/SLA0044
*
******************************************************************************
*/
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 e7b392f59..65a7e7c6c 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 f8a12d423..f78662a44 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 09b6be449..3daff993c 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 2fdc8d9fa..c2b6e0be9 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 3a0b60831..8b2a0f445 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 967bb1bda..89d415770 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 d9e28450e..e2d001e8f 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/common.h
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/common.h
@@ -21,46 +21,431 @@
/* Includes ------------------------------------------------------------------*/
#include "types.h"
+#include "ble_mesh.h"
-#define GENERIC_VALID_FLAG 0xAA
+/* Exported macro ------------------------------------------------------------*/
+/* Macros defined for the number of bytes saved, number of bytes dedicated
+ for ganeric model and light model */
+//#define APP_NVM_GENERIC_MODEL_SIZE 16U
+//#define APP_NVM_LIGHT_MODEL_SIZE 32U
+#define APP_NVM_LIGHT_LC_MODEL_SIZE 4U
+#if 0
+#define APP_NVM_MODELDATA_PER_ELEMENT_SIZE (APP_NVM_GENERIC_MODEL_SIZE + \
+ APP_NVM_LIGHT_MODEL_SIZE + \
+ APP_NVM_LIGHT_LC_MODEL_SIZE)
+#endif
+#define APP_NVM_MODEL_SIZE (APP_NVM_MODELDATA_PER_ELEMENT_SIZE * APPLICATION_NUMBER_OF_ELEMENTS)
+
+#define GENERIC_VALID_FLAG 0xAA
+#define TESTING_BYTE 240
/* 16 bytes are reserved for generic */
-#define GENERIC_VALID_FLAG_OFFSET 0
-#define GENERIC_ON_OFF_NVM_OFFSET 1
-#define GENERIC_LEVEL_NVM_OFFSET 2
-#define GENERIC_POWER_ON_OFF_NVM_OFFSET 4
+#define GENERIC_VALID_FLAG_OFFSET 0
+#define GENERIC_ON_OFF_NVM_OFFSET 1
+#define GENERIC_LEVEL_NVM_OFFSET 2
+#define GENERIC_POWER_ON_OFF_NVM_OFFSET 4
/* 16 bytes are reserved for light
* 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_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
+#define LIGHT_VALID_FLAG_OFFSET 0
+#define LIGHT_LIGHTNESS_PRESENT_NVM_OFFSET 1
+#define LIGHT_LIGHTNESS_TARGET_NVM_OFFSET 3
+#define LIGHT_LIGHTNESS_DEFAULT_NVM_OFFSET 5
+#define LIGHT_LIGHTNESS_LAST_NVM_OFFSET 7
+#define LIGHT_TRANSITION_STATUS 9
+#define LIGHT_CTL_NVM_OFFSET 10
+#define LIGHT_CTL_DEFAULT_NVM_OFFSET 16
+#define LIGHT_HSL_NVM_OFFSET 22
+#define LIGHT_HSL_DEFAULT_NVM_OFFSET 28
+#define LIGHT_LC_MODE_NVM_OFFSET 48
/* Light model nvm offset used for local array*/
-#define LIGHT_DEFAULT_OFFSET 6
+#define LIGHT_DEFAULT_OFFSET 6
/* Buffer index limit for the generic data */
-#define GENERIC_DATA_LIMIT 15
+#define GENERIC_DATA_LIMIT 15
+
+#define No_NVM_FLAG 0XFE
+#define GENERIC_ON_OFF_NVM_FLAG 0X01
+#define GENERIC_LEVEL_NVM_FLAG 0X02
+#define LIGHT_LIGHTNESS_NVM_FLAG 0X03
+#define LIGHT_CTL_NVM_FLAG 0X04
+#define LIGHT_HSL_NVM_FLAG 0X05
+#define LIGHT_LC_NVM_FLAG 0X06
+
+#define GENERIC_POWER_OFF_STATE 0X00
+#define GENERIC_POWER_ON_STATE 0X01
+#define GENERIC_POWER_RESTORE_STATE 0X02
+
+#define FLAG_SET 1
+#define FLAG_RESET 0
+
+#define VALUE_UPDATE_SET 0X01
+#define VALUE_UPDATE_RESET 0X00
+
+#define CLK_FLAG_ENABLE 1
+#define CLK_FLAG_DISABLE 0
+
+#define PWM_ZERO_VALUE 1
+#define INTENSITY_LEVEL_ZERO 0X00
+#define INTENSITY_LEVEL_FULL 31990U
+
+#define MAX_TID_VALUE 0XFF
+
+#define STEP_HEX_VALUE_0 0X00
+#define STEP_HEX_VALUE_1 0X01
+#define STEP_HEX_VALUE_2 0X02
+#define STEP_HEX_VALUE_3 0X03
+
+#define STEP_RESOLUTION_100MS 100
+#define STEP_RESOLUTION_1S 1000
+#define STEP_RESOLUTION_10S 10000
+#define STEP_RESOLUTION_10M 600000
+
+typedef MOBLE_RESULT (*APPLI_SAVE_MODEL_STATE_CB)(MOBLEUINT8* stateBuff, MOBLEUINT16 size);
+typedef MOBLE_RESULT (*APPLI_SAVE_MODEL_TEST_STATE_CB)(MOBLEUINT8* stateBuff, MOBLEUINT16 size);
+typedef MOBLE_RESULT (*APPLI_RETRIEVE_MODEL_TEST_STATE_CB)(MOBLEUINT8* stateBuff, MOBLEUINT16 size);
+
+/******************************************************************************/
+/********** Following Section defines the SIG MODEL IDs ************/
+/******************************************************************************/
+#define GENERIC_ONOFF_SERVER_MODEL_ID 0x1000
+#define GENERIC_ONOFF_CLIENT_MODEL_ID 0x1001
+#define GENERIC_LEVEL_SERVER_MODEL_ID 0x1002
+#define GENERIC_CLIENT_LEVEL_MODEL_ID 0x1003
+#define GENERIC_DEFAULT_TRANSITION_TIME_SERVER_MODEL_ID 0x1004
+#define GENERIC_CLIENT_DEFAULT_TRANSITION_TIME_MODEL_ID 0x1005
+#define GENERIC_SERVER_POWER_ONOFF_MODEL_ID 0x1006
+#define GENERIC_POWER_ONOFF_SETUP_SERVER_MODEL_ID 0x1007
+#define GENERIC_CLIENT_POWER_ONOFF_MODEL_ID 0x1008
+#define GENERIC_SERVER_POWER_LEVEL_MODEL_ID 0x1009
+#define GENERIC_SERVER_POWER_LEVEL_SETUP_MODEL_ID 0x100A
+#define GENERIC_CLIENT_POWER_LEVEL_MODEL_ID 0x100B
+#define GENERIC_SERVER_BATTERY_MODEL_ID 0x100C
+#define GENERIC_CLIENT_BATTERY_MODEL_ID 0x100D
+#define GENERIC_SERVER_LOCATION_MODEL_ID 0x100E
+#define GENERIC_SERVER_LOCATION_SETUP_MODEL_ID 0x100F
+#define GENERIC_CLIENT_LOCATION_MODEL_ID 0x1010
+#define GENERIC_SERVER_ADMIN_PROPERTY_MODEL_ID 0x1011
+#define GENERIC_SERVER_MANUFACTURER_PROPERTY_MODEL_ID 0x1012
+#define GENERIC_SERVER_USER_PROPERTY_MODEL_ID 0x1013
+#define GENERIC_SERVER_CLIENT_PROPERTY_MODEL_ID 0x1014
+
+#define SENSOR_SERVER_MODEL_ID 0x1100U
+#define SENSOR_SETUP_SERVER_MODEL_ID 0x1101U
+#define SENSOR_CLIENT_MODEL_ID 0x1102U
+
+#define LIGHT_SERVER_LIGHTNESS_MODEL_ID 0x1300
+#define LIGHT_SERVER_LIGHTNESS_SETUP_MODEL_ID 0x1301
+#define LIGHT_CLIENT_LIGHTNESS_MODEL_ID 0x1302
+#define LIGHT_SERVER_CTL_MODEL_ID 0x1303
+#define LIGHT_SERVER_CTL_SETUP_MODEL_ID 0x1304
+#define LIGHT_CLIENT_CTL_MODEL_ID 0x1305
+#define LIGHT_SERVER_CTL_TEMPERATURE_MODEL_ID 0x1306
+#define LIGHT_SERVER_HSL_MODEL_ID 0x1307
+#define LIGHT_SERVER_HSL_SETUP_MODEL_ID 0x1308
+#define LIGHT_CLIENT_HSL_MODEL_ID 0x1309
+#define LIGHT_SERVER_HSL_HUE_MODEL_ID 0x130A
+#define LIGHT_SERVER_HSL_SATURATION_MODEL_ID 0x130B
+#define LIGHT_SERVER_XYL_MODEL_ID 0x130C
+#define LIGHT_SERVER_XYL_SETUP_MODEL_ID 0x130D
+#define LIGHT_CLIENT_XYL_MODEL_ID 0x130E
+#define LIGHT_LC_SERVER_MODEL_ID 0x130F
+#define LIGHT_LC_SETUP_SERVER_MODEL_ID 0x1310
+#define LIGHT_LC_CLIENT_MODEL_ID 0x1311
-#define FLAG_SET 1
-#define FLAG_RESET 0
+/* Sensor Server model opcode */
+#define SENSOR_DESCRIPTOR_GET 0x8230U
+#define SENSOR_DESCRIPTOR_STATUS 0X51U
+#define SENSOR_GET 0X8231U
+#define SENSOR_STATUS 0X52U
+#define SENSOR_COLUMN_GET 0X8232U
+#define SENSOR_COLUMN_STATUS 0X53U
+#define SENSOR_SERIES_GET 0X8233U
+#define SENSOR_SERIES_STATUS 0X54U
+/* Sensor Setup Server model opcode */
+#define SENSOR_CADENCE_GET 0X8234U
+#define SENSOR_CADENCE_SET 0X55U
+#define SENSOR_CADENCE_SET_UNACK 0X56U
+#define SENSOR_CADENCE_STATUS 0X57U
+#define SENSOR_SETTINGS_GET 0X8235U
+#define SENSOR_SETTINGS_STATUS 0X58U
+#define SENSOR_SETTING_GET 0X8236U
+#define SENSOR_SETTING_SET 0X59U
+#define SENSOR_SETTING_SET_UNACK 0X5AU
+#define SENSOR_SETTING_STATUS 0X5BU
+/* Light LC Server model opcode */
+#define LIGHT_LC_MODE_GET 0X8291U
+#define LIGHT_LC_MODE_SET 0X8292U
+#define LIGHT_LC_MODE_SET_UNACK 0X8293U
+#define LIGHT_LC_MODE_STATUS 0X8294U
+#define LIGHT_LC_OM_GET 0X8295U
+#define LIGHT_LC_OM_SET 0X8296U
+#define LIGHT_LC_OM_SET_UNACK 0X8297U
+#define LIGHT_LC_OM_STATUS 0X8298U
+#define LIGHT_LC_ON_OFF_GET 0X8299U
+#define LIGHT_LC_ON_OFF_SET 0X829AU
+#define LIGHT_LC_ON_OFF_SET_UNACK 0X829BU
+#define LIGHT_LC_ON_OFF_STATUS 0X829CU
+/* Light LC Setup server model opcode */
+#define LIGHT_LC_PROPERTY_GET 0X829DU
+#define LIGHT_LC_PROPERTY_SET 0X62U
+#define LIGHT_LC_PROPERTY_SET_UNACK 0X63U
+#define LIGHT_LC_PROPERTY_STATUS 0X64U
-#define VALUE_UPDATE_SET 0X01
-#define VALUE_UPDATE_RESET 0X00
-#define CLK_FLAG_ENABLE 1
-#define CLK_FLAG_DISABLE 0
+ /* Mesh Device Properties and Property IDs */
+/* Temperature 8 In A Period Of Day */
+#define AVERAGE_AMBIENT_TEMPERATURE_IN_A_PERIOD_OF_DAY_PID 0x0001
+/* Average Current */
+#define AVERAGE_INPUT_CURRENT_PID 0x0002
+/* Average_Voltage */
+#define AVERAGE_INPUT_VOLTAGE_PID 0x0003
+/* Average Current */
+#define AVERAGE_OUTPUT_CURRENT_PID 0x0004
+/* Average_Voltage */
+#define AVERAGE_OUTPUT_VOLTAGE_PID 0x0005
+/* Luminous Intensity */
+#define CENTER_BEAM_INTENSITY_AT_FULL_POWER _PID 0x0006
+/* Chromaticity Tolerance */
+#define CHROMATICITY_TOLERANCE_PID 0x0007
+/* Cie 13.3-1995 Color Rendering Index */
+#define COLOR_RENDERING_INDEX_R9_PID 0x0008
+/* Cie 13.3-1995 Color Rendering Index */
+#define COLOR_RENDERING_INDEX_RA_PID 0x0009
+/* Gap.Appearance */
+#define DEVICE_APPEARANCE_PID 0x000A
+/* Country Code */
+#define DEVICE_COUNTRY_OF_ORIGIN_PID 0x000B
+/* Date Utc */
+#define DEVICE_DATE_OF_MANUFACTURE_PID 0x000C
+/* Energy */
+#define DEVICE_ENERGY_USE_SINCE_TURN_ON_PID 0x000D
+/* Fixed_String 8 */
+#define DEVICE_FIRMWARE_REVISION_PID 0x000E
+/* Global Trade Item_Number */
+#define DEVICE_GLOBAL_TRADE_ITEM_NUMBER_PID 0x000F
+/* Fixed_String 16 */
+#define DEVICE_HARDWARE_REVISION _PID 0x0010
+/* Fixed_String 36 */
+#define DEVICE_MANUFACTURER_NAME_PID 0x0011
+/* Fixed_String 24 */
+#define DEVICE_MODEL_NUMBER_PID 0x0012
+/* Temperature Range */
+#define DEVICE_OPERATING_TEMPERATURE_RANGE_SPECIFICATION_PID 0x0013
+/* Temperature_Statistics */
+#define DEVICE_OPERATING_TEMPERATURE_STATISTICAL_VALUES_PID 0x0014
+/* Event_Statistics */
+#define DEVICE_OVER_TEMPERATURE_EVENT_STATISTICS_PID 0x0015
+/* Power_Specification */
+#define DEVICE_POWER_RANGE_SPECIFICATION_PID 0x0016
+/* Time_Hour 24 */
+#define DEVICE_RUNTIME_SINCE_TURN_ON_PID 0x0017
+/* Time_Hour 24 */
+#define DEVICE_RUNTIME_WARRANTY_PID 0x0018
+/* Fixed_String 16 */
+#define DEVICE_SERIAL_NUMBER_PID 0x0019
+/* Fixed_String 8 */
+#define DEVICE_SOFTWARE_REVISION_PID 0x001A
+/* Event_Statistics */
+#define DEVICE_UNDER_TEMPERATURE_EVENT_STATISTICS_PID 0x001B
+/* Temperature 8_Statistics */
+#define INDOOR_AMBIENT_TEMPERATURE_STATISTICAL_VALUES_PID 0x001C
+/* Chromaticity Coordinates */
+#define INITIAL_CIE 1931_CHROMATICITY_COORDINATES_PID 0x001D
+/* Correlated Color Temperature */
+#define INITIAL_CORRELATED_COLOR_TEMPERATURE_PID 0x001E
+ /* Luminous_Flux */
+#define INITIAL_LUMINOUS_FLUX_PID 0x001F
+/* Chromatic Distance_From_Planckian */
+#define INITIAL_PLANCKIAN_DISTANCE_PID 0x0020
+/* Electric Current_Specification */
+#define INPUT_CURRENT_RANGE_SPECIFICATION_PID 0x0021
+/* Electric Current_Statistics */
+#define INPUT_CURRENT_STATISTICS_PID 0x0022
+/* Event_Statistics */
+#define INPUT_OVER_CURRENT_EVENT_STATISTICS_PID 0x0023
+/* Event_Statistics */
+#define INPUT_OVER_RIPPLE_VOLTAGE_EVENT_STATISTICS_PID 0x0024
+/* Event_Statistics */
+#define INPUT_OVER_VOLTAGE_EVENT_STATISTICS_PID 0x0025
+/* Event_Statistics */
+#define INPUT_UNDER_CURRENT_EVENT_STATISTICS_PID 0x0026
+/* Event_Statistics */
+#define INPUT_UNDER_VOLTAGE_EVENT_STATISTICS_PID 0x0027
+/* Voltage_Specification */
+#define INPUT_VOLTAGE_RANGE_SPECIFICATION_PID 0x0028
+/* Percentage 8 */
+#define INPUT_VOLTAGE_RIPPLE_SPECIFICATION_PID 0x0029
+/* Voltage Statistics */
+#define INPUT_VOLTAGE_STATISTICS_PID 0x002A
+/* Illuminance */
+#define LIGHT_CONTROL_AMBIENT_LUXLEVEL_ON_PID 0x002B
+/* Illuminance */
+#define LIGHT_CONTROL_AMBIENT_LUXLEVEL_PROLONG_PID 0x002C
+/* Illuminance */
+#define LIGHT_CONTROL_AMBIENT_LUXLEVEL_STANDBY_PID 0x002D
+/* Perceived_Lightness */
+#define LIGHT_CONTROL_LIGHTNESS_ON_PID 0x002E
+/* Perceived_Lightness */
+#define LIGHT_CONTROL_LIGHTNESS_PROLONG_PID 0x002F
+/* Perceived_Lightness */
+#define LIGHT_CONTROL_LIGHTNESS_STANDBY_PID 0x0030
+/* Percentage 8 */
+#define LIGHT_CONTROL_REGULATOR_ACCURACY_PID 0x0031
+/* Coefficient */
+#define LIGHT_CONTROL_REGULATOR_KID_PID 0x0032
+/* Coefficient */
+#define LIGHT_CONTROL_REGULATOR_KIU_PID 0x0033
+/* Coefficient */
+#define LIGHT_CONTROL_REGULATOR_KPD_PID 0x0034
+/* Coefficient */
+#define LIGHT_CONTROL_REGULATOR_KPU_PID 0x0035
+/* Time Millisecond 24 */
+#define LIGHT_CONTROL_TIME_FADE_PID 0x0036
+/* Time Millisecond 24 */
+#define LIGHT_CONTROL_TIME_FADE_ON_PID 0x0037
+/* Time Millisecond 24 */
+#define LIGHT_CONTROL_TIME_FADE_STANDBY_AUTO_PID 0x0038
+/* Time Millisecond 24 */
+#define LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL_PID 0x0039
+/* Time Millisecond 24 */
+#define LIGHT_CONTROL_TIME_OCCUPANCY_DELAY_PID 0x003A
+/* Time Millisecond 24 */
+#define LIGHT_CONTROL_TIME_PROLONG_PID 0x003B
+/* Time Millisecond 24 */
+#define LIGHT_CONTROL_TIME_RUN_ON_PID 0x003C
+/* Percentage 8 */
+#define LUMEN_MAINTENANCE_FACTOR_PID 0x003D
+/* Luminous_Efficacy */
+#define LUMINOUS_EFFICACY_PID 0x003E
+/* Luminous_Energy */
+#define LUMINOUS_ENERGY_SINCE_TURN_ON_PID 0x003F
+/* Luminous_Exposure */
+#define LUMINOUS_EXPOSURE_PID 0x0040
+/* Luminous_Flux Range */
+#define LUMINOUS_FLUX_RANGE_PID 0x0041
+/* Percentage 8 */
+#define MOTION_SENSED_PID 0x0042
+/* Percentage 8 */
+#define MOTION_THRESHOLD_PID 0x0043
+/* Event_Statistics */
+#define OPEN_CIRCUIT_EVENT_STATISTICS_PID 0x0044
+/* Temperature 8_Statistics */
+#define OUTDOOR_STATISTICAL_VALUES_PID 0x0045
+/* Electric Current Range */
+#define OUTPUT_CURRENT_RANGE_PID 0x0046
+/* Electric Current_Statistics */
+#define OUTPUT_CURRENT_STATISTICS_PID 0x0047
+/* Percentage 8 */
+#define OUTPUT_RIPPLE_VOLTAGE_SPECIFICATION_PID 0x0048
+/* Voltage_Specification */
+#define OUTPUT_VOLTAGE_RANGE_PID 0x0049
+/* Voltage_Statistics */
+#define OUTPUT_VOLTAGE_STATISTICS_PID 0x004A
+/* Event_Statistics */
+#define OVER_OUTPUT_RIPPLE_VOLTAGE_EVENT_STATISTICS_PID 0x004B
+/* Count 16 */
+#define PEOPLE_COUNT_PID 0x004C
+/* Boolean */
+#define PRESENCE_DETECTED_PID 0x004D
+/* Illuminance */
+#define PRESENT_AMBIENT_LIGHT_LEVEL_PID 0x004E
+/* Temperature 8 */
+#define PRESENT_AMBIENT_TEMPERATURE_PID 0x004F
+/* Chromaticity Coordinates */
+#define PRESENT_CIE 1931_CHROMATICITY_COORDINATES_PID 0x0050
+/* Correlated Color Temperature */
+#define PRESENT_CORRELATED_COLOR_TEMPERATURE_PID 0x0051
+/* Power */
+#define PRESENT_DEVICE_INPUT_POWER_PID 0x0052
+/* Percentage 8 */
+#define PRESENT_DEVICE_OPERATING_EFFICIENCY_PID 0x0053
+/* Temperature */
+#define PRESENT_DEVICE_OPERATING_TEMPERATURE_PID 0x0054
+/* Illuminance */
+#define PRESENT_ILLUMINANCE_PID 0x0055
+/* Temperature 8 */
+#define PRESENT_INDOOR_AMBIENT_TEMPERATURE_PID 0x0056
+/* Electric Current */
+#define PRESENT_INPUT_CURRENT_PID 0x0057
+/* Percentage 8 */
+#define PRESENT_INPUT_RIPPLE_VOLTAGE_PID 0x0058
+/* Voltage */
+#define PRESENT_INPUT_VOLTAGE_PID 0x0059
+/* Luminous_Flux */
+#define PRESENT_LUMINOUS_FLUX_PID 0x005A
+/* Temperature 8 */
+#define PRESENT_OUTDOOR_AMBIENT_TEMPERATURE_PID 0x005B
+/* Electric Current */
+#define PRESENT_OUTPUT_CURRENT_PID 0x005C
+/* Voltage */
+#define PRESENT_OUTPUT_VOLTAGE_PID 0x005D
+/* Chromatic Distance_From_Planckian */
+#define PRESENT_PLANCKIAN_DISTANCE_PID 0x005E
+/* Percentage 8 */
+#define PRESENT_RELATIVE_OUTPUT_RIPPLE_VOLTAGE_PID 0x005F
+/* Energy In_A_Period Of Day */
+#define RELATIVE_DEVICE_ENERGY_USE_IN_A_PERIOD_OF_DAY_PID 0x0060
+/* Relative Runtime In_A_Generic_Level Range */
+#define RELATIVE_DEVICE_RUNTIME_IN_A_GENERIC_LEVEL_RANGE_PID 0x0061
+/* Relative_Value In_An Illuminance Range */
+#define RELATIVE_EXPOSURE_TIME_IN_AN_ILLUMINANCE_RANGE_PID 0x0062
+/* Luminous_Energy */
+#define RELATIVE_RUNTIME_IN_A_CORRELATED_COLOR_TEMPERATURE_RANGE_PID 0x0063
+/* Relative_Value In_A Temperature Range */
+#define RELATIVE_RUNTIME_IN_A_DEVICE_OPERATING_TEMPERATURE_RANGE_PID 0x0064
+/* Relative Runtime In_A Current Range */
+#define RELATIVE_RUNTIME_IN_AN_INPUT_CURRENT_RANGE_PID 0x0065
+/* Relative_Value In_A_Voltage Range */
+#define RELATIVE_RUNTIME_IN_AN_INPUT_VOLTAGE_RANGE_PID 0x0066
+/* Event_Statistics */
+#define SHORT_CIRCUIT_EVENT_STATISTICS_PID 0x0067
+/* Time_Second 16 */
+#define TIME_SINCE_MOTION_SENSED_PID 0x0068
+/* Time Second 16 */
+#define TIME_SINCE_PRESENCE_DETECTED_PID 0x0069
+/* Energy */
+#define TOTAL_DEVICE_ENERGY_USE_PID 0x006A
+/* Count 24 */
+#define TOTAL_DEVICE_OFF_ON_CYCLES_PID 0x006B
+/* Count 24 */
+#define TOTAL_DEVICE_POWER_ON_CYCLES_PID 0x006C
+/* Time_Hour 24 */
+#define TOTAL_DEVICE_POWER_ON_TIME_PID 0x006D
+/* Time_Hour 24 */
+#define TOTAL_DEVICE_RUNTIME_PID 0x006E
+/* Time_Hour 24 */
+#define TOTAL_LIGHT_EXPOSURE_TIME_PID 0x006F
+/* Luminous_Energy */
+#define TOTAL_LUMINOUS_ENERGY_PID 0x0070
+/* Temperature 8 */
+#define DESIRED_AMBIENT_TEMPERATURE_PID 0x0071
-#define PWM_ZERO_VALUE 1
-#define INTENSITY_LEVEL_ZERO 0X00
-#define INTENSITY_LEVEL_FULL 31990U
+#define PRESSURE_PID 0x2A6D
+#define HUMIDITY_PID 0x2A6F
+#define TIME_OF_FLIGHT_PID 0X2A7F
+#define MAGNETO_METER_PID 0x2AA1
+#define ACCELERO_METER_PID 0x2BA1
+#define GYROSCOPE_PID 0x2BA2
+#define VOLTAGE_PID 0x0005
+#define CURRENT_PID 0x0004
+#define POWER_FACTOR_PID 0x0072
+#define ACTIVE_POWER_PID 0x0073
+#define REACTIVE_POWER_PID 0x0074
+#define APPARENT_POWER_PID 0x0075
+#define ACTIVE_ENERGY_PID 0x0083
+#define REACTIVE_ENERGY_PID 0x0084
+#define APPARENT_ENERGY_PID 0x0085
+
+#define PROPERTY_ID_LENGTH 2
+
+#define ONE_BYTE_VALUE 1
+#define TWO_BYTE_VALUE 2
+#define THREE_BYTE_VALUE 3
+#define FOUR_BYTE_VALUE 4
+
+#define PROPERTY_ID_PROHIBITED 0x0000
-#define MAX_TID_VALUE 0XFF
-typedef MOBLE_RESULT (*APPLI_SAVE_MODEL_STATE_CB)(MOBLEUINT8* stateBuff, MOBLEUINT8 size);
/** @addtogroup MODEL_GENERIC
* @{
*/
@@ -69,17 +454,99 @@ typedef MOBLE_RESULT (*APPLI_SAVE_MODEL_STATE_CB)(MOBLEUINT8* stateBuff, MOBLEUI
* @{
*/
-/* Private define ------------------------------------------------------------*/
-/* Private macro -------------------------------------------------------------*/
-#pragma pack(1)
-typedef struct displayFloatToInt_s
+/* Exported types ------------------------------------------------------------*/
+
+
+/**
+ * transition status enum
+ */
+typedef enum
{
- MOBLEINT8 sign; /* 0 means positive, 1 means negative*/
- MOBLEUINT32 out_int;
- MOBLEUINT32 out_dec;
-} displayFloatToInt_t;
-#pragma pack(4)
+ TRANSITION_STATUS_STOP = 0,
+ TRANSITION_STATUS_DELAY,
+ TRANSITION_STATUS_RUNNING
+}transition_status_e;
+
+/**
+ * transition parameters struct
+ */
+typedef struct
+{
+ MOBLEUINT32 stepResolutionMs;
+ MOBLEUINT32 trTimeMs;
+ MOBLEUINT32 trBeginTick;
+ MOBLEUINT32 trEndTick;
+ MOBLEUINT32 trNextActionTick;
+ transition_status_e trStatus;
+ MOBLEUINT8 publishEventTrig;
+ MOBLEUINT8 res[2];
+} transition_params_t;
+
+
+/**
+ * status send (in reply to get, set & setunack messages) enum
+ */
+typedef enum
+{
+ STATUS_SEND_REPLY = 0,
+ STATUS_SEND_PUBLISH,
+ STATUS_SEND_REPLY_PUBLISH
+} status_send_e;
+
+
+/**
+ * transition event enum
+ */
+typedef enum
+{
+ TRANSITION_EVENT_NO = 0,
+ TRANSITION_EVENT_ABORT,
+ TRANSITION_EVENT_DELAY,
+ TRANSITION_EVENT_TIMER_START,
+ TRANSITION_EVENT_TIMER_TRIG,
+ TRANSITION_EVENT_PUBLISH,
+ TRANSITION_EVENT_TIMER_STOP
+}transition_event_e;
+
+
+/**
+ * Model tid value structure
+ */
+typedef struct
+{
+ MOBLEUINT8 Tid_Value;
+ MOBLEUINT8 TidSend;
+ MOBLE_ADDRESS Peer_Addrs;
+ MOBLE_ADDRESS Dst_Addrs;
+}Model_Tid_t;
+
+
+/**
+ * TID params struct
+ */
+typedef struct
+{
+ MOBLEUINT32 tidTick;
+ MOBLE_ADDRESS src;
+ MOBLE_ADDRESS dst;
+ MOBLEUINT8 tid;
+ MOBLEUINT8 res[3];
+}tid_param_t;
+
+
+/**
+ * variable used for binding status
+ */
+typedef struct
+{
+ MOBLEUINT16 Model_Rx_Opcode;
+ MOBLEUINT16 Model_ID;
+ MOBLE_ADDRESS Dst_Peer;
+}Model_Binding_Var_t;
+
+
+/* Exported functions ------------------------------------------------------- */
MOBLE_RESULT Chk_OptionalParamValidity(MOBLEUINT8 param_length, MOBLEUINT8
mandatory_length, MOBLEUINT8 param,
MOBLEUINT8 max_param_value );
@@ -105,11 +572,14 @@ MOBLE_RESULT Chk_MultiParamValidityAllUnsigned(MOBLEUINT16 min_param_range1, MO
MOBLEUINT16 min_param_range2, MOBLEUINT16 max_param_range2,
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);
+MOBLEUINT8 Tid_CheckAndUpdate(MOBLEUINT8 currentMsgTid,
+ MOBLE_ADDRESS currentMsgSrc,
+ MOBLE_ADDRESS currentMsgDst,
+ tid_param_t* pLastMsgTidParams);
+MOBLE_RESULT TimeDttFGet(MOBLEUINT32 timeMs, MOBLEUINT8* timeDttF);
MOBLEUINT32 Get_StepResolutionValue(MOBLEUINT8 time_param);
MOBLEUINT16 PwmValueMapping(MOBLEUINT16 setValue , MOBLEUINT16 maxRange , MOBLEINT16 minRange);
@@ -117,23 +587,55 @@ MOBLEUINT16 PwmValueMapping(MOBLEUINT16 setValue , MOBLEUINT16 maxRange , MOBLEI
float Ratio_CalculateValue(MOBLEUINT16 setValue , MOBLEUINT16 maxRange , MOBLEINT16 minRange);
MOBLEUINT16 PWM_CoolValue(float colourValue ,float brightValue);
MOBLEUINT16 PWM_WarmValue(float colourValue ,float brightValue);
-void floatToInt(float in, displayFloatToInt_t *out_value, MOBLEINT32 dec_prec);
void TraceHeader(const char* func_name, int mode);
#ifdef ENABLE_SAVE_MODEL_STATE_NVM
-MOBLE_RESULT SaveModelsStateNvm(MOBLEUINT8 flag);
+MOBLE_RESULT SaveModelsStateNvm(MOBLEUINT8* flag);
#endif
MOBLEUINT8 BLE_GetElementNumber(void);
void Test_Process(void);
void ModelSave_Process(void);
void BLEMesh_PacketResponseTime(MOBLEUINT8 *testFunctionParm);
-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);
-
+MOBLEUINT16 Light_lightnessPowerOnValue(MOBLEUINT8 const *pModelValue_Load,
+ MODEL_MessageHeader_t *pmsgParam);
+void Light_CtlPowerOnValue(MOBLEUINT8 const *pModelValue_Load, MODEL_MessageHeader_t *pmsgParam);
+void Light_HslPowerOnValue(MOBLEUINT8 const *pModelValue_Load, MODEL_MessageHeader_t *pmsgParam);
void MemoryDumpHex(const MOBLEUINT8* memory_addr, int size);
+void PutLittleEndian(MOBLEUINT8* stream, MOBLEUINT32 value, MOBLEUINT8 octets);
+void GetLittleEndian(MOBLEUINT8 const *stream, MOBLEUINT8 octets, MOBLEUINT32* result);
+
+void CopyU8LittleEndienArray_fromU16word (MOBLEUINT8* pArray, MOBLEUINT16 inputWord);
+void CopyU8LittleEndienArray_fromU32word (MOBLEUINT8* pArray, MOBLEUINT32 inputWord);
+void CopyU8LittleEndienArray_2B_fromU32word (MOBLEUINT8* pArray, MOBLEUINT32 inputWord);
+MOBLEUINT16 CopyU8LittleEndienArrayToU16word (MOBLEUINT8* pArray);
+MOBLEUINT32 CopyU8LittleEndienArrayToU32word (MOBLEUINT8* pArray);
+void NvmStatePowerFlag_Set(MOBLEUINT8 nvmModelFlag, MOBLEUINT8 elementIndex);
+#if 0
+void Device_FlashTesting(void);
#endif
+transition_event_e Transition_Stop(transition_status_e* status);
+transition_event_e Transition_Sm(transition_params_t* transitionParams,
+ MOBLEUINT32 delayMs);
+MOBLEUINT32 Transition_RemainingTimeGet(transition_params_t* transitionParams);
+MOBLEUINT32 Transition_TimerGet(transition_params_t* pTrParams);
+MOBLEUINT32 Transition_TimeToNextActionGet(transition_params_t* pTrParams);
+MOBLEUINT32 Transition_StateValueGet(MOBLEUINT32 finalState,
+ MOBLEUINT32 initialState,
+ MOBLEUINT32 timer,
+ MOBLEUINT32 transitionTime);
+MOBLE_RESULT ExtractPropertyId(const MOBLEUINT8* data,
+ MOBLEUINT16* pPropertyId);
+MOBLE_RESULT Binding_GenericOnOff_LightLcLightOnOff(MOBLEUINT8 genericElementIndex,
+ MOBLEUINT8 genericOnOff,
+ MOBLEUINT8 optionalParams,
+ MOBLEUINT32 delayMs,
+ MOBLEUINT8 transitionParam);
+MOBLE_RESULT Binding_LightLcLightOnOff_GenericOnOff(MOBLEUINT8 lcElementIndex, MOBLEUINT8 lcOnOff);
+MOBLE_RESULT Binding_LcLinearOut_LightLightnessLinear(MOBLEUINT8 lcElementIndex, MOBLEUINT16 lcLinearOut);
+void BindingDisable_LcLinearOut_LightLightnessLinear(MOBLEUINT8 lightnessLinearElementIndex);
+#endif /* __COMMON_H */
+
+/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
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 3b829142b..75fd663a3 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
@@ -25,15 +25,11 @@
#include "types.h"
#include "ble_mesh.h"
#include "mesh_cfg.h"
-
+#include "mesh_cfg_usr.h"
/* Exported macro ------------------------------------------------------------*/
#define CONFIG_CLIENT_UNICAST_ADDR 0x0001
-
-#define MAX_SIG_MODELS_PER_ELEMENT 12
-#define MAX_VENDOR_MODELS_PER_ELEMENT 1
-#define MAX_ELEMENTS_PER_NODE APPLICATION_NUMBER_OF_ELEMENTS
#define CONFIG_COMPOSITION_DATA_GET_PAGE_SIZE 1
#define COMPOSITION_PAGE0 0
@@ -161,6 +157,8 @@
/* Exported structure --------------------------------------------------------*/
+#if defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER)
+
#pragma pack(1)
typedef struct {
MOBLEUINT16 nodePrimaryAddress;
@@ -168,16 +166,14 @@ typedef struct {
MOBLEUINT8 numberOfAttemptsTx;
MOBLEUINT32 Initial_time; /* Initial time for the Message */
- MOBLEUINT8 NbOfSIGModelsToConfigure;
- MOBLEUINT8 NbOfVendorModelsToConfigure;
} NodeInfo_t;
typedef struct {
MOBLEUINT16 Loc; /* Contains a location descriptor */
MOBLEUINT8 NumSIGmodels; /* Contains a count of SIG Model IDs in this element */
MOBLEUINT8 NumVendorModels; /* Contains a count of Vendor Model IDs in this element */
- MOBLEUINT16 aSIGModels[MAX_SIG_MODELS_PER_ELEMENT];
- MOBLEUINT32 aVendorModels[MAX_VENDOR_MODELS_PER_ELEMENT];
+ MOBLEUINT16 aSIGModels[CLIENT_MAX_SIG_MODELS_PER_ELEMENT];
+ MOBLEUINT32 aVendorModels[CLIENT_MAX_VENDOR_MODELS_PER_ELEMENT];
} Elements_Page0_t;
typedef struct {
@@ -193,7 +189,8 @@ typedef struct {
#define DEVICE_COMPOSITION_HEADER_SIZE sizeof(Composition_Header_Page0_t)
#define DEVICE_COMPOSITION_ELEMENTS_DESC sizeof(Elements_Page0_t)
-#define DEVICE_COMPOSITION_MAX_SIZE (DEVICE_COMPOSITION_HEADER_SIZE + (MAX_ELEMENTS_PER_NODE*DEVICE_COMPOSITION_ELEMENTS_DESC))
+#define DEVICE_COMPOSITION_MAX_SIZE (DEVICE_COMPOSITION_HEADER_SIZE)
+//+ (MAX_ELEMENTS_PER_NODE*DEVICE_COMPOSITION_ELEMENTS_DESC))
#pragma pack(1)
typedef struct {
@@ -362,7 +359,7 @@ typedef struct
const MOBLEUINT8 *pDefaultParam;
} MODEL_CONFIG_CLIENT_OpcodeTableParam_t;
-extern Elements_Page0_t aNodeElements[MAX_ELEMENTS_PER_NODE];
+extern Elements_Page0_t aNodeElements[CLIENT_MAX_ELEMENTS_PER_NODE];
/******************************************************************************/
/********** Following Section defines the Opcodes for the Messages ************/
@@ -370,12 +367,10 @@ extern Elements_Page0_t aNodeElements[MAX_ELEMENTS_PER_NODE];
extern NodeInfo_t NodeInfo;
+
+
/* Exported Functions Prototypes ---------------------------------------------*/
-void CopyU8LittleEndienArray_fromU16word (MOBLEUINT8* pArray, MOBLEUINT16 inputWord);
-void CopyU8LittleEndienArray_fromU32word (MOBLEUINT8* pArray, MOBLEUINT32 inputWord);
-void CopyU8LittleEndienArray_2B_fromU32word (MOBLEUINT8* pArray, MOBLEUINT32 inputWord);
-MOBLEUINT16 CopyU8LittleEndienArrayToU16word (MOBLEUINT8* pArray);
-MOBLEUINT32 CopyU8LittleEndienArrayToU32word (MOBLEUINT8* pArray);
+
MOBLE_RESULT ConfigClientModel_SendMessage(MOBLE_ADDRESS dst_peer ,
MOBLEUINT16 opcode, MOBLEUINT8 *pData,
@@ -394,10 +389,6 @@ MOBLEUINT16 GetNodeElementAddress(void);
MOBLEUINT16 GetServerElementAddress(MOBLEUINT8 elementIndex);
MOBLEUINT8 GetTotalSIGModelsCount(MOBLEUINT8 elementIdx);
MOBLEUINT8 GetTotalVendorModelsCount(MOBLEUINT8 elementIdx);
-MOBLEUINT8 GetNumberofSIGModels(MOBLEUINT8 elementIdx);
-MOBLEUINT8 GetNumberofVendorModels(MOBLEUINT8 elementIdx);
-void SetSIGModelCountToConfigure(MOBLEUINT8 count);
-void SetVendorModelCountToConfigure(MOBLEUINT8 count);
MOBLEUINT8 ConfigClient_ChkRetrialState (eServerRespRecdState_t* eRespRecdState);
MOBLEUINT8 ConfigClient_ChkRetries (void);
void ConfigClient_SaveMsgSendingTime (void);
@@ -449,8 +440,7 @@ MOBLE_RESULT ConfigClient_PublicationStatus(MOBLEUINT8 const *pPublicationStatus
MOBLE_RESULT ConfigClientModel_GetOpcodeTableCb(const MODEL_OpcodeTableParam_t **data,
MOBLEUINT16 *length);
-MOBLE_RESULT ConfigClientModel_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+MOBLE_RESULT ConfigClientModel_GetStatusRequestCb(MODEL_MessageHeader_t *pmsgParam,
MOBLEUINT16 opcode,
MOBLEUINT8 *pResponsedata,
MOBLEUINT32 *plength,
@@ -458,13 +448,15 @@ MOBLE_RESULT ConfigClientModel_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
MOBLEUINT32 dataLength,
MOBLEBOOL response);
-MOBLE_RESULT ConfigClientModel_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+MOBLE_RESULT ConfigClientModel_ProcessMessageCb(MODEL_MessageHeader_t *pmsgParam,
MOBLEUINT16 opcode,
MOBLEUINT8 const *pRxData,
MOBLEUINT32 dataLength,
MOBLEBOOL response);
+
+#endif /* defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER) */
+
#endif /* __CONFIG_CLIENT_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
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 1d648a75e..f0501ae3e 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/generic.h
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/generic.h
@@ -128,20 +128,20 @@
/********** Following Section defines the SERVER SIG MODEL IDs ************/
/******************************************************************************/
-#define GENERIC_MODEL_SERVER_ONOFF_MODEL_ID 0x1000
-#define GENERIC_MODEL_SERVER_LEVEL_MODEL_ID 0x1002
-#define GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID 0x1004
-#define GENERIC_MODEL_SERVER_POWER_ONOFF_MODEL_ID 0x1006
-#define GENERIC_MODEL_SERVER_POWER_ONOFF_SETUP_MODEL_ID 0x1007
-#define GENERIC_MODEL_SERVER_POWER_LEVEL_MODEL_ID 0x1009
-#define GENERIC_MODEL_SERVER_POWER_LEVEL_SETUP_MODEL_ID 0x100A
-#define GENERIC_MODEL_SERVER_BATTERY_MODEL_ID 0x100C
-#define GENERIC_MODEL_SERVER_LOCATION_MODEL_ID 0x100E
-#define GENERIC_MODEL_SERVER_LOCATION_SETUP_MODEL_ID 0x100F
-#define GENERIC_MODEL_SERVER_ADMIN_PROPERTY_MODEL_ID 0x1011
-#define GENERIC_MODEL_SERVER_MANUFACTURER_PROPERTY_MODEL_ID 0x1012
-#define GENERIC_MODEL_SERVER_USER_PROPERTY_MODEL_ID 0x1013
-#define GENERIC_MODEL_SERVER_CLIENT_PROPERTY_MODEL_ID 0x1014
+#define GENERIC_MODEL_SERVER_ONOFF_MODEL_ID 0x1000
+#define GENERIC_LEVEL_SERVER_MODEL_ID 0x1002
+#define GENERIC_DEFAULT_TRANSITION_TIME_SERVER_MODEL_ID 0x1004
+#define GENERIC_SERVER_POWER_ONOFF_MODEL_ID 0x1006
+#define GENERIC_POWER_ONOFF_SETUP_SERVER_MODEL_ID 0x1007
+#define GENERIC_MODEL_SERVER_POWER_LEVEL_MODEL_ID 0x1009
+#define GENERIC_MODEL_SERVER_POWER_LEVEL_SETUP_MODEL_ID 0x100A
+#define GENERIC_MODEL_SERVER_BATTERY_MODEL_ID 0x100C
+#define GENERIC_MODEL_SERVER_LOCATION_MODEL_ID 0x100E
+#define GENERIC_MODEL_SERVER_LOCATION_SETUP_MODEL_ID 0x100F
+#define GENERIC_MODEL_SERVER_ADMIN_PROPERTY_MODEL_ID 0x1011
+#define GENERIC_MODEL_SERVER_MANUFACTURER_PROPERTY_MODEL_ID 0x1012
+#define GENERIC_MODEL_SERVER_USER_PROPERTY_MODEL_ID 0x1013
+#define GENERIC_MODEL_SERVER_CLIENT_PROPERTY_MODEL_ID 0x1014
/******************************************************************************/
/********** SIG MODEL IDs ends ************/
@@ -151,10 +151,10 @@
/********** Following Section defines the CLIENT SIG MODEL IDs ************/
/******************************************************************************/
-#define GENERIC_MODEL_CLIENT_ONOFF_MODEL_ID 0x1001
-#define GENERIC_MODEL_CLIENT_LEVEL_MODEL_ID 0x1003
-#define GENERIC_MODEL_CLIENT_DEFAULT_TRANSITION_TIME_MODEL_ID 0x1005
-#define GENERIC_MODEL_CLIENT_POWER_ONOFF_MODEL_ID 0x1008
+#define GENERIC_ONOFF_CLIENT_MODEL_ID 0x1001
+#define GENERIC_LEVEL_CLIENT_MODEL_ID 0x1003
+#define GENERIC_DEFAULT_TRANSITION_TIME_CLIENT_MODEL_ID 0x1005
+#define GENERIC_POWER_ONOFF_CLIENT_MODEL_ID 0x1008
/******************************************************************************/
/********** SIG MODEL IDs ends ************/
@@ -163,11 +163,7 @@
#define MAXSTEPVALUE 0X3E
#define MINSTEPVALUE 0X00
-
-#define STEP_RESOLUTION_0 100
-#define STEP_RESOLUTION_1 1000
-#define STEP_RESOLUTION_2 10000
-#define STEP_RESOLUTION_3 600000
+#define UNDEFSTEPVAL 0x3F
#define STEP_HEX_VALUE_0 0X00
#define STEP_HEX_VALUE_1 0X01
@@ -207,10 +203,6 @@
#define IN_TRANSITION 0X02
#define DEFAULT_TRANSITION 0X03
-#define No_NVM_FLAG 0XFE
-#define GENERIC_ON_OFF_NVM_FLAG 0X01
-#define GENERIC_LEVEL_NVM_FLAG 0X02
-
#define GENERIC_TRANSITION_STOP 0X00
#define GENERIC_ON_OFF_TRANSITION_START 0X01
#define GENERIC_LEVEL_TRANSITION_START 0X02
@@ -229,6 +221,7 @@ typedef struct
MOBLEINT16 PresentValue16;
MOBLEINT16 TargetValue16;
} Generic_TemporaryStatus_t;
+
/*****************************************************/
/* Transition time variables */
typedef struct
@@ -309,12 +302,11 @@ typedef struct
/******************************************************/
/* Generic Default transition time messages*/
typedef struct
- {
+{
MOBLEUINT8 DefaultTransitionTime;
}Generic_DefaultTransitionParam_t;
-typedef union
-{
+typedef union {
Generic_LevelParam_t sGeneric_LevelParam;
MOBLEUINT8 a_Level_param[sizeof(Generic_LevelParam_t)];
} _Generic_LevelParam;
@@ -325,51 +317,61 @@ typedef struct
/* Pointer to the function Appli_Generic_OnOff_Set used for callback
from the middle layer to Application layer
*/
- MOBLE_RESULT (*OnOff_Set_cb)(Generic_OnOffStatus_t*, uint8_t);
+ MOBLE_RESULT (*OnOff_Set_cb)(Generic_OnOffStatus_t*, uint8_t, uint16_t, \
+ uint8_t);
- MOBLE_RESULT (*OnOff_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32);
+ MOBLE_RESULT (*OnOff_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32, uint16_t,\
+ uint8_t);
/* Pointer to the function Appli_Generic_Level_Set used for callback
from the middle layer to Application layer
*/
- MOBLE_RESULT (*Level_Set_cb)(Generic_LevelStatus_t*, MOBLEUINT8);
+ MOBLE_RESULT (*Level_Set_cb)(Generic_LevelStatus_t*, MOBLEUINT8, uint16_t,\
+ uint8_t);
/* 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);
+ MOBLE_RESULT (*LevelDelta_Set_cb)(Generic_LevelStatus_t*, MOBLEUINT8, uint16_t,\
+ uint8_t);
/* 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);
+ MOBLE_RESULT (*LevelDeltaMove_Set_cb)(Generic_LevelStatus_t*, MOBLEUINT8, \
+ uint16_t, uint8_t);
- MOBLE_RESULT (*Level_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32);
+ MOBLE_RESULT (*Level_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32, uint16_t, \
+ uint8_t);
/* Pointer to the function Appli_Generic_PowerOnOff_Set used for callback
from the middle layer to Application layer
*/
- MOBLE_RESULT (*GenericPowerOnOff_cb)(Generic_PowerOnOffParam_t*, MOBLEUINT8);
+ MOBLE_RESULT (*GenericPowerOnOff_cb)(Generic_PowerOnOffParam_t*, MOBLEUINT8, \
+ uint16_t, uint8_t);
- MOBLE_RESULT (*GenericPowerOnOff_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32);
+ MOBLE_RESULT (*GenericPowerOnOff_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32, \
+ uint16_t, uint8_t);
/* Pointer to the function Generic_DefaultTransitionTime_Set used for callback
from the middle layer to Application layer
*/
- MOBLE_RESULT (*GenericDefaultTransition_cb)(Generic_DefaultTransitionParam_t*, MOBLEUINT8);
+ MOBLE_RESULT (*GenericDefaultTransition_cb)(Generic_DefaultTransitionParam_t*,\
+ MOBLEUINT8, uint16_t, uint8_t);
- MOBLE_RESULT (*GenericDefaultTransition_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32);
+ MOBLE_RESULT (*GenericDefaultTransition_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32, \
+ uint16_t, uint8_t);
} Appli_Generic_cb_t;
typedef struct
{
- MOBLE_RESULT (*GetOnOffStatus_cb)(MOBLEUINT8*);
+ MOBLE_RESULT (*GetOnOffStatus_cb)(MOBLEUINT8*, uint16_t, uint8_t);
- MOBLE_RESULT (*GetOnOffValue_cb)(MOBLEUINT8*);
+ MOBLE_RESULT (*GetOnOffValue_cb)(MOBLEUINT8*, uint16_t, uint8_t);
- MOBLE_RESULT (*GetLevelStatus_cb)(MOBLEUINT8*);
+ MOBLE_RESULT (*GetLevelStatus_cb)(MOBLEUINT8*, uint16_t, uint8_t);
- MOBLE_RESULT (*GetPowerOnOffStatus_cb)(MOBLEUINT8*);
+ MOBLE_RESULT (*GetPowerOnOffStatus_cb)(MOBLEUINT8*, uint16_t, uint8_t);
- MOBLE_RESULT (*GetDefaultTransitionStatus_cb)(MOBLEUINT8*);
+ MOBLE_RESULT (*GetDefaultTransitionStatus_cb)(MOBLEUINT8*, uint16_t, uint8_t);
}Appli_Generic_State_cb_t;
#pragma pack(4)
@@ -382,24 +384,26 @@ extern const Appli_Generic_cb_t GenericAppli_cb;
void BLEMesh_GenericModelAppliCb (Appli_Generic_cb_t* map );
-MOBLE_RESULT Generic_OnOff_Set(MOBLEUINT8 const*, MOBLEUINT32);
-MOBLE_RESULT Generic_OnOff_Status(MOBLEUINT8* , MOBLEUINT32*);
+MOBLE_RESULT Generic_OnOff_Set(MOBLEUINT8 const*, MOBLEUINT32, MODEL_MessageHeader_t*);
+MOBLE_RESULT Generic_OnOff_Status(MOBLEUINT8*, MOBLEUINT32*, MODEL_MessageHeader_t*);
-MOBLE_RESULT Generic_Level_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*);
-MOBLE_RESULT Generic_DefaultTransitionTime_Set(const MOBLEUINT8*, MOBLEUINT32 length);
-MOBLE_RESULT Generic_DefaultTransitionTime_Status(MOBLEUINT8 *pTransition_status , MOBLEUINT32 *plength);
+MOBLE_RESULT Generic_Level_Set(const MOBLEUINT8*, MOBLEUINT32, MODEL_MessageHeader_t*);
+MOBLE_RESULT Generic_Delta_Set(const MOBLEUINT8*, MOBLEUINT32, MODEL_MessageHeader_t*);
+MOBLE_RESULT Generic_Move_Set(const MOBLEUINT8*, MOBLEUINT32, MODEL_MessageHeader_t*);
+MOBLE_RESULT Generic_Level_Status(MOBLEUINT8*, MOBLEUINT32*, MODEL_MessageHeader_t*);
+MOBLE_RESULT Generic_PowerOnOff_Set(const MOBLEUINT8*, MOBLEUINT32 length, MODEL_MessageHeader_t*);
+MOBLE_RESULT Generic_PowerOnOff_Status(MOBLEUINT8*, MOBLEUINT32*, MODEL_MessageHeader_t*);
+MOBLE_RESULT Generic_DefaultTransitionTime_Set(const MOBLEUINT8*, MOBLEUINT32 length,\
+ MODEL_MessageHeader_t*);
+MOBLE_RESULT Generic_DefaultTransitionTime_Status(MOBLEUINT8 *pTransition_status , \
+ MOBLEUINT32 *plength,
+ MODEL_MessageHeader_t*);
MOBLE_RESULT GenericModelServer_GetOpcodeTableCb(const MODEL_OpcodeTableParam_t **data,
MOBLEUINT16 *length);
-MOBLE_RESULT GenericModelServer_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+MOBLE_RESULT GenericModelServer_GetStatusRequestCb(MODEL_MessageHeader_t *pmsgParam,
MOBLEUINT16 opcode,
MOBLEUINT8 *pResponsedata,
MOBLEUINT32 *plength,
@@ -407,8 +411,7 @@ MOBLE_RESULT GenericModelServer_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
MOBLEUINT32 length,
MOBLEBOOL response);
-MOBLE_RESULT GenericModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+MOBLE_RESULT GenericModelServer_ProcessMessageCb(MODEL_MessageHeader_t *pmsgParam,
MOBLEUINT16 opcode,
MOBLEUINT8 const *data,
MOBLEUINT32 length,
@@ -418,28 +421,33 @@ void Generic_Publish(MOBLE_ADDRESS srcAddress);
MOBLE_RESULT BLEMesh_AddGenericModels(void);
-void Generic_GetStepValue(MOBLEUINT8 stepParam);
-
-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_TransitionBehaviour(MOBLEUINT8 *GetValue);
-
-MOBLE_RESULT GenericOnOffStateUpdate_Process(void);
-MOBLE_RESULT GenericLevelStateUpdate_Process(void);
-
-void Generic_OnOffDefaultTransitionValue(void);
-void Generic_LevelDefaultTransitionValue(MOBLEUINT16 levelValue);
-
-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);
-MOBLE_RESULT Generic_Client_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status , MOBLEUINT32 plength);
+void Generic_GetStepValue(MOBLEUINT8 stepParam, MOBLEUINT8 elementIndex);
+
+void GenericOnOff_LightActualBinding(Generic_OnOffStatus_t* onOff_param,MOBLEUINT8 elementIndex);
+void GenericLevel_LightBinding(Generic_LevelStatus_t* gLevel_param , MOBLEUINT8 flag,MOBLEUINT8 elementIndex);
+void GenericLevel_CtlTempBinding(Generic_LevelStatus_t * bLevelParam,MOBLEUINT8 elementIndex);
+void GenericLevel_HslHueBinding(Generic_LevelStatus_t * bLevelParam,MOBLEUINT8 elementIndex);
+void GenericLevel_HslSaturationBinding(Generic_LevelStatus_t * bLevelParam,MOBLEUINT8 elementIndex);
+void GenericOnOff_Light_LC_Binding(Generic_OnOffStatus_t* onOff_param,MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Generic_TransitionBehaviour(MOBLEUINT8 *GetValue, MOBLEUINT8 elementIndex);
+MOBLE_RESULT Generic_OnOffStateUpdate_Process(MOBLEUINT8 elementIndex);
+MOBLE_RESULT Generic_LevelStateUpdate_Process(MOBLEUINT8 elementIndex);
+void Generic_OnOffDefaultTransitionValue(MOBLEUINT8 elementIndex);
+void Generic_LevelDefaultTransitionValue(MOBLEUINT8 elementIndex, MOBLEUINT16 levelValue);
+void Generic_DeltaDefaultTransitionValue(MOBLEUINT8 elementIndex, MOBLEUINT32 deltaValue);
+void Generic_OnOffUpdate(MOBLEUINT8 elementIndex, MOBLEUINT8 onOff);
+MOBLE_RESULT Generic_Client_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUINT32 plength,\
+ uint16_t, uint8_t);
+MOBLE_RESULT Generic_Client_Level_Status(MOBLEUINT8 const *plevel_status, MOBLEUINT32 plength,\
+ uint16_t, uint8_t);
+MOBLE_RESULT Generic_Client_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status ,
+ MOBLEUINT32 plength,\
+ uint16_t, uint8_t);
+MOBLE_RESULT Generic_Client_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status ,
+ MOBLEUINT32 plength,\
+ uint16_t, uint8_t);
#endif /* __GENERIC_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/generic_client.h b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/generic_client.h
index 649fbbf5b..2f74b6209 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/generic_client.h
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/generic_client.h
@@ -35,6 +35,7 @@ typedef union
MOBLEUINT8 a_OnOff_param[sizeof(Generic_OnOffParam_t)];
} _Generic_OnOffParam;
+
/******************************************************************************/
/********** Following Section defines the Opcodes for the Messages ************/
/******************************************************************************/
@@ -44,8 +45,7 @@ typedef union
MOBLE_RESULT GenericModelClient_GetOpcodeTableCb(const MODEL_OpcodeTableParam_t **data,
MOBLEUINT16 *length);
-MOBLE_RESULT GenericModelClient_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+MOBLE_RESULT GenericModelClient_GetStatusRequestCb(MODEL_MessageHeader_t *pmsgParam,
MOBLEUINT16 opcode,
MOBLEUINT8 *pResponsedata,
MOBLEUINT32 *plength,
@@ -53,32 +53,72 @@ MOBLE_RESULT GenericModelClient_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
MOBLEUINT32 dataLength,
MOBLEBOOL response);
-MOBLE_RESULT GenericModelClient_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+MOBLE_RESULT GenericModelClient_ProcessMessageCb(MODEL_MessageHeader_t *pmsgParam,
MOBLEUINT16 opcode,
MOBLEUINT8 const *pRxData,
MOBLEUINT32 dataLength,
MOBLEBOOL response
);
-MOBLE_RESULT GenericClient_OnOff_Set(MOBLE_ADDRESS element_number,
- _Generic_OnOffParam *pOnOff_param,
+// Generic OnOff
+MOBLE_RESULT GenericClient_OnOff_Get(MOBLEUINT8 elementIndex);
+MOBLE_RESULT GenericClient_OnOff_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pOnOff_param,
MOBLEUINT32 length);
-MOBLE_RESULT GenericClient_OnOff_Set_Unack(MOBLE_ADDRESS element_number,
- _Generic_OnOffParam *pOnOff_param,
+MOBLE_RESULT GenericClient_OnOff_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pOnOff_param,
MOBLEUINT32 length);
-MOBLE_RESULT GenericClient_Level_Set_Unack(MOBLE_ADDRESS element_number,
- _Generic_LevelParam *plevel_param,
+// Generic Level
+MOBLE_RESULT GenericClient_Level_Get(MOBLEUINT8 elementIndex);
+MOBLE_RESULT GenericClient_Level_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *plevel_param,
+ MOBLEUINT32 length);
+MOBLE_RESULT GenericClient_Level_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *plevel_param,
+ MOBLEUINT32 length);
+
+MOBLE_RESULT GenericClient_Delta_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pdeltalevel_param,
+ MOBLEUINT32 length);
+MOBLE_RESULT GenericClient_Delta_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pdeltalevel_param,
MOBLEUINT32 length);
+MOBLE_RESULT GenericClient_Move_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *plevelmove_param,
+ MOBLEUINT32 length);
+MOBLE_RESULT GenericClient_Move_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *plevelmove_param,
+ MOBLEUINT32 length) ;
+// Generic PowerOnOff
+MOBLE_RESULT GenericClient_PowerOnOff_Get(MOBLEUINT8 elementIndex);
+MOBLE_RESULT GenericClient_PowerOnOff_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8* ppoweronoff_param,
+ MOBLEUINT32 length);
+MOBLE_RESULT GenericClient_PowerOnOff_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8* ppoweronoff_param,
+ MOBLEUINT32 length);
+// Generic Default Transition Time
+MOBLE_RESULT GenericClient_DefaultTransitionTime_Get(MOBLEUINT8 elementIndex);
+MOBLE_RESULT GenericClient_DefaultTransitionTime_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pdefaulttransitiontime_param,
+ MOBLEUINT32 length);
+MOBLE_RESULT GenericClient_DefaultTransitionTime_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pdefaulttransitiontime_param,
+ MOBLEUINT32 length);
-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);
-MOBLE_RESULT Generic_Client_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status , MOBLEUINT32 plength);
+// Status
+MOBLE_RESULT Generic_Client_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUINT32 plength,\
+ uint16_t, uint8_t);
+MOBLE_RESULT Generic_Client_Level_Status(MOBLEUINT8 const *plevel_status, MOBLEUINT32 plength,\
+ uint16_t, uint8_t);
+MOBLE_RESULT Generic_Client_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status ,\
+ MOBLEUINT32 plength,uint16_t, uint8_t);
+MOBLE_RESULT Generic_Client_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status ,\
+ MOBLEUINT32 plength, uint16_t, uint8_t);
#endif /* __GENERIC_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
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 c2d56d288..61bc49728 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/light.h
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/light.h
@@ -108,18 +108,18 @@
/********** Following Section defines the SIG MODEL IDs ************/
/******************************************************************************/
-#define LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID 0x1300
-#define LIGHT_MODEL_SERVER_LIGHTNESS_SETUP_MODEL_ID 0x1301
-#define LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID 0x1302
-#define LIGHT_MODEL_SERVER_CTL_MODEL_ID 0x1303
-#define LIGHT_MODEL_SERVER_CTL_SETUP_MODEL_ID 0x1304
-#define LIGHT_MODEL_CLIENT_CTL_MODEL_ID 0x1305
-#define LIGHT_MODEL_SERVER_CTL_TEMPERATURE_MODEL_ID 0x1306
-#define LIGHT_MODEL_SERVER_HSL_MODEL_ID 0x1307
-#define LIGHT_MODEL_SERVER_HSL_SETUP_MODEL_ID 0x1308
-#define LIGHT_MODEL_CLIENT_HSL_MODEL_ID 0x1309
-#define LIGHT_MODEL_SERVER_HSL_HUE_MODEL_ID 0x130A
-#define LIGHT_MODEL_SERVER_HSL_SATURATION_MODEL_ID 0x130B
+#define LIGHT_LIGHTNESS_SERVER_MODEL_ID 0x1300
+#define LIGHT_LIGHTNESS_SETUP_SERVER_MODEL_ID 0x1301
+#define LIGHT_LIGHTNESS_CLIENT_MODEL_ID 0x1302
+#define LIGHT_CTL_SERVER_MODEL_ID 0x1303
+#define LIGHT_CTL_SETUP_SERVER_MODEL_ID 0x1304
+#define LIGHT_CTL_CLIENT_MODEL_ID 0x1305
+#define LIGHT_CTL_TEMPERATURE_SERVER_MODEL_ID 0x1306
+#define LIGHT_HSL_SERVER_MODEL_ID 0x1307
+#define LIGHT_HSL_SETUP_SERVER_MODEL_ID 0x1308
+#define LIGHT_HSL_CLIENT_MODEL_ID 0x1309
+#define LIGHT_HSL_HUE_SERVER_MODEL_ID 0x130A
+#define LIGHT_HSL_SATURATION_SERVER_MODEL_ID 0x130B
#define LIGHT_MODEL_SERVER_XYL_MODEL_ID 0x130C
#define LIGHT_MODEL_SERVER_XYL_SETUP_MODEL_ID 0x130D
@@ -155,12 +155,11 @@
#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
-#define LIGHT_HSL_NVM_FLAG 0X05
+#define BINDING_LIGHT_HSL_HUE_SET 0X07
+#define BINDING_LIGHT_HSL_SATURATION_SET 0X08
+
+/* Total maximum number of models to be binded */
+#define MAX_NUM_BINDED_STATE /*5*/20
/* Define the following Macros to change the step resolution and step count value */
#define TRANSITION_SCALER 1
@@ -183,7 +182,6 @@
#define LIGHT_HSL_HUE_TRANSITION_START 0X06
#define LIGHT_HSL_SATURATION_TRANSITION_START 0X07
-#define MAX_NUM_BINDED_STATE /*5*/20
/* Exported variables ------------------------------------------------------- */
/* Transition flag of models*/
#pragma pack(1)
@@ -278,6 +276,16 @@ typedef struct
MOBLEUINT8 RemainingTime;
}Light_TemporaryStatus_t;
+/* Light Ctl Temperature parameters*/
+typedef struct
+{
+ MOBLEUINT16 CTL_Temperature;
+ MOBLEINT16 CTL_DeltaUv;
+ MOBLEUINT8 CTL_TID;
+ MOBLEUINT8 CTL_TransitionTime;
+ MOBLEUINT8 CTL_Delay;
+}Light_CtlTemperatureParam_t;
+
/* Light CTL Temperature Range Parameter */
typedef struct
{
@@ -331,120 +339,142 @@ typedef struct
MOBLEUINT16 HslMinSaturation16;
MOBLEUINT16 HslMaxSaturation16;
}Light_HslRangeParam_t;
+
+typedef struct
+{
+ MOBLEUINT16 HslHueLightness16;
+ MOBLEUINT8 Hsl_TID;
+ MOBLEUINT8 Hsl_TransitionTime;
+ MOBLEUINT8 Hsl_Delay;
+}Light_HslHueParam_t;
+
+typedef struct
+{
+ MOBLEUINT16 HslSaturation16;
+ MOBLEUINT8 Hsl_TID;
+ MOBLEUINT8 Hsl_TransitionTime;
+ MOBLEUINT8 Hsl_Delay;
+}Light_HslSaturationParam_t;
/**************************************/
typedef struct
{
/* Pointer to the function Appli_Light_Lightness_Set used for callback
from the middle layer to Application layer
*/
- MOBLE_RESULT (*Lightness_Set_cb)(Light_LightnessStatus_t*, MOBLEUINT8);
+ MOBLE_RESULT (*Lightness_Set_cb)(Light_LightnessStatus_t*, MOBLEUINT8,uint16_t, uint8_t);
- MOBLE_RESULT (*Lightness_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32);
+ MOBLE_RESULT (*Lightness_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32,uint16_t, uint8_t);
/* Pointer to the function Appli_Light_Lightness_Linear_Set used for callback
from the middle layer to Application layer
*/
- MOBLE_RESULT (*Lightness_Linear_Set_cb)(Light_LightnessStatus_t*, MOBLEUINT8);
+ MOBLE_RESULT (*Lightness_Linear_Set_cb)(Light_LightnessStatus_t*, MOBLEUINT8,uint16_t, uint8_t);
- MOBLE_RESULT (*Lightness_Linear_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32);
+ MOBLE_RESULT (*Lightness_Linear_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32,uint16_t, uint8_t);
/* Pointer to the function Appli_Light_Lightness_Default_Set used for callback
from the middle layer to Application layer
*/
- MOBLE_RESULT (*Lightness_Default_Set_cb)(Light_LightnessDefaultParam_t*, MOBLEUINT8);
+ MOBLE_RESULT (*Lightness_Default_Set_cb)(Light_LightnessDefaultParam_t*, MOBLEUINT8,uint16_t, uint8_t);
- MOBLE_RESULT (*Lightness_Default_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32);
+ MOBLE_RESULT (*Lightness_Default_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32, uint16_t, uint8_t);
- /* Pointer to the function Appli_Light_Lightness_Range_Set used for callback
+ MOBLE_RESULT (*Lightness_Last_Set_cb)(Light_LightnessStatus_t*, MOBLEUINT8);
+
+ MOBLE_RESULT (*Lightness_Last_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32, uint16_t, uint8_t);
+
+/* Pointer to the function Appli_Light_Lightness_Range_Set used for callback
from the middle layer to Application layer
*/
- MOBLE_RESULT (*Lightness_Range_Set_cb)(Light_LightnessRangeParam_t*, MOBLEUINT8);
+ MOBLE_RESULT (*Lightness_Range_Set_cb)(Light_LightnessRangeParam_t*, MOBLEUINT8,uint16_t, uint8_t);
- MOBLE_RESULT (*Lightness_Range_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32);
+ MOBLE_RESULT (*Lightness_Range_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32,uint16_t, uint8_t);
/* Pointer to the function Appli_Light_Ctl_Set used for callback
from the middle layer to Application layer
*/
- MOBLE_RESULT (*Light_Ctl_Set_cb)(Light_CtlStatus_t*, MOBLEUINT8);
+ MOBLE_RESULT (*Light_Ctl_Set_cb)(Light_CtlStatus_t*, MOBLEUINT8,uint16_t, uint8_t);
- MOBLE_RESULT (*Light_Ctl_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32);
+ MOBLE_RESULT (*Light_Ctl_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32,uint16_t, uint8_t);
/* Pointer to the function Appli_Light_CtlTemperature_Set used for callback
from the middle layer to Application layer
*/
- MOBLE_RESULT (*Light_CtlTemperature_Set_cb)(Light_CtlStatus_t*, MOBLEUINT8);
+ MOBLE_RESULT (*Light_CtlTemperature_Set_cb)(Light_CtlStatus_t*, MOBLEUINT8,uint16_t, uint8_t);
- MOBLE_RESULT (*Light_CtlTemperature_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32);
+ MOBLE_RESULT (*Light_CtlTemperature_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32,uint16_t, uint8_t);
/* Pointer to the function Appli_Light_CtlTemperature_Range_Set used for callback
from the middle layer to Application layer
*/
- MOBLE_RESULT (*Light_CtlTemperature_Range_Set_cb)(Light_CtlTemperatureRangeParam_t*, MOBLEUINT8);
+ MOBLE_RESULT (*Light_CtlTemperature_Range_Set_cb)(Light_CtlTemperatureRangeParam_t*, MOBLEUINT8,uint16_t, uint8_t);
- MOBLE_RESULT (*Light_CtlTemperature_Range_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32);
+ MOBLE_RESULT (*Light_CtlTemperature_Range_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32,uint16_t, uint8_t);
/* Pointer to the function Appli_Light_CtlDefault_Set used for callback
from the middle layer to Application layer
*/
- MOBLE_RESULT (*Light_CtlDefault_Set_cb)(Light_CtlDefaultParam_t*, MOBLEUINT8);
+ MOBLE_RESULT (*Light_CtlDefault_Set_cb)(Light_CtlDefaultParam_t*, MOBLEUINT8,uint16_t, uint8_t);
- MOBLE_RESULT (*Light_CtlDefault_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32);
+ MOBLE_RESULT (*Light_CtlDefault_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32,uint16_t, uint8_t);
/* Pointer to the function Appli_Light_Hsl_Set used for callback
from the middle layer to Application layer
*/
- MOBLE_RESULT (*Light_Hsl_Set_cb)(Light_HslStatus_t*, MOBLEUINT8);
+ MOBLE_RESULT (*Light_Hsl_Set_cb)(Light_HslStatus_t*, MOBLEUINT8,uint16_t, uint8_t);
- MOBLE_RESULT (*Light_Hsl_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32);
+ MOBLE_RESULT (*Light_Hsl_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32,uint16_t, uint8_t);
/* Pointer to the function Appli_Light_HslHue_Set used for callback
from the middle layer to Application layer
*/
- MOBLE_RESULT (*Light_HslHue_Set_cb)(Light_HslStatus_t*, MOBLEUINT8);
+ MOBLE_RESULT (*Light_HslHue_Set_cb)(Light_HslStatus_t*, MOBLEUINT8,uint16_t, uint8_t);
- MOBLE_RESULT (*Light_HslHue_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32);
+ MOBLE_RESULT (*Light_HslHue_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32,uint16_t, uint8_t);
/* Pointer to the function Appli_Light_HslSaturation_Set used for callback
from the middle layer to Application layer
*/
- MOBLE_RESULT (*Light_HslSaturation_Set_cb)(Light_HslStatus_t*, MOBLEUINT8);
+ MOBLE_RESULT (*Light_HslSaturation_Set_cb)(Light_HslStatus_t*, MOBLEUINT8,uint16_t, uint8_t);
- MOBLE_RESULT (*Light_HslSaturation_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32);
+ MOBLE_RESULT (*Light_HslSaturation_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32,uint16_t, uint8_t);
/* Pointer to the function Appli_Light_HslDefault_Set used for callback
from the middle layer to Application layer
*/
- MOBLE_RESULT (*Light_HslDefault_Set_cb)(Light_HslStatus_t*, MOBLEUINT8);
+ MOBLE_RESULT (*Light_HslDefault_Set_cb)(Light_HslStatus_t*, MOBLEUINT8,uint16_t, uint8_t);
- MOBLE_RESULT (*Light_HslDefault_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32);
+ MOBLE_RESULT (*Light_HslDefault_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32,uint16_t, uint8_t);
/* Pointer to the function Appli_Light_HslRange_Set used for callback
from the middle layer to Application layer
*/
- MOBLE_RESULT (*Light_HslRange_Set_cb)(Light_HslRangeParam_t*, MOBLEUINT8);
+ MOBLE_RESULT (*Light_HslRange_Set_cb)(Light_HslRangeParam_t*, MOBLEUINT8,uint16_t, uint8_t);
- MOBLE_RESULT (*Light_HslRange_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32);
+ MOBLE_RESULT (*Light_HslRange_Status_cb)(MOBLEUINT8 const *, MOBLEUINT32,uint16_t, uint8_t);
} Appli_Light_cb_t;
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*);
- MOBLE_RESULT (*GetLightCtlTempRange_cb)(MOBLEUINT8*);
- MOBLE_RESULT (*GetLightCtlDefault_cb)(MOBLEUINT8*);
- MOBLE_RESULT (*GetLightHsl_cb)(MOBLEUINT8*);
- MOBLE_RESULT (*GetLightHslHue_cb)(MOBLEUINT8*);
- MOBLE_RESULT (*GetLightHslSaturation_cb)(MOBLEUINT8*);
- MOBLE_RESULT (*GetLightHslHueRange_cb)(MOBLEUINT8*);
- MOBLE_RESULT (*GetLightHslSatRange_cb)(MOBLEUINT8*);
- MOBLE_RESULT (*GetLightHslDefault_cb)(MOBLEUINT8*);
+ MOBLE_RESULT (*GetLightLightness_cb)(MOBLEUINT8*,uint16_t, uint8_t);
+ MOBLE_RESULT (*GetLightLightnessLinear_cb)(MOBLEUINT8*,uint16_t, uint8_t);
+ MOBLE_RESULT (*GetLightLightnessDefault_cb)(MOBLEUINT8*,uint16_t, uint8_t);
+ MOBLE_RESULT (*GetLightLightnessLast_cb)(MOBLEUINT8*,uint16_t, uint8_t);
+ MOBLE_RESULT (*GetLightLightnessRange_cb)(MOBLEUINT8*,uint16_t, uint8_t);
+ MOBLE_RESULT (*GetLightCtl_cb)(MOBLEUINT8*,uint16_t, uint8_t);
+ MOBLE_RESULT (*GetLightCtlTrgt_cb)(MOBLEUINT8*,uint16_t, uint8_t);
+ MOBLE_RESULT (*GetLightCtlTemp_cb)(MOBLEUINT8*,uint16_t, uint8_t);
+ MOBLE_RESULT (*GetLightCtlTempRange_cb)(MOBLEUINT8*,uint16_t, uint8_t);
+ MOBLE_RESULT (*GetLightCtlDefault_cb)(MOBLEUINT8*,uint16_t, uint8_t);
+ MOBLE_RESULT (*GetLightHsl_cb)(MOBLEUINT8*,uint16_t, uint8_t);
+ MOBLE_RESULT (*GetLightHslTrgt_cb)(MOBLEUINT8*,uint16_t, uint8_t);
+ MOBLE_RESULT (*GetLightHslHue_cb)(MOBLEUINT8*,uint16_t, uint8_t);
+ MOBLE_RESULT (*GetLightHslSaturation_cb)(MOBLEUINT8*,uint16_t, uint8_t);
+ MOBLE_RESULT (*GetLightHslHueRange_cb)(MOBLEUINT8*,uint16_t, uint8_t);
+ MOBLE_RESULT (*GetLightHslSatRange_cb)(MOBLEUINT8*,uint16_t, uint8_t);
+ MOBLE_RESULT (*GetLightHslDefault_cb)(MOBLEUINT8*,uint16_t, uint8_t);
}Appli_Light_GetStatus_cb_t;
#pragma pack(4)
@@ -456,67 +486,40 @@ extern const Appli_Light_cb_t LightAppli_cb;
void BLEMesh_LightModelAppliCb (Appli_Light_cb_t* map );
-MOBLE_RESULT Light_Lightness_Set(const MOBLEUINT8* plightness_param,
- MOBLEUINT32 length);
-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);
-MOBLE_RESULT Light_Lightness_Range_Set(const MOBLEUINT8* plightnessRange_param,
- MOBLEUINT32 length);
-MOBLE_RESULT Light_Lightness_Range_Status(MOBLEUINT8* pLightnessRange_status,
- MOBLEUINT32 *pLength);
-MOBLE_RESULT Light_Ctl_Set(const MOBLEUINT8* pLightCtl_param,
- MOBLEUINT32 length);
-MOBLE_RESULT Light_CtlTemperature_Set(const MOBLEUINT8* pLightCtlTemp_param,
- MOBLEUINT32 length);
-MOBLE_RESULT Light_CtlTemperature_Range_Set(const MOBLEUINT8* plightCtlTempRange_param,
- MOBLEUINT32 length);
-MOBLE_RESULT Light_CtlTemperature_Range_Status(MOBLEUINT8* pCtlTempRange_status,
- MOBLEUINT32 *pLength);
-MOBLE_RESULT Light_CtlDefault_Set(const MOBLEUINT8* pCtlDefault_param,
- MOBLEUINT32 length);
-MOBLE_RESULT Light_CtlDefault_Status(MOBLEUINT8* pCtlDefault_status,
- MOBLEUINT32 *pLength);
-MOBLE_RESULT Light_Hsl_Set(const MOBLEUINT8* pHsl_param,
- MOBLEUINT32 length);
-MOBLE_RESULT Light_Hsl_Status(MOBLEUINT8* pHsl_status,
- MOBLEUINT32 *pLength);
-MOBLE_RESULT Light_HslHue_Set(const MOBLEUINT8* pHslHue_param,
- MOBLEUINT32 length);
-MOBLE_RESULT Light_HslHue_Status(MOBLEUINT8* pHslHue_status,
- MOBLEUINT32 *pLength);
-MOBLE_RESULT Light_HslSaturation_Set(const MOBLEUINT8* pHslSaturation_param,
- MOBLEUINT32 length);
-MOBLE_RESULT Light_HslSaturation_Status(MOBLEUINT8* pHslSaturation_status,
- MOBLEUINT32 *pLength);
-MOBLE_RESULT Light_HslDefault_Set(const MOBLEUINT8* pHslDefault_param,
- MOBLEUINT32 length);
-MOBLE_RESULT Light_HslDefault_Status(MOBLEUINT8* pHslDefault_status,
- MOBLEUINT32 *pLength);
-MOBLE_RESULT Light_HslRange_Set(const MOBLEUINT8* pHslRange_param,
- MOBLEUINT32 length);
-MOBLE_RESULT Light_HslRange_Status(MOBLEUINT8* pHslRange_status,
- MOBLEUINT32 *pLength);
-MOBLE_RESULT Light_HslTarget_Status(MOBLEUINT8* pHslTarget_status,
- MOBLEUINT32 *pLength);
+MOBLE_RESULT Light_Lightness_Set(const MOBLEUINT8* plightness_param, MOBLEUINT32 length, MODEL_MessageHeader_t*);
+MOBLE_RESULT Light_Lightness_Status(MOBLEUINT8* pLightness_status, MOBLEUINT32 *pLength, MODEL_MessageHeader_t*);
+MOBLE_RESULT Light_LightnessLinear_Set(const MOBLEUINT8* plightnessLinear_param, MOBLEUINT32 length, MODEL_MessageHeader_t*);
+MOBLE_RESULT Light_LightnessLinear_Status(MOBLEUINT8* pLightnessLinear_status, MOBLEUINT32 *pLength, MODEL_MessageHeader_t*);
+MOBLE_RESULT Light_LightnessLast_Set(const MOBLEUINT8* plightnessLast_param, MOBLEUINT32 length, MODEL_MessageHeader_t*);
+MOBLE_RESULT Light_LightnessLast_Status(MOBLEUINT8* pLightnessLast_status, MOBLEUINT32 *pLength, MODEL_MessageHeader_t*);
+MOBLE_RESULT Light_LightnessDefault_Set(const MOBLEUINT8* plightnessDefault_param, MOBLEUINT32 length, MODEL_MessageHeader_t*);
+MOBLE_RESULT Light_LightnessDefault_Status(MOBLEUINT8* pLightnessDefault_status, MOBLEUINT32 *pLength, MODEL_MessageHeader_t*);
+MOBLE_RESULT Light_LightnessRange_Set(const MOBLEUINT8* plightnessRange_param, MOBLEUINT32 length, MODEL_MessageHeader_t*);
+MOBLE_RESULT Light_LightnessRange_Status(MOBLEUINT8* pLightnessRange_status, MOBLEUINT32 *pLength, MODEL_MessageHeader_t*);
+MOBLE_RESULT Light_Ctl_Set(const MOBLEUINT8* pLightCtl_param, MOBLEUINT32 length, MODEL_MessageHeader_t*);
+MOBLE_RESULT Light_CtlTemperature_Set(const MOBLEUINT8* pLightCtlTemp_param, MOBLEUINT32 length, MODEL_MessageHeader_t*);
+MOBLE_RESULT Light_CtlTemperature_Status(MOBLEUINT8* pLightCtlTemp_status,MOBLEUINT32 *pLength, MODEL_MessageHeader_t *pmsgParam) ;
+MOBLE_RESULT Light_CtlTemperatureRange_Set(const MOBLEUINT8* plightCtlTempRange_param, MOBLEUINT32 length, MODEL_MessageHeader_t*);
+MOBLE_RESULT Light_CtlTemperatureRange_Status(MOBLEUINT8* pCtlTempRange_status, MOBLEUINT32 *pLength, MODEL_MessageHeader_t*);
+MOBLE_RESULT Light_CtlDefault_Set(const MOBLEUINT8* pCtlDefault_param, MOBLEUINT32 length, MODEL_MessageHeader_t*);
+MOBLE_RESULT Light_CtlDefault_Status(MOBLEUINT8* pCtlDefault_status, MOBLEUINT32 *pLength, MODEL_MessageHeader_t*);
+MOBLE_RESULT Light_Hsl_Set(const MOBLEUINT8* pHsl_param, MOBLEUINT32 length, MODEL_MessageHeader_t*);
+MOBLE_RESULT Light_Hsl_Status(MOBLEUINT8* pHsl_status, MOBLEUINT32 *pLength, MODEL_MessageHeader_t*);
+MOBLE_RESULT Light_HslHue_Set(const MOBLEUINT8* pHslHue_param, MOBLEUINT32 length, MODEL_MessageHeader_t *pmsgParam);
+MOBLE_RESULT Light_HslHue_Status(MOBLEUINT8* pHslHue_status, MOBLEUINT32 *pLength, MODEL_MessageHeader_t*);
+MOBLE_RESULT Light_HslSaturation_Set(const MOBLEUINT8* pHslSaturation_param, MOBLEUINT32 length, MODEL_MessageHeader_t *pmsgParam);
+MOBLE_RESULT Light_HslSaturation_Status(MOBLEUINT8* pHslSaturation_status, MOBLEUINT32 *pLength, MODEL_MessageHeader_t*);
+MOBLE_RESULT Light_HslDefault_Set(const MOBLEUINT8* pHslDefault_param, MOBLEUINT32 length, MODEL_MessageHeader_t *pmsgParam);
+MOBLE_RESULT Light_HslDefault_Status(MOBLEUINT8* pHslDefault_status, MOBLEUINT32 *pLength, MODEL_MessageHeader_t*);
+MOBLE_RESULT Light_HslRange_Set(const MOBLEUINT8* pHslRange_param, MOBLEUINT32 length, MODEL_MessageHeader_t*);
+MOBLE_RESULT Light_HslRange_Status(MOBLEUINT8* pHslRange_status, MOBLEUINT32 *pLength, MODEL_MessageHeader_t*);
+MOBLE_RESULT Light_HslTarget_Status(MOBLEUINT8* pHslTarget_status, MOBLEUINT32 *pLength, MODEL_MessageHeader_t*);
MOBLE_RESULT LightModelServer_GetOpcodeTableCb(const MODEL_OpcodeTableParam_t **data,
MOBLEUINT16 *length);
-MOBLE_RESULT LightModelServer_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+MOBLE_RESULT LightModelServer_GetStatusRequestCb(MODEL_MessageHeader_t* pmsgParam,
MOBLEUINT16 opcode,
MOBLEUINT8 *pResponsedata,
MOBLEUINT32 *plength,
@@ -525,94 +528,90 @@ MOBLE_RESULT LightModelServer_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
MOBLEBOOL response);
-MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+MOBLE_RESULT LightModelServer_ProcessMessageCb(MODEL_MessageHeader_t* pmsgParam,
MOBLEUINT16 opcode,
MOBLEUINT8 const *data,
MOBLEUINT32 length,
- MOBLEBOOL response);
+ MOBLEBOOL response
+ );
void Lighting_Process(void);
MOBLE_RESULT BLEMesh_AddLightingModels(void);
-void Light_Ctl_LightActual_Binding(MOBLEUINT8 bindingFlag);
+void Light_Ctl_LightActual_Binding(MOBLEUINT8 bindingFlag,MOBLEUINT8 elementIndex);
void Light_BindingTemperatureToTemperatureRange(void);
-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_HslStatus_t* bHslHueParam);
-void Light_HslHue_RangeBinding(Light_HslParam_t* bHslHueParam);
-void Light_HslSaturation_GenericLevelBinding(Light_HslStatus_t* bHslSatParam);
-void Light_HslSaturation_RangeBinding(Light_HslParam_t* bHslSatParam);
-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 LightActual_GenericOnOffBinding(Light_LightnessStatus_t* lightActual, MOBLEUINT8 elementIndex);
+void LightActual_GenericLevelBinding(Light_LightnessStatus_t* lightActual, MOBLEUINT8 elementIndex);
+void Light_CtlTemp_GenericLevelBinding(Light_CtlStatus_t* bCtlTempParam, MOBLEUINT8 elementIndex);
+void Light_Lightness_Binding(MOBLEUINT8 bindingFlag ,MOBLEUINT32 length, MOBLEUINT8 elementindex);
+MOBLEUINT16 Light_Actual_LinearBinding(MOBLEUINT8 elementIndex);
+void Light_Lightness_Linear_Binding(MOBLEUINT8 bindingFlag ,MOBLEUINT32 length, MOBLEUINT8 elementIndex);
+MOBLEUINT16 Light_Linear_ActualBinding(MOBLEUINT32 length, MOBLEUINT8 elementIndex);
+void Light_Actual_RangeBinding(Light_LightnessParam_t* lightActual, MOBLEUINT8 elementIndex);
+void Light_CtlTemperature_Binding(MOBLEUINT8 elementIndex);
+void Light_CtlTemperature_TempRangeBinding(Light_CtlParam_t* ctlTemperature, MOBLEUINT8 elementIndex);
+void Light_HslHue_GenericLevelBinding(Light_HslStatus_t* bHslHueParam, MOBLEUINT8 elementIndex);
+void Light_HslHue_RangeBinding(Light_HslParam_t* bHslHueParam, MOBLEUINT8 elementIndex);
+void Light_HslSaturation_GenericLevelBinding(Light_HslStatus_t* bHslSatParam, MOBLEUINT8 elementIndex);
+void Light_HslSaturation_RangeBinding(Light_HslParam_t* bHslSatParam, MOBLEUINT8 elementIndex);
+void Light_HslLightness_LightnessActualBinding(MOBLEUINT8 elementIndex);
+void Light_Hsl_Hue_Binding(MOBLEUINT8 elementIndex);
+void Light_Hsl_Saturation_Binding(MOBLEUINT8 elementIndex);
+void Light_ActualLightness_HslLightnessBinding(Light_LightnessStatus_t* bActualLightParam, MOBLEUINT8 elementIndex);
+void Light_Linear_Ligth_LC_binding(MOBLEUINT16 lc_OutValue, MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_LightnessActualUpdate(MOBLEUINT16 lightActual, MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_TransitionBehaviourSingle_Param(MOBLEUINT8 *GetValue,MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_TransitionBehaviourMulti_Param(MOBLEUINT8 *GetValue , MOBLEUINT8 param_Count,MOBLEUINT8 elementIndex);
void Model_BindingPublishStatus(void);
-void Light_GetStepValue(MOBLEUINT8 stepParam);
+void Light_GetStepValue(MOBLEUINT8 stepParam, MOBLEUINT8 elementIndex);
-MOBLE_RESULT LightLightnessStateUpdate_Process(void);
-MOBLE_RESULT LightLinearStateUpdate_Process(void);
-MOBLE_RESULT LightCtlStateUpdate_Process(void);
-MOBLE_RESULT LightCtlTemperatureStateUpdate_Process(void);
-MOBLE_RESULT LightHslStateUpdate_Process(void);
-MOBLE_RESULT LightHslHueStateUpdate_Process(void);
-MOBLE_RESULT LightHslSaturationStateUpdate_Process(void);
+void Light_LightnessLinearUpdate(MOBLEUINT8 elementIndex, MOBLEUINT16 linear);
-void Light_RestoreStates(MOBLEUINT8 const *pModelState_Load, MOBLEUINT8 size);
+MOBLE_RESULT Light_LightnessStateUpdate_Process(MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_LinearStateUpdate_Process(MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_CtlStateUpdate_Process(MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_CtlTemperatureStateUpdate_Process(MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_HslStateUpdate_Process(MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_HslHueStateUpdate_Process(MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_HslSaturationStateUpdate_Process(MOBLEUINT8 elementIndex);
-void Light_LightnessDefaultTransitionValue(Light_LightnessParam_t* pLightnessValue);
-void Light_CTLDefaultTransitionValue(Light_CtlParam_t* pCTLValue);
-void Light_CTLTemperatureDefaultTransitionValue(Light_CtlParam_t* pCTLValue);
-
-MOBLE_RESULT Light_Client_Lightness_Status(MOBLEUINT8 const *pLightness_status,
- MOBLEUINT32 pLength);
-MOBLE_RESULT Light_Client_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status,
- MOBLEUINT32 pLength);
-MOBLE_RESULT Light_Client_Lightness_Last_Status(MOBLEUINT8 const *pLightnessLast_status,
- MOBLEUINT32 pLength);
-MOBLE_RESULT Light_Client_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDefault_status,
- MOBLEUINT32 pLength);
-MOBLE_RESULT Light_Client_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status,
- MOBLEUINT32 pLength);
-MOBLE_RESULT Light_Client_Ctl_Status(MOBLEUINT8 const *pLightCtl_status, MOBLEUINT32 pLength);
-MOBLE_RESULT Light_Client_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status,
- MOBLEUINT32 pLength);
-MOBLE_RESULT Light_Client_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status,
- MOBLEUINT32 pLength);
-MOBLE_RESULT Light_Client_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status,
- MOBLEUINT32 pLength);
-MOBLE_RESULT Light_Client_Hsl_Status(MOBLEUINT8 const *pHsl_status,
- MOBLEUINT32 pLength);
-MOBLE_RESULT Light_Client_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status,
- MOBLEUINT32 pLength);
-MOBLE_RESULT Light_Client_HslRange_Status(MOBLEUINT8 const *pHslRange_status,
- MOBLEUINT32 pLength);
-MOBLE_RESULT Light_Client_HslTarget_Status(MOBLEUINT8 const *pHslTarget_status,
- MOBLEUINT32 pLength);
-MOBLE_RESULT Light_Client_HslHue_Status(MOBLEUINT8 const *pHslHue_status,
- MOBLEUINT32 pLength);
-MOBLE_RESULT Light_Client_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status,
- MOBLEUINT32 pLength);
+void Light_RestoreStates(MOBLEUINT8 const *pModelState_Load, MOBLEUINT8 size);
+void Light_ModelRangeInit(void);
+
+void Light_LightnessDefaultTransitionValue(Light_LightnessParam_t* pLightnessValue, MOBLEUINT8 elementIndex);
+void Light_LightnessLinearDefaultTransitionValue(Light_LightnessParam_t* pLightnessValue, MOBLEUINT8 elementIndex);
+void Light_CTLDefaultTransitionValue(Light_CtlParam_t* pCTLValue, MOBLEUINT8 elementIndex);
+void Light_CTLTemperatureDefaultTransitionValue(Light_CtlParam_t* pCTLValue, MOBLEUINT8 elementIndex);
+void Light_HSLDefaultTransitionValue(Light_HslParam_t* pCTLValue,MOBLEUINT8 elementIndex);
+void Light_HSLHueDefaultTransitionValue(Light_HslParam_t* pHSLHueValue, MOBLEUINT8 elementIndex);
+void Light_HSLSaturationDefaultTransitionValue(Light_HslParam_t* pHSLSaturationValue, MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Light_Client_Lightness_Status(MOBLEUINT8 const *pLightness_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_Client_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status, MOBLEUINT32 pLength,MOBLEUINT16 dstPeer,MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_Client_Lightness_Last_Status(MOBLEUINT8 const *pLightnessLast_status, MOBLEUINT32 pLength,MOBLEUINT16 dstPeer,MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_Client_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDefault_status, MOBLEUINT32 pLength,MOBLEUINT16 dstPeer,MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_Client_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status, MOBLEUINT32 pLength,MOBLEUINT16 dstPeer,MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_Client_Ctl_Status(MOBLEUINT8 const *pLightCtl_status, MOBLEUINT32 pLength,MOBLEUINT16 dstPeer,MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_Client_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status, MOBLEUINT32 pLength,MOBLEUINT16 dstPeer,MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_Client_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status, MOBLEUINT32 pLength,MOBLEUINT16 dstPeer,MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_Client_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status, MOBLEUINT32 pLength,MOBLEUINT16 dstPeer,MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_Client_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 pLength,MOBLEUINT16 dstPeer,MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_Client_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status, MOBLEUINT32 pLength,MOBLEUINT16 dstPeer,MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_Client_HslRange_Status(MOBLEUINT8 const *pHslRange_status, MOBLEUINT32 pLength,MOBLEUINT16 dstPeer,MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_Client_HslTarget_Status(MOBLEUINT8 const *pHslTarget_status, MOBLEUINT32 pLength,MOBLEUINT16 dstPeer,MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_Client_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUINT32 pLength,MOBLEUINT16 dstPeer,MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_Client_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status, MOBLEUINT32 pLength,MOBLEUINT16 dstPeer,MOBLEUINT8 elementIndex);
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_LC
+MOBLE_RESULT LightLC_Client_Mode_Status(MOBLEUINT8 const *pLCMode_status, MOBLEUINT32 plength, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex);
+MOBLE_RESULT LightLC_Client_OM_Status(MOBLEUINT8 const *pLCOccupancyMode_status, MOBLEUINT32 plength, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex);
+MOBLE_RESULT LightLC_Client_OnOff_Status(MOBLEUINT8 const *pLCOnOff_status, MOBLEUINT32 plength, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex);
+MOBLE_RESULT LightLC_Client_Property_Status(MOBLEUINT8 const *pLCProperty_status, MOBLEUINT32 plength, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex);
+#endif /* #ifdef ENABLE_LIGHT_MODEL_CLIENT_LC */
void Light_Publish_Add(MOBLEUINT16 model_id, MOBLEUINT16 opcode);
void Light_Publish_Reset(void);
#endif /* __LIGHT_MODEL_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/light_client.h b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/light_client.h
index d9282d3b3..544c111dd 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/light_client.h
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/light_client.h
@@ -27,12 +27,15 @@
/* Exported macro ------------------------------------------------------------*/
+#define LIGHT_LIGHTNESS_CLIENT_MODEL_ID 0x1302
/* Variable ------------------------------------------------------------------*/
#pragma pack(1)
typedef union {
Light_LightnessParam_t sLight_LightnessParam;
MOBLEUINT8 a_Lightness_param[sizeof(Light_LightnessParam_t)];
} _Light_LightnessParam;
+
+
/******************************************************************************/
/********** Following Section defines the Opcodes for the Messages ************/
/******************************************************************************/
@@ -40,31 +43,240 @@ typedef union {
/* Exported Functions Prototypes ---------------------------------------------*/
MOBLE_RESULT LightModelClient_GetOpcodeTableCb(const MODEL_OpcodeTableParam_t **data,
- MOBLEUINT16 *length);
-
-MOBLE_RESULT LightModelClient_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
- MOBLEUINT16 opcode,
- MOBLEUINT8 *pResponsedata,
- MOBLEUINT32 *plength,
- MOBLEUINT8 const *pRxData,
- MOBLEUINT32 dataLength,
- MOBLEBOOL response);
-
-MOBLE_RESULT LightModelClient_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+ MOBLEUINT16 *length);
+
+MOBLE_RESULT LightModelClient_GetStatusRequestCb(MODEL_MessageHeader_t* pmsgParam,
MOBLEUINT16 opcode,
- MOBLEUINT8 const *pRxData,
- MOBLEUINT32 dataLength,
- MOBLEBOOL response
- );
+ MOBLEUINT8 *pResponsedata,
+ MOBLEUINT32 *plength,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 dataLength,
+ MOBLEBOOL response);
+
+MOBLE_RESULT LightModelClient_ProcessMessageCb(MODEL_MessageHeader_t* pmsgParam,
+ MOBLEUINT16 opcode,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 dataLength,
+ MOBLEBOOL response);
+
+MOBLE_RESULT LightClient_Lightness_Get(MOBLEUINT8 elementIndex);
+MOBLE_RESULT LightClient_Lightness_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightness_param,
+ MOBLEUINT32 length);
+MOBLE_RESULT LightClient_Lightness_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightness_param,
+ MOBLEUINT32 length);
+
+MOBLE_RESULT LightClient_Lightness_Linear_Get(MOBLEUINT8 elementIndex);
+MOBLE_RESULT LightClient_Lightness_Linear_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightnessLinear_param,
+ MOBLEUINT32 length);
+MOBLE_RESULT LightClient_Lightness_Linear_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightnessLinear_param,
+ MOBLEUINT32 length);
+
+MOBLE_RESULT LightClient_Lightness_Default_Get(MOBLEUINT8 elementIndex);
+MOBLE_RESULT LightClient_Lightness_Default_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightnessDefault_param,
+ MOBLEUINT32 length);
+MOBLE_RESULT LightClient_Lightness_Default_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightnessDefault_param,
+ MOBLEUINT32 length);
+
+MOBLE_RESULT LightClient_Lightness_Range_Get(MOBLEUINT8 elementIndex);
+MOBLE_RESULT LightClient_Lightness_Range_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightnessRange_param,
+ MOBLEUINT32 length);
+MOBLE_RESULT LightClient_Lightness_Range_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightnessRange_param,
+ MOBLEUINT32 length);
+
+MOBLE_RESULT LightClient_Ctl_Get(MOBLEUINT8 elementIndex);
+MOBLE_RESULT LightClient_Ctl_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightCtl_param,
+ MOBLEUINT32 length);
+MOBLE_RESULT LightClient_Ctl_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightCtl_param,
+ MOBLEUINT32 length);
+
+MOBLE_RESULT LightClient_Ctl_Temperature_Get(MOBLEUINT8 elementIndex);
+MOBLE_RESULT LightClient_Ctl_Temperature_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightCtlTemperature_param,
+ MOBLEUINT32 length);
+MOBLE_RESULT LightClient_Ctl_Temperature_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightCtlTemperature_param,
+ MOBLEUINT32 length);
+
+MOBLE_RESULT LightClient_Ctl_Temperature_Range_Get(MOBLEUINT8 elementIndex);
+MOBLE_RESULT LightClient_Ctl_Temperature_Range_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightCtlTemperatureRange_param,
+ MOBLEUINT32 length);
+MOBLE_RESULT LightClient_Ctl_Temperature_Range_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightCtlTemperatureRange_param,
+ MOBLEUINT32 length);
+
+MOBLE_RESULT LightClient_Ctl_Default_Get(MOBLEUINT8 elementIndex);
+MOBLE_RESULT LightClient_Ctl_Default_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightCtlDefault_param,
+ MOBLEUINT32 length);
+MOBLE_RESULT LightClient_Ctl_Default_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightCtlDefault_param,
+ MOBLEUINT32 length);
+
+MOBLE_RESULT LightClient_Hsl_Get(MOBLEUINT8 elementIndex) ;
+MOBLE_RESULT LightClient_Hsl_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightHsl_param,
+ MOBLEUINT32 length);
+
+MOBLE_RESULT LightClient_Hsl_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightHsl_param,
+ MOBLEUINT32 length);
+
+MOBLE_RESULT LightClient_Hsl_Default_Get(MOBLEUINT8 elementIndex);
+MOBLE_RESULT LightClient_Hsl_Default_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightHslDefault_param,
+ MOBLEUINT32 length);
+MOBLE_RESULT LightClient_Hsl_Default_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightHslDefault_param,
+ MOBLEUINT32 length);
+
+MOBLE_RESULT LightClient_Hsl_Range_Get(MOBLEUINT8 elementIndex);
+MOBLE_RESULT LightClient_Hsl_Range_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightHslRange_param,
+ MOBLEUINT32 length);
+MOBLE_RESULT LightClient_Hsl_Range_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightHslRange_param,
+ MOBLEUINT32 length);
+
+MOBLE_RESULT LightClient_Hsl_Hue_Get(MOBLEUINT8 elementIndex);
+MOBLE_RESULT LightClient_Hsl_Hue_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightHslHue_param,
+ MOBLEUINT32 length);
+MOBLE_RESULT LightClient_Hsl_Hue_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightHslHue_param,
+ MOBLEUINT32 length);
+
+MOBLE_RESULT LightClient_Hsl_Saturation_Get(MOBLEUINT8 elementIndex);
+MOBLE_RESULT LightClient_Hsl_Saturation_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightHslSaturation_param,
+ MOBLEUINT32 length);
+MOBLE_RESULT LightClient_Hsl_Saturation_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightHslSaturation_param,
+ MOBLEUINT32 length);
+
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_LC
+MOBLE_RESULT LightClient_LC_Mode_Get(MOBLEUINT8 elementIndex);
+MOBLE_RESULT LightClient_LC_Mode_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightLCMode_param,
+ MOBLEUINT32 length);
+MOBLE_RESULT LightClient_LC_Mode_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightLCMode_param,
+ MOBLEUINT32 length);
+
+MOBLE_RESULT LightClient_LC_OM_Get(MOBLEUINT8 elementIndex);
+MOBLE_RESULT LightClient_LC_OM_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightLCOccupancyMode_param,
+ MOBLEUINT32 length);
+MOBLE_RESULT LightClient_LC_OM_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightLCOccupancyMode_param,
+ MOBLEUINT32 length);
+
+MOBLE_RESULT LightClient_LC_OnOff_Get(MOBLEUINT8 elementIndex);
+MOBLE_RESULT LightClient_LC_OnOff_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightLCOnOff_param,
+ MOBLEUINT32 length);
+MOBLE_RESULT LightClient_LC_OnOff_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightLCOnOff_param,
+ MOBLEUINT32 length);
+
+MOBLE_RESULT LightClient_LC_Property_Get(MOBLEUINT8 elementIndex, MOBLEUINT8 *pPropertyID);
+MOBLE_RESULT LightClient_LC_Property_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightLCProperty_param,
+ MOBLEUINT32 length);
+MOBLE_RESULT LightClient_LC_Property_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightLCProperty_param,
+ MOBLEUINT32 length);
+#endif /* #ifdef ENABLE_LIGHT_MODEL_CLIENT_LC */
-MOBLE_RESULT LightClient_Lightness_Set_Unack(MOBLE_ADDRESS element_number,
- _Light_LightnessParam *pLightness_param,
- MOBLEUINT32 length);
-MOBLE_RESULT Light_Client_Lightness_Status(MOBLEUINT8 const *pLightness_status, MOBLEUINT32 plength);
+// Status
+MOBLE_RESULT Light_Client_Lightness_Status(MOBLEUINT8 const *pLightness_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_Client_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_Client_Lightness_Last_Status(MOBLEUINT8 const *pLightnessLast_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_Client_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDefault_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_Client_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_Client_Ctl_Status(MOBLEUINT8 const *pLightCtl_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_Client_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_Client_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_Client_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_Client_Hsl_Status(MOBLEUINT8 const *pHsl_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_Client_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_Client_HslRange_Status(MOBLEUINT8 const *pHslRange_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_Client_HslTarget_Status(MOBLEUINT8 const *pHslTarget_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_Client_HslHue_Status(MOBLEUINT8 const *pHslHue_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_Client_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT LightLC_Client_Mode_Status(MOBLEUINT8 const *pLCMode_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT LightLC_Client_OM_Status(MOBLEUINT8 const *pLCOccupancyMode_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT LightLC_Client_OnOff_Status(MOBLEUINT8 const *pLCOnOff_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT LightLC_Client_Property_Status(MOBLEUINT8 const *pLCProperty_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
#endif /* __LIGHT_CLIENT_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
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 d30b1fd6c..c65039866 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
@@ -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
@@ -22,297 +22,148 @@
#define __LIGHT_LC_H
/* Includes ------------------------------------------------------------------*/
-#include "types.h"
-#include "ble_mesh.h"
-
-
+/* Exported constants --------------------------------------------------------*/
+/* Exported variables -------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
-/******************************************************************************/
-/********** Following Section defines the Opcodes for the Messages ************/
-/******************************************************************************/
-#define LIGHT_LC_MODE_GET 0X8291
-#define LIGHT_LC_MODE_SET 0X8292
-#define LIGHT_LC_MODE_SET_UNACK 0X8293
-#define LIGHT_LC_MODE_STATUS 0X8294
-#define LIGHT_LC_OM_GET 0X8295
-#define LIGHT_LC_OM_SET 0X8296
-#define LIGHT_LC_OM_SET_UNACK 0X8297
-#define LIGHT_LC_OM_STATUS 0X8298
-#define LIGHT_LC_ON_OFF_GET 0X8299
-#define LIGHT_LC_ON_OFF_SET 0X829A
-#define LIGHT_LC_ON_OFF_SET_UNACK 0X829B
-#define LIGHT_LC_ON_OFF_STATUS 0X829C
-#define LIGHT_LC_PROPERTY_GET 0X829D
-#define LIGHT_LC_PROPERTY_SET 0X62
-#define LIGHT_LC_PROPERTY_SET_UNACK 0X63
-#define LIGHT_LC_PROPERTY_STATUS 0X64
-
-#define LIGHT_MODEL_SERVER_LC_MODEL_ID 0x130F
-#define LIGHT_MODEL_SERVER_LC_SETUP_MODEL_ID 0x1310
-#define LIGHT_MODEL_CLIENT_LC_MODEL_ID 0x1311
-
-/* Property id for the light LC model */
-#define LIGHT_CONTROL_LUX_LEVEL_ON_ID 0X002B
-#define LIGHT_CONTROL_LUX_LEVEL_PROLONG_ID 0X002C
-#define LIGHT_CONTROL_LUX_LEVEL_STANDBY_ID 0X002D
-#define LIGHT_CONTROL_LIGHTNESS_ON_ID 0X002E
-#define LIGHT_CONTROL_LIGHTNESS_PROLONG_ID 0X002F
-#define LIGHT_CONTROL_LIGHTNESS_STANDBY_ID 0X0030
-#define LIGHT_CONTROL_REGULATOR_ACCURACY_ID 0X0031
-#define LIGHT_CONTROL_REGULATOR_KID_ID 0X0032
-#define LIGHT_CONTROL_REGULATOR_KIU_ID 0X0033
-#define LIGHT_CONTROL_REGULATOR_KPD_ID 0X0034
-#define LIGHT_CONTROL_REGULATOR_KPU_ID 0X0035
-#define LIGHT_CONTROL_TIME_FADE_ID 0X0036
-#define LIGHT_CONTROL_TIME_FADE_ON_ID 0X0037
-#define LIGHT_CONTROL_TIME_FADE_STANDBY_AUTO_ID 0X0038
-#define LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL_ID 0X0039
-#define LIGHT_CONTROL_TIME_PROLONG_ID 0X003B
-#define LIGHT_CONTROL_TIME_RUN_ON_ID 0X003C
-
-/* Macros ------------------------------------------------------- */
-#define LIGHT_CONTROL_AMBIENT_LUXLEVEL_ON 0XEA60
-#define LIGHT_CONTROL_AMBIENT_LUXLEVEL_PROLONG 0XC350
-#define LIGHT_CONTROL_AMBIENT_LUXLEVEL_STANDBY 0X0000
-#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 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 0X10
-
-/* Property IDs by SIG ------------------------------------------------------- */
-#define MOTION_SENSED_PROPERTY 0X0042
-#define PEOPLE_COUNT_PROPERTY 0X004C
-#define PRESENCE_DETECTED_PROPERTY 0X004D
-
-#define TRANSITION_RES_VALUE 100
-#define LC_MODE_ENABLE 0X01
-#define LC_MODE_DISABLE 0X00
+#define LC_PROPERTY_TABLE_COUNT 18
+#define LIGHT_LC_DEFAULT_TRANSITION_RES_MS 100 /* Recommended value is 100 milliseconds */
-#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)
+/* Exported types ------------------------------------------------------------*/
typedef struct
{
- MOBLEUINT8 Light_LC_Transition_Flag;
- MOBLEUINT8 Light_LC_OptionalParam;
- MOBLEUINT8 Transition_Cmplt;
- MOBLEUINT8 LightLCUpdateFlag;
-}Light_LC_ModelFlag_t;
+ MOBLEUINT8 LC_modeState;
+}Light_LC_ModeParam_t;
-#pragma pack(1)
typedef struct
{
- MOBLEUINT16 PresentParam_1;
- MOBLEUINT16 TargetParam_1;
- MOBLEUINT8 RemainingTime;
-}Light_LC_TemporaryStatus_t;
+ MOBLEUINT8 LC_OMState;
+}Light_LC_OccupancyModeParam_t;
-/* Light control mode messages*/
-#pragma pack(1)
typedef struct
{
- MOBLEUINT8 LC_mode;
- MOBLEUINT8 LC_OM;
- MOBLEUINT8 Present_Light_OnOff;
- MOBLEUINT8 Target_Light_OnOff;
+ MOBLEUINT8 LC_OnOffState;
MOBLEUINT8 Tid;
MOBLEUINT8 Transition_Time;
- MOBLEUINT8 Remaining_Time;
- MOBLEUINT8 Delay;
-}Light_LC_Param_t;
-
-typedef struct
-{
- MOBLEUINT32 Property_Value;
-}Light_LC_Value_t;
-
-/* Property values for variable length */
-typedef struct
-{
- MOBLEUINT16 Property_ID;
- MOBLEUINT16 Property_Value_16;
-}
-Light_LC_PropertyTable16_t;
-
-typedef struct
-{
- MOBLEUINT16 Property_ID;
- float Property_Value_float;
-}
-Light_LC_PropertyTablefloat_t;
-
-typedef struct
-{
- MOBLEUINT16 Property_ID;
- MOBLEUINT8 Property_Value_8b;
-}
-Light_LC_PropertyTable8b_t;
-
-typedef struct
-{
- MOBLEUINT16 Property_ID;
- MOBLEUINT32 Property_Value_24b;
-}
-Light_LC_PropertyTable24b_t;
-
-
-/* Table for all the Property id and corresponding value */
-typedef struct {
-Light_LC_PropertyTable8b_t LC_PropertyTable8b[1];
-Light_LC_PropertyTable16_t LC_PropertyTable16b[3];
-Light_LC_PropertyTable24b_t LC_PropertyTable24b[9];
-Light_LC_PropertyTablefloat_t LC_PropertyTableFloat[4];
-}Light_Property_Table_t;
-
-typedef struct
-{
- MOBLEUINT8 Present_OnOff_State;
- MOBLEUINT16 Target_OnOff;
- MOBLEUINT8 RemainingTime;
-}Light_LC_OnOffState_t;
-
-/* Transition time variables */
-typedef struct
-{
- MOBLEINT8 StepValue ;
- MOBLEUINT8 ResBitValue;
- MOBLEUINT32 Res_Value;
- MOBLEUINT32 TotalTime;
-}Light_LC_TimeParam_t;
-
-#pragma pack(4)
-
-/* Light LC state machine states */
-typedef enum
-{
- LC_STANDBY,
- LC_FADE_ON,
- LC_RUN,
- LC_FADE,
- LC_PROLONG,
- LC_FADE_STANDBY_AUTO,
- LC_FADE_STANDBY_MANUAL
-}Lc_States_e;
-
-/* Light LC state machine states */
-typedef enum
-{
- LC_NO_EVENT,
- LC_LIGHT_ON,
- LC_OCCUPANCY_ON,
- LC_LIGHT_OFF,
- LC_OCCUPANCY_OFF,
- LC_TIMER_OFF
-}Lc_Event_e;
+ MOBLEUINT8 Delay_Time;
+}Light_LC_OnOffParam_t;
+/**
+ * LC callback structure
+ */
typedef struct
{
- Lc_States_e Lc_States;
-}Light_LC_States;
-
-
-#pragma pack(1)
-typedef struct
-{
- /* Pointer to the function Appli_LightLC_Mode_Set used for callback
- from the middle layer to Application layer
- */
- MOBLE_RESULT (*LightLC_Mode_Set_cb)(Light_LC_Param_t*, MOBLEUINT8);
-
- /* Pointer to the function Appli_LightLC_OM_Set used for callback
- from the middle layer to Application layer
- */
- MOBLE_RESULT (*LightLC_OM_Set_cb)(Light_LC_Param_t*, MOBLEUINT8);
-
- /* Pointer to the function Appli_LightLC_OnOff_Set used for callback
- from the middle layer to Application layer
- */
- MOBLE_RESULT (*LightLC_OnOff_Set_cb)(Light_LC_Param_t*, MOBLEUINT8);
-
- /* Pointer to the function Appli_LightLC_Property_Set used for callback
- from the middle layer to Application layer
- */
-
-} Appli_Light_Ctrl_cb_t;
-
-typedef struct
-{
- MOBLE_RESULT (*GetLightLC_ModeState_cb)(MOBLEUINT8*);
- MOBLE_RESULT (*GetLightLC_OMState_cb)(MOBLEUINT8*);
- MOBLE_RESULT (*GetLightLC_OnOffState_cb)(MOBLEUINT8*);
- MOBLEUINT16 (*GetLightLC_AmbientLuxLevel_cb)(void);
- MOBLEUINT16 (*GetLightLC_PIregulatorOut_cb)(MOBLEUINT16,MOBLEUINT16);
-}Appli_LightLC_GetStatus_cb_t;
-#pragma pack(4)
-
-extern const Appli_Light_Ctrl_cb_t LightLCAppli_cb;
-extern const Appli_LightLC_GetStatus_cb_t Appli_LightLC_GetStatus_cb;
-
-MOBLE_RESULT Light_LC_ModelServer_GetOpcodeTableCb(const MODEL_OpcodeTableParam_t **data,
- MOBLEUINT16 *length);
-
-MOBLE_RESULT Light_LC_ModelServer_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
- MOBLEUINT16 opcode,
- MOBLEUINT8 *pResponsedata,
- MOBLEUINT32 *plength,
- MOBLEUINT8 const *pRxData,
- MOBLEUINT32 dataLength,
- MOBLEBOOL response);
-
-MOBLE_RESULT Light_LC_ModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
- MOBLEUINT16 opcode,
- MOBLEUINT8 const *pRxData,
- MOBLEUINT32 dataLength,
- MOBLEBOOL response
- );
-
-MOBLE_RESULT Light_LC_ModeSet(MOBLEUINT8 const *lcMode_param, MOBLEUINT32 length);
-MOBLE_RESULT Light_LC_ModeStatus(MOBLEUINT8* lcMode_status, MOBLEUINT32 *plength);
-MOBLE_RESULT Light_LC_OMSet(MOBLEUINT8 const *lcOM_param, MOBLEUINT32 length);
-MOBLE_RESULT Light_LC_OMStatus(MOBLEUINT8* lcOM_status, MOBLEUINT32 *plength);
-MOBLE_RESULT Light_LC_OnOffSet(MOBLEUINT8 const *lcOnOff_param, MOBLEUINT32 length);
-MOBLE_RESULT Light_LC_OnOffStatus(MOBLEUINT8* lcOnOff_status, MOBLEUINT32 *plength);
-MOBLE_RESULT Light_LC_PropertySet(MOBLEUINT8 const *lcProp_param, MOBLEUINT32 length);
-MOBLE_RESULT Light_LC_PropertyStatus( MOBLEUINT8* lcData_param, MOBLEUINT32* plength ,
- MOBLEUINT8 const *pData, MOBLEUINT32 length);
-
-MOBLE_RESULT Light_LC_SetPropertyID_value(MOBLEUINT32 Prop_Value,
- MOBLEUINT16 prop_ID);
+ void (*LightLCs_ModeGet_cb)(MODEL_MessageHeader_t *pmsgParam);
+ void (*LightLCs_ModeSet_cb)(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+ void (*LightLCs_ModeSetUnack_cb)(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+ void (*LightLCs_ModeStatus_cb)(MOBLEUINT8 const*,
+ MOBLEUINT32,
+ uint16_t,
+ uint8_t);
+ void (*LightLCs_OmGet_cb)(MODEL_MessageHeader_t *pmsgParam);
+ void (*LightLCs_OmSet_cb)(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+ void (*LightLCs_OmSetUnack_cb)(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+ void (*LightLCs_OmStatus_cb)(MOBLEUINT8 const*,
+ MOBLEUINT32,
+ uint16_t,
+ uint8_t);
+ void (*LightLCs_OnOffGet_cb)(MODEL_MessageHeader_t *pmsgParam);
+ void (*LightLC_OnOffSet_cb)(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+ void (*LightLCs_OnOffSetUnack_cb)(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+ void (*LightLCs_OnOffStatus_cb)(MOBLEUINT8 const *,
+ MOBLEUINT32,
+ uint16_t,
+ uint8_t);
+ void (*LightLCs_PropertyGet_cb)(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+ void (*LightLCs_PropertySet_cb)(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+ void (*LightLCs_PropertySetUnack_cb)(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+ void (*LightLCs_PropertyStatus_cb)(MOBLEUINT8 const*,
+ MOBLEUINT32,
+ uint16_t,
+ uint8_t);
+} light_lc_cb_t;
+
+extern const light_lc_cb_t AppliLightLc_cb;
+
+
+/* Exported functions ------------------------------------------------------- */
+MOBLE_RESULT LightLcServer_GetOpcodeTableCb(const MODEL_OpcodeTableParam_t **data,
+ MOBLEUINT16 *length);
+MOBLE_RESULT LightLcServer_GetStatusRequestCb(MODEL_MessageHeader_t *pmsgParam,
+ MOBLEUINT16 opcode,
+ MOBLEUINT8 *pResponsedata,
+ MOBLEUINT32 *plength,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 dataLength,
+ MOBLEBOOL response);
+MOBLE_RESULT LightLcServer_ProcessMessageCb(MODEL_MessageHeader_t *pmsgParam,
+ MOBLEUINT16 opcode,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 dataLength,
+ MOBLEBOOL response);
+void Light_LC_NvmParams_Get(MOBLEUINT8 elementIndex,
+ MOBLEUINT8* lightLcNvmParamsBuff,
+ MOBLEUINT8* lcNvmParamsSize);
+void Light_LC_OnPowerUp(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 const *pModelValue_Load,
+ MOBLEUINT8 genericOnPowerUp,
+ MOBLEUINT16 lightDefault,
+ MOBLEUINT16 lightLast,
+ MOBLEUINT16 lightActualLKV);
+MOBLE_RESULT Light_LC_SetTransitionTimeZero(MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_LC_SensorPropertyUpdate(MOBLEUINT8 lcsElementIndex,
+ MOBLEUINT16 sensorPropertyId,
+ MOBLEUINT32 value);
+void Light_LC_LigtnessLinearUnsolicitedChange(MOBLEUINT8 elementIndex);
+MOBLEUINT32 Light_LC_SleepDurationMs_Get(void);
+MOBLE_RESULT Light_LC_Send(MOBLEUINT8 elementIndex);
+MOBLE_RESULT Light_LC_LcOnOffUpdate(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 onOff,
+ MOBLEUINT8 optionalParams,
+ MOBLEUINT32 delayMsOnOffMsg,
+ MOBLEUINT32 stepResMsOnOffMsg,
+ MOBLEUINT32 trTimeMsOnOffMsg);
+void Light_LC_Process(void);
+MOBLE_RESULT Light_LCs_Init(void* lcsBuff,
+ MOBLEUINT8 lcsElementIndex,
+ const light_lc_cb_t* lcs_cb,
+ MOBLEUINT16 sizeBuff);
+MOBLE_RESULT ExtractLcServerElementIndex(MOBLEUINT8* pLcsElementIndex,
+ MOBLEUINT8 noOfElements,
+ MOBLEUINT8 lcServer,
+ MOBLEUINT8 lcSetupServer,
+ MOBLEUINT8 genericOnOffServer,
+ MOBLEUINT8 genericPowerOnOffServer,
+ MOBLEUINT8 lightLightnessServer);
+
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_LC
+MOBLE_RESULT LightLC_Client_Mode_Status(MOBLEUINT8 const *pLCMode_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT LightLC_Client_OM_Status(MOBLEUINT8 const *pLCOccupancyMode_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT LightLC_Client_OnOff_Status(MOBLEUINT8 const *pLCOnOff_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT LightLC_Client_Property_Status(MOBLEUINT8 const *pLCProperty_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+#endif /* #ifdef ENABLE_LIGHT_MODEL_CLIENT_LC */
-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);
-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****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/sensors.h b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/sensors.h
index 09b1c6926..793091707 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/sensors.h
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/sensors.h
@@ -25,208 +25,277 @@
#include "types.h"
#include "ble_mesh.h"
-/* Exported macro ------------------------------------------------------------*/
+/* Exported types ------------------------------------------------------------*/
-/******************************************************************************/
-/********** Following Section defines the Opcodes for the Messages ************/
-/******************************************************************************/
-/* Sensors Property ID */
-#define TEMPERATURE_PID 0x0071
-#define PRESSURE_PID 0x2A6D
-#define HUMIDITY_PID 0x2A6F
-#define TIME_OF_FLIGHT_PID 0X2A7F
-#define MAGNETO_METER_PID 0x2AA1
-#define ACCELERO_METER_PID 0x2BA1
-#define GYROSCOPE_PID 0x2BA2
-#define VOLTAGE_PID 0x0005
-#define CURRENT_PID 0x0004
-#define POWER_FACTOR_PID 0x0072
-#define ACTIVE_POWER_PID 0x0073
-#define REACTIVE_POWER_PID 0x0074
-#define APPARENT_POWER_PID 0x0075
-#define ACTIVE_ENERGY_PID 0x0083
-#define REACTIVE_ENERGY_PID 0x0084
-#define APPARENT_ENERGY_PID 0x0085
-
-
-/* 7.1 Messages summary Page 300 */
-/* Sensor Server Model Opcode */
-#define SENSOR_DESCRIPTOR_GET 0x8230U
-#define SENSOR_DESCRIPTOR_STATUS 0X51U
-#define SENSOR_GET 0X8231U
-#define SENSOR_STATUS 0X52U
-#define SENSOR_COLUMN_GET 0X8232U
-#define SENSOR_COLUMN_STATUS 0X53U
-#define SENSOR_SERIES_GET 0X8233U
-#define SENSOR_SERIES_STATUS 0X54U
-
-/* Sensor Setup Server Model Opcode */
-#define SENSOR_CADENCE_GET 0X8234U
-#define SENSOR_CADENCE_SET 0X55U
-#define SENSOR_CADENCE_SET_UNACK 0X56U
-#define SENSOR_CADENCE_STATUS 0X57U
-#define SENSOR_SETTING_GET 0X8235U
-#define SENSOR_SETTING_STATUS_PID 0X58U
-#define SENSOR_SETTING_GET_SETTING_ID 0X8236U
-#define SENSOR_SETTING_SET 0X59U
-#define SENSOR_SETTING_SET_UNACK 0X5AU
-#define SENSOR_SETTING_STATUS_SETTING_ID 0X5BU
-
-/******************************************************************************/
-/********** Following Section defines the SIG MODEL IDs ************/
-/******************************************************************************/
-
-#define SENSOR_SERVER_MODEL_ID 0x1100U /* sensor server */
-#define SENSOR_SETUP_SERVER_MODEL_ID 0x1101U /* sensor setup server*/
-#define SENSOR_CLIENT_MODEL_ID 0x1102U /* Sensor Client */
-
-/******************************************************************************/
-/********** SIG MODEL IDs ends ************/
-/******************************************************************************/
-/***********Publsh Period For the Sensor **************************************/
-#define SENSOR_PUBLISH_PERIOD 10000
-#define SENSOR_SERIES_VALUE 4
-/*
- structure for the Property id for the sensors Present inside the firmware.
-*/
-#pragma pack(4)
+/**
+* This structure contains sensor cadence callback parameters
+*/
typedef struct
{
- MOBLEUINT16 Property_ID;
-} MODEL_Property_IDTableParam_t;
+ MOBLEUINT16 property_ID;
+ MOBLEUINT8 fastCadenceDevisor;
+ MOBLEUINT8 statusTriggerType;
+ MOBLEUINT32 triggerDeltaDown;
+ MOBLEUINT32 triggerDeltaUp;
+ MOBLEUINT8 statusMinInterval;
+ MOBLEUINT32 fastCadenceLow;
+ MOBLEUINT32 fastCadenceHigh;
+}sensor_CadenceCbParam_t;
-#pragma pack(4)
-/* Sensor Cadence Parameters */
-typedef struct
-{
- MOBLEUINT16 Property_ID;
- MOBLEUINT8 FastCadenceDevisor;
- MOBLEUINT8 StatusTriggerType;
- MOBLEUINT8 triggerDeltaDown;
- MOBLEUINT8 triggerDeltaUp;
- MOBLEUINT8 StatusMinInterval;
- MOBLEUINT16 FastCadenceLow;
- MOBLEUINT16 FastCadenceHigh;
-}Sensor_CadenceParam_t;
-
-/* Sensor Setting Parameters */
-#pragma pack(1)
+/**
+* This structure contains sensor settings callback parameters
+*/
typedef struct
{
- MOBLEUINT16 Property_ID;
- MOBLEUINT16 Sensor_Setting_ID;
- MOBLEUINT8 Sensor_Setting_Access;
- MOBLEUINT16 Sensor_Setting_Value;
-}Sensor_SettingParam_t;
-
-/* Sensor Coloumn Parameters */
-#pragma pack(1)
+ MOBLEUINT16 propertyId;
+ MOBLEUINT16 settingPropertyId;
+}sensor_SettingsCbParams_t;
+
+/**
+* This structure contains sensor setting callback parameters
+*/
typedef struct
{
- MOBLEUINT16 Property_ID;
- MOBLEUINT16 RawValueX;
- MOBLEUINT16 RawValueWidth;
- MOBLEUINT16 RawValueY;
-}Sensor_ColumnParam_t;
+ MOBLEUINT16 property_ID;
+ MOBLEUINT16 settingPropertyId;
+ MOBLEUINT32 settingRaw;
+ MOBLEUINT8 settingAccess;
+}sensor_SettingCbParams_t;
-/* Sensor Series Parameters*/
+/**
+* This structure contains sensor descriptor callback parameters
+*/
typedef struct
{
- MOBLEUINT16 Property_ID;
- MOBLEUINT16 RawValueX1;
- MOBLEUINT16 RawValueX2;
-
-}Sensor_SeriesParam_t ;
+ MOBLEUINT16 propertyId;
+ MOBLEUINT16 positiveTolerance;
+ MOBLEUINT16 negativeTolerance;
+ MOBLEUINT8 samplingFunction;
+ MOBLEUINT8 measurementPeriod;
+ MOBLEUINT8 updateInterval;
+}sensor_DescriptorCbParams_t;
+/**
+* This structure contains sensor column callback parameters
+*/
+typedef struct
+{
+ MOBLEUINT16 propertyId;
+ MOBLEUINT32 rawValueX;
+ MOBLEUINT8 data[8];
+ MOBLEUINT8 dataLength;
+}sensor_ColumnCbParams_t;
+/**
+* This structure contains sensor series callback parameters
+*/
+typedef struct
+{
+ MOBLEUINT16 propertyId;
+ MOBLEUINT32 rawValueX1;
+ MOBLEUINT32 rawValueX2;
+ MOBLEUINT8 data[379];
+ MOBLEUINT16 dataLength;
+}sensor_SeriesCbParams_t;
+/**
+* This structure contains sensor value callback parameters
+*/
typedef struct
{
- /* Pointer to the function Appli_Sensor_Cadence_Set used for callback
- from the middle layer to Application layer
- */
- MOBLE_RESULT (*Sensor_Cadence_Set_cb)(Sensor_CadenceParam_t*, MOBLEUINT16 ,MOBLEUINT32);
-
- /* Pointer to the function Appli_Sensor_Data_Status used for callback
- from the middle layer to Application layer
- */
- MOBLE_RESULT (*Sensor_Data_cb)(MOBLEUINT8*, MOBLEUINT32*, MOBLEUINT16 , MOBLEUINT32);
-
- /* Pointer to the function Appli_Sensor_Descriptor_Status used for callback
- from the middle layer to Application layer
- */
- MOBLE_RESULT (*Sensor_Descriptor_cb)(MOBLEUINT8*, MOBLEUINT32* , MOBLEUINT16 , MOBLEUINT32);
-
+ MOBLEUINT16 propertyId;
+ MOBLEUINT8 data[128];
+}sensor_ValueCbParams_t;
-
- /* Pointer to the function Appli_Sensor_Setting_Set used for callback
- from the middle layer to Application layer
- */
- // MOBLE_RESULT (*Sensor_Setting_Set_cb)(Sensor_SettingParam_t*, MOBLEUINT8,MOBLEUINT16);
- MOBLE_RESULT (*Sensor_Setting_Set_cb)(Sensor_SettingParam_t*,MOBLEUINT8,MOBLEUINT16);
-
-
-
- MOBLE_RESULT (*Sensor_Column_cb)(MOBLEUINT8*,MOBLEUINT32*,MOBLEUINT16,MOBLEUINT32);
-
- MOBLE_RESULT (*Sensor_Series_cb)(MOBLEUINT8*,MOBLEUINT32*,MOBLEUINT16,MOBLEUINT32);
-
-
-} Appli_Sensor_cb_t;
+/**
+* Enum for status trigger type
+*/
+typedef enum
+{
+ STATUS_TRIGGER_TYPE_VALUE = 0,
+ STATUS_TRIGGER_TYPE_PC
+} status_trigger_type_e;
+/**
+* Enum for status trigger delta
+*/
+typedef enum
+{
+ STATUS_TRIGGER_DELTA_DOWN = 0,
+ STATUS_TRIGGER_DELTA_UP
+} status_trigger_delta_e;
-/* function pointer for application to get the value from application to middle
- layer file
+/**
+* structure of sensor server function pointers callback
*/
-
typedef struct
{
-// MOBLE_RESULT (*GetSettingStatus_cb)(MOBLEUINT8*);
+ void (*Sensor_CadenceGet_cb)(sensor_CadenceCbParam_t* pCadenceParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+ void (*Sensor_CadenceSet_cb)(sensor_CadenceCbParam_t* pCadenceParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+ void (*Sensor_CadenceSetUnack_cb)(sensor_CadenceCbParam_t* pCadenceParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+ void (*Sensor_SettingsGet_cb)(sensor_SettingsCbParams_t* pSettingsParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+ void (*Sensor_SettingGet_cb)(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+ void (*Sensor_SettingSet_cb)(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+ void (*Sensor_SettingSetUnack_cb)(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+ void (*Sensor_DescriptorGet_cb)(MOBLEUINT8 propID,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+ void (*Sensor_Get_cb)(MOBLEUINT16 propID,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+ void (*Sensor_ColumnGet_cb)(sensor_ColumnCbParams_t* pColumnParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+ void (*Sensor_SeriesGet_cb)(sensor_SeriesCbParams_t* pSeriesParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+ MOBLE_RESULT (*Sensor_ReadDescriptor_cb)(MOBLEUINT8 sensorOffset,
+ sensor_DescriptorCbParams_t* pDescriptorParams);
+ MOBLE_RESULT (*Sensor_ReadValue_cb)(MOBLEUINT8 sensorOffset,
+ sensor_ValueCbParams_t* pValueParams);
+ MOBLE_RESULT (*Sensor_ReadColumn_cb)(MOBLEUINT8 sensorOffset,
+ MOBLEUINT8 columnOffset,
+ sensor_ColumnCbParams_t* pColumnParams);
+ MOBLE_RESULT (*Sensor_ReadSeries_cb)(MOBLEUINT8 sensorOffset,
+ sensor_SeriesCbParams_t* pSeriesParams);
+ MOBLEUINT8 (*Sensor_IsFastCadence_cb)(MOBLEUINT8 sensorOffset,
+ void* pFastCadenceLow,
+ void* pFastCadenceHigh);
+ MOBLEUINT8 (*Sensor_IsStatusTrigger_cb)(MOBLEUINT8 sensorOffset,
+ status_trigger_type_e triggerType,
+ void* pDeltaDown,
+ void* pDeltaUp);
+ void (*Sensor_Descriptor_Status_cb)(const MOBLEUINT8 *pDescriptor,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+ void (*Sensor_Cadence_Status_cb)(const MOBLEUINT8 *pCadence,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+ void (*Sensor_Settings_Status_cb)(const MOBLEUINT8 *pSettings,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+ void (*Sensor_Setting_Status_cb)(const MOBLEUINT8 *pSetting,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+ void (*Sensor_Status_cb)(const MOBLEUINT8 *pStatus,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+ void (*Sensor_Column_Status_cb)(const MOBLEUINT8 *pColumn,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+ void (*Sensor_Series_Status_cb)(const MOBLEUINT8 *pSeries,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+} sensor_server_cb_t;
- MOBLE_RESULT (*GetSetting_IDStatus_cb)(MOBLEUINT8* , MOBLEUINT16);
- // MOBLE_RESULT (*GetSetting_IDStatus_cb)(MOBLEUINT8* ,);
-}Appli_Sensor_GetStatus_cb_t;
-#pragma pack(4)
+extern const sensor_server_cb_t SensorAppli_cb;
-extern const Appli_Sensor_GetStatus_cb_t Appli_Sensor_GetStatus_cb;
-extern const Appli_Sensor_cb_t SensorAppli_cb;
-
-/* Exported Functions Prototypes ---------------------------------------------*/
+/* Exported macro ------------------------------------------------------------*/
+#define SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED 0x000
+#define SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED 0x000
+#define SENSOR_SAMPLING_FUNC_UNSPECIFIED 0x00
+#define SENSOR_SAMPLING_FUNC_INSTANTANEOUS 0x01
+#define SENSOR_SAMPLING_FUNC_ARITHMETIC_MEAN 0x02
+#define SENSOR_SAMPLING_FUNC_RMS 0x03
+#define SENSOR_SAMPLING_FUNC_MAX 0x04
+#define SENSOR_SAMPLING_FUNC_MIN 0x05
+#define SENSOR_SAMPLING_FUNC_ACCUMULATED 0x06
+#define SENSOR_SAMPLING_FUNC_COUNT 0x07
+#define SENSOR_SAMPLING_FUNC_RFU(x) x>=0x08 ?\
+ MOBLE_TRUE:MOBLE_FALSE
+#define SENSOR_MEASUREMENT_PERIOD_NA 0x00
+#define SENSOR_UPDATE_INTERVAL_NA 0x00
+#define SENSOR_SETTING_PROPERTY_ID_PROHIBITED 0x0000
+#define SENSOR_SETTING_ACCESS_READ 0x01
+#define SENSOR_SETTING_ACCESS_READ_WRITE 0x03
+#define SENSOR_SETTING_ACCESS_PROHIBITED(x) ((x == 0x02)||(x>=0x04)) ?\
+ MOBLE_TRUE:MOBLE_FALSE
+#define SENSOR_STATUS_TRIG_FORMAT_PROP_ID 0b0
+#define SENSOR_STATUS_TRIG_FORMAT_UNITLESS 0b1
+#define SENSOR_FAST_CADENCE_PERIOD_DIV(n) pow(2,n)
+#define SENSOR_FAST_CADENCE_PERIOD_DIV_PROHIBITED(x) \
+ x>=16 ? MOBLE_TRUE:MOBLE_FALSE
+#define SENSOR_STATUS_MIN_INTERVAL_PROHIBITED(x) \
+ x>=27 ? MOBLE_TRUE:MOBLE_FALSE
+#define SENSOR_CADENCE_NOT_SUPPORTED 0
+#define SENSOR_CADENCE_SUPPORTED 1
+#define SENSOR_PROPERTY_ID_LENGTH 2
+
+#define SENSOR_CLIENT_MODEL_ID 0x1102U
-void BLEMesh_SensorModelAppliCb (Appli_Sensor_cb_t* map );
+/* Exported functions ------------------------------------------------------- */
MOBLE_RESULT SensorModelServer_GetOpcodeTableCb(const MODEL_OpcodeTableParam_t **data,
MOBLEUINT16 *length);
-MOBLE_RESULT SensorModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+MOBLE_RESULT SensorModelServer_ProcessMessageCb(MODEL_MessageHeader_t *pmsgParams,
MOBLEUINT16 opcode,
- MOBLEUINT8 const *pData,
+ MOBLEUINT8 const *data,
MOBLEUINT32 length,
- MOBLEBOOL response
- );
-MOBLE_RESULT SensorModelServer_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+ MOBLEBOOL response);
+MOBLE_RESULT SensorModelServer_GetStatusRequestCb(MODEL_MessageHeader_t *pmsgParams,
MOBLEUINT16 opcode,
MOBLEUINT8 *pResponsedata,
MOBLEUINT32 *plength,
MOBLEUINT8 const *pData,
MOBLEUINT32 length,
MOBLEBOOL response);
-
-MOBLE_RESULT Sensor_Cadence_Set(const MOBLEUINT8* pCadence_param, MOBLEUINT32 length);
-MOBLE_RESULT Sensor_Data_Status(MOBLEUINT8* pSensorData_param, MOBLEUINT32* plength ,
- MOBLEUINT8 const *pData, MOBLEUINT32 length);
-MOBLE_RESULT Sensor_Descriptor_Status(MOBLEUINT8* pSensorDiscriptor_param, MOBLEUINT32* plength,MOBLEUINT8 const *pData, MOBLEUINT32 length);
-MOBLE_RESULT Sensor_Setting_Set(const MOBLEUINT8* pSetting_param, MOBLEUINT32 length);
-MOBLE_RESULT Sensor_Setting_Status_PID(MOBLEUINT8* pSetting_param, MOBLEUINT32 *plength,
- const MOBLEUINT8 *pData,MOBLEUINT32 length);
-MOBLE_RESULT Sensor_Setting_Status_SettingID(MOBLEUINT8* pSetting_param, MOBLEUINT32 *plength,
- const MOBLEUINT8 *pData,MOBLEUINT32 length);
-
-MOBLE_RESULT Check_Property_ID(const MODEL_Property_IDTableParam_t prop_ID_Table[]
- , MOBLEUINT16 prop_ID);
-MOBLE_RESULT Appli_Sensor_Column_Status(MOBLEUINT8* sensor_Column , MOBLEUINT32* pLength,MOBLEUINT16 prop_ID , MOBLEUINT32 length);
-
+MOBLE_RESULT Sensor_Send(MOBLEUINT8 sensorOffset,
+ MOBLEUINT8 elementIdx,
+ MOBLEUINT16 propertyId);
+MOBLE_RESULT Sensor_UpdateCadence(MOBLEUINT8 sensorOffset,
+ MOBLEUINT8 elementIdx,
+ MOBLEUINT16 propertyId);
+MOBLE_RESULT Sensor_UpdatePublishState(MOBLEUINT8 sensorOffset, MOBLEUINT8 state);
+MOBLEUINT32 Sensor_SleepDurationMs_Get(void);
+void Sensor_Process(void);
+MOBLE_RESULT SensorServer_Init(void* sensorBuff,
+ const sensor_server_cb_t* sensor_cb,
+ MOBLEUINT16 sizeBuff,
+ const void* sensorServerInitParams);
+MOBLE_RESULT Sensor_ModelPublishSet(model_publicationparams_t* pPublishParams);
#endif /* __SENSORS_H */
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/sensors_client.h b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/sensors_client.h
new file mode 100644
index 000000000..3af1d0ffa
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/sensors_client.h
@@ -0,0 +1,113 @@
+/**
+******************************************************************************
+* @file sensors_client.h
+* @author BLE Mesh Team
+* @brief Header file for the user application file
+******************************************************************************
+* @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 __SENSORS_CLIENT_H
+#define __SENSORS_CLIENT_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "ble_mesh.h"
+
+
+/* Exported macro ------------------------------------------------------------*/
+/* Variable-------------------------------------------------------------------*/
+#pragma pack(1)
+typedef union
+{
+ sensor_CadenceCbParam_t sSensor_CadenceParam;
+ MOBLEUINT8 a_Cadence_param[sizeof(sensor_CadenceCbParam_t)];
+} _Sensor_CadenceParam;
+
+typedef union
+{
+ sensor_SettingCbParams_t sSensor_SettingParam;
+ MOBLEUINT8 a_Setting_param[sizeof(sensor_SettingCbParams_t)];
+} _Sensor_SettingParam;
+
+
+extern const sensor_server_cb_t SensorAppli_cb;
+
+/******************************************************************************/
+/********** Following Section defines the Opcodes for the Messages ************/
+/******************************************************************************/
+
+
+/* Exported Functions Prototypes ---------------------------------------------*/
+MOBLE_RESULT SensorsModelClient_GetOpcodeTableCb(const MODEL_OpcodeTableParam_t **data,
+ MOBLEUINT16 *length);
+
+MOBLE_RESULT SensorsModelClient_GetStatusRequestCb(MODEL_MessageHeader_t *pmsgParam,
+ MOBLEUINT16 opcode,
+ MOBLEUINT8 *pResponsedata,
+ MOBLEUINT32 *plength,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 dataLength,
+ MOBLEBOOL response);
+
+MOBLE_RESULT SensorsModelClient_ProcessMessageCb(MODEL_MessageHeader_t *pmsgParam,
+ MOBLEUINT16 opcode,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 dataLength,
+ MOBLEBOOL response);
+
+MOBLE_RESULT SensorsClient_Descriptor_Get(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 * ppropertyId);
+
+MOBLE_RESULT SensorsClient_Cadence_Get(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 * ppropertyId);
+
+MOBLE_RESULT SensorsClient_Cadence_Set(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pCadence_param,
+ MOBLEUINT32 length);
+
+MOBLE_RESULT SensorsClient_Cadence_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pCadence_param,
+ MOBLEUINT32 length);
+
+MOBLE_RESULT SensorsClient_Settings_Get(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 * ppropertyId);
+
+MOBLE_RESULT SensorsClient_Setting_Get(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 * pparam,
+ MOBLEUINT8 length);
+
+MOBLE_RESULT SensorsClient_Setting_Set(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pSetting_param,
+ MOBLEUINT32 length);
+
+MOBLE_RESULT SensorsClient_Setting_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pSetting_param,
+ MOBLEUINT32 length);
+
+MOBLE_RESULT SensorsClient_Get(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 * ppropertyId);
+
+MOBLE_RESULT SensorsClient_Column_Get(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 * pparam,
+ MOBLEUINT8 length);
+
+MOBLE_RESULT SensorsClient_Series_Get(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 * pparam,
+ MOBLEUINT8 length);
+
+#endif /* __SENSORS_CLIENT */
+
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
+
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/time_scene.h b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/time_scene.h
index ed97f87ba..8a95e52d5 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/time_scene.h
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/time_scene.h
@@ -86,5 +86,5 @@ MOBLE_RESULT Time_SceneModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
#endif /* __TIME_SCENE_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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 826011728..231ac8676 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/vendor.h
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc/vendor.h
@@ -99,7 +99,7 @@
#define PRESS_SENSOR 0X2U
#define ACCEL_SENSOR 0X3U
/******************************************************************************/
-#define VENDOR_DATA_BYTE 50
+#define VENDOR_DATA_BUFFER_SIZE 140
#define R_ASCI_CODE 0X52
#define DEFAULT_DELAY_PACKET_FROM 500U
@@ -111,10 +111,6 @@
#define BOUNCE_THRESHOLD 20U
#define LONG_PRESS_THRESHOLD 1000U
-#define FIRST_ELEMENT 1
-#define SECOND_ELEMENT 2
-#define THIRD_ELEMENT 3
-
/* Exported variables ------------------------------------------------------- */
/** \brief Callback map */
#pragma pack(1)
@@ -127,20 +123,19 @@ typedef struct
void (*GetTestCount)(MOBLEUINT8*);
MOBLE_RESULT (*DataControlCommand_cb)(MOBLEUINT8 const *, MOBLEUINT32);
} Appli_Vendor_cb_t;
-#pragma pack(4)
extern const Appli_Vendor_cb_t VendorAppli_cb;
/* Exported Functions Prototypes ---------------------------------------------*/
-MOBLE_RESULT Vendor_WriteLocalDataCb(MOBLE_ADDRESS peer_addr, MOBLE_ADDRESS dst_peer,
+MOBLE_RESULT Vendor_WriteLocalDataCb(MODEL_MessageHeader_t *pmsgParams,
MOBLEUINT8 command, MOBLEUINT8 const *data,
MOBLEUINT32 length, MOBLEBOOL response);
-MOBLE_RESULT Vendor_ReadLocalDataCb(MOBLE_ADDRESS peer_addr, MOBLE_ADDRESS dst_peer,
+MOBLE_RESULT Vendor_ReadLocalDataCb(MODEL_MessageHeader_t *pmsgParams,
MOBLEUINT8 command, MOBLEUINT8 const *data,
MOBLEUINT32 length, MOBLEBOOL response);
-MOBLE_RESULT Vendor_OnResponseDataCb(MOBLE_ADDRESS peer_addr, MOBLE_ADDRESS dst_peer,
+MOBLE_RESULT Vendor_OnResponseDataCb(MODEL_MessageHeader_t *pmsgParams,
MOBLEUINT8 command, MOBLEUINT8 const *pRxData,
MOBLEUINT32 dataLength, MOBLEBOOL response);
@@ -148,12 +143,11 @@ void Vendor_Process(void);
void Vendor_Publish(MOBLE_ADDRESS srcAddress);
void Vendor_TestRemoteData(MOBLE_ADDRESS src,MOBLE_ADDRESS dst,MOBLEUINT8 elementIndex);
void Vendor_TestCounterInc(MOBLE_ADDRESS src ,MOBLE_ADDRESS dst ,MOBLEUINT8 elementIndex);
-
+void Vendor_SendDataFreq(MOBLEUINT8 freq);
MOBLE_RESULT VendorModel_PID1_GetOpcodeTableCb(const MODEL_OpcodeTableParam_t **data,
MOBLEUINT16 *length);
-MOBLE_RESULT VendorModel_PID1_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+MOBLE_RESULT VendorModel_PID1_GetStatusRequestCb(MODEL_MessageHeader_t *pmsgParams,
MOBLEUINT16 opcode,
MOBLEUINT8 *pResponsedata,
MOBLEUINT32 *plength,
@@ -162,8 +156,7 @@ MOBLE_RESULT VendorModel_PID1_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
MOBLEBOOL response);
-MOBLE_RESULT VendorModel_PID1_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+MOBLE_RESULT VendorModel_PID1_ProcessMessageCb(MODEL_MessageHeader_t *pmsgParams,
MOBLEUINT16 opcode,
MOBLEUINT8 const *pRxData,
MOBLEUINT32 dataLength,
@@ -172,4 +165,4 @@ MOBLE_RESULT VendorModel_PID1_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
#endif /* __VENDOR_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
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 919f7f9d2..85fc23bdd 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/common.c
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/common.c
@@ -42,18 +42,19 @@ MOBLEUINT8 TimeDelay(MOBLEUINT16 waitPeriod);
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
-
#ifdef ENABLE_SAVE_MODEL_STATE_NVM
extern const APPLI_SAVE_MODEL_STATE_CB SaveModelState_cb;
+extern const APPLI_SAVE_MODEL_TEST_STATE_CB SaveModelTestState_cb;
+extern const APPLI_RETRIEVE_MODEL_TEST_STATE_CB RetrieveModelTestState_cb;
#endif
+extern Light_ModelFlag_t Light_ModelFlag[APPLICATION_NUMBER_OF_ELEMENTS];
extern MOBLEUINT8 NumberOfElements;
MOBLEUINT8 PowerOnOff_flag = FLAG_RESET;
-MOBLEUINT8 RestoreFlag;
-MOBLE_ADDRESS Peer_Addrs;
-MOBLE_ADDRESS Dst_Addrs;
-MOBLEUINT8 Tid_Value = 0;
-MOBLEUINT8 TidSend = 0;
-MOBLE_ADDRESS Dst_Peer;
+MOBLEUINT8 RestoreFlag[APPLICATION_NUMBER_OF_ELEMENTS];
+
+Model_Tid_t Model_Tid;
+/*Variables used for the publishing of binded data */
+Model_Binding_Var_t Model_Binding_Var;
/**
* @brief Chk_ParamValidity: This function is to check validity of Parameters
@@ -86,9 +87,12 @@ MOBLE_ADDRESS Dst_Peer;
* @param max_param_range3: Max Value of parameter 3
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Chk_MultiParamValidity(MOBLEUINT16 min_param_range1, MOBLEUINT16 max_param_range1,
- MOBLEUINT16 min_param_range2, MOBLEUINT16 max_param_range2,
- MOBLEINT16 min_param_range3, MOBLEUINT16 max_param_range3,
+MOBLE_RESULT Chk_MultiParamValidity(MOBLEUINT16 min_param_range1,
+ MOBLEUINT16 max_param_range1,
+ MOBLEUINT16 min_param_range2,
+ MOBLEUINT16 max_param_range2,
+ MOBLEINT16 min_param_range3,
+ MOBLEUINT16 max_param_range3,
const MOBLEUINT8* param)
{
MOBLEUINT16 param_value1;
@@ -108,10 +112,12 @@ MOBLE_RESULT Chk_MultiParamValidity(MOBLEUINT16 min_param_range1, MOBLEUINT16 m
{
return MOBLE_RESULT_INVALIDARG;
}
+
if((param_value2 < min_param_range2) || (param_value2 > max_param_range2))
{
return MOBLE_RESULT_INVALIDARG;
}
+
if((param_value3 < min_param_range3) || (param_value3 > max_param_range3))
{
return MOBLE_RESULT_INVALIDARG;
@@ -133,9 +139,12 @@ MOBLE_RESULT Chk_MultiParamValidity(MOBLEUINT16 min_param_range1, MOBLEUINT16 m
* @param max_param_range3: Max Value of parameter 3
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Chk_MultiParamValidityAllUnsigned(MOBLEUINT16 min_param_range1, MOBLEUINT16 max_param_range1,
- MOBLEUINT16 min_param_range2, MOBLEUINT16 max_param_range2,
- MOBLEINT16 min_param_range3, MOBLEUINT16 max_param_range3,
+MOBLE_RESULT Chk_MultiParamValidityAllUnsigned(MOBLEUINT16 min_param_range1,
+ MOBLEUINT16 max_param_range1,
+ MOBLEUINT16 min_param_range2,
+ MOBLEUINT16 max_param_range2,
+ MOBLEINT16 min_param_range3,
+ MOBLEUINT16 max_param_range3,
const MOBLEUINT8* param)
{
MOBLEUINT16 param_value1;
@@ -155,10 +164,12 @@ MOBLE_RESULT Chk_MultiParamValidityAllUnsigned(MOBLEUINT16 min_param_range1, MO
{
return MOBLE_RESULT_INVALIDARG;
}
+
if((param_value2 < min_param_range2) || (param_value2 > max_param_range2))
{
return MOBLE_RESULT_INVALIDARG;
}
+
if((param_value3 < min_param_range3) || (param_value3 > max_param_range3))
{
return MOBLE_RESULT_INVALIDARG;
@@ -178,8 +189,10 @@ MOBLE_RESULT Chk_MultiParamValidityAllUnsigned(MOBLEUINT16 min_param_range1, MO
* @param max_param_range2: Max Value of parameter 2
* @retval MOBLE_RESULT
*/
- MOBLE_RESULT Chk_TwoParamValidity(MOBLEUINT16 min_param_range1, MOBLEUINT16 max_param_range1,
- MOBLEUINT16 min_param_range2, MOBLEUINT16 max_param_range2,
+MOBLE_RESULT Chk_TwoParamValidity(MOBLEUINT16 min_param_range1,
+ MOBLEUINT16 max_param_range1,
+ MOBLEUINT16 min_param_range2,
+ MOBLEUINT16 max_param_range2,
const MOBLEUINT8* param)
{
MOBLEUINT16 param_value1;
@@ -195,6 +208,7 @@ MOBLE_RESULT Chk_MultiParamValidityAllUnsigned(MOBLEUINT16 min_param_range1, MO
{
return MOBLE_RESULT_INVALIDARG;
}
+
if((param_value2 < min_param_range2) || (param_value2 > max_param_range2))
{
return MOBLE_RESULT_INVALIDARG;
@@ -211,7 +225,8 @@ MOBLE_RESULT Chk_MultiParamValidityAllUnsigned(MOBLEUINT16 min_param_range1, MO
* @param min_param_value: Min Parameter Value
* @retval MOBLE_RESULT
*/
- MOBLE_RESULT Chk_RangeValidity(MOBLEUINT16 min_param_value, const MOBLEUINT8* param,
+MOBLE_RESULT Chk_RangeValidity(MOBLEUINT16 min_param_value,
+ const MOBLEUINT8* param,
MOBLEUINT16 max_param_value )
{
MOBLEUINT16 minRange;
@@ -227,6 +242,7 @@ MOBLE_RESULT Chk_MultiParamValidityAllUnsigned(MOBLEUINT16 min_param_range1, MO
{
return MOBLE_RESULT_INVALIDARG;
}
+
if((maxRange > max_param_value) || (maxRange < minRange))
{
return MOBLE_RESULT_INVALIDARG;
@@ -235,6 +251,7 @@ 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
@@ -242,8 +259,10 @@ MOBLE_RESULT Chk_MultiParamValidityAllUnsigned(MOBLEUINT16 min_param_range1, MO
* @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,
+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;
@@ -264,14 +283,17 @@ MOBLE_RESULT Chk_MultiParamValidityAllUnsigned(MOBLEUINT16 min_param_range1, MO
{
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;
@@ -289,8 +311,10 @@ MOBLE_RESULT Chk_MultiParamValidityAllUnsigned(MOBLEUINT16 min_param_range1, MO
* @param max_param_value: Max Parameter Value
* @retval MOBLE_RESULT
*/
- MOBLE_RESULT Chk_OptionalParamValidity(MOBLEUINT8 param_length, MOBLEUINT8 mandatory_length,
- MOBLEUINT8 param, MOBLEUINT8 max_param_value )
+MOBLE_RESULT Chk_OptionalParamValidity(MOBLEUINT8 param_length,
+ MOBLEUINT8 mandatory_length,
+ MOBLEUINT8 param,
+ MOBLEUINT8 max_param_value )
{
if ((param_length > mandatory_length) && (param > max_param_value))
{
@@ -302,6 +326,7 @@ MOBLE_RESULT Chk_MultiParamValidityAllUnsigned(MOBLEUINT16 min_param_range1, MO
}
}
+
/**
* @brief Chk_ParamMinMaxIntValidity: This function is to check validity of optional Parameters
* @param param: Parameter
@@ -309,7 +334,8 @@ MOBLE_RESULT Chk_MultiParamValidityAllUnsigned(MOBLEUINT16 min_param_range1, MO
* @param min_param_value: signed Min Parameter Value
* @retval MOBLE_RESULT
*/
- MOBLE_RESULT Chk_ParamMinMaxIntValidity(MOBLEINT16 min_param_value, const MOBLEUINT8* param,
+MOBLE_RESULT Chk_ParamMinMaxIntValidity(MOBLEINT16 min_param_value,
+ const MOBLEUINT8* param,
MOBLEINT16 max_param_value )
{
MOBLEINT16 param_State1;
@@ -327,6 +353,7 @@ MOBLE_RESULT Chk_MultiParamValidityAllUnsigned(MOBLEUINT16 min_param_range1, MO
}
}
+
/**
* @brief Chk_ParamMinMaxValidity: This function is to check validity of optional Parameters
* @param param: Parameter
@@ -334,14 +361,15 @@ MOBLE_RESULT Chk_MultiParamValidityAllUnsigned(MOBLEUINT16 min_param_range1, MO
* @param min_param_value: unsigned Min Parameter Value
* @retval MOBLE_RESULT
*/
- MOBLE_RESULT Chk_ParamMinMaxValidity(MOBLEUINT16 min_param_value, const MOBLEUINT8* param,
+MOBLE_RESULT Chk_ParamMinMaxValidity(MOBLEUINT16 min_param_value,
+ const MOBLEUINT8* param,
MOBLEUINT16 max_param_value )
{
MOBLEUINT16 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;
@@ -353,9 +381,58 @@ MOBLE_RESULT Chk_MultiParamValidityAllUnsigned(MOBLEUINT16 min_param_range1, MO
}
- /*
- @brief Get_StepResolutionValue
- To get the default transition step resolution value
+/**
+ * @brief Get remaining time in format as defined for Generic Default Transition Time
+ * If remaining time > max possible value (620 min), DTTF is 0xFE
+ * @param Remaining time in milliseconds
+ * @param Reference to time in Default Transition Time Format
+ * @retval Success if remaining time < max possible value else Fail
+ */
+MOBLE_RESULT TimeDttFGet(MOBLEUINT32 timeMs, MOBLEUINT8* timeDttF)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 stepRes = 0;
+ MOBLEUINT8 noOfSteps = 0;
+
+ if (timeMs <= 6200) /* Max possible with resolution of 100ms */
+ {
+ stepRes = 0x00;
+ noOfSteps = (timeMs+50)/100;
+ }
+ else if (timeMs <= 62000) /* Max possible with resolution of 1s */
+ {
+ stepRes = 0x01;
+ noOfSteps = (timeMs+500)/1000;
+ }
+ else if (timeMs <= 620000) /* Max possible with resolution of 10s */
+ {
+ stepRes = 0x02;
+ noOfSteps = (timeMs+5000)/10000;
+ }
+ else if (timeMs <= 37200000)/* Max possible with resolution of 10m */
+ {
+ stepRes = 0x03;
+ noOfSteps = (timeMs+300000)/600000;
+ }
+ else
+ {
+ /* Remaining time > max possible
+ This may happen in case delay is added to max possible transition time */
+ stepRes = 0x03;
+ noOfSteps = 0x3E; /* set maximum possible value */
+ result = MOBLE_RESULT_FALSE;
+ }
+
+ *timeDttF = noOfSteps | (stepRes << 6);
+
+ /* TRACE_M(TF_COMMON, "Raw time %dms, Default transition format time %x\r\n", timeMs, *timeDttF); */
+
+ return result;
+}
+
+
+/**
+* @brief Get actual value in milliseconds from default transition step resolution
* @param time_param: intger value received for transition time
* @retval stepResolution
*/
@@ -365,24 +442,25 @@ MOBLEUINT32 Get_StepResolutionValue(MOBLEUINT8 time_param)
if(time_param == STEP_HEX_VALUE_0)
{
- stepResolution = STEP_RESOLUTION_0;
+ stepResolution = STEP_RESOLUTION_100MS;
}
else if(time_param == STEP_HEX_VALUE_1)
{
- stepResolution = STEP_RESOLUTION_1;
+ stepResolution = STEP_RESOLUTION_1S;
}
else if(time_param == STEP_HEX_VALUE_2)
{
- stepResolution = STEP_RESOLUTION_2;
+ stepResolution = STEP_RESOLUTION_10S;
}
else if(time_param == STEP_HEX_VALUE_3)
{
- stepResolution = STEP_RESOLUTION_3;
+ stepResolution = STEP_RESOLUTION_10M;
}
else
{
- /* stepResolution = STEP_RESOLUTION_0; */
+ stepResolution = 0;
}
+
return stepResolution;
}
@@ -485,6 +563,7 @@ MOBLEUINT16 PwmValueMapping(MOBLEUINT16 setValue , MOBLEUINT16 maxRange , MOBLEI
float Ratio_CalculateValue(MOBLEUINT16 setValue , MOBLEUINT16 maxRange , MOBLEINT16 minRange)
{
float Ratio;
+
if(minRange == 0)
{
Ratio = (float)(setValue)/(maxRange - minRange);
@@ -495,8 +574,8 @@ float Ratio_CalculateValue(MOBLEUINT16 setValue , MOBLEUINT16 maxRange , MOBLEIN
}
return Ratio;
+}
- }
/**
* @brief PWM_CoolValue: This function is used to calculate the value for the
@@ -535,6 +614,7 @@ MOBLEUINT16 PWM_WarmValue(float colourValue ,float brightValue)
return duty;
}
+
/**
* @brief TraceHeader: This function is used print the timestamp , function name
* depends on the flag.
@@ -550,6 +630,12 @@ void TraceHeader(const char* func_name, int mode)
printf("%ld %s - <<<ERROR>>>", Clock_Time(), func_name);
}
+
+/**
+ * @brief
+ * @param
+ * @retval
+*/
void MemoryDumpHex(const MOBLEUINT8* memory_addr, int size)
{
int row_index;
@@ -569,53 +655,209 @@ void MemoryDumpHex(const MOBLEUINT8* memory_addr, int size)
}
}
+
#ifdef ENABLE_SAVE_MODEL_STATE_NVM
/**
* @brief Prepare and save buffer of Generic and Light models state in NVM
* @param void
* @retval MOBLE_RESULT_SUCCESS on success
*/
-MOBLE_RESULT SaveModelsStateNvm(MOBLEUINT8 flag)
+MOBLE_RESULT SaveModelsStateNvm(MOBLEUINT8* flag)
{
MOBLE_RESULT result = MOBLE_RESULT_FAIL;
- MOBLEUINT8 Model_GetBuff[APP_NVM_MODEL_SIZE];/* 16 bytes for generic model and 16 bytes for light model */
+ MOBLEUINT16 saveBuffSize = APP_NVM_MODEL_SIZE;
+ MOBLEUINT8 Model_GetBuff[APP_NVM_MODEL_SIZE];
+// uint16_t my_Address;
+// MOBLEUINT16 dstPeer;
+ MOBLEUINT16 elementParamOffset;
+// MOBLEUINT16 PresentLightness;
+// MOBLEUINT16 TargetLightness;
+// MODEL_MessageHeader_t msgParam;
- memset(Model_GetBuff, 0x00, APP_NVM_MODEL_SIZE);
-
- Model_GetBuff[GENERIC_VALID_FLAG_OFFSET] = flag;
+// my_Address = BLEMesh_GetAddress(); /* Get the Primary address */
+ memset(Model_GetBuff, 0x00, saveBuffSize); /* Initialize the buffer to 0 */
+ for(uint8_t elementIndex = 0; elementIndex < APPLICATION_NUMBER_OF_ELEMENTS; elementIndex++)
+ {
+// dstPeer = my_Address+elementIndex;
+ elementParamOffset = elementIndex * APP_NVM_MODELDATA_PER_ELEMENT_SIZE;
+
+ Model_GetBuff[elementParamOffset+GENERIC_VALID_FLAG_OFFSET] = flag[elementIndex];
+
#ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF
- (Appli_GenericState_cb.GetOnOffStatus_cb)(&Model_GetBuff[GENERIC_ON_OFF_NVM_OFFSET]);
+ (Appli_GenericState_cb.GetOnOffStatus_cb)(&Model_GetBuff[elementParamOffset+GENERIC_ON_OFF_NVM_OFFSET],
+// dstPeer,
+ BLEMesh_GetAddress() + elementIndex,
+ elementIndex);
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_LEVEL
- (Appli_GenericState_cb.GetLevelStatus_cb)(&Model_GetBuff[GENERIC_LEVEL_NVM_OFFSET]);
+ (Appli_GenericState_cb.GetLevelStatus_cb)(&Model_GetBuff[elementParamOffset+GENERIC_LEVEL_NVM_OFFSET],
+// dstPeer,
+ BLEMesh_GetAddress() + elementIndex,
+ elementIndex);
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF
- (Appli_GenericState_cb.GetPowerOnOffStatus_cb)(&Model_GetBuff[GENERIC_POWER_ON_OFF_NVM_OFFSET]);
+ (Appli_GenericState_cb.GetPowerOnOffStatus_cb)(&Model_GetBuff[elementParamOffset+GENERIC_POWER_ON_OFF_NVM_OFFSET],
+// dstPeer,
+ BLEMesh_GetAddress() + elementIndex,
+ elementIndex);
#endif
+
#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]);
+
+ if(Light_ModelFlag[elementIndex].LightTransitionFlag)
+ {
+ MODEL_MessageHeader_t msgParam;
+ MOBLEUINT32 dataLength;
+// MOBLEUINT16 PresentLightness;
+// MOBLEUINT16 TargetLightness;
+ uint16_t my_Address = BLEMesh_GetAddress(); /* Get the Primary address */;
+
+ /* Initialize the messageParam*/
+ msgParam.dst_peer = my_Address+elementIndex;
+ msgParam.peer_addr = my_Address;
+ msgParam.elementIndex = elementIndex;
+ msgParam.rcvdAppKeyOffset = 0;
+ msgParam.rcvdNetKeyOffset = 0;
+ msgParam.rssi = 0;
+ msgParam.ttl = 0;
+
+ Light_Lightness_Status(&Model_GetBuff[elementParamOffset+GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_PRESENT_NVM_OFFSET],
+ &dataLength, &msgParam);
+// PresentLightness = CopyU8LittleEndienArrayToU16word((MOBLEUINT8*)(&Model_GetBuff[elementParamOffset+GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_PRESENT_NVM_OFFSET]));
+// TargetLightness = CopyU8LittleEndienArrayToU16word((MOBLEUINT8*)(&Model_GetBuff[elementParamOffset+GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_TARGET_NVM_OFFSET]));
+ TRACE_M(TF_COMMON,"PresentLightness = 0x%.2x, TrgtLightness = 0x%.2x \r\n",
+ CopyU8LittleEndienArrayToU16word((MOBLEUINT8*)(&Model_GetBuff[elementParamOffset+GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_PRESENT_NVM_OFFSET])),
+ CopyU8LittleEndienArrayToU16word((MOBLEUINT8*)(&Model_GetBuff[elementParamOffset+GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_TARGET_NVM_OFFSET])));
+ }
+
+ else
+ {
+// MOBLEUINT16 PresentLightness;
+
+ (Appli_Light_GetStatus_cb.GetLightLightness_cb)(&Model_GetBuff[elementParamOffset+GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_PRESENT_NVM_OFFSET],
+// dstPeer,
+ BLEMesh_GetAddress() + elementIndex,
+ elementIndex);
+// PresentLightness = CopyU8LittleEndienArrayToU16word((MOBLEUINT8*)(&Model_GetBuff[elementParamOffset+GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_PRESENT_NVM_OFFSET]));
+ TRACE_M(TF_COMMON,"PresentLightness = 0x%.2x \r\n",
+ CopyU8LittleEndienArrayToU16word((MOBLEUINT8*)(&Model_GetBuff[elementParamOffset+GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_PRESENT_NVM_OFFSET])));
+ }
+
+
+
+ (Appli_Light_GetStatus_cb.GetLightLightnessDefault_cb)(&Model_GetBuff[elementParamOffset+GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_DEFAULT_NVM_OFFSET],
+// dstPeer,
+ BLEMesh_GetAddress() + elementIndex,
+ elementIndex);
+
+ (Appli_Light_GetStatus_cb.GetLightLightnessLast_cb)(&Model_GetBuff[elementParamOffset+GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_LAST_NVM_OFFSET],
+// dstPeer,
+ BLEMesh_GetAddress() + elementIndex,
+ elementIndex);
+
+ /*3.1.4 : If a transition was in progress when powered down, the element restores the
+ target state when powered up. Otherwise the element restores the state it was in when
+ powered down. Saving the Transition Flag Status*/
+ Model_GetBuff[elementParamOffset+GENERIC_DATA_LIMIT+LIGHT_TRANSITION_STATUS] = Light_ModelFlag[elementIndex].LightTransitionFlag;
+ TRACE_M(TF_COMMON,"Transition Flag is = %.2x \r\n", Model_GetBuff[elementParamOffset+GENERIC_DATA_LIMIT+LIGHT_TRANSITION_STATUS]);
#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.GetLightCtlDefault_cb)(&Model_GetBuff[GENERIC_DATA_LIMIT+LIGHT_CTL_DEFAULT_NVM_OFFSET]);
+
+ /* Check if the transition is in process - Save the target value to Restore from the Target value */
+ if(Light_ModelFlag[elementIndex].LightTransitionFlag)
+ {
+ MOBLEUINT16 dstPeer = BLEMesh_GetAddress() + elementIndex;
+
+ /* Getting Target paramters to save in NVM for the PowerUp state handing */
+ (Appli_Light_GetStatus_cb.GetLightCtlTrgt_cb)(&Model_GetBuff[elementParamOffset+GENERIC_DATA_LIMIT+LIGHT_CTL_NVM_OFFSET],
+ dstPeer,
+ elementIndex);
+ (Appli_Light_GetStatus_cb.GetLightCtlDefault_cb)(&Model_GetBuff[elementParamOffset+GENERIC_DATA_LIMIT+LIGHT_CTL_DEFAULT_NVM_OFFSET],
+ dstPeer,
+ elementIndex);
+ }
+ else
+ {
+ MOBLEUINT16 dstPeer = BLEMesh_GetAddress() + elementIndex;
+
+ /* Getting set paramters to save in NVM for the PowerUp state handing */
+ (Appli_Light_GetStatus_cb.GetLightCtl_cb)(&Model_GetBuff[elementParamOffset+GENERIC_DATA_LIMIT+LIGHT_CTL_NVM_OFFSET],
+ dstPeer,
+ elementIndex);
+ (Appli_Light_GetStatus_cb.GetLightCtlDefault_cb)(&Model_GetBuff[elementParamOffset+GENERIC_DATA_LIMIT+LIGHT_CTL_DEFAULT_NVM_OFFSET],
+ dstPeer,
+ elementIndex);
+ }
+
#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]);
+
+ /* Check if the transition is in process - Save the target value to Restore from the Target value */
+ if(Light_ModelFlag[elementIndex].LightTransitionFlag)
+ {
+ MOBLEUINT16 dstPeer = BLEMesh_GetAddress() + elementIndex;
+
+ /* Getting Target paramters to save in NVM for the PowerUp state handing */
+ (Appli_Light_GetStatus_cb.GetLightHslTrgt_cb)(&Model_GetBuff[elementParamOffset+GENERIC_DATA_LIMIT+LIGHT_HSL_NVM_OFFSET],
+ dstPeer,
+ elementIndex);
+
+ (Appli_Light_GetStatus_cb.GetLightHslDefault_cb)(&Model_GetBuff[elementParamOffset+GENERIC_DATA_LIMIT+LIGHT_HSL_DEFAULT_NVM_OFFSET],
+ dstPeer,
+ elementIndex);
+ }
+ else
+ {
+ MOBLEUINT16 dstPeer = BLEMesh_GetAddress() + elementIndex;
+
+ /* Getting set paramters to save in NVM for the PowerUp state handing */
+ (Appli_Light_GetStatus_cb.GetLightHsl_cb)(&Model_GetBuff[elementParamOffset+GENERIC_DATA_LIMIT+LIGHT_HSL_NVM_OFFSET],
+ dstPeer,
+ elementIndex);
+
+ (Appli_Light_GetStatus_cb.GetLightHslDefault_cb)(&Model_GetBuff[elementParamOffset+GENERIC_DATA_LIMIT+LIGHT_HSL_DEFAULT_NVM_OFFSET],
+ dstPeer,
+ elementIndex);
+ }
#endif
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+
+ MOBLEUINT8 lightLcNvmParamsBuff[APP_NVM_LIGHT_LC_MODEL_SIZE];
+ MOBLEUINT8 lcNvmParamsSize;
+
+ /* only for element index for which LC is supported */
+// if((ENABLE_LIGHT_MODEL_SERVER_LC & (1 << elementIndex)) == (1 << elementIndex))
+ {
+ Light_LC_NvmParams_Get(elementIndex, lightLcNvmParamsBuff, &lcNvmParamsSize);
+
+ if (lcNvmParamsSize <= APP_NVM_LIGHT_LC_MODEL_SIZE)
+ {
+ memcpy(&Model_GetBuff[elementParamOffset+LIGHT_LC_MODE_NVM_OFFSET],
+ lightLcNvmParamsBuff,
+ lcNvmParamsSize);
+ }
+ else
+ {
+ /* length mismatch */
+ }
+ }
+
+ break; /* Only for element index 0 */
+#endif /* ENABLE_LIGHT_MODEL_SERVER_LC */
+ } /* for */
+
if (SaveModelState_cb != NULL)
{
- result = SaveModelState_cb(Model_GetBuff, APP_NVM_MODEL_SIZE);
+ result = SaveModelState_cb(Model_GetBuff, saveBuffSize);
}
if (MOBLE_FAILED(result))
@@ -630,7 +872,34 @@ MOBLE_RESULT SaveModelsStateNvm(MOBLEUINT8 flag)
return result;
}
#endif
-/*
+
+#if 0
+void Device_FlashTesting(void)
+{
+ MOBLEUINT8 SaveBuffer[TESTING_BYTE];
+ MOBLEUINT8 RetrieveBuffer[TESTING_BYTE];
+ MOBLEUINT16 buffSize = TESTING_BYTE;
+
+ MOBLEUINT8 ret;
+
+ SaveModelTestState_cb(SaveBuffer,buffSize);
+
+ RetrieveModelTestState_cb(RetrieveBuffer,buffSize);
+
+ ret = memcmp(SaveBuffer, RetrieveBuffer, APP_NVM_MODEL_SIZE);
+
+ if(ret == MOBLE_RESULT_SUCCESS)
+ {
+ TRACE_M(TF_MISC, "Successfully retrieved the saved data from flash \r\n");
+ }
+ else
+ {
+ TRACE_M(TF_MISC, "Failed to retrieved the saved data from flash \r\n");
+ }
+}
+#endif
+
+/**
* @brief function to call light middle layer function for restoration of
* saved states.
* @param void.
@@ -640,146 +909,215 @@ 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;
+ MOBLEUINT16 dstPeer;
+ MOBLEUINT16 elementParamOffset;
+ MOBLEUINT16 powerOnOffOffset;
+ MODEL_MessageHeader_t msgParam;
+
+ my_Address = BLEMesh_GetAddress(); /* Get the Primary address */
if (size > 0)
{
- switch(pModelState_Load[0])
- {
+ for(uint8_t elementIndex = 0; elementIndex < APPLICATION_NUMBER_OF_ELEMENTS; elementIndex++)
+ {
+ dstPeer = my_Address+elementIndex;
+
+ /* Initialize the messageParam */
+ msgParam.dst_peer = dstPeer;
+ msgParam.peer_addr = dstPeer;
+ msgParam.elementIndex = elementIndex;
+ msgParam.rcvdAppKeyOffset = 0;
+ msgParam.rcvdNetKeyOffset = 0;
+ msgParam.rssi = 0;
+ msgParam.ttl = 0;
+
+ elementParamOffset = elementIndex * APP_NVM_MODELDATA_PER_ELEMENT_SIZE;
+
+ powerOnOffOffset = (elementIndex * APP_NVM_MODELDATA_PER_ELEMENT_SIZE)+ GENERIC_POWER_ON_OFF_NVM_OFFSET;
+
+ switch(pModelState_Load[elementParamOffset + GENERIC_VALID_FLAG_OFFSET])
+ {
+
#ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF
- case GENERIC_ON_OFF_NVM_FLAG:
- {
- /* checking the Power on off retrieved value according to the given
- in standered and taking decision for Generic on off.
- */
-
- 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)
+ case GENERIC_ON_OFF_NVM_FLAG:
{
- Generic_OnOff_Set(pModelState_Load+GENERIC_ON_OFF_NVM_OFFSET, 1);
+ /* checking the Power on off retrieved value according to the given
+ in standered and taking decision for Generic on off.
+ */
+
+ if(pModelState_Load[powerOnOffOffset] == GENERIC_POWER_OFF_STATE)
+ {
+ pData[0] = APPLI_LED_OFF;
+ Generic_OnOff_Set(pData,1,&msgParam);
+ }
+ else if(pModelState_Load[powerOnOffOffset] == GENERIC_POWER_ON_STATE)
+ {
+ pData[0] = APPLI_LED_ON;
+ Generic_OnOff_Set(pData,1,&msgParam);
+
+ }
+ else if(pModelState_Load[powerOnOffOffset] == GENERIC_POWER_RESTORE_STATE)
+ {
+ Generic_OnOff_Set(pModelState_Load+GENERIC_ON_OFF_NVM_OFFSET+elementParamOffset, 1,&msgParam);
+ }
+ else
+ {
+ TRACE_M(TF_GENERIC_M, "Power On Off value invalid %d \r\n", pModelState_Load[0]);
+ }
+
+ opcode = GENERIC_ON_OFF_SET_UNACK;
+ model_ID = GENERIC_ONOFF_SERVER_MODEL_ID;
+ break;
}
- else
- {
- 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
#ifdef ENABLE_GENERIC_MODEL_SERVER_LEVEL
- case GENERIC_LEVEL_NVM_FLAG:
- {
- Generic_Level_Set(pModelState_Load+GENERIC_LEVEL_NVM_OFFSET,2);
- break;
- }
+ case GENERIC_LEVEL_NVM_FLAG:
+ {
+ Generic_Level_Set(pModelState_Load+GENERIC_LEVEL_NVM_OFFSET,2, &msgParam);
+ break;
+ }
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
- case LIGHT_LIGHTNESS_NVM_FLAG:
- {
- 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;
- }
+ case LIGHT_LIGHTNESS_NVM_FLAG:
+ {
+ MOBLEUINT16 light_LightnessValue;
+ light_LightnessValue = Light_lightnessPowerOnValue(pModelState_Load, &msgParam);
+ *pData = light_LightnessValue;
+ *(pData+1) = light_LightnessValue >> 8;
+ Light_Lightness_Set(pData, 2, &msgParam);
+
+ opcode = LIGHT_LIGHTNESS_SET_UNACK;
+ model_ID = LIGHT_LIGHTNESS_SERVER_MODEL_ID;
+ break;
+ }
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL
- case LIGHT_CTL_NVM_FLAG:
- {
-
- Light_CtlPowerOnValue(pModelState_Load);
- opcode = LIGHT_CTL_TEMPERATURE_SET_UNACK;
- model_ID = LIGHT_MODEL_SERVER_CTL_TEMPERATURE_MODEL_ID;
- break;
- }
+ case LIGHT_CTL_NVM_FLAG:
+ {
+ Light_CtlPowerOnValue(pModelState_Load, &msgParam);
+ opcode = LIGHT_CTL_TEMPERATURE_SET_UNACK;
+ model_ID = LIGHT_CTL_TEMPERATURE_SERVER_MODEL_ID;
+ break;
+ }
#endif
#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)
- {
- Light_Hsl_Set((pModelState_Load+GENERIC_DATA_LIMIT+LIGHT_HSL_NVM_OFFSET), 6);
+ case LIGHT_HSL_NVM_FLAG:
+ {
+ /* restore the light HSL with respect to Power on off value */
+ Light_HslPowerOnValue(pModelState_Load, &msgParam);
+ opcode = LIGHT_HSL_SET_UNACK;
+ model_ID = LIGHT_HSL_SERVER_MODEL_ID;
+ break;
}
- else
- {
- TRACE_M(TF_GENERIC_M, "Power On Off value invalid %d \r\n", pModelState_Load[0]);
- }
+#endif
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+ case LIGHT_LC_NVM_FLAG:
+// if((ENABLE_LIGHT_MODEL_SERVER_LC & (1 << elementIndex)) == (1 << elementIndex))
+ {
+ MOBLEUINT8 genericOnPowerUp;
+ MOBLEUINT16 lightDefault;
+ MOBLEUINT16 lightLast;
+ MOBLEUINT16 lightActualLKV;
+ MOBLEUINT8 transitionStatus;
+ MOBLEUINT16 temp;
+
+ genericOnPowerUp = pModelState_Load[GENERIC_POWER_ON_OFF_NVM_OFFSET];
+
+ lightDefault = pModelState_Load[GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_DEFAULT_NVM_OFFSET+1]<<8;
+ lightDefault |= pModelState_Load[GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_DEFAULT_NVM_OFFSET];
+
+ lightLast = pModelState_Load[GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_LAST_NVM_OFFSET+1]<<8;
+ lightLast |= pModelState_Load[GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_LAST_NVM_OFFSET];
+
+ transitionStatus = pModelState_Load[GENERIC_DATA_LIMIT+LIGHT_TRANSITION_STATUS];
+ if(transitionStatus)
+ {
+ temp = pModelState_Load[GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_TARGET_NVM_OFFSET+1]<<8;
+ temp |= pModelState_Load[GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_TARGET_NVM_OFFSET];
+ lightActualLKV = CopyU8LittleEndienArrayToU16word((MOBLEUINT8*)(&temp));
+ }
+ else
+ {
+ temp = pModelState_Load[GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_PRESENT_NVM_OFFSET+1]<<8;
+ temp |= pModelState_Load[GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_PRESENT_NVM_OFFSET];
+ lightActualLKV = CopyU8LittleEndienArrayToU16word((MOBLEUINT8*)(&temp));
+ }
- opcode = LIGHT_HSL_SET_UNACK;
- model_ID = LIGHT_MODEL_SERVER_HSL_MODEL_ID;
+ TRACE_M(TF_COMMON, "Transition Flag %.2x\r\n", transitionStatus);
+
+ Light_LC_OnPowerUp(elementIndex,
+ pModelState_Load+elementParamOffset+LIGHT_LC_MODE_NVM_OFFSET,
+ genericOnPowerUp,
+ lightDefault,
+ lightLast,
+ lightActualLKV);
+ }
+
break;
- }
#endif
- case No_NVM_FLAG:
- {
- TRACE_M(TF_GENERIC_M, "Power OnOff value stored = %d \r\n",pModelState_Load[4]);
- break;
- }
- default:
- {
- TRACE_M(TF_LIGHT_M, "No Saved Data Found \r\n");
- break;
- }
- }
+
+ case No_NVM_FLAG:
+ {
+ TRACE_M(TF_GENERIC_M, "Power OnOff value stored = %d \r\n",pModelState_Load[4]);
+ break;
+ }
+
+ default:
+ {
+ TRACE_M(TF_LIGHT_M, "No Saved Data Found \r\n");
+ break;
+ }
+
+ } /* switch(pModelState_Load[GENERIC_VALID_FLAG_OFFSET]) */
- pData[0] = pModelState_Load[4];
- Generic_PowerOnOff_Set(pData,1);
+ pData[0] = pModelState_Load[powerOnOffOffset];
+ Generic_PowerOnOff_Set(pData,1,&msgParam);
- my_Address = BLEMesh_GetAddress();
- elementNumber = BLE_GetElementNumber();
- publishAddress = BLEMesh_GetPublishAddress(elementNumber,model_ID);
-
- if(publishAddress != 0x0000 )
- {
- Model_SendResponse(publishAddress,my_Address,opcode,pData,length);
+ my_Address = BLEMesh_GetAddress();
+ publishAddress = BLEMesh_GetPublishAddress(elementIndex, model_ID);
- TRACE_I(TF_MISC,"Publishing the Power on state to address %.2X \r\n",publishAddress);
- }
-
- }
+ if(publishAddress != 0x0000 )
+ {
+ msgParam.peer_addr = publishAddress;
+ msgParam.dst_peer = dstPeer;
+
+ Model_SendResponse(&msgParam, opcode, pData,length);
+ TRACE_I(TF_COMMON,"Publishing the Power on state to address %.2X \r\n",publishAddress);
+ } /* if(publishAddress != 0x0000) */
+ break; /* Run only once for element index 0 */
+ } /* for(uint8_t elementIndex = 0; elementIndex < APPLICATION_NUMBER_OF_ELEMENTS; elementIndex++) */
+ } /* if (size > 0) */
}
+
/**
* @brief Function used to restore the light lighness with respect to Power on off
* value .
* @param pModelValue_Load:array of saved data
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLEUINT16
*/
-MOBLEUINT16 Light_lightnessPowerOnValue(MOBLEUINT8 const *pModelValue_Load)
+MOBLEUINT16 Light_lightnessPowerOnValue(MOBLEUINT8 const *pModelValue_Load, MODEL_MessageHeader_t *pmsgParam)
{
MOBLEUINT16 light_DefaultValue;
MOBLEUINT16 light_LastValue;
MOBLEUINT8 powerOn_Value;
MOBLEUINT16 light_Actual = 0;
MOBLEUINT16 last_Known_Value;
+ MOBLEUINT8 transitionStatus;
+
+ transitionStatus = pModelValue_Load[GENERIC_DATA_LIMIT+LIGHT_TRANSITION_STATUS];
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];
@@ -787,24 +1125,45 @@ MOBLEUINT16 Light_lightnessPowerOnValue(MOBLEUINT8 const *pModelValue_Load)
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];
+ if(transitionStatus)
+ {
+ last_Known_Value = pModelValue_Load[GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_TARGET_NVM_OFFSET+1]<<8;
+ last_Known_Value |= pModelValue_Load[GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_TARGET_NVM_OFFSET];
+ TRACE_M(TF_COMMON,"Transition Flag is = %.2x, Last_Known Value = 0x%.2x \r\n",
+ transitionStatus,
+ CopyU8LittleEndienArrayToU16word((MOBLEUINT8*)(&last_Known_Value)));
+ }
+ else
+ {
+ last_Known_Value = pModelValue_Load[GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_PRESENT_NVM_OFFSET+1]<<8;
+ last_Known_Value |= pModelValue_Load[GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_PRESENT_NVM_OFFSET];
+ TRACE_M(TF_COMMON,"Transition Flag is = %.2x, Last_Known Value = 0x%.2x \r\n",
+ transitionStatus,
+ CopyU8LittleEndienArrayToU16word((MOBLEUINT8*)(&last_Known_Value)));
+ }
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);
+ Light_LightnessLast_Set((pModelValue_Load+GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_LAST_NVM_OFFSET),2, pmsgParam);
+ Light_LightnessDefault_Set((pModelValue_Load+GENERIC_DATA_LIMIT+LIGHT_LIGHTNESS_DEFAULT_NVM_OFFSET),2, pmsgParam);
if(powerOn_Value == GENERIC_POWER_OFF_STATE)
- {
+ {
+ /* Light Lightness Actual = 0 for value of the Generic OnPowerUp state equal
+ to 0x00 */
light_Actual = 0x00;
}
else if((powerOn_Value == GENERIC_POWER_ON_STATE) && (light_DefaultValue != 0x00))
{
+ /* Light Lightness Actual = Light Lightness Default for value of the Generic
+ OnPowerUp state equal to 0x01 and Light Lightness Default not equal to zero, */
light_Actual = light_DefaultValue;
}
else if((powerOn_Value == GENERIC_POWER_ON_STATE) && (light_DefaultValue == 0x00))
{
+ /* Light Lightness Actual = Light Lightness Last (see Section 6.1.2.3)
+ for value of the Generic OnPowerUp state equal to 0x01 and
+ Light Lightness Default equal to zero */
light_Actual = light_LastValue;
}
else if(powerOn_Value == GENERIC_POWER_RESTORE_STATE)
@@ -815,18 +1174,21 @@ MOBLEUINT16 Light_lightnessPowerOnValue(MOBLEUINT8 const *pModelValue_Load)
{
}
-
- printf("LIGHT LIGHTNESS VALUE ON POWER UP %.2x \r\n",light_Actual);
+
+ TRACE_I(TF_COMMON, "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
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLEUINT16
*/
-void Light_CtlPowerOnValue(MOBLEUINT8 const *pModelValue_Load)
+void Light_CtlPowerOnValue(MOBLEUINT8 const *pModelValue_Load, MODEL_MessageHeader_t *pmsgParam)
{
MOBLEUINT8 powerOn_Value;
MOBLEUINT8 pData[12];
@@ -840,12 +1202,12 @@ void Light_CtlPowerOnValue(MOBLEUINT8 const *pModelValue_Load)
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);
+ Light_CtlDefault_Set((pData+LIGHT_DEFAULT_OFFSET), 6,0);
+ Light_CtlTemperature_Set((pData+8), 4, pmsgParam);
}
else if(powerOn_Value == GENERIC_POWER_RESTORE_STATE)
{
- Light_CtlTemperature_Set((pData+2), 4);
+ Light_CtlTemperature_Set((pData+2), 4, pmsgParam);
}
else
{
@@ -853,13 +1215,16 @@ void Light_CtlPowerOnValue(MOBLEUINT8 const *pModelValue_Load)
}
}
+
/**
* @brief Function used to restore the light HSL with respect to Power on off
* value .
* @param pModelValue_Load:array of saved data
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLEUINT16
*/
-void Light_HslPowerOnValue(MOBLEUINT8 const *pModelValue_Load)
+void Light_HslPowerOnValue(MOBLEUINT8 const *pModelValue_Load, MODEL_MessageHeader_t *pmsgParam)
{
MOBLEUINT8 powerOn_Value;
MOBLEUINT8 pData[12];
@@ -873,21 +1238,25 @@ void Light_HslPowerOnValue(MOBLEUINT8 const *pModelValue_Load)
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);
+ Light_HslDefault_Set((pData+LIGHT_DEFAULT_OFFSET), 6, 0);
+ if(powerOn_Value == GENERIC_POWER_OFF_STATE)
+ {
+ memset((void*)(pData+LIGHT_DEFAULT_OFFSET), 0x00, 2);
+ }
+ Light_Hsl_Set((pData+LIGHT_DEFAULT_OFFSET), 6, 0);
}
+ /* Check to restore the state during Power Up */
else if(powerOn_Value == GENERIC_POWER_RESTORE_STATE)
{
- Light_HslHue_Set((pData+2), 2);
- Light_HslSaturation_Set((pData+4), 2);
+ Light_Hsl_Set(pData, 6, 0);
}
else
{
-
+ TRACE_M(TF_GENERIC_M, "Power On Off value invalid %d \r\n", powerOn_Value);
}
}
+
/**
* @brief Function used to select the element number
* @param void
@@ -904,19 +1273,19 @@ MOBLEUINT8 BLE_GetElementNumber(void)
{
elementNumber = 0x01;
}
-
else if(NumberOfElements == 2)
{
elementNumber = 0x02; /*Element 2 is configured as switch*/
}
-
else if(NumberOfElements == 3)
{
elementNumber = 0x03; /*Element 3 is configured as switch*/
}
+
return elementNumber;
}
+
#ifdef ENABLE_SAVE_MODEL_STATE_NVM
/**
* @brief Function used to save the states of the node, when power down is detected.
@@ -931,102 +1300,741 @@ void ModelSave_Process(void)
PowerOnOff_flag = FLAG_RESET;
}
}
+#endif /* #ifdef ENABLE_SAVE_MODEL_STATE_NVM */
+
-#endif
/**
-* @brief Function used to calculate the delay.
-* @param MOBLEUINT16
-* @retval MOBLEUINT8
+ * @brief
+ * @param
+ * @retval
+ */
+MOBLE_RESULT Chk_TidValidity(MOBLE_ADDRESS peerAddr, MOBLE_ADDRESS dstAddr, MOBLEUINT8 tidValue)
+{
+ static MOBLEUINT32 Check_time;
+ MOBLE_RESULT status = MOBLE_RESULT_SUCCESS;
+
+ TRACE_M(TF_COMMON, "dst_peer %.2X peer_add %.2X, tid %d\r\n", dstAddr, peerAddr, tidValue);
+
+ if(((Clock_Time()- Check_time) <= 6000))
+ {
+ if((Model_Tid.Peer_Addrs == peerAddr)&&(Model_Tid.Dst_Addrs == dstAddr)&&(Model_Tid.Tid_Value == tidValue))
+ {
+ TRACE_M(TF_COMMON,"Duplicate Message Parameter within six second \r\n");
+ status = MOBLE_RESULT_INVALIDARG;
+ }
+ else
+ {
+ Check_time = Clock_Time();
+ Model_Tid.Peer_Addrs = peerAddr;
+ Model_Tid.Dst_Addrs = dstAddr;
+ Model_Tid.Tid_Value = tidValue;
+ TRACE_M(TF_COMMON,"New Message Parameter within six second \r\n");
+ }
+ }
+ else
+ {
+ Check_time = Clock_Time();
+ Model_Tid.Peer_Addrs = peerAddr;
+ Model_Tid.Dst_Addrs = dstAddr;
+ Model_Tid.Tid_Value = tidValue;
+ TRACE_M(TF_COMMON,"New Message Parameter after six second\r\n");
+ }
+
+ return status;
+}
+
+
+/**
+ * @brief Last TID parameters update with current TID parameters if
+ * either 6 seconds has passed or TID mismatch or src & dst mismatch
+ * @param current TID parameters and reference to last TID parameters
+ * @retval If last TID parameters updated return 1 else 0
+ */
+MOBLEUINT8 Tid_CheckAndUpdate(MOBLEUINT8 currentMsgTid,
+ MOBLE_ADDRESS currentMsgSrc,
+ MOBLE_ADDRESS currentMsgDst,
+ tid_param_t* pLastMsgTidParams)
+{
+ MOBLEUINT8 updateLastTidParams = 0;
+ MOBLEUINT32 lastMsgPlus6Tick = pLastMsgTidParams->tidTick + 6000;
+ MOBLEUINT8 lastTidExpired = 0;
+
+ if(currentMsgTid != pLastMsgTidParams->tid)
+ {
+ updateLastTidParams = 1;
+ }
+ else if(currentMsgSrc != pLastMsgTidParams->src ||
+ currentMsgDst != pLastMsgTidParams->dst)
+ {
+ updateLastTidParams = 1;
+ }
+ else
+ {
+ if(pLastMsgTidParams->tidTick <= lastMsgPlus6Tick)
+ {
+ lastTidExpired = Clock_Time() >= lastMsgPlus6Tick ||
+ Clock_Time() < pLastMsgTidParams->tidTick;
+ }
+ else
+ {
+ lastTidExpired = Clock_Time() >= lastMsgPlus6Tick &&
+ Clock_Time() < pLastMsgTidParams->tidTick;
+ }
+
+ if(lastTidExpired == 1)
+ {
+ updateLastTidParams = 1;
+ }
+ }
+
+ if(updateLastTidParams == 1)
+ {
+ pLastMsgTidParams->tid = currentMsgTid;
+ pLastMsgTidParams->src = currentMsgSrc;
+ pLastMsgTidParams->dst = currentMsgDst;
+ pLastMsgTidParams->tidTick = Clock_Time();
+ }
+
+ return updateLastTidParams;
+}
+
+
+/**
+ * @brief
+ * @param
+ * @retval
*/
-MOBLEUINT8 BLE_waitPeriod(MOBLEUINT32 waitPeriod)
+void CopyU8LittleEndienArray_fromU16word (MOBLEUINT8* pArray, MOBLEUINT16 inputWord)
{
- static MOBLEUINT8 Clockflag = 0;
- static MOBLEUINT32 Check_time;
-
-
- if(Clockflag == CLK_FLAG_DISABLE)
- {
- Check_time = Clock_Time();
- Clockflag = CLK_FLAG_ENABLE;
- }
-/* The function will called untill the testcount will not become zero */
-
- if(((Clock_Time()- Check_time) >= waitPeriod))
- {
- Clockflag = CLK_FLAG_DISABLE;
- return 0x01;
-
- }
- return 0x00;
+ *(pArray) = (MOBLEUINT8)(inputWord & 0x00ff); /* Copy the LSB first */
+ *(pArray+1) = (MOBLEUINT8)((inputWord & 0xff00) >> 0x08); /* Copy the MSB later */
}
+
/**
-* @brief Function used to calculate the delay.
-* @param MOBLEUINT16
-* @retval MOBLEUINT8
+ * @brief
+ * @param
+ * @retval
*/
-MOBLEUINT8 TimeDelay(MOBLEUINT16 waitPeriod)
+MOBLEUINT16 CopyU8LittleEndienArrayToU16word (MOBLEUINT8* pArray)
{
- static MOBLEUINT8 Clockflag = 0;
- static MOBLEUINT32 Check_time;
+ MOBLEUINT16 u16Word=0;
+ MOBLEUINT8 lsb_byte=0;
+ MOBLEUINT8 msb_byte=0;
+ lsb_byte = *pArray;
+ pArray++;
+ msb_byte = *pArray;
+ u16Word = (msb_byte<<8);
+ u16Word &= 0xFF00;
+ u16Word |= lsb_byte;
+
+ return u16Word;
+}
+
+
+/**
+ * @brief
+ * @param
+ * @retval
+ */
+MOBLEUINT32 CopyU8LittleEndienArrayToU32word (MOBLEUINT8* pArray)
+{
+ MOBLEUINT32 u32Word=0;
+
+ u32Word = *(pArray+3);
+ u32Word <<= 8;
+ u32Word |= *(pArray+2);
+ u32Word <<= 8;
+ u32Word |= *(pArray+1);
+ u32Word <<= 8;
+ u32Word |= *pArray;
+ return u32Word;
+}
+
+
+/**
+ * @brief
+ * @param
+ * @retval
+*/
+void CopyU8LittleEndienArray_fromU32word (MOBLEUINT8* pArray, MOBLEUINT32 inputWord)
+{
+ *pArray = (MOBLEUINT8)(inputWord & 0x000000ff); /* Copy the LSB first */
+ *(pArray+1) = (MOBLEUINT8)((inputWord & 0x0000ff00) >> 8); /* Copy the MSB later */
+ *(pArray+2) = (MOBLEUINT8)((inputWord & 0x00ff0000) >> 16); /* Copy the MSB later */
+ *(pArray+3) = (MOBLEUINT8)((inputWord & 0xff000000) >> 24); /* Copy the MSB later */
+}
+
+
+/**
+ * @brief
+ * @param
+ * @retval
+*/
+void CopyU8LittleEndienArray_2B_fromU32word (MOBLEUINT8* pArray, MOBLEUINT32 inputWord)
+{
+ *pArray = (MOBLEUINT8)(inputWord & 0x000000ff); /* Copy the LSB first */
+ *(pArray+1) = (MOBLEUINT8)((inputWord & 0x0000ff00) >> 8); /* Copy the MSB later */
+}
+
+
+/**
+ * @brief Fill array from uint32 value in little endian format
+ * @param Array to be filled
+ * @param uint32 value (may have uint16 or uint8 value)
+ * @param No of bytes to be extracted and filled
+ * @retval None
+ */
+void PutLittleEndian(MOBLEUINT8* stream, MOBLEUINT32 value, MOBLEUINT8 octets)
+{
+ for (MOBLEUINT8 i = 0; i < octets; ++i)
+ {
+ stream[i] = (MOBLEUINT8)value;
+ value >>= 8;
+ }
+}
+
+
+/**
+ * @brief Get value from array formatted as little endian
+ * @param Initial array
+ * @param Extracted value
+ * @retval None
+ */
+void GetLittleEndian(MOBLEUINT8 const *stream, MOBLEUINT8 octets, MOBLEUINT32* result)
+{
+ MOBLEUINT32 data;
+ memcpy(&data, stream, sizeof(MOBLEUINT32));
+ *result = data & ~((unsigned int)-1 << (octets << 3));
+}
+
+
+/**
+* @brief Update parameters for ModelSaveProcess to save model states
+* @param NVM flag for model
+* @retval None
+*/
+void NvmStatePowerFlag_Set(MOBLEUINT8 nvmModelFlag, MOBLEUINT8 elementIndex)
+{
+#ifdef SAVE_MODEL_STATE_FOR_ALL_MESSAGES
+ PowerOnOff_flag = FLAG_SET;
+ RestoreFlag[elementIndex] = nvmModelFlag;
+#endif
+}
+
+
+/**
+ * @brief Stops ongoing transition
+ * @param Reference to transition status
+ * @retval TRANSITION_EVENT_ABORT if ongoing transition stopped
+ * else TRANSITION_EVENT_NO
+ **/
+transition_event_e Transition_Stop(transition_status_e* trStatus)
+{
+ transition_event_e transitionEvent = TRANSITION_EVENT_NO;
- if(Clockflag == CLK_FLAG_DISABLE)
+ if (*trStatus != TRANSITION_STATUS_STOP)
{
- Check_time = Clock_Time();
- Clockflag = CLK_FLAG_ENABLE;
- }
- /* The function will called untill the testcount will not become zero */
+ *trStatus = TRANSITION_STATUS_STOP;
+ transitionEvent = TRANSITION_EVENT_ABORT;
+
+ /* TRACE_M(TF_COMMON, "Transition aborted\r\n"); */
+ }
+
+ return transitionEvent;
+}
+
+
+/**
+ * @brief Transition state machine
+ * If transition stopped, transition starts with delay or without delay
+ * If transition in delay state, next action is to move to run state
+ * If in run state, next action can be to generate intermediate triggers
+ * according to step resolution or next action can be to stop ongoing
+ * transition if transition time is elapsed
+ * If transition time > 2 seconds, publish event is generated after
+ * 1 second w.r.t. transition run
+ * TRANSITION_EVENT_DELAY can be override by TRANSITION_EVENT_TIMER_START
+ * TRANSITION_EVENT_DELAY can be override by TRANSITION_EVENT_TIMER_STOP
+ * TRANSITION_EVENT_TIMER_START can be override by TRANSITION_EVENT_TIMER_STOP
+ * TRANSITION_EVENT_TIMER_TRIG can be override by TRANSITION_EVENT_TIMER_STOP
+ * @param Reference to transition parameters
+ * @param delay required in milliseconds
+ * @retval TRANSITION_EVENT_DELAY if transition started with delay
+ * TRANSITION_EVENT_TIMER_START if transition started without delay or delay elapsed
+ * TRANSITION_EVENT_TIMER_TRIG at every step resolution time elapse
+ * TRANSITION_EVENT_PUBLISH if 1 second elapsed after run started
+ * TRANSITION_EVENT_TIMER_STOP if transition stopped
+ * else TRANSITION_EVENT_NO
+ **/
+transition_event_e Transition_Sm(transition_params_t* pTrParams,
+ MOBLEUINT32 delayMs)
+{
+ transition_event_e transitionEvent = TRANSITION_EVENT_NO;
+ MOBLEUINT8 triggerStatus = 0;
+ MOBLEUINT8 timerOffEvent = 0;
+
+ if (pTrParams->trStatus == TRANSITION_STATUS_STOP)
+ {
+ if(pTrParams->trTimeMs > 2000 &&
+ /* optimization to not generate publish event if step resoltuion is comparable to transition time */
+ pTrParams->stepResolutionMs < pTrParams->trTimeMs)
+ {
+ /* Intermediate publish event to be generated after 1 second of start */
+ pTrParams->publishEventTrig = 1;
+ }
+ else
+ {
+ pTrParams->publishEventTrig = 0;
+ }
+
+ /* Set begin and end time */
+ pTrParams->trBeginTick = Clock_Time();
+ pTrParams->trEndTick = pTrParams->trBeginTick +
+ delayMs +
+ pTrParams->trTimeMs;
+
+ /* If not in transition
+ Either transition is with delay -> SWITCH TO DELAY
+ Or transition is without delay -> SWITCH TO RUNNING */
+ if (delayMs != 0)
+ {
+ /* Switch to delay state */
+ pTrParams->trStatus = TRANSITION_STATUS_DELAY;
+ transitionEvent = TRANSITION_EVENT_DELAY;
+ pTrParams->trNextActionTick = pTrParams->trBeginTick + delayMs;
+ }
+ else
+ {
+ /* delay is 0 -> transition starts but no change in value in first iteration */
+ pTrParams->trStatus = TRANSITION_STATUS_RUNNING;
+ transitionEvent = TRANSITION_EVENT_TIMER_START;
+ pTrParams->trNextActionTick = pTrParams->trBeginTick +
+ pTrParams->stepResolutionMs;
+ }
+ }
+
+ if(pTrParams->trBeginTick <= pTrParams->trNextActionTick)
+ {
+ triggerStatus = Clock_Time() >= pTrParams->trNextActionTick ||
+ Clock_Time() < pTrParams->trBeginTick;
+ }
+ else /* overflow */
+ {
+ triggerStatus = Clock_Time() >= pTrParams->trNextActionTick &&
+ Clock_Time() < pTrParams->trBeginTick;
+ }
+
+ if(triggerStatus == 1) /* next action triggered */
+ {
+ if(pTrParams->trStatus == TRANSITION_STATUS_DELAY)
+ {
+ /* Switcht to run state and timer started */
+ pTrParams->trStatus = TRANSITION_STATUS_RUNNING;
+ transitionEvent = TRANSITION_EVENT_TIMER_START;
+ }
+ else /* running */
+ {
+ transitionEvent = TRANSITION_EVENT_TIMER_TRIG;
+ }
+
+ pTrParams->trNextActionTick = pTrParams->trNextActionTick +
+ pTrParams->stepResolutionMs;
+ }
- if(((Clock_Time()- Check_time) <= waitPeriod))
+ /* check for timer off event
+ next action tick is already updated for next iteration
+ below check is w.r.t. next iteration itself */
+ if (pTrParams->trBeginTick <= pTrParams->trEndTick)
{
- Clockflag = CLK_FLAG_DISABLE;
- return 0x01;
+ timerOffEvent = Clock_Time() >= pTrParams->trEndTick ||
+ Clock_Time() < pTrParams->trBeginTick;
+ }
+ else /* overflow */
+ {
+ timerOffEvent = Clock_Time() >= pTrParams->trEndTick &&
+ Clock_Time() < pTrParams->trBeginTick;
+ }
+
+ if(timerOffEvent == 1)
+ {
+ transitionEvent = TRANSITION_EVENT_TIMER_STOP;
+ pTrParams->trStatus = TRANSITION_STATUS_STOP;
+ }
+
+ if(pTrParams->publishEventTrig == 1 &&
+ /* pTrParams->trTimeMs > 2000 && */
+ transitionEvent == TRANSITION_EVENT_NO &&
+ pTrParams->trStatus == TRANSITION_STATUS_RUNNING)
+ {
+ /* TRANSITION_EVENT_PUBLISH can't override any other transition event */
+ if (pTrParams->trBeginTick <= pTrParams->trEndTick)
+ {
+ triggerStatus = Clock_Time() >= (pTrParams->trEndTick - (pTrParams->trTimeMs -1000)) ||
+ Clock_Time() < pTrParams->trBeginTick;
+ }
+ else
+ {
+ if(pTrParams->trEndTick >= (pTrParams->trTimeMs - 1000))
+ {
+ triggerStatus = Clock_Time() >= (pTrParams->trEndTick-(pTrParams->trTimeMs-1000)) &&
+ Clock_Time() < pTrParams->trBeginTick;
+ }
+ else
+ {
+ triggerStatus = Clock_Time() >= ((0xFFFFFFFF-(pTrParams->trTimeMs-1000))+pTrParams->trEndTick) ||
+ Clock_Time() < pTrParams->trBeginTick;
+ }
+ }
+
+ if(triggerStatus == 1) /* status publication */
+ {
+ pTrParams->publishEventTrig = 0;
+ transitionEvent = TRANSITION_EVENT_PUBLISH;
+ }
+ }
+
+ if(transitionEvent == TRANSITION_EVENT_NO)
+ {
+ /* TRACE_I(TF_COMMON, "Tr sm TRANSITION_EVENT_NO\r\n"); */
+ }
+ else if(transitionEvent == TRANSITION_EVENT_ABORT)
+ {
+ /* TRACE_I(TF_COMMON, "Tr sm TRANSITION_EVENT_ABORT\r\n"); */
+ }
+ else if(transitionEvent == TRANSITION_EVENT_DELAY)
+ {
+ /* TRACE_I(TF_COMMON, "Tr sm TRANSITION_EVENT_DELAY\r\n"); */
}
- return 0x00;
+ else if(transitionEvent == TRANSITION_EVENT_TIMER_START)
+ {
+ /* TRACE_I(TF_COMMON, "Tr sm TRANSITION_EVENT_TIMER_START\r\n"); */
+ }
+ else if(transitionEvent == TRANSITION_EVENT_TIMER_TRIG)
+ {
+ /* TRACE_I(TF_COMMON, "Tr sm TRANSITION_EVENT_TIMER_TRIG\r\n"); */
+ }
+ else if(transitionEvent == TRANSITION_EVENT_PUBLISH)
+ {
+ /* TRACE_I(TF_COMMON, "Tr sm TRANSITION_EVENT_PUBLISH\r\n"); */
+ }
+ else if(transitionEvent == TRANSITION_EVENT_TIMER_STOP)
+ {
+ /* TRACE_I(TF_COMMON, "Tr sm TRANSITION_EVENT_TIMER_STOP\r\n"); */
+ }
+
+ return transitionEvent;
}
-MOBLE_RESULT Chk_TidValidity(MOBLE_ADDRESS peer_Addrs,MOBLE_ADDRESS dst_Addrs,MOBLEUINT8 tidValue)
+
+/**
+ * @brief Returns time remaining before transition stops
+ * @param Reference to transition parameters
+ * @retval Remaining time in milliseconds
+ **/
+MOBLEUINT32 Transition_RemainingTimeGet(transition_params_t* pTrParams)
{
- static MOBLEUINT32 Check_time;
- MOBLE_RESULT status = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT32 remainingTimeMs = 0;
- if(((Clock_Time()- Check_time) <= 6000))
+ if (pTrParams->trStatus == TRANSITION_STATUS_STOP)
+ {
+ /* Timer is stopped */
+ }
+ else /* delay or running */
{
- if((Peer_Addrs == peer_Addrs)&&(Dst_Addrs == dst_Addrs)&&(Tid_Value == tidValue))
+ if(pTrParams->trBeginTick <= pTrParams->trEndTick)
{
- TRACE_M(TF_COMMON,"dst_peer = %.2X , peer_add = %.2X,tid = %.2X \r\n",dst_Addrs,peer_Addrs,tidValue);
- TRACE_M(TF_COMMON,"Duplicate Message Parameter within six second \r\n");
- status = MOBLE_RESULT_INVALIDARG;
+ if(Clock_Time() < pTrParams->trEndTick &&
+ Clock_Time() >= pTrParams->trBeginTick)
+ {
+ remainingTimeMs = pTrParams->trEndTick - Clock_Time();
+ }
+ else
+ {
+ remainingTimeMs = 0;
+ }
}
else
{
- Check_time = Clock_Time();
- Peer_Addrs = peer_Addrs;
- Dst_Addrs = dst_Addrs;
- Tid_Value = tidValue;
- TRACE_M(TF_COMMON,"dst_peer = %.2X , peer_add = %.2X,tid = %.2X \r\n",dst_Addrs,peer_Addrs,tidValue);
- TRACE_M(TF_COMMON,"New Message Parameter within six second \r\n");
+ if(Clock_Time() >= pTrParams->trEndTick &&
+ Clock_Time() < pTrParams->trBeginTick)
+ {
+ remainingTimeMs = 0;
+ }
+ else
+ {
+ if(Clock_Time() < pTrParams->trEndTick)
+ {
+ remainingTimeMs = pTrParams->trEndTick - Clock_Time();
+ }
+ else
+ {
+ remainingTimeMs = pTrParams->trEndTick + (0xFFFFFFFF - Clock_Time());
+ }
+ }
+ }
+ }
+
+ /* TRACE_I(TF_COMMON, "Tr remaining time %dms\r\n", remainingTimeMs); */
+ return remainingTimeMs;
+}
+
+
+/**
+ * @brief Returns time before transition stops w.r.t. transition time
+ * @param Reference to transition parameters
+ * @retval timer in milliseconds
+ **/
+MOBLEUINT32 Transition_TimerGet(transition_params_t* pTrParams)
+{
+ MOBLEUINT32 timerMs = 0;
+
+ if(pTrParams->trStatus == TRANSITION_STATUS_STOP)
+ {
+ /* Timer is stopped */
+ }
+ else if(pTrParams->trStatus == TRANSITION_STATUS_DELAY)
+ {
+ timerMs = pTrParams->trTimeMs;
+ }
+ else /* running */
+ {
+ if(pTrParams->trBeginTick <= pTrParams->trEndTick)
+ {
+ if(Clock_Time() < pTrParams->trEndTick &&
+ Clock_Time() >= pTrParams->trBeginTick)
+ {
+ timerMs = pTrParams->trEndTick - Clock_Time();
+ }
+ else
+ {
+ timerMs = 0;
+ }
+ }
+ else
+ {
+ if(Clock_Time() >= pTrParams->trEndTick &&
+ Clock_Time() < pTrParams->trBeginTick)
+ {
+ timerMs = 0;
+ }
+ else
+ {
+ if(Clock_Time() < pTrParams->trEndTick)
+ {
+ timerMs = pTrParams->trEndTick - Clock_Time();
+ }
+ else
+ {
+ timerMs = pTrParams->trEndTick + (0xFFFFFFFF - Clock_Time());
+ }
+ }
+ }
+ }
+
+ return timerMs;
+}
+
+
+/**
+ * @brief Returns time to next scheduled tick
+ * May be used for low power remaining time calculation
+ * TRANSITION_EVENT_PUBLISH is not in consideration
+ * @param Reference to transition parameters
+ * @retval time in milliseconds
+ **/
+MOBLEUINT32 Transition_TimeToNextActionGet(transition_params_t* pTrParams)
+{
+ MOBLEUINT32 timerMs = 0xFFFFFFFF;
+
+ if (pTrParams->trStatus == TRANSITION_STATUS_STOP)
+ {
+ /* Timer is stopped */
+ }
+ else /* delay or running */
+ {
+ if(pTrParams->trBeginTick <= pTrParams->trNextActionTick)
+ {
+ if(Clock_Time() < pTrParams->trNextActionTick &&
+ Clock_Time() >= pTrParams->trBeginTick)
+ {
+ timerMs = pTrParams->trNextActionTick - Clock_Time();
+ }
+ else
+ {
+ timerMs = 0;
+ }
+ }
+ else
+ {
+ if(Clock_Time() >= pTrParams->trNextActionTick &&
+ Clock_Time() < pTrParams->trBeginTick)
+ {
+ timerMs = 0;
+ }
+ else
+ {
+ if(Clock_Time() < pTrParams->trNextActionTick)
+ {
+ timerMs = pTrParams->trNextActionTick - Clock_Time();
+ }
+ else
+ {
+ timerMs = pTrParams->trNextActionTick + (0xFFFFFFFF - Clock_Time());
+ }
+ }
}
}
+
+ return timerMs;
+}
+
+
+/**
+ * @brief Returns intermediate state during transition
+ * Intermediate state is based on initial & final state and timer
+ * @param Final state
+ * @param Initial state
+ * @param Timer (starts with transition time and decrements to 0)
+ * @retval Intermediate calculated state
+ **/
+MOBLEUINT32 Transition_StateValueGet(MOBLEUINT32 finalState,
+ MOBLEUINT32 initialState,
+ MOBLEUINT32 timer,
+ MOBLEUINT32 transitionTime)
+{
+ MOBLEUINT32 transitionStateVal = 0;
+
+ if(transitionTime != 0)
+ {
+ transitionStateVal = (finalState*(transitionTime - timer) + initialState*timer)/\
+ transitionTime;
+ }
else
{
- Check_time = Clock_Time();
- Peer_Addrs = peer_Addrs;
- Dst_Addrs = dst_Addrs;
- Tid_Value = tidValue;
- TRACE_M(TF_COMMON,"dst_peer = %.2X , peer_add = %.2X,tid = %.2X \r\n",dst_Addrs,peer_Addrs,tidValue);
- TRACE_M(TF_COMMON,"New Message Parameter \r\n");
+ if(finalState == initialState)
+ {
+ transitionStateVal = finalState;
+ }
+ else
+ {
+ /* Undefined */
+ }
}
- return status;
+ return transitionStateVal;
}
-WEAK_FUNCTION(MOBLE_RESULT ApplicationGetConfigServerDeviceKey(MOBLE_ADDRESS src,
- const MOBLEUINT8**ppkeyTbUse))
+
+/**
+ * @brief ExtractPropertyId
+ * Extract 16 bit Property ID from buffer
+ * @param reference to data to be used for extracting Property ID
+ * @param reference to be updated with Property ID
+ * @retval Success if Property ID is not prohibited
+ * else Invalid
+ */
+MOBLE_RESULT ExtractPropertyId(const MOBLEUINT8* data,
+ MOBLEUINT16* pPropertyId)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 propertyId = (*data | (*(data+1)<<8));
+
+ if (propertyId == PROPERTY_ID_PROHIBITED)
+ {
+ TRACE_M(TF_COMMON, "Prohibited Property Id received\r\n");
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else
+ {
+ *pPropertyId = propertyId;
+ }
+
+ return result;
+}
+
+
+/**
+ * @brief
+ * @param
+ * @retval
+ */
+MOBLE_RESULT Binding_GenericOnOff_LightLcLightOnOff(MOBLEUINT8 genericElementIndex,
+ MOBLEUINT8 genericOnOff,
+ MOBLEUINT8 optionalParams,
+ MOBLEUINT32 delayMs,
+ MOBLEUINT8 transitionParam)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ /* optional params to be inserted */
+ Light_LC_LcOnOffUpdate(genericElementIndex, genericOnOff, 0, 0, 0, 0);
+
+ return result;
+}
+
+
+/**
+ * @brief
+ * @param
+ * @retval
+ */
+MOBLE_RESULT Binding_LightLcLightOnOff_GenericOnOff(MOBLEUINT8 lcElementIndex, MOBLEUINT8 lcOnOff)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ Generic_OnOffUpdate(lcElementIndex, lcOnOff);
+
+ return result;
+}
+
+
+/**
+ * @brief
+ * @param
+ * @retval
+ */
+MOBLE_RESULT Binding_LcLinearOut_LightLightnessLinear(MOBLEUINT8 lcElementIndex, MOBLEUINT16 lcLinearOut)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ /* Extract element index of target light lightness linear
+ should not be same element index as of lcElementIndex */
+ MOBLEUINT8 targetElementIndex = 0;
+
+ if(lcElementIndex == targetElementIndex)
+ {
+ TRACE_M(TF_COMMON, "Element index conflict\r\n");
+ }
+
+ Light_LightnessLinearUpdate(targetElementIndex, lcLinearOut);
+
+ return result;
+}
+
+
+/**
+ * @brief Disable binding between LC Linear Out and Light Lightness Server
+ * upon an unsolicited change in binded Light Lightness Linear
+ * Extract target LC Server element index
+ * @param element index of Light Lightness Server
+ * @retval None
+ */
+void BindingDisable_LcLinearOut_LightLightnessLinear(MOBLEUINT8 lightnessLinearElementIndex)
+{
+ MOBLEUINT8 targetElementIndex = 1; /* Element index of targeted LC server */
+ Light_LC_LigtnessLinearUnsolicitedChange(targetElementIndex);
+}
+
+
+WEAK_FUNCTION ( MOBLE_RESULT ApplicationGetConfigServerDeviceKey(MOBLE_ADDRESS src,
+ const MOBLEUINT8 **ppkeyTbUse))
{
return MOBLE_RESULT_SUCCESS;
}
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+
+
+/******************* (C) COPYRIGHT 2020 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 2abd878e8..4dd80bd9c 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
@@ -39,12 +39,13 @@
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
+#if defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER)
/* ALIGN(4) */
-__attribute__((aligned(4))) Composition_Data_Page0_t NodeCompositionPage0; /* Storage of the Node Page0 */
+__attribute__((aligned(4))) Composition_Header_Page0_t NodeCompositionPage0Header;
/* ALIGN(4) */
-__attribute__((aligned(4)))Elements_Page0_t aNodeElements[MAX_ELEMENTS_PER_NODE];
+__attribute__((aligned(4)))Elements_Page0_t aNodeElements[CLIENT_MAX_ELEMENTS_PER_NODE];
/* ALIGN(4)*/
__attribute__((aligned(4)))NodeInfo_t NodeInfo;
@@ -235,6 +236,7 @@ MOBLE_RESULT ConfigClient_CompositionDataStatusResponse(MOBLEUINT8 const *pSrcCo
MOBLEUINT32 length)
{
MOBLEUINT8 *pSrcElements;
+ MOBLEUINT32 parsedDataLength;
MOBLEUINT8 elementIndex;
MOBLEUINT8 numNodeSIGmodels;
MOBLEUINT8 numNodeVendormodels;
@@ -244,94 +246,136 @@ MOBLE_RESULT ConfigClient_CompositionDataStatusResponse(MOBLEUINT8 const *pSrcCo
TRACE_M(TF_CONFIG_CLIENT_M, "Composition Status Cb \r\n");
+ parsedDataLength = 0;
+
+ if (length >= DEVICE_COMPOSITION_HEADER_SIZE)
+ {
/* Copy the header of the Composition page */
- NodeCompositionPage0.sComposition_Data_Page0.sheader.DataPage = *pSrcComposition;
- NodeCompositionPage0.sComposition_Data_Page0.sheader.NodeCID = CopyU8LittleEndienArrayToU16word((MOBLEUINT8*)(pSrcComposition+1));
- NodeCompositionPage0.sComposition_Data_Page0.sheader.NodePID = CopyU8LittleEndienArrayToU16word((MOBLEUINT8*)(pSrcComposition+3));
- NodeCompositionPage0.sComposition_Data_Page0.sheader.NodeVID = CopyU8LittleEndienArrayToU16word((MOBLEUINT8*)(pSrcComposition+5));
- NodeCompositionPage0.sComposition_Data_Page0.sheader.NodeCRPL = CopyU8LittleEndienArrayToU16word((MOBLEUINT8*)(pSrcComposition+7));
- NodeCompositionPage0.sComposition_Data_Page0.sheader.NodeFeatures = CopyU8LittleEndienArrayToU16word((MOBLEUINT8*)(pSrcComposition+9));
+ NodeCompositionPage0Header.DataPage = *pSrcComposition;
+ NodeCompositionPage0Header.NodeCID = CopyU8LittleEndienArrayToU16word((MOBLEUINT8*)(pSrcComposition+1));
+ NodeCompositionPage0Header.NodePID = CopyU8LittleEndienArrayToU16word((MOBLEUINT8*)(pSrcComposition+3));
+ NodeCompositionPage0Header.NodeVID = CopyU8LittleEndienArrayToU16word((MOBLEUINT8*)(pSrcComposition+5));
+ NodeCompositionPage0Header.NodeCRPL = CopyU8LittleEndienArrayToU16word((MOBLEUINT8*)(pSrcComposition+7));
+ NodeCompositionPage0Header.NodeFeatures = CopyU8LittleEndienArrayToU16word((MOBLEUINT8*)(pSrcComposition+9));
+ }
+
+ parsedDataLength += DEVICE_COMPOSITION_HEADER_SIZE;
+ if (length > parsedDataLength)
+ {
/* Point to the Start of Elements data from source */
/* Point after the Header and Loc , NumS, NumV */
pSrcElements = (MOBLEUINT8*)(pSrcComposition+11);
- for (elementIndex =0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ for (elementIndex =0; elementIndex < CLIENT_MAX_ELEMENTS_PER_NODE; elementIndex++ )
{
+
+ NodeInfo.NbOfelements = elementIndex+1; /* Save number of elements available in node for later use */
+
/* Point to the destination address in Global Variable */
/* Copy Loc, NumSIGmodels, NumVendorModels in Composition page */
aNodeElements[elementIndex].Loc = CopyU8LittleEndienArrayToU16word((MOBLEUINT8*)pSrcElements);
pSrcElements += 2;
+ parsedDataLength += 2;
+
aNodeElements[elementIndex].NumSIGmodels = *(pSrcElements);
pSrcElements++;
+ parsedDataLength++;
+
aNodeElements[elementIndex].NumVendorModels = *(pSrcElements);
pSrcElements++;
+ parsedDataLength++;
/******************* Copy the SIG Models **********************************/
/* Prepare the variables to find the number of SIG Models, SInce header is already copied,
it can use used directly for the comparision */
/* This is to be used for running the loop for data copy */
- numNodeSIGmodels = aNodeElements[elementIndex].NumSIGmodels;
- varModels = numNodeSIGmodels;
+
+ if (length >= (parsedDataLength+2))
+ { /* Still length of data received is more than parsed and the remaining
+ data is >2Bytes for SIG Model ID */
+
+ numNodeSIGmodels = aNodeElements[elementIndex].NumSIGmodels;
+ varModels = numNodeSIGmodels;
- /* Point to the Elements array for the SIG Models */
+ /* Point to the Elements array for the SIG Models */
- if (numNodeSIGmodels > MAX_SIG_MODELS_PER_ELEMENT)
- { /* Number of models of Node is more than storage capacity */
- varModels = MAX_SIG_MODELS_PER_ELEMENT;
- }
+ if (numNodeSIGmodels > CLIENT_MAX_SIG_MODELS_PER_ELEMENT)
+ { /* Number of models of Node is more than storage capacity */
+ varModels = CLIENT_MAX_SIG_MODELS_PER_ELEMENT;
+ }
- for (indexModels=0; indexModels< varModels; indexModels++)
- {
- aNodeElements[elementIndex].aSIGModels[indexModels] = CopyU8LittleEndienArrayToU16word((MOBLEUINT8*)pSrcElements);
- pSrcElements +=2; /* Increment by 2 Bytes for next Model */
- }
+ for (indexModels=0; indexModels< varModels; indexModels++)
+ {
+ aNodeElements[elementIndex].aSIGModels[indexModels] = CopyU8LittleEndienArrayToU16word((MOBLEUINT8*)pSrcElements);
+ pSrcElements +=2; /* Increment by 2 Bytes for next Model */
+ parsedDataLength += 2;
+ }
- /* If the source has more SIG Model IDs, then keep reading them till next address */
- if (numNodeSIGmodels > MAX_SIG_MODELS_PER_ELEMENT)
- {
- for (; indexModels< numNodeSIGmodels; indexModels++)
+ /* If the source has more SIG Model IDs, then keep reading them till next address */
+ if (numNodeSIGmodels > CLIENT_MAX_SIG_MODELS_PER_ELEMENT)
{
- /* Increase the Source address pointer ONLY */
- pSrcElements +=2;
+ for (; indexModels< numNodeSIGmodels; indexModels++)
+ {
+ /* Increase the Source address pointer ONLY */
+ pSrcElements +=2;
+ parsedDataLength += 2;
+ }
}
+ } /* if (length > parsedDataLength) */
+ else
+ {
+ break;
}
/******************* Copy the Vendor Models *******************************/
numNodeVendormodels = aNodeElements[elementIndex].NumVendorModels;
varModels = numNodeVendormodels;
- /* Point to the destination address in Global Variable */
- if (numNodeVendormodels > MAX_VENDOR_MODELS_PER_ELEMENT)
- {
- varModels = MAX_VENDOR_MODELS_PER_ELEMENT;
- }
+ if (length >= (parsedDataLength+4))
+ { /* Still length of data received is more than parsed and the remaining
+ data is >4Bytes for Vendor Model ID */
+
+ /* Point to the destination address in Global Variable */
+ if (numNodeVendormodels > CLIENT_MAX_VENDOR_MODELS_PER_ELEMENT)
+ {
+ varModels = CLIENT_MAX_VENDOR_MODELS_PER_ELEMENT;
+ }
- /* Start copying the Vendor Models */
- for (indexModels=0; indexModels < varModels; indexModels++)
- {
- aNodeElements[elementIndex].aVendorModels[indexModels] = CopyU8LittleEndienArrayToU32word(pSrcElements);
- pSrcElements +=4;
- }
-
- /* If the source has more Vendor Model IDs, then keep reading them till next Element */
- if (numNodeVendormodels > MAX_VENDOR_MODELS_PER_ELEMENT)
- {
- for (; indexModels< numNodeVendormodels; indexModels++)
+ /* Start copying the Vendor Models */
+ for (indexModels=0; indexModels < varModels; indexModels++)
{
- /* Increase the Source address pointer only */
+ aNodeElements[elementIndex].aVendorModels[indexModels] = CopyU8LittleEndienArrayToU32word(pSrcElements);
pSrcElements +=4;
+ parsedDataLength += 4;
}
+
+ /* If the source has more Vendor Model IDs, then keep reading them till next Element */
+ if (numNodeVendormodels > CLIENT_MAX_VENDOR_MODELS_PER_ELEMENT)
+ {
+ for (; indexModels< numNodeVendormodels; indexModels++)
+ {
+ /* Increase the Source address pointer only */
+ pSrcElements +=4;
+ }
+ }
+ } /* if (length > (parsedDataLength+4)) */
+ else
+ {
+ break;
}
- } /* for (elementIndex =0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ ) */
+ if (length <= parsedDataLength)
+ { /* No more data to parse */
+ break;
+ }
+ } /* for (elementIndex =0; elementIndex < CLIENT_MAX_ELEMENTS_PER_NODE; elementIndex++ ) */
+ } /* if (length > parsedDataLength) */
- NodeInfo.NbOfelements = elementIndex; /* Save number of elements available in node for later use */
- /* Element index is already incremented by 1 after 'for' loop */
Appli_CompositionDataStatusCb(result);
return result;
@@ -391,46 +435,6 @@ MOBLEUINT16 GetSIGModelFromCompositionData(MOBLEUINT8 elementIdx, MOBLEUINT8 idx
/**
-* @brief SetSigModelsNodeElementAddress: This function gets the element address
- from last known address saved in the flash
-* @param None
-* @retval MOBLE_RESULT
-*/
-void SetSIGModelCountToConfigure(MOBLEUINT8 count)
-{
- MOBLEUINT8 sigModelsCount;
-
- sigModelsCount = GetTotalSIGModelsCount(0);
- if (count > sigModelsCount)
- { /* if count required by application is more than Element's SIG Models,
- keep the low value */
- count = sigModelsCount;
- }
-
- NodeInfo.NbOfSIGModelsToConfigure = count;
-}
-
-/**
-* @brief SetVendorModelsNodeElementAddress: This function gets the element address
- from last known address saved in the flash
-* @param None
-* @retval MOBLE_RESULT
-*/
-void SetVendorModelCountToConfigure(MOBLEUINT8 count)
-{
- MOBLEUINT8 vendorModelsCount;
-
- vendorModelsCount = GetTotalVendorModelsCount(0);
- if (count > vendorModelsCount)
- { /* if count required by application is more than Element's SIG Models,
- keep the low value */
- count = vendorModelsCount;
- }
-
- NodeInfo.NbOfVendorModelsToConfigure = count;
-}
-
-/**
* @brief GetNodeElementAddress: This function gets the element address
from last known address saved in the flash
* @param None
@@ -471,27 +475,6 @@ MOBLEUINT8 GetTotalVendorModelsCount(MOBLEUINT8 elementIdx)
return aNodeElements[elementIdx].NumVendorModels ;
}
-/**
-* @brief GetNodeElementAddress: This function gets the element address
- from last known address saved in the flash
-* @param None
-* @retval MOBLE_RESULT
-*/
-MOBLEUINT8 GetNumberofSIGModels(MOBLEUINT8 elementIdx)
-{
- return NodeInfo.NbOfSIGModelsToConfigure;
-}
-
-/**
-* @brief GetNodeElementAddress: This function gets the element address
- from last known address saved in the flash
-* @param None
-* @retval MOBLE_RESULT
-*/
-MOBLEUINT8 GetNumberofVendorModels(MOBLEUINT8 elementIdx)
-{
- return NodeInfo.NbOfVendorModelsToConfigure;
-}
/**
* @brief PackNetkeyAppkeyInto3Bytes: This function is called to pack the
@@ -525,6 +508,7 @@ void PackNetkeyAppkeyInto3Bytes (MOBLEUINT16 netKeyIndex,
}
+
/**
* @brief PackNetkeyAppkeyInto3Bytes: This function is called to pack the
2 key Index into 3Bytes
@@ -740,16 +724,16 @@ MOBLE_RESULT ConfigClient_PublicationSet (MOBLEUINT16 elementAddress,
MOBLEUINT8 publishRetransmitIntervalSteps,
MOBLEUINT32 modelIdentifier)
{
- /*
-4.3.2.16 Config Model Publication Set
-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.
+/*
+ 4.3.2.16 Config Model Publication Set
+ 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.
+ 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
@@ -761,7 +745,7 @@ maximize the size of a payload.
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
- */
+*/
MOBLEUINT16 msg_opcode;
MOBLEUINT8* pConfigData;
@@ -775,24 +759,26 @@ maximize the size of a payload.
dataLength = sizeof(configClientModelPublication_t);
- if ( (ADDRESS_IS_GROUP(elementAddress)) || (ADDRESS_IS_UNASSIGNED(elementAddress)) )
+ if ( (ADDRESS_IS_GROUP(elementAddress)) ||
+ (ADDRESS_IS_UNASSIGNED(elementAddress)) )
{
/* The ElementAddress field is the unicast address of the element,
all other address types are Prohibited. */
result = MOBLE_RESULT_INVALIDARG;
}
- else{
-
- configClientModelPublication.elementAddr = elementAddress;
- configClientModelPublication.publishAddr = publishAddress;
- configClientModelPublication.appKeyIndex = appKeyIndex;
- configClientModelPublication.credentialFlag = credentialFlag;
- configClientModelPublication.rfu = 0;
- configClientModelPublication.publishTTL=publishTTL;
- configClientModelPublication.publishPeriod=publishPeriod;
- configClientModelPublication.publishRetransmitCount=publishRetransmitCount;
- configClientModelPublication.publishRetransmitIntervalSteps=publishRetransmitIntervalSteps;
- configClientModelPublication.modelIdentifier=modelIdentifier;
+ else
+ {
+
+ configClientModelPublication.elementAddr = elementAddress;
+ configClientModelPublication.publishAddr = publishAddress;
+ configClientModelPublication.appKeyIndex = appKeyIndex;
+ configClientModelPublication.credentialFlag = credentialFlag;
+ configClientModelPublication.rfu = 0;
+ configClientModelPublication.publishTTL=publishTTL;
+ configClientModelPublication.publishPeriod=publishPeriod;
+ configClientModelPublication.publishRetransmitCount=publishRetransmitCount;
+ configClientModelPublication.publishRetransmitIntervalSteps=publishRetransmitIntervalSteps;
+ configClientModelPublication.modelIdentifier=modelIdentifier;
if(CHKSIGMODEL(modelIdentifier))
@@ -809,7 +795,7 @@ maximize the size of a payload.
TRACE_M(TF_CONFIG_CLIENT_M, "Config Client Publication Add \r\n");
TRACE_M(TF_CONFIG_CLIENT_M, "elementAddr = [%04x]\r\n", elementAddress);
TRACE_M(TF_CONFIG_CLIENT_M, "publishAddress = [%04x]\r\n", publishAddress);
- TRACE_M(TF_CONFIG_CLIENT_M, "modelIdentifier = [%08lx]\r\n", modelIdentifier);
+ TRACE_M(TF_CONFIG_CLIENT_M, "modelIdentifier = [%08x]\r\n", modelIdentifier);
TRACE_I(TF_CONFIG_CLIENT_M, "Publication Set buffer \r\n");
@@ -916,7 +902,7 @@ MOBLE_RESULT ConfigClient_PublicationStatus(MOBLEUINT8 const *pPublicationStatus
}
TRACE_M(TF_CONFIG_CLIENT_M, "elementAddr = [%04x]\r\n", configClientPublicationStatus.elementAddr);
TRACE_M(TF_CONFIG_CLIENT_M, "publishAddress = [%04x]\r\n", configClientPublicationStatus.publishAddr);
- TRACE_M(TF_CONFIG_CLIENT_M, "modelIdentifier = [%08lx]\r\n", configClientPublicationStatus.modelIdentifier);
+ TRACE_M(TF_CONFIG_CLIENT_M, "modelIdentifier = [%08x]\r\n", configClientPublicationStatus.modelIdentifier);
TRACE_M(TF_CONFIG_CLIENT_M, "status = [%02x]\r\n", configClientPublicationStatus.Status);
Appli_PublicationStatusCb(configClientPublicationStatus.Status);
@@ -1006,7 +992,7 @@ Config Model Subscription Status message.
TRACE_M(TF_CONFIG_CLIENT_M, "elementAddr = [%04x]\r\n", elementAddress);
TRACE_M(TF_CONFIG_CLIENT_M, "SubscriptionAddress = [%04x]\r\n", address);
- TRACE_M(TF_CONFIG_CLIENT_M, "modelIdentifier = [%08lx]\r\n", modelIdentifier);
+ TRACE_M(TF_CONFIG_CLIENT_M, "modelIdentifier = [%08x]\r\n", modelIdentifier);
self_addr = BLEMesh_GetAddress();
@@ -1141,7 +1127,7 @@ MOBLE_RESULT ConfigClient_SubscriptionStatus(MOBLEUINT8 const *pSrcSubscriptionS
TRACE_M(TF_CONFIG_CLIENT_M, "elementAddr = [%04x]\r\n", configClientSubscriptionStatus.elementAddress);
TRACE_M(TF_CONFIG_CLIENT_M, "SubscriptionAddress = [%04x]\r\n", configClientSubscriptionStatus.address);
- TRACE_M(TF_CONFIG_CLIENT_M, "modelIdentifier = [%08lx]\r\n", configClientSubscriptionStatus.modelIdentifier);
+ TRACE_M(TF_CONFIG_CLIENT_M, "modelIdentifier = [%08x]\r\n", configClientSubscriptionStatus.modelIdentifier);
TRACE_M(TF_CONFIG_CLIENT_M, "subscription status = [%02x]\r\n", configClientSubscriptionStatus.Status);
Appli_SubscriptionAddStatusCb(configClientSubscriptionStatus.Status);
@@ -1234,7 +1220,8 @@ The response to a Config Model App Bind message is a Config Model App Status mes
pConfigData = (MOBLEUINT8*) &(modelAppBind);
TRACE_M(TF_CONFIG_CLIENT_M, "Config Client App Key Bind message \r\n");
- TRACE_M(TF_CONFIG_CLIENT_M, "Model = 0x%8lx \r\n", modelIdentifier );
+ TRACE_M(TF_CONFIG_CLIENT_M, "elementAddr = [%04x]\r\n", elementAddress);
+ TRACE_M(TF_CONFIG_CLIENT_M, "modelIdentifier = [%08x]\r\n", modelIdentifier);
if(ADDRESS_IS_UNASSIGNED(elementAddress))
{
@@ -1376,7 +1363,7 @@ There are no Parameters for this message.
else
{
/* Node address to be configured */
- ConfigClientModel_SendMessage(dst_peer,msg_opcode,pConfigData,dataLength);
+ result = ConfigClientModel_SendMessage(dst_peer,msg_opcode,pConfigData,dataLength);
}
return result;
@@ -1405,55 +1392,6 @@ MOBLE_RESULT ConfigClient_NodeResetStatus(MOBLEUINT8 const *pStatus,
return result;
}
-void CopyU8LittleEndienArray_fromU16word (MOBLEUINT8* pArray, MOBLEUINT16 inputWord)
-{
- *(pArray) = (MOBLEUINT8)(inputWord & 0x00ff); /* Copy the LSB first */
- *(pArray+1) = (MOBLEUINT8)((inputWord & 0xff00) >> 0x08); /* Copy the MSB later */
-}
-
-MOBLEUINT16 CopyU8LittleEndienArrayToU16word (MOBLEUINT8* pArray)
-{
- MOBLEUINT16 u16Word=0;
- MOBLEUINT8 lsb_byte=0;
- MOBLEUINT8 msb_byte=0;
-
- lsb_byte = *pArray;
- pArray++;
- msb_byte = *pArray;
- u16Word = (msb_byte<<8);
- u16Word &= 0xFF00;
- u16Word |= lsb_byte;
-
- return u16Word;
-}
-
-MOBLEUINT32 CopyU8LittleEndienArrayToU32word (MOBLEUINT8* pArray)
-{
- MOBLEUINT32 u32Word=0;
-
- u32Word = *(pArray+3);
- u32Word <<= 8;
- u32Word |= *(pArray+2);
- u32Word <<= 8;
- u32Word |= *(pArray+1);
- u32Word <<= 8;
- u32Word |= *pArray;
- return u32Word;
-}
-
-void CopyU8LittleEndienArray_fromU32word (MOBLEUINT8* pArray, MOBLEUINT32 inputWord)
-{
- *pArray = (MOBLEUINT8)(inputWord & 0x000000ff); /* Copy the LSB first */
- *(pArray+1) = (MOBLEUINT8)((inputWord & 0x0000ff00) >> 8); /* Copy the MSB later */
- *(pArray+2) = (MOBLEUINT8)((inputWord & 0x00ff0000) >> 16); /* Copy the MSB later */
- *(pArray+3) = (MOBLEUINT8)((inputWord & 0xff000000) >> 24); /* Copy the MSB later */
-}
-
-void CopyU8LittleEndienArray_2B_fromU32word (MOBLEUINT8* pArray, MOBLEUINT32 inputWord)
-{
- *pArray = (MOBLEUINT8)(inputWord & 0x000000ff); /* Copy the LSB first */
- *(pArray+1) = (MOBLEUINT8)((inputWord & 0x0000ff00) >> 8); /* Copy the MSB later */
-}
/**
* @brief GenericModelServer_GetOpcodeTableCb: This function is call-back
@@ -1474,7 +1412,7 @@ MOBLE_RESULT ConfigClientModel_SendMessage(MOBLE_ADDRESS dst_peer ,
pTargetDevKey = GetNewProvNodeDevKey();
- ConfigModel_SendMessage(peer_addr, dst_peer, opcode,
+ result = ConfigModel_SendMessage(peer_addr, dst_peer, opcode,
pData, dataLength, pTargetDevKey);
return result;
}
@@ -1626,9 +1564,8 @@ MOBLE_RESULT ConfigClientModel_GetOpcodeTableCb(const MODEL_OpcodeTableParam_t *
/**
* @brief ConfigClientModel_GetStatusRequestCb : This function is call-back
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
+* @param *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* @param opcode: Received opcode of the Status message callback
* @param pResponsedata: Pointer to the buffer to be updated with status
* @param plength: Pointer to the Length of the data, to be updated by application
@@ -1637,8 +1574,7 @@ from the library to send response to the message from peer
* @param response: Value to indicate wheather message is acknowledged meassage or not.
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT ConfigClientModel_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+MOBLE_RESULT ConfigClientModel_GetStatusRequestCb(MODEL_MessageHeader_t *pmsgParam,
MOBLEUINT16 opcode,
MOBLEUINT8 *pResponsedata,
MOBLEUINT32 *plength,
@@ -1667,10 +1603,10 @@ MOBLE_RESULT ConfigClientModel_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
/**
* @brief GenericModelServer_ProcessMessageCb: This is a callback function from
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
+* @param *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* @param opcode: Received opcode of the Status message callback
+* @param modelID: Received modelID of the message callback
* @param pData: Pointer to the buffer to be updated with status
* @param length: Length of the parameters received
* @param response: if TRUE, the message is an acknowledged message
@@ -1679,8 +1615,7 @@ the library whenever a Generic Model message is received
* @param response: Value to indicate wheather message is acknowledged meassage or not.
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT ConfigClientModel_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+MOBLE_RESULT ConfigClientModel_ProcessMessageCb(MODEL_MessageHeader_t *pmsgParam,
MOBLEUINT16 opcode,
MOBLEUINT8 const *pRxData,
MOBLEUINT32 dataLength,
@@ -1691,8 +1626,8 @@ MOBLE_RESULT ConfigClientModel_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
// tClockTime delay_t = Clock_Time();
- TRACE_M(TF_CONFIG_CLIENT_M, "dst_peer = %.2X , peer_add = %.2X, opcode= %.2X ,response= %.2X \r\n ",
- dst_peer, peer_addr, opcode , response);
+ TRACE_M(TF_CONFIG_CLIENT_M, "dst_peer = [%04x] , peer_add = [%04x], opcode= [%.2X] ,response= [%.2X] \r\n ",
+ pmsgParam->dst_peer, pmsgParam->peer_addr, opcode , response);
switch(opcode)
{
@@ -1752,6 +1687,8 @@ MOBLE_RESULT ConfigClientModel_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
return MOBLE_RESULT_SUCCESS;
}
+#endif /* defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER) */
+
WEAK_FUNCTION (MOBLEUINT8* GetNewProvNodeDevKey(void))
{
return 0;
@@ -1765,5 +1702,5 @@ WEAK_FUNCTION (MOBLEUINT8* GetNewProvNodeDevKey(void))
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
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 107e58104..89c743122 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic.c
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic.c
@@ -18,14 +18,17 @@
*/
/* Includes ------------------------------------------------------------------*/
#include "hal_common.h"
+#include "ble_mesh.h"
#include "mesh_cfg.h"
#include "generic.h"
#include "light.h"
#include "light_lc.h"
#include "common.h"
+#include "models_if.h"
#include <string.h>
#include "compiler.h"
#include <stdint.h>
+#include "math.h"
/** @addtogroup MODEL_GENERIC
@@ -41,132 +44,141 @@
/* Private variables ---------------------------------------------------------*/
-static Generic_TemporaryStatus_t Generic_TemporaryStatus;
+static Generic_TemporaryStatus_t Generic_TemporaryStatus[APPLICATION_NUMBER_OF_ELEMENTS];
+static Generic_TimeParam_t Generic_TimeParam[APPLICATION_NUMBER_OF_ELEMENTS];
-static Generic_TimeParam_t Generic_TimeParam;
/* initialize the array with minimum level value and other parameter as zero */
-static Generic_LevelStatus_t Generic_LevelStatus = {LEVEL_MIN_VALID_RANGE,0x00,0x00,0x00,0x00,0x00};
+static Generic_LevelStatus_t Generic_LevelStatus[APPLICATION_NUMBER_OF_ELEMENTS] =
+{
+ {
+ LEVEL_MIN_VALID_RANGE,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00
+ }
+};
+
+static Generic_OnOffStatus_t Generic_OnOffStatus[APPLICATION_NUMBER_OF_ELEMENTS];
-static Generic_OnOffStatus_t Generic_OnOffStatus;
-/* Initialize the default transition value 0x06
- with 100 ms resolution and 6 step count
+#ifdef ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
+/* Initialize the default transition value 0x00
+ Default Transition Step Resolution is 100 milliseconds
+ Generic Default Transition Time is immediate.
*/
-Generic_DefaultTransitionParam_t Generic_DefaultTransitionParam = {0x06};
-
-static Generic_ModelFlag_t Generic_ModelFlag;
+Generic_DefaultTransitionParam_t Generic_DefaultTransitionParam = {0x00};
+#endif
+static Generic_ModelFlag_t Generic_ModelFlag[APPLICATION_NUMBER_OF_ELEMENTS];
-extern MOBLEUINT16 CommandStatus;
+extern MOBLEUINT16 CommandStatus; /* Current on/off status, shared with Vendor model, used to publish status */
MOBLEUINT8 GenericUpdateFlag = 0;
-MOBLEUINT16 Model_Rx_Opcode;
-MOBLEUINT8 OptionalValid = 0;
-MOBLEUINT8 PowerOnOff_Flag = 0;
-MOBLEUINT8 TidValue = 0;
-MOBLEUINT16 Model_ID = 0;
-extern MOBLEUINT8 TidSend;
-extern MOBLE_ADDRESS Dst_Peer;
+MOBLEUINT8 OptionalParam = 0;
+
+extern Model_Tid_t Model_Tid;
+/*Variables used for the publishing of binded data */
+extern Model_Binding_Var_t Model_Binding_Var;
const MODEL_OpcodeTableParam_t Generic_Opcodes_Table[] =
{
/* Generic OnOff Server */
-/* model_id opcode, reliable, min_payload_size, max_payload_size, response_opcode, min_response_size, max_response_size
+/* model_id opcode, reliable, min_payload_size, max_payload_size, response_opcode, min_response_size, max_response_size
Here in this array, Handler is not defined; */
#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},
- {GENERIC_MODEL_SERVER_ONOFF_MODEL_ID, GENERIC_ON_OFF_STATUS, MOBLE_FALSE, 1, 3, 0, 1, 3},
-#endif
-#ifdef ENABLE_GENERIC_MODEL_CLIENT_ONOFF
- {GENERIC_MODEL_CLIENT_ONOFF_MODEL_ID, GENERIC_ON_OFF_GET, MOBLE_TRUE, 0, 0, GENERIC_ON_OFF_STATUS, 1, 3},
- {GENERIC_MODEL_CLIENT_ONOFF_MODEL_ID, GENERIC_ON_OFF_SET_ACK, MOBLE_TRUE, 2, 4, GENERIC_ON_OFF_STATUS, 1, 3},
- {GENERIC_MODEL_CLIENT_ONOFF_MODEL_ID, GENERIC_ON_OFF_SET_UNACK, MOBLE_FALSE, 2, 4, GENERIC_ON_OFF_STATUS, 1, 3},
- {GENERIC_MODEL_CLIENT_ONOFF_MODEL_ID, GENERIC_ON_OFF_STATUS, MOBLE_FALSE, 1, 3, 0, 1, 3},
+ {GENERIC_ONOFF_SERVER_MODEL_ID, GENERIC_ON_OFF_GET, MOBLE_TRUE, 0, 0, GENERIC_ON_OFF_STATUS, 1, 3},
+ {GENERIC_ONOFF_SERVER_MODEL_ID, GENERIC_ON_OFF_SET_ACK, MOBLE_TRUE, 2, 4, GENERIC_ON_OFF_STATUS, 1, 3},
+ {GENERIC_ONOFF_SERVER_MODEL_ID, GENERIC_ON_OFF_SET_UNACK, MOBLE_FALSE, 2, 4, GENERIC_ON_OFF_STATUS, 1, 3},
+ {GENERIC_ONOFF_SERVER_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},
- {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_CLIENT_LEVEL
- /* Generic Level Server */
- {GENERIC_MODEL_CLIENT_LEVEL_MODEL_ID, GENERIC_LEVEL_GET, MOBLE_TRUE, 0, 0, GENERIC_LEVEL_STATUS, 2, 5},
- {GENERIC_MODEL_CLIENT_LEVEL_MODEL_ID, GENERIC_LEVEL_SET_ACK, MOBLE_TRUE, 3, 5, GENERIC_LEVEL_STATUS, 2, 5},
- {GENERIC_MODEL_CLIENT_LEVEL_MODEL_ID, GENERIC_LEVEL_SET_UNACK, MOBLE_FALSE, 3, 5, GENERIC_LEVEL_STATUS, 2, 5},
- {GENERIC_MODEL_CLIENT_LEVEL_MODEL_ID, GENERIC_DELTA_SET, MOBLE_TRUE, 5, 7, GENERIC_LEVEL_STATUS, 2, 5},
- {GENERIC_MODEL_CLIENT_LEVEL_MODEL_ID, GENERIC_DELTA_SET_UNACK, MOBLE_FALSE, 5, 7, GENERIC_LEVEL_STATUS, 2, 5},
- {GENERIC_MODEL_CLIENT_LEVEL_MODEL_ID, GENERIC_MOVE_SET, MOBLE_TRUE, 3, 5, GENERIC_LEVEL_STATUS, 2, 5},
- {GENERIC_MODEL_CLIENT_LEVEL_MODEL_ID, GENERIC_MOVE_SET_UNACK, MOBLE_FALSE, 3, 5, GENERIC_LEVEL_STATUS, 2, 5},
- {GENERIC_MODEL_CLIENT_LEVEL_MODEL_ID, GENERIC_LEVEL_STATUS, MOBLE_FALSE, 2, 5, 0, 2, 5},
+ {GENERIC_LEVEL_SERVER_MODEL_ID, GENERIC_LEVEL_GET, MOBLE_TRUE, 0, 0, GENERIC_LEVEL_STATUS, 2, 5},
+ {GENERIC_LEVEL_SERVER_MODEL_ID, GENERIC_LEVEL_SET_ACK, MOBLE_TRUE, 3, 5, GENERIC_LEVEL_STATUS, 2, 5},
+ {GENERIC_LEVEL_SERVER_MODEL_ID, GENERIC_LEVEL_SET_UNACK, MOBLE_FALSE, 3, 5, GENERIC_LEVEL_STATUS, 2, 5},
+ {GENERIC_LEVEL_SERVER_MODEL_ID, GENERIC_DELTA_SET, MOBLE_TRUE, 5, 7, GENERIC_LEVEL_STATUS, 2, 5},
+ {GENERIC_LEVEL_SERVER_MODEL_ID, GENERIC_DELTA_SET_UNACK, MOBLE_FALSE, 5, 7, GENERIC_LEVEL_STATUS, 2, 5},
+ {GENERIC_LEVEL_SERVER_MODEL_ID, GENERIC_MOVE_SET, MOBLE_TRUE, 3, 5, GENERIC_LEVEL_STATUS, 2, 5},
+ {GENERIC_LEVEL_SERVER_MODEL_ID, GENERIC_MOVE_SET_UNACK, MOBLE_FALSE, 3, 5, GENERIC_LEVEL_STATUS, 2, 5},
+ {GENERIC_LEVEL_SERVER_MODEL_ID, GENERIC_LEVEL_STATUS, MOBLE_FALSE, 2, 5, 0, 2, 5},
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF
- {GENERIC_MODEL_SERVER_POWER_ONOFF_MODEL_ID, GENERIC_POWER_ON_OFF_SET, MOBLE_TRUE, 1, 1, GENERIC_POWER_ON_OFF_STATUS, 1, 1},
- {GENERIC_MODEL_SERVER_POWER_ONOFF_MODEL_ID, GENERIC_POWER_ON_OFF_SET_UNACK, MOBLE_FALSE, 1, 1, 0, 1, 1},
- {GENERIC_MODEL_SERVER_POWER_ONOFF_MODEL_ID, GENERIC_POWER_ON_OFF_GET , MOBLE_TRUE, 0, 0, GENERIC_POWER_ON_OFF_STATUS, 1, 1},
- {GENERIC_MODEL_SERVER_POWER_ONOFF_MODEL_ID, GENERIC_POWER_ON_OFF_STATUS , MOBLE_FALSE, 1, 1, 0, 1, 1},
-#endif
-#ifdef ENABLE_GENERIC_MODEL_CLIENT_POWER_ONOFF
- {GENERIC_MODEL_CLIENT_POWER_ONOFF_MODEL_ID, GENERIC_POWER_ON_OFF_SET, MOBLE_TRUE, 1, 1, GENERIC_POWER_ON_OFF_STATUS, 1, 1},
- {GENERIC_MODEL_CLIENT_POWER_ONOFF_MODEL_ID, GENERIC_POWER_ON_OFF_SET_UNACK, MOBLE_FALSE, 1, 1, 0, 1, 1},
- {GENERIC_MODEL_CLIENT_POWER_ONOFF_MODEL_ID, GENERIC_POWER_ON_OFF_GET , MOBLE_TRUE, 0, 0, GENERIC_POWER_ON_OFF_STATUS, 1, 1},
- {GENERIC_MODEL_CLIENT_POWER_ONOFF_MODEL_ID, GENERIC_POWER_ON_OFF_STATUS , MOBLE_FALSE, 1, 1, 0, 1, 1},
+ {GENERIC_POWER_ONOFF_SETUP_SERVER_MODEL_ID, GENERIC_POWER_ON_OFF_SET, MOBLE_TRUE, 1, 1, GENERIC_POWER_ON_OFF_STATUS, 1, 1},
+ {GENERIC_POWER_ONOFF_SETUP_SERVER_MODEL_ID, GENERIC_POWER_ON_OFF_SET_UNACK, MOBLE_FALSE, 1, 1, 0, 1, 1},
+ {GENERIC_SERVER_POWER_ONOFF_MODEL_ID, GENERIC_POWER_ON_OFF_GET , MOBLE_TRUE, 0, 0, GENERIC_POWER_ON_OFF_STATUS, 1, 1},
+ {GENERIC_SERVER_POWER_ONOFF_MODEL_ID, GENERIC_POWER_ON_OFF_STATUS , MOBLE_FALSE, 1, 1, 0, 1, 1},
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
/* 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, 1 , 1},
- {GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID, GENERIC_DEFAULT_TRANSITION_TIME_STATUS, MOBLE_FALSE, 1, 1, 0, 1, 1},
-#endif
-#ifdef ENABLE_GENERIC_MODEL_CLIENT_DEFAULT_TRANSITION_TIME
- /* Generic Default Transition Time Server Model */
- {GENERIC_MODEL_CLIENT_DEFAULT_TRANSITION_TIME_MODEL_ID, GENERIC_DEFAULT_TRANSITION_TIME_GET, MOBLE_TRUE, 0, 0, GENERIC_DEFAULT_TRANSITION_TIME_STATUS, 1, 1},
- {GENERIC_MODEL_CLIENT_DEFAULT_TRANSITION_TIME_MODEL_ID, GENERIC_DEFAULT_TRANSITION_TIME_SET, MOBLE_TRUE, 1, 1, GENERIC_DEFAULT_TRANSITION_TIME_STATUS, 1, 1},
- {GENERIC_MODEL_CLIENT_DEFAULT_TRANSITION_TIME_MODEL_ID, GENERIC_DEFAULT_TRANSITION_TIME_SET_UNACK, MOBLE_FALSE, 1, 1, GENERIC_DEFAULT_TRANSITION_TIME_STATUS, 1 , 1},
- {GENERIC_MODEL_CLIENT_DEFAULT_TRANSITION_TIME_MODEL_ID, GENERIC_DEFAULT_TRANSITION_TIME_STATUS, MOBLE_FALSE, 1, 1, 0, 1, 1},
+ {GENERIC_DEFAULT_TRANSITION_TIME_SERVER_MODEL_ID, GENERIC_DEFAULT_TRANSITION_TIME_GET, MOBLE_TRUE, 0, 0, GENERIC_DEFAULT_TRANSITION_TIME_STATUS, 1, 1},
+ {GENERIC_DEFAULT_TRANSITION_TIME_SERVER_MODEL_ID, GENERIC_DEFAULT_TRANSITION_TIME_SET, MOBLE_TRUE, 1, 1, GENERIC_DEFAULT_TRANSITION_TIME_STATUS, 1, 1},
+ {GENERIC_DEFAULT_TRANSITION_TIME_SERVER_MODEL_ID, GENERIC_DEFAULT_TRANSITION_TIME_SET_UNACK, MOBLE_FALSE, 1, 1, GENERIC_DEFAULT_TRANSITION_TIME_STATUS, 1 , 1},
+ {GENERIC_DEFAULT_TRANSITION_TIME_SERVER_MODEL_ID, GENERIC_DEFAULT_TRANSITION_TIME_STATUS, MOBLE_FALSE, 1, 1, 0, 1, 1},
#endif
-
-#ifdef ENABLE_GENERIC_MODEL_SERVER_BATTERY
- /* Generic Battery Server Model */
- {GENERIC_MODEL_SERVER_BATTERY_MODEL_ID, GENERIC_BATTERY_GET, MOBLE_TRUE, 0, 0, GENERIC_BATTERY_STATUS, 8, 8},
-#endif
+
{0}
};
/* Private function prototypes -----------------------------------------------*/
WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t* pGeneric_OnOffParam,
- MOBLEUINT8 OptionalValid));
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t* plevelParam,
- MOBLEUINT8 OptionalValid));
-WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_LevelDelta_Set(Generic_LevelStatus_t* pdeltalevelParam,
- MOBLEUINT8 OptionalValid));
-WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_LevelMove_Set(Generic_LevelStatus_t* pdeltaMoveParam,
- MOBLEUINT8 OptionalValid));
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t* pdeltalevelParam,
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_PowerOnOff_Set(Generic_PowerOnOffParam_t* pPowerOnOffParam,
- MOBLEUINT8 OptionalValid));
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION (void Appli_Generic_Restore_PowerOn_Value(MOBLEUINT8 restoreValue,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Set(Generic_DefaultTransitionParam_t* pDefaultTimeParam,
- MOBLEUINT8 OptionalValid));
-WEAK_FUNCTION (void Appli_Generic_Restore_PowerOn_Value(MOBLEUINT8 restoreValue));
-WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_GetOnOffStatus(MOBLEUINT8* pOnOff_Status));
-WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_GetOnOffValue(MOBLEUINT8* pOnOff_Value) );
-WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_GetLevelStatus(MOBLEUINT8* pLevel_Status));
-WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_GetPowerOnOffStatus(MOBLEUINT8* pLevel_Status));
-WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_Status));
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status,
+ MOBLEUINT32 plength,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_Level_Status(MOBLEUINT8 const *plevel_status,
+ MOBLEUINT32 plength,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status ,
+ MOBLEUINT32 plength,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status ,
+ MOBLEUINT32 plength,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_GetOnOffStatus(MOBLEUINT8* pOnOff_Status,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_GetOnOffValue(MOBLEUINT8* pOnOff_Value,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_GetLevelStatus(MOBLEUINT8* pLevel_Status,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_GetPowerOnOffStatus(MOBLEUINT8* pPower_Status,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_Status,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
WEAK_FUNCTION(MOBLE_RESULT Appli_GenericClient_Level_Set_Unack(void));
-WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUINT32 plength));
-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 ---------------------------------------------------------*/
@@ -175,9 +187,13 @@ WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdelta
* unacknowledged message
* @param pOnOff_param: Pointer to the parameters received for message
* @param length: Length of the parameters received for message
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Generic_OnOff_Set(MOBLEUINT8 const *pOnOff_param, MOBLEUINT32 length)
+MOBLE_RESULT Generic_OnOff_Set(MOBLEUINT8 const *pOnOff_param,
+ MOBLEUINT32 length,
+ MODEL_MessageHeader_t *pmsgParam)
{
/* 3.2.1.2 Generic OnOff Set
@@ -193,10 +209,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
+
+ Generic_OnOffParam.Transition_Time = 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) && (pOnOff_param[2] !=0))
@@ -205,58 +224,87 @@ MOBLE_RESULT Generic_OnOff_Set(MOBLEUINT8 const *pOnOff_param, MOBLEUINT32 lengt
Generic_OnOffParam.Transition_Time = pOnOff_param[2];
Generic_OnOffParam.Delay_Time = pOnOff_param[3];
- /* Copy the received data in status message which needs
- to be set in application messages
- */
- Generic_OnOffStatus.Target_OnOff = Generic_OnOffParam.TargetOnOffState;
- Generic_OnOffStatus.RemainingTime = Generic_OnOffParam.Transition_Time;
-
- Generic_TemporaryStatus.RemainingTime = Generic_OnOffStatus.RemainingTime;
+ /* 3.1.1.1 Binary state transitions: Because binary states cannot support transitions,
+ when changing to 0x01 (On), the Generic OnOff state shall change immediately
+ when the transition starts, and when changing to 0x00, the state shall
+ change when the transition finishes.*/
+ if(pOnOff_param[0] == 1)
+ {
+ Generic_OnOffStatus[pmsgParam->elementIndex].Present_OnOff_State = pOnOff_param[0];
+ }
+ Generic_OnOffStatus[pmsgParam->elementIndex].Target_OnOff = Generic_OnOffParam.TargetOnOffState;
+ Generic_OnOffStatus[pmsgParam->elementIndex].RemainingTime = Generic_OnOffParam.Transition_Time;
+
+ Generic_TemporaryStatus[pmsgParam->elementIndex].RemainingTime = Generic_OnOffStatus[pmsgParam->elementIndex].RemainingTime;
/* Function to calculate time parameters, step resolution
step size for transition state machine
*/
- Generic_GetStepValue(pOnOff_param[2]);
- /*option parameter flag, enable to sent all required parameter in status.*/
- Generic_ModelFlag.GenericOptionalParam = 1;
+ Generic_GetStepValue(pOnOff_param[2], pmsgParam->elementIndex);
+ /*option parameter flag, enable to send optional parameters in status.*/
+ Generic_ModelFlag[pmsgParam->elementIndex].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
+ Generic_ModelFlag[pmsgParam->elementIndex].GenericTransitionFlag = GENERIC_ON_OFF_TRANSITION_START;
+ /* flag is used for the application to get the information about the transition
time parameter is included or not in the received message.
*/
- OptionalValid = IN_TRANSITION;
+ OptionalParam = IN_TRANSITION;
}
else
{
+ Generic_OnOffStatus[pmsgParam->elementIndex].Present_OnOff_State = Generic_OnOffParam.TargetOnOffState;
+
/* when default transition time enabled,and the target time is not given by client
the transition time will be used from default value
*/
#ifdef ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
- Generic_OnOffDefaultTransitionValue();
- OptionalValid = DEFAULT_TRANSITION;
+ Generic_OnOffDefaultTransitionValue(pmsgParam->elementIndex);
+/* EME BEGIN: management of Present_OnOff_Value and Target_OnOff on immediate transition */
+ if(Generic_TimeParam[pmsgParam->elementIndex].StepValue == 0)
+ {
+ /* Immediate transition */
+ if(Generic_OnOffStatus[pmsgParam->elementIndex].Present_OnOff_State > 0)
+ {
+ Generic_OnOffStatus[pmsgParam->elementIndex].Present_OnOff_Value = PWM_TIME_PERIOD;
+ Generic_OnOffStatus[pmsgParam->elementIndex].Target_OnOff = PWM_TIME_PERIOD;
+ }
+ else
+ {
+ Generic_OnOffStatus[pmsgParam->elementIndex].Present_OnOff_Value = 0;
+ Generic_OnOffStatus[pmsgParam->elementIndex].Target_OnOff = 0;
+ }
+ Generic_OnOffStatus[pmsgParam->elementIndex].RemainingTime = Generic_OnOffParam.Transition_Time;
+ }
+/* EME END: management of Present_OnOff_Value and Target_OnOff on immediate transition */
#else
/* When no optional parameter received, target value will be set as present
value in application.
*/
- OptionalValid = NO_TRANSITION;
+ OptionalParam = NO_TRANSITION;
+ Generic_ModelFlag[pmsgParam->elementIndex].GenericTransitionFlag = GENERIC_TRANSITION_STOP;
#endif
+
+ Generic_OnOffStatus[pmsgParam->elementIndex].Present_OnOff_State = Generic_OnOffParam.TargetOnOffState;
}
- Generic_OnOffStatus.Present_OnOff_State = Generic_OnOffParam.TargetOnOffState;
- /* Application Callback */
- (GenericAppli_cb.OnOff_Set_cb)(&Generic_OnOffStatus, OptionalValid);
+
+ /* Application Callback */
+ (GenericAppli_cb.OnOff_Set_cb)(&Generic_OnOffStatus[pmsgParam->elementIndex], OptionalParam, pmsgParam->dst_peer, pmsgParam->elementIndex);
#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_OnOffStatus);
+ /* Binding of data b/w Generic on off and Light lightness Actual model */
+ GenericOnOff_LightActualBinding(&Generic_OnOffStatus[pmsgParam->elementIndex],pmsgParam->elementIndex);
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
- GenericOnOff_Light_LC_Binding(&Generic_OnOffStatus);
+ //todo
+ Binding_GenericOnOff_LightLcLightOnOff(pmsgParam->elementIndex,
+ Generic_OnOffParam.TargetOnOffState,
+ 0, 0, 0);//todo transition parameters
#endif
#endif
-
- return MOBLE_RESULT_SUCCESS;
+
+ return MOBLE_RESULT_SUCCESS;
}
@@ -264,9 +312,14 @@ MOBLE_RESULT Generic_OnOff_Set(MOBLEUINT8 const *pOnOff_param, MOBLEUINT32 lengt
* @brief Generic_OnOff_Status
* @param pOnoff_status: Pointer to the status message, which needs to be updated
* @param plength: Pointer to the Length of the Status message
+* @param dstPeer: *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
+
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Generic_OnOff_Status(MOBLEUINT8* pOnOff_status, MOBLEUINT32 *plength)
+MOBLE_RESULT Generic_OnOff_Status(MOBLEUINT8* pOnOff_status,
+ MOBLEUINT32 *plength,
+ MODEL_MessageHeader_t *pmsgParam)
{
/*
Following is the status message:
@@ -275,34 +328,37 @@ MOBLE_RESULT Generic_OnOff_Status(MOBLEUINT8* pOnOff_status, MOBLEUINT32 *plengt
Remaining Time is transition time.
*/
- TRACE_M(TF_GENERIC_M, "Generic_OnOff_Status callback received \r\n");
+ TRACE_M(TF_GENERIC_M, ">>>\r\n");
TRACE_M(TF_SERIAL_CTRL,"#8201! \n\r");
- /*
+ /*
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
+ if((Generic_ModelFlag[pmsgParam->elementIndex].GenericOptionalParam == 1) || (Generic_TimeParam[pmsgParam->elementIndex].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;
+ TRACE_M(TF_GENERIC_M, "Generic_OnOff_Status sent with Transition \r\n");
+
+ *(pOnOff_status+1) = Generic_OnOffStatus[pmsgParam->elementIndex].Target_OnOff;
+ *(pOnOff_status+2) = Generic_OnOffStatus[pmsgParam->elementIndex].RemainingTime;
*plength = 3;
- Generic_ModelFlag.GenericOptionalParam = 0;
- }
- 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;
- }
-
- return MOBLE_RESULT_SUCCESS;
+ Generic_ModelFlag[pmsgParam->elementIndex].GenericOptionalParam = 0;
+ }
+ else
+ { /* When no optional parameter received, target value will
+ be sent in status message.
+ length of received data is equal to 2B
+ */
+ TRACE_M(TF_GENERIC_M, "Generic_OnOff_Status sent without Transition \r\n");
+ TRACE_M(TF_GENERIC_M, "%d \r\n",*pOnOff_status);
+ *plength = 1;
+ }
+
+ *pOnOff_status = Generic_OnOffStatus[pmsgParam->elementIndex].Present_OnOff_State;
+ return MOBLE_RESULT_SUCCESS;
}
@@ -311,9 +367,13 @@ MOBLE_RESULT Generic_OnOff_Status(MOBLEUINT8* pOnOff_status, MOBLEUINT32 *plengt
* unacknowledged message
* @param plevel_param: Pointer to the parameters received for message
* @param length: Length of the parameters received for message
+* @param *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Generic_Level_Set(const MOBLEUINT8* plevel_param, MOBLEUINT32 length)
+MOBLE_RESULT Generic_Level_Set(const MOBLEUINT8* plevel_param,
+ MOBLEUINT32 length,
+ MODEL_MessageHeader_t *pmsgParam)
{
/*
3.2.2.2 Generic Level Set
@@ -328,7 +388,7 @@ MOBLE_RESULT Generic_Level_Set(const MOBLEUINT8* plevel_param, MOBLEUINT32 lengt
Generic_LevelParam_t Generic_LevelParam;
MOBLEINT16 setValue;
- Generic_LevelParam.TargetLevel = *(MOBLEUINT16*) plevel_param;
+ Generic_LevelParam.TargetLevel = CopyU8LittleEndienArrayToU16word((MOBLEUINT8*)plevel_param);
Generic_LevelParam.Generic_TID = plevel_param[2];
setValue = Generic_LevelParam.TargetLevel;
@@ -343,47 +403,50 @@ MOBLE_RESULT Generic_Level_Set(const MOBLEUINT8* plevel_param, MOBLEUINT32 lengt
/* Copy the data into status message which needs to be update in
application message.
*/
- Generic_LevelStatus.Target_Level16 = setValue;
- Generic_LevelStatus.RemainingTime = Generic_LevelParam.Transition_Time;
- /* copy status parameters in Temporary parameters for transition
- process.
- */
- Generic_TemporaryStatus.TargetValue16 = Generic_LevelStatus.Target_Level16;
- Generic_TemporaryStatus.RemainingTime = Generic_LevelStatus.RemainingTime;
- /* Function to calculate time parameters, step resolution
- step size for transition state machine
- */
- Generic_GetStepValue(plevel_param[3]);
- /*option parameter flag, enable to sent all required parameter in status.*/
- Generic_ModelFlag.GenericOptionalParam = 1;
- /*transition process enable flag. */
- Generic_ModelFlag.GenericTransitionFlag = GENERIC_LEVEL_TRANSITION_START;
+ Generic_LevelStatus[pmsgParam->elementIndex].Target_Level16 = setValue;
+ Generic_LevelStatus[pmsgParam->elementIndex].RemainingTime = Generic_LevelParam.Transition_Time;
+ /* copy status parameters in Temporary parameters for transition
+ process.
+ */
+ Generic_TemporaryStatus[pmsgParam->elementIndex].TargetValue16 = Generic_LevelStatus[pmsgParam->elementIndex].Target_Level16;
+ Generic_TemporaryStatus[pmsgParam->elementIndex].RemainingTime = Generic_LevelStatus[pmsgParam->elementIndex].RemainingTime;
+ /* Function to calculate time parameters, step resolution
+ step size for transition state machine
+ */
+ Generic_GetStepValue(plevel_param[3], pmsgParam->elementIndex);
+ /*option parameter flag, enable to sent all required parameter in status.*/
+ Generic_ModelFlag[pmsgParam->elementIndex].GenericOptionalParam = 1;
+ /*transition process enable flag. */
+ Generic_ModelFlag[pmsgParam->elementIndex].GenericTransitionFlag = GENERIC_LEVEL_TRANSITION_START;
}
else
{
#ifdef ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
- Generic_LevelDefaultTransitionValue(setValue);
+ Generic_LevelDefaultTransitionValue(pmsgParam->elementIndex, setValue);
+
#else
/* When no optional parameter received, target value will
be set as present value in application.
*/
- Generic_LevelStatus.Present_Level16= setValue;
+ Generic_ModelFlag[pmsgParam->elementIndex].GenericTransitionFlag = GENERIC_TRANSITION_STOP;
+ Generic_LevelStatus[pmsgParam->elementIndex].Present_Level16= setValue;
#endif
}
- Generic_LevelStatus.Last_Present_Level16 = Generic_LevelStatus.Present_Level16;
+ Generic_LevelStatus[pmsgParam->elementIndex].Last_Present_Level16 = Generic_LevelStatus[pmsgParam->elementIndex].Present_Level16;
- /* Application Callback */
- (GenericAppli_cb.Level_Set_cb)(&Generic_LevelStatus, 0);
+ /* Application Callback */
+ (GenericAppli_cb.Level_Set_cb)(&Generic_LevelStatus[pmsgParam->elementIndex], 0, pmsgParam->dst_peer, pmsgParam->elementIndex);
#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);
+ /* Binding of Generic level with light lightnes actual */
+ GenericLevel_LightBinding(&Generic_LevelStatus[pmsgParam->elementIndex],BINDING_GENERIC_LEVEL_SET, pmsgParam->elementIndex);
#endif
#endif /* ENABLE_MODEL_BINDING */
- return MOBLE_RESULT_SUCCESS;
+
+ return MOBLE_RESULT_SUCCESS;
}
@@ -392,9 +455,12 @@ MOBLE_RESULT Generic_Level_Set(const MOBLEUINT8* plevel_param, MOBLEUINT32 lengt
* and unacknowledged message
* @param plevel_param: Pointer to the parameters received for message
* @param length: Length of the parameters received for message
+* @param *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Generic_Delta_Set(const MOBLEUINT8* plevel_param, MOBLEUINT32 length)
+MOBLE_RESULT Generic_Delta_Set(const MOBLEUINT8* plevel_param, MOBLEUINT32 length,\
+ MODEL_MessageHeader_t *pmsgParam)
{
/*
3.2.2.4 Generic Delta Set
@@ -416,8 +482,8 @@ MOBLE_RESULT Generic_Delta_Set(const MOBLEUINT8* plevel_param, MOBLEUINT32 lengt
delta |= (plevel_param[0]);
Generic_DeltaLevelParam.TargetDeltaLevel32 = delta;
- TRACE_M(TF_GENERIC_M,"Generic delta value %.2lx \r\n"
- ,Generic_DeltaLevelParam.TargetDeltaLevel32);
+ TRACE_M(TF_GENERIC_M,"Generic Delta value %.2lx \r\n",
+ Generic_DeltaLevelParam.TargetDeltaLevel32);
Generic_DeltaLevelParam.Generic_TID = plevel_param[4];
/*
@@ -427,73 +493,79 @@ MOBLE_RESULT Generic_Delta_Set(const MOBLEUINT8* plevel_param, MOBLEUINT32 lengt
*/
if((length > 5) && (plevel_param[5] !=0))
{
- Generic_DeltaLevelParam.Transition_Time = plevel_param[5];
- Generic_DeltaLevelParam.Delay_Time = plevel_param[6];
- /* Copy the data into status message which needs to be update in
- application message.
- */
- Generic_LevelStatus.Target_Level16 = Generic_LevelStatus.Present_Level16 +
+ Generic_DeltaLevelParam.Transition_Time = plevel_param[5];
+ Generic_DeltaLevelParam.Delay_Time = plevel_param[6];
+ /* Copy the data into status message which needs to be update in
+ application message.
+ */
+ Generic_LevelStatus[pmsgParam->elementIndex].Target_Level16 = Generic_LevelStatus[pmsgParam->elementIndex].Present_Level16 +
Generic_DeltaLevelParam.TargetDeltaLevel32;
- Generic_LevelStatus.RemainingTime = Generic_DeltaLevelParam.Transition_Time;
+ Generic_LevelStatus[pmsgParam->elementIndex].RemainingTime = Generic_DeltaLevelParam.Transition_Time;
- /* copy status parameters in Temporary parameters for transition
- process.
- */
- Generic_TemporaryStatus.TargetValue16 = Generic_LevelStatus.Target_Level16;
- Generic_TemporaryStatus.RemainingTime = Generic_LevelStatus.RemainingTime;
- /* Function to calculate time parameters, step resolution
- step size for transition state machine.
- */
- Generic_GetStepValue(plevel_param[5]);
+ /* copy status parameters in Temporary parameters for transition
+ process.
+ */
+ Generic_TemporaryStatus[pmsgParam->elementIndex].TargetValue16 = Generic_LevelStatus[pmsgParam->elementIndex].Target_Level16;
+ Generic_TemporaryStatus[pmsgParam->elementIndex].RemainingTime = Generic_LevelStatus[pmsgParam->elementIndex].RemainingTime;
+ /* Function to calculate time parameters, step resolution
+ step size for transition state machine.
+ */
+ Generic_GetStepValue(plevel_param[5], pmsgParam->elementIndex);
- /*option parameter flag, enable to sent all required parameter in status.*/
- Generic_ModelFlag.GenericOptionalParam = 1;
+ /*option parameter flag, enable to sent all required parameter in status.*/
+ Generic_ModelFlag[pmsgParam->elementIndex].GenericOptionalParam = 1;
- /*transition process enable flag. */
- Generic_ModelFlag.GenericTransitionFlag = GENERIC_LEVEL_TRANSITION_START;
+ /*transition process enable flag. */
+ Generic_ModelFlag[pmsgParam->elementIndex].GenericTransitionFlag = GENERIC_LEVEL_TRANSITION_START;
}
else
- {
- if(Generic_LevelStatus.Last_Level_TID == Generic_DeltaLevelParam.Generic_TID)
+ {
+
+ if(Generic_LevelStatus[pmsgParam->elementIndex].Last_Level_TID == Generic_DeltaLevelParam.Generic_TID)
+ {
+ if(Generic_DeltaLevelParam.TargetDeltaLevel32 > Generic_LevelStatus[pmsgParam->elementIndex].Last_delta_level)
{
- 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) ;
- }
+ Generic_LevelStatus[pmsgParam->elementIndex].Present_Level16 += (Generic_DeltaLevelParam.TargetDeltaLevel32
+ - Generic_LevelStatus[pmsgParam->elementIndex].Last_delta_level);
}
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;
- }
+ {
+ Generic_LevelStatus[pmsgParam->elementIndex].Present_Level16 -= (Generic_LevelStatus[pmsgParam->elementIndex].Last_delta_level
+ -Generic_DeltaLevelParam.TargetDeltaLevel32) ;
+ }
}
+ else
+ { /*If TID value is different from the last TID, then new transaction has been started*/
+ Generic_LevelStatus[pmsgParam->elementIndex].Present_Level16 += Generic_DeltaLevelParam.TargetDeltaLevel32;
}
+
+#ifdef ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
+
+ Generic_DeltaDefaultTransitionValue(pmsgParam->elementIndex, delta);
+
+#else
+ /* When no optional parameter received, target value will
+ be set as present value in application.
+ */
+ Generic_ModelFlag[pmsgParam->elementIndex].GenericTransitionFlag = GENERIC_TRANSITION_STOP;
+#endif
+ }
- TRACE_M(TF_GENERIC_M, "Generic Level value %.2x \r\n" ,Generic_LevelStatus.Present_Level16);
+ TRACE_M(TF_GENERIC_M, "Generic Level value %.2x \r\n",
+ Generic_LevelStatus[pmsgParam->elementIndex].Present_Level16);
- Generic_LevelStatus.Last_delta_level = Generic_DeltaLevelParam.TargetDeltaLevel32;
- Generic_LevelStatus.Last_Level_TID = Generic_DeltaLevelParam.Generic_TID;
+ Generic_LevelStatus[pmsgParam->elementIndex].Last_delta_level = Generic_DeltaLevelParam.TargetDeltaLevel32;
+ Generic_LevelStatus[pmsgParam->elementIndex].Last_Level_TID = Generic_DeltaLevelParam.Generic_TID;
- /* Application Callback */
- (GenericAppli_cb.Level_Set_cb)(&Generic_LevelStatus, 0);
+ /* Application Callback */
+ (GenericAppli_cb.Level_Set_cb)(&Generic_LevelStatus[pmsgParam->elementIndex], 0, pmsgParam->dst_peer, pmsgParam->elementIndex);
#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);
+ GenericLevel_LightBinding(&Generic_LevelStatus[pmsgParam->elementIndex],BINDING_GENERIC_LEVEL_SET,pmsgParam->elementIndex);
#endif
#endif
- return MOBLE_RESULT_SUCCESS;
+ return MOBLE_RESULT_SUCCESS;
}
@@ -502,9 +574,13 @@ MOBLE_RESULT Generic_Delta_Set(const MOBLEUINT8* plevel_param, MOBLEUINT32 lengt
* Acknowledged and unacknowledged message
* @param plevel_param: Pointer to the parameters received for message
* @param length: Length of the parameters received for message
+* @param *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Generic_Move_Set(const MOBLEUINT8* plevel_param, MOBLEUINT32 length)
+MOBLE_RESULT Generic_Move_Set(const MOBLEUINT8* plevel_param,
+ MOBLEUINT32 length,
+ MODEL_MessageHeader_t *pmsgParam)
{
/*
3.2.2.6 Generic Level Move Set
@@ -515,53 +591,68 @@ MOBLE_RESULT Generic_Move_Set(const MOBLEUINT8* plevel_param, MOBLEUINT32 length
*/
TRACE_M(TF_GENERIC_M, "Generic_Move_Set callback received \r\n");
- Generic_LevelMoveParam_t Generic_LevelMoveParam;
+ Generic_LevelMoveParam_t Generic_LevelMoveParam;
- Generic_LevelMoveParam.TargetMoveLevel16 = (plevel_param[1] << 8);
- Generic_LevelMoveParam.TargetMoveLevel16 |= (plevel_param[0]);
- Generic_LevelMoveParam.Generic_TID = plevel_param[2];
+ Generic_LevelMoveParam.TargetMoveLevel16 = (plevel_param[1] << 8);
+ Generic_LevelMoveParam.TargetMoveLevel16 |= (plevel_param[0]);
+ Generic_LevelMoveParam.Generic_TID = plevel_param[2];
/* 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];
- /* Copy the data into status message which needs to be update in
- application message.
+ Generic_LevelMoveParam.Transition_Time = plevel_param[3];
+ Generic_LevelMoveParam.Delay_Time = plevel_param[4];
+
+ /* Copy the data into status message which needs to be update in
+ application message.
*/
- Generic_LevelStatus.Target_Level16 = Generic_LevelStatus.Present_Level16 +
- Generic_LevelMoveParam.TargetMoveLevel16;
- Generic_LevelStatus.RemainingTime = Generic_LevelMoveParam.Transition_Time;
- /* Function to calculate time parameters, step resolution
- step size for transition state machine.
- */
- Generic_GetStepValue(plevel_param[3]);
- /*option parameter flag, enable to sent all required parameter in status.*/
- Generic_ModelFlag.GenericOptionalParam = 1;
- /*transition process enable flag. */
- Generic_ModelFlag.GenericTransitionFlag = GENERIC_LEVEL_TRANSITION_START;
+ /* The assumption here is that the move command starts transition with each
+ step of size delta, which terminates only at max or min value */
+ if (Generic_LevelMoveParam.TargetMoveLevel16 <= 0x7FFF)
+ {
+ Generic_LevelStatus[pmsgParam->elementIndex].Target_Level16 = 0x7FFF;
+ }
+ else
+ {
+ Generic_LevelStatus[pmsgParam->elementIndex].Target_Level16 = 0x8000;
+ }
+
+ Generic_LevelStatus[pmsgParam->elementIndex].RemainingTime = UNDEFSTEPVAL;
+
+ /* Function to calculate time parameters, step resolution
+ step size for transition state machine.
+ */
+ Generic_GetStepValue(plevel_param[3], pmsgParam->elementIndex);
+ /* option parameter flag, enable to sent all required parameter in status.*/
+ Generic_ModelFlag[pmsgParam->elementIndex].GenericOptionalParam = 1;
+ /* transition process enable flag. */
+ Generic_ModelFlag[pmsgParam->elementIndex].GenericTransitionFlag = GENERIC_LEVEL_TRANSITION_START;
}
else
{
- if(Generic_LevelStatus.Last_Level_TID == Generic_LevelMoveParam.Generic_TID)
+ Generic_ModelFlag[pmsgParam->elementIndex].GenericTransitionFlag = GENERIC_TRANSITION_STOP;
+ Generic_TimeParam[pmsgParam->elementIndex].StepValue = 0;
+ if(Generic_LevelStatus[pmsgParam->elementIndex].Last_Level_TID == Generic_LevelMoveParam.Generic_TID)
{
- Generic_LevelStatus.Present_Level16 = Generic_LevelStatus.Last_Present_Level16
- + Generic_LevelMoveParam.TargetMoveLevel16;
+ Generic_LevelStatus[pmsgParam->elementIndex].Present_Level16 = Generic_LevelStatus[pmsgParam->elementIndex].Last_Present_Level16
+ + Generic_LevelMoveParam.TargetMoveLevel16;
}
else
{
- Generic_LevelStatus.Present_Level16 += Generic_LevelMoveParam.TargetMoveLevel16;
+
}
- } Generic_LevelStatus.Last_Level_TID = Generic_LevelMoveParam.Generic_TID;
+ }
+
+ Generic_LevelStatus[pmsgParam->elementIndex].Last_Level_TID = Generic_LevelMoveParam.Generic_TID;
- /* Application Callback */
- (GenericAppli_cb.LevelDeltaMove_Set_cb)(&Generic_LevelStatus, 0);
+ /* Application Callback */
+ (GenericAppli_cb.LevelDeltaMove_Set_cb)(&Generic_LevelStatus[pmsgParam->elementIndex], 0, pmsgParam->dst_peer, pmsgParam->elementIndex);
- return MOBLE_RESULT_SUCCESS;
+ return MOBLE_RESULT_SUCCESS;
}
@@ -569,9 +660,13 @@ MOBLE_RESULT Generic_Move_Set(const MOBLEUINT8* plevel_param, MOBLEUINT32 length
* @brief Generic_Level_Status
* @param plevel_status: Pointer to the status message, which needs to be updated
* @param plength: Pointer to the Length of the Status message
+* @param *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Generic_Level_Status(MOBLEUINT8* plevel_status, MOBLEUINT32 *plength)
+MOBLE_RESULT Generic_Level_Status(MOBLEUINT8* plevel_status,
+ MOBLEUINT32 *plength,
+ MODEL_MessageHeader_t *pmsgParam)
{
/*
3.2.2.8 Generic Level Status
@@ -585,26 +680,29 @@ MOBLE_RESULT Generic_Level_Status(MOBLEUINT8* plevel_status, MOBLEUINT32 *plengt
TRACE_M(TF_GENERIC_M, "Generic_Level_Status callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#8205! \n\r");
- /* 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;
- *(plevel_status+1) = Generic_LevelStatus.Present_Level16 >> 8;
- *(plevel_status+2) = Generic_LevelStatus.Target_Level16;
- *(plevel_status+3) = Generic_LevelStatus.Target_Level16 >> 8;
- *(plevel_status+4) = Generic_LevelStatus.RemainingTime;
- *plength = 5;
- Generic_ModelFlag.GenericOptionalParam = 0;
- }
+ /* checking the transition is in process.
+ checking for remaining time is not equal to zero.
+ */
+
+ if((Generic_ModelFlag[pmsgParam->elementIndex].GenericOptionalParam ==1) || (Generic_TimeParam[pmsgParam->elementIndex].StepValue != 0))
+ {
+ TRACE_M(TF_GENERIC_M, "Generic_Level_Status sent with Transition \r\n");
+
+ *(plevel_status+2) = Generic_LevelStatus[pmsgParam->elementIndex].Target_Level16;
+ *(plevel_status+3) = Generic_LevelStatus[pmsgParam->elementIndex].Target_Level16 >> 8;
+ *(plevel_status+4) = Generic_LevelStatus[pmsgParam->elementIndex].RemainingTime;
+ *plength = 5;
+ Generic_ModelFlag[pmsgParam->elementIndex].GenericOptionalParam = 0;
+ }
else
{
- *(plevel_status) = Generic_LevelStatus.Present_Level16;
- *(plevel_status+1) = Generic_LevelStatus.Present_Level16 >> 8;
- *plength = 2;
+ TRACE_M(TF_GENERIC_M, "Generic_Level_Status sent without Transition \r\n");
+ *plength = 2;
}
+ *(plevel_status) = Generic_LevelStatus[pmsgParam->elementIndex].Present_Level16;
+ *(plevel_status+1) = Generic_LevelStatus[pmsgParam->elementIndex].Present_Level16 >> 8;
+ TRACE_M(TF_GENERIC_M, "%d \r\n", Generic_LevelStatus[pmsgParam->elementIndex].Present_Level16);
return MOBLE_RESULT_SUCCESS;
}
@@ -613,32 +711,40 @@ MOBLE_RESULT Generic_Level_Status(MOBLEUINT8* plevel_status, MOBLEUINT32 *plengt
* Acknowledged and unacknowledged message
* @param powerOnOff_param: Pointer to the parameters received for message
* @param length: Length of the parameters received for message
+* @param *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Generic_PowerOnOff_Set(const MOBLEUINT8 *powerOnOff_param , MOBLEUINT32 length)
+MOBLE_RESULT Generic_PowerOnOff_Set(const MOBLEUINT8 *powerOnOff_param , MOBLEUINT32 length,\
+ MODEL_MessageHeader_t *pmsgParam)
{
- /*
+ /*
3.2.4.2 Generic Power On Off Time
Following is the set message:
powerOnOff_param:1B parameter is received to set the power on off model.
*/
TRACE_M(TF_GENERIC_M, "Generic_PowerOnOff_Set callback received \r\n");
-
+ TRACE_M(TF_GENERIC_M,"Generic_PowerOnOff_Set is %d\r\n", powerOnOff_param[0]);
Generic_PowerOnOffParam_t Generic_PowerOnOffParam;
Generic_PowerOnOffParam.PowerOnOffState = powerOnOff_param[0];
/* Application Callback */
- (GenericAppli_cb.GenericPowerOnOff_cb)(&Generic_PowerOnOffParam, length);
- return MOBLE_RESULT_SUCCESS;
+ (GenericAppli_cb.GenericPowerOnOff_cb)(&Generic_PowerOnOffParam, length, pmsgParam->dst_peer,\
+ pmsgParam->elementIndex);
+ return MOBLE_RESULT_SUCCESS;
}
/**
* @brief Generic_PowerOnOff_Status
* @param powerOnOff_status: Pointer to the status message, which needs to be updated
* @param plength: Pointer to the Length of the Status message
+* @param *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Generic_PowerOnOff_Status(MOBLEUINT8 *powerOnOff_status , MOBLEUINT32 *plength)
+MOBLE_RESULT Generic_PowerOnOff_Status(MOBLEUINT8 *powerOnOff_status ,
+ MOBLEUINT32 *plength,
+ MODEL_MessageHeader_t *pmsgParam)
{
/*
3.2.4.4 Generic OnPowerUp Status
@@ -650,43 +756,56 @@ MOBLE_RESULT Generic_PowerOnOff_Status(MOBLEUINT8 *powerOnOff_status , MOBLEUINT
TRACE_M(TF_SERIAL_CTRL,"#8211! \n\r");
/* Function call back to get the values from application*/
- (Appli_GenericState_cb.GetPowerOnOffStatus_cb)(Generic_GetBuff);
+ (Appli_GenericState_cb.GetPowerOnOffStatus_cb)(Generic_GetBuff, pmsgParam->dst_peer,\
+ pmsgParam->elementIndex);
- *(powerOnOff_status) = Generic_GetBuff[0];
- *plength = 1;
+ *(powerOnOff_status) = Generic_GetBuff[0];
+ *plength = 1;
return MOBLE_RESULT_SUCCESS;
}
+
+#ifdef ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
/**
* @brief Generic_DefaultTransitionTime_Set: This function is called for both
* Acknowledged and unacknowledged message
* @param defaultTransition_param: Pointer to the parameters received for message
* @param length: Length of the parameters received for message
+* @param *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Generic_DefaultTransitionTime_Set(const MOBLEUINT8 *defaultTransition_param , MOBLEUINT32 length)
+MOBLE_RESULT Generic_DefaultTransitionTime_Set(const MOBLEUINT8 *defaultTransition_param,
+ MOBLEUINT32 length,
+ MODEL_MessageHeader_t *pmsgParam)
{
- /*
+ /*
3.2.3.2 Generic Default Transition Time Set
Following is the set message:
defaultTime_param:1B parameter is received to set the Default transition time model.
*/
TRACE_M(TF_GENERIC_M, "Generic_DefaultTransitionTime_Set callback received \r\n");
-
+ TRACE_M(TF_GENERIC_M,"Generic_DefaultTransitionTime is = %.2x \r\n", defaultTransition_param[0]);
Generic_DefaultTransitionParam.DefaultTransitionTime = defaultTransition_param[0];
+
/* Application Callback */
- (GenericAppli_cb.GenericDefaultTransition_cb)(&Generic_DefaultTransitionParam, length);
+ (GenericAppli_cb.GenericDefaultTransition_cb)(&Generic_DefaultTransitionParam,
+ length, pmsgParam->dst_peer, pmsgParam->elementIndex);
return MOBLE_RESULT_SUCCESS;
}
+
/**
* @brief Generic_DefaultTransitionTime_Status
* @param pTransition_status: Pointer to the status message, which needs to be updated
* @param plength: Pointer to the Length of the Status message
+* @param *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Generic_DefaultTransitionTime_Status(MOBLEUINT8 *pTransition_status , MOBLEUINT32 *plength)
+MOBLE_RESULT Generic_DefaultTransitionTime_Status(MOBLEUINT8 *pTransition_status,\
+ MOBLEUINT32 *plength, MODEL_MessageHeader_t *pmsgParam)
{
/*
3.2.3.4 Generic Default Transition Time Status
@@ -695,14 +814,22 @@ MOBLE_RESULT Generic_DefaultTransitionTime_Status(MOBLEUINT8 *pTransition_status
*/
MOBLEUINT8 Generic_GetBuff[2] ;
TRACE_M(TF_GENERIC_M, "Generic_DefaultTransitionTime_Status callback received \r\n");
+ TRACE_M(TF_SERIAL_CTRL,"#820D! \n\r");
+
/* Function call back to get the values from application*/
- (Appli_GenericState_cb.GetDefaultTransitionStatus_cb)(Generic_GetBuff);
+ (Appli_GenericState_cb.GetDefaultTransitionStatus_cb)(Generic_GetBuff, pmsgParam->dst_peer,\
+ pmsgParam->elementIndex);
+
+ *(pTransition_status) = Generic_GetBuff[0];
+ *plength = 1;
+
+ TRACE_M(TF_GENERIC_M,"Generic_DefaultTransitionTime_Status = %.2x \r\n", Generic_GetBuff[0]);
- *(pTransition_status) = Generic_GetBuff[0];
- *plength = 1;
return MOBLE_RESULT_SUCCESS;
}
+#endif
+
/**
* @brief GenericModelServer_GetOpcodeTableCb: This function is call-back
@@ -712,7 +839,7 @@ MOBLE_RESULT Generic_DefaultTransitionTime_Status(MOBLEUINT8 *pTransition_status
* @retval MOBLE_RESULT
*/
MOBLE_RESULT GenericModelServer_GetOpcodeTableCb(const MODEL_OpcodeTableParam_t **data,
- MOBLEUINT16 *length)
+ MOBLEUINT16 *length)
{
*data = Generic_Opcodes_Table;
*length = sizeof(Generic_Opcodes_Table)/sizeof(Generic_Opcodes_Table[0]);
@@ -724,9 +851,8 @@ MOBLE_RESULT GenericModelServer_GetOpcodeTableCb(const MODEL_OpcodeTableParam_t
/**
* @brief GenericModelServer_GetStatusRequestCb : This function is call-back
* 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
+* @param *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* @param opcode: Received opcode of the Status message callback
* @param pResponsedata: Pointer to the buffer to be updated with status
* @param plength: Pointer to the Length of the data, to be updated by application
@@ -735,50 +861,49 @@ MOBLE_RESULT GenericModelServer_GetOpcodeTableCb(const MODEL_OpcodeTableParam_t
* @param response: Value to indicate wheather message is acknowledged meassage or not.
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT GenericModelServer_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
- MOBLEUINT16 opcode,
- MOBLEUINT8 *pResponsedata,
- MOBLEUINT32 *plength,
- MOBLEUINT8 const *pRxData,
- MOBLEUINT32 dataLength,
- MOBLEBOOL response)
+MOBLE_RESULT GenericModelServer_GetStatusRequestCb(MODEL_MessageHeader_t *pmsgParam,
+ MOBLEUINT16 opcode,
+ MOBLEUINT8 *pResponsedata,
+ MOBLEUINT32 *plength,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 dataLength,
+ MOBLEBOOL response)
{
TRACE_M(TF_GENERIC_M, "response status enable \n\r");
switch(opcode)
{
#ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF
- case GENERIC_ON_OFF_STATUS:
+ case GENERIC_ON_OFF_STATUS:
{
- Generic_OnOff_Status(pResponsedata, plength);
+ Generic_OnOff_Status(pResponsedata, plength, pmsgParam);
break;
}
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_LEVEL
- case GENERIC_LEVEL_STATUS:
+ case GENERIC_LEVEL_STATUS:
{
- Generic_Level_Status(pResponsedata, plength);
+ Generic_Level_Status(pResponsedata, plength, pmsgParam);
break;
}
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF
- case GENERIC_POWER_ON_OFF_STATUS:
+ case GENERIC_POWER_ON_OFF_STATUS:
{
- Generic_PowerOnOff_Status(pResponsedata, plength);
+ Generic_PowerOnOff_Status(pResponsedata, plength, pmsgParam);
break;
}
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
- case GENERIC_DEFAULT_TRANSITION_TIME_STATUS:
+ case GENERIC_DEFAULT_TRANSITION_TIME_STATUS:
{
- Generic_DefaultTransitionTime_Status(pResponsedata, plength);
+ Generic_DefaultTransitionTime_Status(pResponsedata, plength, pmsgParam);
}
#endif
- default:
+ default:
{
break;
}
@@ -790,76 +915,68 @@ MOBLE_RESULT GenericModelServer_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
/**
* @brief GenericModelServer_ProcessMessageCb: This is a callback function from
* 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
+* @param *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* @param opcode: Received opcode of the Status message callback
-* @param pData: Pointer to the buffer to be updated with status
-* @param length: Length of the parameters received
-* @param response: if TRUE, the message is an acknowledged message
* @param pRxData: Pointer to the data received in packet.
* @param dataLength: length of the data in packet.
-* @param response: Value to indicate wheather message is acknowledged meassage or not.
+* @param response: Value to indicate whether message is acknowledged message or not.
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT GenericModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+MOBLE_RESULT GenericModelServer_ProcessMessageCb(MODEL_MessageHeader_t *pmsgParam,
MOBLEUINT16 opcode,
MOBLEUINT8 const *pRxData,
MOBLEUINT32 dataLength,
- MOBLEBOOL response
- )
+ MOBLEBOOL response)
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
MOBLE_ADDRESS publishAddress;
- MOBLEUINT8 elementNumber;
- MOBLEUINT8 modelStateChangeFlag = MOBLE_FALSE;
- MOBLE_ADDRESS my_Address;
- Model_Rx_Opcode = opcode;
+ MOBLEUINT8 modelStateChangeFlag = MOBLE_FALSE;
- my_Address = BLEMesh_GetAddress();
- Dst_Peer = dst_peer;
-
- TRACE_M(TF_GENERIC_M,"dst_peer = %.2X , peer_add = %.2X, opcode= %.2X ,response= %.2X \r\n ",
- dst_peer, peer_addr, opcode , response);
+ TRACE_M(TF_GENERIC_M, "elementIndex %.2x dst_peer %.2X peer_add %.2X opcode %.2X response %.2X\r\n",
+ pmsgParam->elementIndex, pmsgParam->dst_peer, pmsgParam->peer_addr, opcode, response);
+
switch(opcode)
{
#ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF
case GENERIC_ON_OFF_SET_ACK:
case GENERIC_ON_OFF_SET_UNACK:
- {
- result = Chk_ParamValidity(pRxData[0], 1);
- /* 3.1.1 Generic OnOff 0x02–0xFF Prohibited */
- /* 3.2.1.2 Generic OnOff Set If the Transition Time field is present,
- the Delay field shall also be present; otherwise these fields shall
- not be present*/
+ {
+ result = Chk_ParamValidity(pRxData[0], 1);
+ /* 3.1.1 Generic OnOff 0x02–0xFF Prohibited */
+ /* 3.2.1.2 Generic OnOff Set If the Transition Time field is present,
+ the Delay field shall also be present; otherwise these fields shall
+ not be present*/
- /* 3.2.1.2 Generic OnOff Set
- Check if Transition Time field is present or Not,
- If present, Only values of 0x00 through 0x3E shall be used to specify
- the value of the Transition Number of Steps field. */
+ /* 3.2.1.2 Generic OnOff Set
+ Check if Transition Time field is present or Not,
+ If present, Only values of 0x00 through 0x3E shall be used to specify
+ the value of the Transition Number of Steps field. */
- result |= Chk_OptionalParamValidity (dataLength, 2, (pRxData[2]&0x3F), 0x3E );
-
- if(result == MOBLE_RESULT_SUCCESS)
- {
+ result |= Chk_OptionalParamValidity (dataLength, 2, (pRxData[2]&0x3F), 0x3E );
+
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
/* when device is working as proxy and is a part of node
- delay is included in LED toggle */
- if(!MOBLE_FAILED(result = Chk_TidValidity(peer_addr,dst_peer,pRxData[1])))
- {
- Generic_OnOff_Set(pRxData,dataLength);
- Model_ID = (MOBLEUINT16)GENERIC_MODEL_SERVER_ONOFF_MODEL_ID;
- modelStateChangeFlag = MOBLE_TRUE;
- }
+ delay is included in LED toggle */
+ if(!MOBLE_FAILED(result = Chk_TidValidity(pmsgParam->peer_addr,\
+ pmsgParam->dst_peer, pRxData[1])))
+ {
+ Generic_OnOff_Set(pRxData, dataLength, pmsgParam);
+ Model_Binding_Var.Model_ID = (MOBLEUINT16)GENERIC_ONOFF_SERVER_MODEL_ID;
+ Model_Binding_Var.Model_Rx_Opcode = opcode;
+ modelStateChangeFlag = MOBLE_TRUE;
+ Model_Binding_Var.Dst_Peer = pmsgParam->dst_peer;
}
-
- break;
}
- case GENERIC_ON_OFF_STATUS:
+
+ break;
+ }
+ case GENERIC_ON_OFF_STATUS:
{
- Generic_Client_OnOff_Status(pRxData,dataLength);
+ Generic_Client_OnOff_Status(pRxData,dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
#endif
@@ -868,109 +985,121 @@ MOBLE_RESULT GenericModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
case GENERIC_LEVEL_SET_ACK:
case GENERIC_LEVEL_SET_UNACK:
- {
+ {
result = Chk_ParamMinMaxIntValidity(INT16_MIN ,pRxData , INT16_MAX );
- if(result == MOBLE_RESULT_SUCCESS)
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ if(!MOBLE_FAILED(result = Chk_TidValidity(pmsgParam->peer_addr,
+ pmsgParam->dst_peer,
+ pRxData[2])))
{
- 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;
- modelStateChangeFlag = MOBLE_TRUE;
- }
+ Generic_Level_Set(pRxData, dataLength, pmsgParam);
+ Model_Binding_Var.Model_ID = (MOBLEUINT16)GENERIC_LEVEL_SERVER_MODEL_ID;
+ Model_Binding_Var.Model_Rx_Opcode = opcode;
+ modelStateChangeFlag = MOBLE_TRUE;
+ Model_Binding_Var.Dst_Peer = pmsgParam->dst_peer;
+ }
}
- break;
- }
+ break;
+ }
- case GENERIC_DELTA_SET:
- case GENERIC_DELTA_SET_UNACK:
- {
- /*
+ case GENERIC_DELTA_SET:
+ case GENERIC_DELTA_SET_UNACK:
+ {
+ /*
Delta Level 4 The Delta change of the Generic Level state
TID 1 Transaction Identifier
Transition Time 1 Format as defined in Section 3.1.3. (Optional)
Delay 1 Message execution delay in 5 milliseconds steps (C.1)
- */
- Generic_Delta_Set(pRxData,dataLength);
- Model_ID = (MOBLEUINT16)GENERIC_MODEL_SERVER_LEVEL_MODEL_ID;
- modelStateChangeFlag = MOBLE_TRUE;
- break;
- }
+ */
+ Generic_Delta_Set(pRxData,dataLength, pmsgParam);
+ Model_Binding_Var.Model_ID = (MOBLEUINT16)GENERIC_LEVEL_SERVER_MODEL_ID;
+ Model_Binding_Var.Model_Rx_Opcode = opcode;
+ modelStateChangeFlag = MOBLE_TRUE;
+ Model_Binding_Var.Dst_Peer = pmsgParam->dst_peer;
+ break;
+ }
- case GENERIC_MOVE_SET:
- case GENERIC_MOVE_SET_UNACK:
- {
+ case GENERIC_MOVE_SET:
+ case GENERIC_MOVE_SET_UNACK:
+ {
result = Chk_ParamMinMaxIntValidity(INT16_MIN ,pRxData , INT16_MAX );
- if(result == MOBLE_RESULT_SUCCESS)
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ if(!MOBLE_FAILED(result = Chk_TidValidity(pmsgParam->peer_addr,
+ pmsgParam->dst_peer,
+ pRxData[2])))
{
- if(!MOBLE_FAILED(result = Chk_TidValidity(peer_addr,dst_peer,pRxData[2])))
- {
- Generic_Move_Set(pRxData, dataLength);
+ Generic_Move_Set(pRxData, dataLength, pmsgParam);
+ Model_Binding_Var.Dst_Peer = pmsgParam->dst_peer;
}
}
- break;
- }
- case GENERIC_LEVEL_STATUS:
+ break;
+ }
+ case GENERIC_LEVEL_STATUS:
{
- Generic_Client_Level_Status(pRxData,dataLength);
+ Generic_Client_Level_Status(pRxData,dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF
- case GENERIC_POWER_ON_OFF_SET:
- case GENERIC_POWER_ON_OFF_SET_UNACK:
+ case GENERIC_POWER_ON_OFF_SET:
+ case GENERIC_POWER_ON_OFF_SET_UNACK:
{
result = Chk_ParamValidity(pRxData[0], GENERIC_POWER_RESTORE_STATE);
if(result == MOBLE_RESULT_SUCCESS)
{
- Generic_PowerOnOff_Set(pRxData, dataLength);
- Model_ID = (MOBLEUINT16)GENERIC_MODEL_SERVER_POWER_ONOFF_MODEL_ID;
- modelStateChangeFlag = MOBLE_TRUE;
+ Generic_PowerOnOff_Set(pRxData, dataLength, pmsgParam);
+ Model_Binding_Var.Model_ID = (MOBLEUINT16)GENERIC_SERVER_POWER_ONOFF_MODEL_ID;
+ Model_Binding_Var.Model_Rx_Opcode = opcode;
+ modelStateChangeFlag = MOBLE_TRUE;
}
break;
}
- case GENERIC_POWER_ON_OFF_STATUS:
+ case GENERIC_POWER_ON_OFF_STATUS:
{
- Generic_Client_PowerOnOff_Status(pRxData,dataLength);
+ Generic_Client_PowerOnOff_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
- case GENERIC_DEFAULT_TRANSITION_TIME_SET:
- case GENERIC_DEFAULT_TRANSITION_TIME_SET_UNACK:
+ case GENERIC_DEFAULT_TRANSITION_TIME_SET:
+ case GENERIC_DEFAULT_TRANSITION_TIME_SET_UNACK:
{
result = Chk_ParamValidity(pRxData[0], TRANSITION_MAX_VALID_RANGE);
if(result == MOBLE_RESULT_SUCCESS)
{
- Generic_DefaultTransitionTime_Set(pRxData, dataLength);
- Model_ID = (MOBLEUINT16)GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID;
+ Generic_DefaultTransitionTime_Set(pRxData, dataLength, pmsgParam);
+ Model_Binding_Var.Model_ID = (MOBLEUINT16)GENERIC_DEFAULT_TRANSITION_TIME_SERVER_MODEL_ID;
modelStateChangeFlag = MOBLE_TRUE;
}
break;
}
- case GENERIC_DEFAULT_TRANSITION_TIME_STATUS:
+ case GENERIC_DEFAULT_TRANSITION_TIME_STATUS:
{
- Generic_Client_DefaultTransitionTime_Status(pRxData, dataLength);
+ Generic_Client_DefaultTransitionTime_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
#endif
- default:
+ default:
{
break;
}
} /* Switch ends */
-
- if((result == MOBLE_RESULT_SUCCESS) && (response == MOBLE_TRUE) && (ADDRESS_IS_UNICAST(dst_peer)))
+
+ if((result == MOBLE_RESULT_SUCCESS) &&
+ (response == MOBLE_TRUE) &&
+ (ADDRESS_IS_UNICAST(pmsgParam->dst_peer)))
{
- Model_SendResponse(peer_addr,my_Address,opcode,pRxData,dataLength);
+ Model_SendResponse(pmsgParam, opcode, pRxData, dataLength);
}
/*
@@ -979,13 +1108,15 @@ MOBLE_RESULT GenericModelServer_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);
+ publishAddress = BLEMesh_GetPublishAddress(pmsgParam->elementIndex, Model_Binding_Var.Model_ID);
- if((result == MOBLE_RESULT_SUCCESS) && (publishAddress != 0x0000) && (modelStateChangeFlag == MOBLE_TRUE)
- && (ADDRESS_IS_UNICAST(dst_peer)))
+ if((result == MOBLE_RESULT_SUCCESS) &&
+ (publishAddress != 0x0000) &&
+ (modelStateChangeFlag == MOBLE_TRUE) &&
+ (ADDRESS_IS_UNICAST(pmsgParam->dst_peer)))
{
- Model_SendResponse(publishAddress,my_Address,opcode,pRxData,dataLength);
+ pmsgParam->peer_addr = publishAddress;
+ Model_SendResponse(pmsgParam, opcode, pRxData, dataLength);
modelStateChangeFlag = MOBLE_FALSE;
TRACE_I(TF_GENERIC_M,"Publishing state when change to the address %.2X \r\n",publishAddress);
@@ -998,9 +1129,12 @@ MOBLE_RESULT GenericModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
* used for the Generic On Off model when transition time is received in
* message.
* @param GetValue Pointer of the array
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Generic_TransitionBehaviour(MOBLEUINT8 *GetValue)
+MOBLE_RESULT Generic_TransitionBehaviour(MOBLEUINT8 *GetValue,
+ MOBLEUINT8 elementIndex)
{
static MOBLEUINT8 Clockflag = 0;
@@ -1014,63 +1148,68 @@ MOBLE_RESULT Generic_TransitionBehaviour(MOBLEUINT8 *GetValue)
Check_time = Clock_Time();
Clockflag = 1;
}
- /* Values from application are copied into Temporary vaiables for processing */
+ /* 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)
+ Generic_TemporaryStatus[elementIndex].PresentValue16 = GetValue[1] << 8;
+ Generic_TemporaryStatus[elementIndex].PresentValue16 |= GetValue[0];
+ /* if condition to wait untill the time is equal to the given resolution time */
+ if(((Clock_Time()- Check_time) >= Generic_TimeParam[elementIndex].Res_Value))
+ {
+ if(Generic_TimeParam[elementIndex].StepValue == 0)
+ {
+ Generic_TimeParam[elementIndex].StepValue = 1;
+ }
+
+ if(Generic_TemporaryStatus[elementIndex].TargetValue16 > Generic_TemporaryStatus[elementIndex].PresentValue16)
{
- Generic_OnOffStatus.Present_OnOff_State = 1;
+ Generic_OnOffStatus[elementIndex].Present_OnOff_State = 1;
/* 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;
+ targetRange =
+ Generic_TemporaryStatus[elementIndex].TargetValue16 - Generic_TemporaryStatus[elementIndex].PresentValue16;
+
+ /* target slot = time to cover in single step */
+ targetSlot = targetRange / Generic_TimeParam[elementIndex].StepValue;
/* target slot added to present value to achieve target value */
- Generic_TemporaryStatus.PresentValue16 += targetSlot;
+ Generic_TemporaryStatus[elementIndex].PresentValue16 += targetSlot;
}
- else if(Generic_TemporaryStatus.TargetValue16 < Generic_TemporaryStatus.PresentValue16)
+ else if(Generic_TemporaryStatus[elementIndex].TargetValue16 < Generic_TemporaryStatus[elementIndex].PresentValue16)
{
- Generic_OnOffStatus.Present_OnOff_State = 0;
+ Generic_OnOffStatus[elementIndex].Present_OnOff_State = 0;
/* 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;
+ targetRange = Generic_TemporaryStatus[elementIndex].PresentValue16 - Generic_TemporaryStatus[elementIndex].TargetValue16;
+ /* target slot = time to cover in single step */
+ targetSlot = targetRange / Generic_TimeParam[elementIndex].StepValue;
+ /* target slot = time to cover in single step */
+ Generic_TemporaryStatus[elementIndex].PresentValue16 -= targetSlot;
}
else
{
}
- 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;
+ Generic_TimeParam[elementIndex].StepValue--;
+ /* updating the remaining time after each step covered*/
+ Generic_TemporaryStatus[elementIndex].RemainingTime = Generic_TimeParam[elementIndex].StepValue | (Generic_TimeParam[elementIndex].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_ModelFlag.Generic_Trnsn_Cmplt = MOBLE_TRUE;
- }
- TRACE_M(TF_GENERIC_M,"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);
+ /* when transition is completed, disable the transition by disabling
+ transition flag
+ */
+ if(Generic_TimeParam[elementIndex].StepValue <= 0)
+ {
+ if((Generic_OnOffStatus[elementIndex].Present_OnOff_State == 1) && (Generic_OnOffStatus[elementIndex].Target_OnOff == 0))
+ {
+ Generic_OnOffStatus[elementIndex].Present_OnOff_State=0;
+ }
+ Generic_ModelFlag[elementIndex].GenericTransitionFlag = GENERIC_TRANSITION_STOP;
+ Generic_ModelFlag[elementIndex].Generic_Trnsn_Cmplt = MOBLE_TRUE;
}
-return MOBLE_RESULT_SUCCESS;
+ TRACE_M(TF_GENERIC_M, "Inside virtual application at %d, Current state 0x%.2x, Target state 0x%.2x, Remaining Time 0x%.2x \n\r",
+ Clock_Time(), Generic_TemporaryStatus[elementIndex].PresentValue16,Generic_TemporaryStatus[elementIndex].TargetValue16,Generic_TemporaryStatus[elementIndex].RemainingTime);
+ }
+ return MOBLE_RESULT_SUCCESS;
}
@@ -1078,31 +1217,34 @@ return MOBLE_RESULT_SUCCESS;
/**
* @brief Generic_GetStepValue: This function calculates values for transition time
* @param stepParam: Transition time set value of particular model message.
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* retval void
*/
-void Generic_GetStepValue(MOBLEUINT8 stepParam)
+void Generic_GetStepValue(MOBLEUINT8 stepParam,
+ MOBLEUINT8 elementIndex)
{
/*
- Two MSB bit of transition time is dedicated to resolution.
- 00 = resolution is 100 ms.
- 01 = resolution is 1000 ms.
- 10 = resolution is 10000 ms.
- 11 = resolution is 600000 ms.
+ Two MSB bit of transition time is dedicated to resolution.
+ 00 = resolution is 100 ms.
+ 01 = resolution is 1000 ms.
+ 10 = resolution is 10000 ms.
+ 11 = resolution is 600000 ms.
Last bits from 0 to 5th index is step number.
*/
- Generic_TimeParam.ResBitValue = stepParam >> 6 ;
- Generic_TimeParam.Res_Value = Get_StepResolutionValue(Generic_TimeParam.ResBitValue);
- Generic_TimeParam.StepValue = stepParam & 0x3F ;
+ Generic_TimeParam[elementIndex].ResBitValue = stepParam >> 6 ;
+ Generic_TimeParam[elementIndex].Res_Value = Get_StepResolutionValue(Generic_TimeParam[elementIndex].ResBitValue);
+ Generic_TimeParam[elementIndex].StepValue = stepParam & 0x3F ;
- if(Generic_TimeParam.Res_Value >= 100)
+ if(Generic_TimeParam[elementIndex].Res_Value >= 100)
{
- Generic_TimeParam.Res_Value = Generic_TimeParam.Res_Value/TRANSITION_SCALER;
- Generic_TimeParam.StepValue = (Generic_TimeParam.StepValue * TRANSITION_SCALER);
+ Generic_TimeParam[elementIndex].Res_Value = Generic_TimeParam[elementIndex].Res_Value/TRANSITION_SCALER;
+ Generic_TimeParam[elementIndex].StepValue = (Generic_TimeParam[elementIndex].StepValue * TRANSITION_SCALER);
}
- TRACE_M(TF_GENERIC_M," step resolution 0x%.2lx, number of step 0x%.2x \r\n",
- Generic_TimeParam.Res_Value , Generic_TimeParam.StepValue );
+ TRACE_M(TF_GENERIC_M," step resolution 0x%.2x, number of step 0x%.2x \r\n",
+ Generic_TimeParam[elementIndex].Res_Value , Generic_TimeParam[elementIndex].StepValue );
}
@@ -1115,68 +1257,79 @@ void Generic_GetStepValue(MOBLEUINT8 stepParam)
void Generic_Process(void)
{
MOBLE_ADDRESS publishAddress;
- MOBLE_ADDRESS my_Address;
- MOBLEUINT8 elementNumber;
+ MOBLE_ADDRESS my_Address = BLEMesh_GetAddress();
+ MOBLEUINT8 elementIndex;
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];
+ MOBLEUINT8 Generic_GetBuff[8];
#endif
+ for(elementIndex = 0; elementIndex < APPLICATION_NUMBER_OF_ELEMENTS; elementIndex++)
+ {
+ my_Address = my_Address+elementIndex;
#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_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;
- }
- }
+ if(Generic_ModelFlag[elementIndex].GenericTransitionFlag == GENERIC_ON_OFF_TRANSITION_START)
+ {
+ /* Fetching the state value from the applcation layer to middle layer */
+ (Appli_GenericState_cb.GetOnOffValue_cb)(Generic_GetBuff, my_Address, elementIndex);
+
+ Generic_TemporaryStatus[elementIndex].TargetValue16 = Generic_GetBuff[3] << 8;
+ Generic_TemporaryStatus[elementIndex].TargetValue16 |= Generic_GetBuff[2];
+
+ /* Transition function called to change the state in transition */
+ Generic_TransitionBehaviour(Generic_GetBuff, elementIndex);
+ if(GenericUpdateFlag == VALUE_UPDATE_SET)
+ {
+ /* updating the state value after the each transition step complete */
+ Generic_OnOffStateUpdate_Process(elementIndex);
+ /* Application callback */
+ (GenericAppli_cb.OnOff_Set_cb)(&Generic_OnOffStatus[elementIndex], OptionalParam, my_Address, elementIndex);
+ /*binding of the generic on off with light model */
+ GenericOnOff_LightActualBinding(&Generic_OnOffStatus[elementIndex],elementIndex);
+ GenericUpdateFlag = VALUE_UPDATE_RESET;
+ }
+ }
#endif
#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);
- /* 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;
- }
-
- }
+ if(Generic_ModelFlag[elementIndex].GenericTransitionFlag == GENERIC_LEVEL_TRANSITION_START)
+ {
+ /* Fetching the state value from the applcation layer to middle layer */
+ (Appli_GenericState_cb.GetLevelStatus_cb)(Generic_GetBuff, my_Address, elementIndex);
+ /* Transition function called to change the state in transition */
+ Generic_TransitionBehaviour(Generic_GetBuff, elementIndex);
+ if(GenericUpdateFlag == VALUE_UPDATE_SET)
+ {
+ /* updating the state value after the each transition step complete */
+ Generic_LevelStateUpdate_Process(elementIndex);
+ /* Application callback */
+ (GenericAppli_cb.Level_Set_cb)(&Generic_LevelStatus[elementIndex], 0, my_Address, elementIndex);
+ /*binding of the generic Level with light model */
+ GenericLevel_LightBinding(&Generic_LevelStatus[elementIndex],BINDING_GENERIC_LEVEL_SET,elementIndex);
+ GenericUpdateFlag = VALUE_UPDATE_RESET;
+ }
+
+ }
#endif
- 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,my_Address,Model_Rx_Opcode,pRxData,dataLength);
+ if(Generic_ModelFlag[elementIndex].Generic_Trnsn_Cmplt == MOBLE_TRUE)
+ {
+ publishAddress = BLEMesh_GetPublishAddress(elementIndex,Model_Binding_Var.Model_ID);
+ if((publishAddress != 0x00))
+ {
+
+ MODEL_MessageHeader_t msgHdr;
+ msgHdr.dst_peer = my_Address;
+ msgHdr.elementIndex = elementIndex;
+ msgHdr.peer_addr = publishAddress;
+ Model_SendResponse(&msgHdr, Model_Binding_Var.Model_Rx_Opcode, pRxData, dataLength);
+ TRACE_M(TF_LIGHT_M, "Publishing the status after transition complete opcode %.2x model id %.2x \r\n",
+ Model_Binding_Var.Model_Rx_Opcode,Model_Binding_Var.Model_ID);
+ }
+ Generic_ModelFlag[elementIndex].Generic_Trnsn_Cmplt = MOBLE_FALSE;
}
- Generic_ModelFlag.Generic_Trnsn_Cmplt = MOBLE_FALSE;
}
}
@@ -1189,7 +1342,7 @@ void Generic_Process(void)
*/
void Generic_Publish(MOBLE_ADDRESS srcAddress)
{
- MOBLEUINT8 generic_Buff[2];
+ MOBLEUINT8 generic_Buff[2];
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
/* changes the LED status on other nodes in the network */
@@ -1201,56 +1354,58 @@ void Generic_Publish(MOBLE_ADDRESS srcAddress)
{
generic_Buff[0] = APPLI_LED_ON;
}
- generic_Buff[1] = TidSend;
+ generic_Buff[1] = Model_Tid.TidSend;
- result = BLEMesh_SetRemotePublication(GENERIC_MODEL_SERVER_ONOFF_MODEL_ID, srcAddress ,
- GENERIC_ON_OFF_SET_UNACK,
- generic_Buff, 2,
- MOBLE_FALSE, MOBLE_FALSE);
- TidSend++;
- if(TidSend >= MAX_TID_VALUE)
+ result = BLEMesh_SetRemotePublication(GENERIC_ONOFF_SERVER_MODEL_ID,
+ srcAddress ,
+ GENERIC_ON_OFF_SET_UNACK,
+ generic_Buff, 2,
+ MOBLE_FALSE, MOBLE_FALSE);
+ Model_Tid.TidSend++;
+ if(Model_Tid.TidSend >= MAX_TID_VALUE)
{
- TidSend = 0;
+ Model_Tid.TidSend = 0;
}
if(result)
{
TRACE_M(TF_GENERIC_M, "Publication Error \r\n");
}
- CommandStatus = generic_Buff[0];
+ CommandStatus = generic_Buff[0];
}
/**
-* @brief GenericOnOffStateUpdate_Process:Function to update the parametes of
+* @brief Generic_OnOffStateUpdate_Process:Function to update the parametes of
* Generic On Off model in application file from Temporary parameter in model file.
* @param void
* return MOBLE_RESULT.
*/
-MOBLE_RESULT GenericOnOffStateUpdate_Process(void)
+MOBLE_RESULT Generic_OnOffStateUpdate_Process(MOBLEUINT8 elementIndex)
{
- Generic_OnOffStatus.Present_OnOff_Value = Generic_TemporaryStatus.PresentValue16;
- Generic_OnOffStatus.RemainingTime = Generic_TemporaryStatus.RemainingTime;
+ Generic_OnOffStatus[elementIndex].Present_OnOff_Value = Generic_TemporaryStatus[elementIndex].PresentValue16;
+ Generic_OnOffStatus[elementIndex].RemainingTime = Generic_TemporaryStatus[elementIndex].RemainingTime;
return MOBLE_RESULT_SUCCESS;
}
/**
-* @brief GenericLevelStateUpdate_Process:function to update the parametes of Generic
+* @brief Generic_LevelStateUpdate_Process:function to update the parametes of Generic
* Level model in application file from Temporary parameter in model file.
* @param void
* return MOBLE_RESULT.
*/
-MOBLE_RESULT GenericLevelStateUpdate_Process(void)
+MOBLE_RESULT Generic_LevelStateUpdate_Process(MOBLEUINT8 elementIndex)
{
- Generic_LevelStatus.Present_Level16 = Generic_TemporaryStatus.PresentValue16;
- Generic_LevelStatus.Target_Level16 = Generic_TemporaryStatus.TargetValue16;
- Generic_LevelStatus.RemainingTime = Generic_TemporaryStatus.RemainingTime;
+ Generic_LevelStatus[elementIndex].Present_Level16 = Generic_TemporaryStatus[elementIndex].PresentValue16;
+ Generic_LevelStatus[elementIndex].Target_Level16 = Generic_TemporaryStatus[elementIndex].TargetValue16;
+ Generic_LevelStatus[elementIndex].RemainingTime = Generic_TemporaryStatus[elementIndex].RemainingTime;
return MOBLE_RESULT_SUCCESS;
}
+
/**
* @brief LightActual_GenericOnOffBinding: Reverse Data binding b/w Generic On Off and
* light lightness Actual. this function will set the On Off status of
@@ -1258,27 +1413,31 @@ MOBLE_RESULT GenericLevelStateUpdate_Process(void)
* @param lightActual: used to select the binding and reverse binding
* return void.
*/
-void LightActual_GenericOnOffBinding(Light_LightnessStatus_t* lightActual)
+void LightActual_GenericOnOffBinding(Light_LightnessStatus_t* lightActual,
+ MOBLEUINT8 elementIndex)
{
/*
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
*/
+
if(lightActual->LightnessPresentValue16 == 0x00)
{
- Generic_OnOffStatus.Present_OnOff_State = 0x00;
+ Generic_OnOffStatus[elementIndex].Present_OnOff_State = 0x00;
}
else
{
- Generic_OnOffStatus.Present_OnOff_State = 0x01;
+ Generic_OnOffStatus[elementIndex].Present_OnOff_State = 0x01;
}
- TRACE_M(TF_LIGHT_M, "LightActual_GenericOnOffBinding Function - Present OnOff value 0x%.2x \r\n"
- , Generic_OnOffStatus.Present_OnOff_State);
+ TRACE_M(TF_LIGHT_M,
+ "Light Actual binding with Generic On Off - Present OnOff value 0x%.2x \r\n",
+ Generic_OnOffStatus[elementIndex].Present_OnOff_State);
}
+
/**
* @brief LightActual_GenericLevelBinding: Data binding b/w Generic Level and
* light lightness Actual. this function will set the actual light lightness
@@ -1286,17 +1445,20 @@ void LightActual_GenericOnOffBinding(Light_LightnessStatus_t* lightActual)
* @param lightActual: Pointer to the data which needs to be checked.
* return void.
*/
-void LightActual_GenericLevelBinding(Light_LightnessStatus_t* lightActual)
+void LightActual_GenericLevelBinding(Light_LightnessStatus_t* lightActual,
+ MOBLEUINT8 elementIndex)
{
/*
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;
+
+ Generic_LevelStatus[elementIndex].Present_Level16 = lightActual->LightnessPresentValue16 - 32768;
- TRACE_M(TF_LIGHT_M, "LightActual_GenericLevelBinding Function - Present Level value 0x%.2x \r\n"
- , Generic_LevelStatus.Present_Level16);
+ TRACE_M(TF_LIGHT_M,
+ "Light Actual binding with Generic Level - Present Level value 0x%.2x \r\n",
+ Generic_LevelStatus[elementIndex].Present_Level16);
}
@@ -1308,7 +1470,8 @@ void LightActual_GenericLevelBinding(Light_LightnessStatus_t* lightActual)
* @param bCtlTempParam: Pointer to the data which needs to be checked.
* return void.
*/
-void Light_CtlTemp_GenericLevelBinding(Light_CtlStatus_t* bCtlTempParam)
+void Light_CtlTemp_GenericLevelBinding(Light_CtlStatus_t* bCtlTempParam,
+ MOBLEUINT8 elementIndex)
{
/* 6.1.3.1.1 Binding with the Generic Level state.
Generic Level = (Light CTL Temperature - T _MIN) * 65535 / (T_MAX - T_MIN) - 32768
@@ -1316,11 +1479,13 @@ void Light_CtlTemp_GenericLevelBinding(Light_CtlStatus_t* bCtlTempParam)
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;
+ TRACE_M(TF_GENERIC_M, "\r\n ******** PresentCtlTemperature16 = %ld, ********\r\n\r\n", bCtlTempParam->PresentCtlTemperature16);
+ TRACE_M(TF_GENERIC_M, "\r\n ******** productValue = %ld, ********\r\n\r\n", productValue);
- GenericLevel_LightBinding(&Generic_LevelStatus , BINDING_LIGHT_CTL_TEMP_SET);
+ Generic_LevelStatus[elementIndex].Present_Level16 = (MOBLEINT16)(round((productValue / (float)(MAX_CTL_TEMP_RANGE - MIN_CTL_TEMP_RANGE))) - 32768);
+ TRACE_M(TF_GENERIC_M, "\r\n ********, Present Level value %d ********\r\n\r\n" ,Generic_LevelStatus[elementIndex].Present_Level16);
+ GenericLevel_LightBinding(&Generic_LevelStatus[elementIndex] , BINDING_LIGHT_CTL_TEMP_SET,elementIndex);
}
/**
@@ -1330,16 +1495,18 @@ void Light_CtlTemp_GenericLevelBinding(Light_CtlStatus_t* bCtlTempParam)
* @param bHslHueParam: Pointer to the data which needs to be checked.
* return void.
*/
-void Light_HslHue_GenericLevelBinding(Light_HslStatus_t* bHslHueParam)
+void Light_HslHue_GenericLevelBinding(Light_HslStatus_t* bHslHueParam,
+ MOBLEUINT8 elementIndex)
{
/* 6.1.4.1.1 Binding with the Generic Level state
Generic Level = Light HSL Hue – 32768
*/
- Generic_LevelStatus.Present_Level16 = bHslHueParam->PresentHslHueLightness16- 32768;
+ Generic_LevelStatus[elementIndex].Present_Level16 = (MOBLEINT16)(bHslHueParam->PresentHslHueLightness16 - 32768);
- GenericLevel_LightBinding(&Generic_LevelStatus , BINDIG_LIGHT_HSL_HUE_SET);
+ GenericLevel_LightBinding(&Generic_LevelStatus[elementIndex], BINDING_LIGHT_HSL_HUE_SET, elementIndex);
}
+
/**
* @brief Light_HslSaturation_GenericLevelBinding: Data binding b/w Generic Level and
* light Hsl . this function will set the Generic Level
@@ -1347,176 +1514,315 @@ void Light_HslHue_GenericLevelBinding(Light_HslStatus_t* bHslHueParam)
* @param bHslSatParam: Pointer to the data which needs to be checked.
* return void.
*/
-void Light_HslSaturation_GenericLevelBinding(Light_HslStatus_t* bHslSatParam)
+void Light_HslSaturation_GenericLevelBinding(Light_HslStatus_t* bHslSatParam,
+ MOBLEUINT8 elementIndex)
{
/* 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);
+ Generic_LevelStatus[elementIndex].Present_Level16 = (MOBLEINT16)(bHslSatParam->PresentHslSaturation16 - 32768);
+
+ GenericLevel_LightBinding(&Generic_LevelStatus[elementIndex], BINDING_LIGHT_HSL_SATURATION_SET, elementIndex);
}
+
+#ifdef ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
/**
-* @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
+* @brief function to assign the Pwm value to the target value of the generic on off
+* saved states.
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return void.
*/
-void Light_LC_GenericOnOffBinding(Light_LC_Param_t* light_LC)
+void Generic_OnOffDefaultTransitionValue(MOBLEUINT8 elementIndex)
+
{
- if(light_LC->Present_Light_OnOff == 0x00)
+ Generic_GetStepValue((MOBLEUINT8)Generic_DefaultTransitionParam.DefaultTransitionTime, elementIndex);
+ TRACE_M(TF_GENERIC_M, "Generic_OnOff_DefaultTransition StepValue is = %.2x \r\n", Generic_TimeParam[elementIndex].StepValue);
+
+ if(Generic_TimeParam[elementIndex].StepValue != 0x00)
{
- Generic_OnOffStatus.Present_OnOff_State = 0x00;
+ Generic_TemporaryStatus[elementIndex].RemainingTime = Generic_DefaultTransitionParam.DefaultTransitionTime;
+ Generic_ModelFlag[elementIndex].GenericOptionalParam = 1;
+ Generic_ModelFlag[elementIndex].GenericTransitionFlag = GENERIC_ON_OFF_TRANSITION_START;
+ OptionalParam = DEFAULT_TRANSITION;
}
else
{
- Generic_OnOffStatus.Present_OnOff_State = 0x01;
+ Generic_TimeParam[elementIndex].StepValue = 0;
+ Generic_ModelFlag[elementIndex].GenericOptionalParam = 0;
+ OptionalParam = NO_TRANSITION;
+ Generic_ModelFlag[elementIndex].GenericTransitionFlag = GENERIC_TRANSITION_STOP;
}
+
}
-
+
+
/**
-* @brief function to assign the Pwm value to the target value of the generic on off
-* saved states.
-* @param void:
+* @brief function called in generic level when the default transition time is enabled.
+* @param levelValue: generic level target value
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return void.
*/
-void Generic_OnOffDefaultTransitionValue(void)
+void Generic_LevelDefaultTransitionValue(MOBLEUINT8 elementIndex, MOBLEUINT16 levelValue)
{
- Generic_TemporaryStatus.RemainingTime = Generic_DefaultTransitionParam.DefaultTransitionTime;
- Generic_GetStepValue((MOBLEUINT8)Generic_DefaultTransitionParam.DefaultTransitionTime);
- Generic_ModelFlag.GenericTransitionFlag = GENERIC_ON_OFF_TRANSITION_START;
- Generic_ModelFlag.GenericOptionalParam = 1;
+ Generic_GetStepValue((MOBLEUINT8)Generic_DefaultTransitionParam.DefaultTransitionTime, elementIndex);
+ TRACE_M(TF_GENERIC_M, "Generic_Level_DefaultTransition StepValue is =%.2x \r\n", Generic_TimeParam[elementIndex].StepValue);
+
+ if(Generic_TimeParam[elementIndex].StepValue != 0x00){
+ Generic_TemporaryStatus[elementIndex].TargetValue16 = levelValue;
+ Generic_TemporaryStatus[elementIndex].RemainingTime = Generic_DefaultTransitionParam.DefaultTransitionTime;
+ Generic_ModelFlag[elementIndex].GenericTransitionFlag = GENERIC_LEVEL_TRANSITION_START;
+ Generic_ModelFlag[elementIndex].GenericOptionalParam = 1;
+ }
+ else{
+ Generic_TimeParam[elementIndex].StepValue = 0;
+ Generic_ModelFlag[elementIndex].GenericOptionalParam = 0;
+ Generic_LevelStatus[elementIndex].Present_Level16= levelValue;
+ Generic_ModelFlag[elementIndex].GenericTransitionFlag = GENERIC_TRANSITION_STOP;
+ }
}
+
/**
-* @brief function called in generic level when the default transition time is enabled.
-* @param levelValue: generic level target value
+* @brief function called in generic delta when the default transition time is enabled.
+* @param deltaValue: generic delta value
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return void.
*/
-void Generic_LevelDefaultTransitionValue(MOBLEUINT16 levelValue)
+void Generic_DeltaDefaultTransitionValue(MOBLEUINT8 elementIndex, MOBLEUINT32 deltaValue)
+{
+ Generic_GetStepValue((MOBLEUINT8)Generic_DefaultTransitionParam.DefaultTransitionTime, elementIndex);
+ TRACE_M(TF_GENERIC_M, "Generic_Delta_DefaultTransition StepValue is =%.2x \r\n", Generic_TimeParam[elementIndex].StepValue);
+
+ if(Generic_TimeParam[elementIndex].StepValue != 0x00){
+
+ Generic_TemporaryStatus[elementIndex].TargetValue16 = Generic_LevelStatus[elementIndex].Present_Level16 +
+ deltaValue;
+ Generic_TemporaryStatus[elementIndex].RemainingTime = Generic_DefaultTransitionParam.DefaultTransitionTime;
+ Generic_ModelFlag[elementIndex].GenericTransitionFlag = GENERIC_LEVEL_TRANSITION_START;
+ Generic_ModelFlag[elementIndex].GenericOptionalParam = 1;
+ }
+ else{
+ Generic_TimeParam[elementIndex].StepValue = 0;
+ Generic_ModelFlag[elementIndex].GenericOptionalParam = 0;
+ Generic_ModelFlag[elementIndex].GenericTransitionFlag = GENERIC_TRANSITION_STOP;
+ }
+}
+#endif
+
+
+/**
+ * @brief
+ * @param
+ * @retval
+ */
+void Generic_OnOffUpdate(MOBLEUINT8 elementIndex, MOBLEUINT8 onOff)
{
- Generic_TemporaryStatus.TargetValue16 = levelValue;
- Generic_TemporaryStatus.RemainingTime = Generic_DefaultTransitionParam.DefaultTransitionTime;
- Generic_GetStepValue((MOBLEUINT8)Generic_DefaultTransitionParam.DefaultTransitionTime);
- Generic_ModelFlag.GenericTransitionFlag = GENERIC_LEVEL_TRANSITION_START;
- Generic_ModelFlag.GenericOptionalParam = 1;
+ Generic_OnOffStatus[elementIndex].Present_OnOff_State = onOff;
+
+ //status publish
+ //to review implementation
+ BLEMesh_SetRemotePublication(GENERIC_ONOFF_SERVER_MODEL_ID,
+ BLEMesh_GetAddress() + elementIndex,
+ (MOBLEUINT16)GENERIC_ON_OFF_STATUS,
+ &Generic_OnOffStatus[elementIndex].Present_OnOff_State,
+ 1,
+ MOBLE_FALSE,
+ MOBLE_FALSE);
}
+
+
+
/**
* @brief Generic_Client_OnOff_Status: Function called when status of the model
* received on the client.
-* @param pOnOff_status: ointer to the parameters received for message
+* @param pOnOff_status: Pointer to the parameters received for message
* @param plength: Length of the parameters received for message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return MOBLE_RESULT_SUCCESS.
*/
-MOBLE_RESULT Generic_Client_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUINT32 plength)
+MOBLE_RESULT Generic_Client_OnOff_Status(MOBLEUINT8 const *pOnOff_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_GENERIC_CLIENT_M, "Generic_OnOff_Status received \r\n");
- GenericAppli_cb.OnOff_Status_cb(pOnOff_status , plength);
+ TRACE_M(TF_GENERIC_CLIENT_M, ">>>\r\n");
+ GenericAppli_cb.OnOff_Status_cb(pOnOff_status , plength, dstPeer, elementIndex);
return MOBLE_RESULT_SUCCESS;
}
+
/**
* @brief Generic_Client_Level_Status: Function called when status of the model
* received on the client.
* @param plevel_status: ointer to the parameters received for message
* @param plength: Length of the parameters received for message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return MOBLE_RESULT_SUCCESS.
*/
-MOBLE_RESULT Generic_Client_Level_Status(MOBLEUINT8 const *plevel_status, MOBLEUINT32 plength)
+MOBLE_RESULT Generic_Client_Level_Status(MOBLEUINT8 const *plevel_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_GENERIC_CLIENT_M, "Generic_Level_Status received \r\n");
- GenericAppli_cb.Level_Status_cb(plevel_status , plength);
+ TRACE_M(TF_GENERIC_CLIENT_M, "Generic_Client_Level_Status received \r\n");
+ GenericAppli_cb.Level_Status_cb(plevel_status , plength, dstPeer, elementIndex);
return MOBLE_RESULT_SUCCESS;
}
+
/**
* @brief Generic_Client_PowerOnOff_Status: Function called when status of the model
* received on the client.
* @param powerOnOff_status: ointer to the parameters received for message
* @param plength: Length of the parameters received for message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return MOBLE_RESULT_SUCCESS.
*/
-MOBLE_RESULT Generic_Client_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status , MOBLEUINT32 plength)
+MOBLE_RESULT Generic_Client_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
TRACE_M(TF_GENERIC_CLIENT_M, "Generic_PowerOnOff_Status received \r\n");
- GenericAppli_cb.GenericPowerOnOff_Status_cb(powerOnOff_status, plength);
+ GenericAppli_cb.GenericPowerOnOff_Status_cb(powerOnOff_status,
+ plength, dstPeer,
+ elementIndex);
return MOBLE_RESULT_SUCCESS;
}
+
/**
* @brief Generic_Client_DefaultTransitionTime_Status: Function called when status of the model
* received on the client.
* @param pTransition_status: ointer to the parameters received for message
* @param plength: Length of the parameters received for message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return MOBLE_RESULT_SUCCESS.
*/
-MOBLE_RESULT Generic_Client_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status , MOBLEUINT32 plength)
+MOBLE_RESULT Generic_Client_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_GENERIC_CLIENT_M, "Generic_DefaultTransitionTime_Status received \r\n");
- GenericAppli_cb.GenericDefaultTransition_Status_cb(pTransition_status, plength);
+ TRACE_M(TF_GENERIC_CLIENT_M, "Generic_Client_DefaultTransitionTime_Status received \r\n");
+ GenericAppli_cb.GenericDefaultTransition_Status_cb(pTransition_status,
+ plength,
+ dstPeer,
+ elementIndex);
return MOBLE_RESULT_SUCCESS;
}
+
/**
* Weak function are defined to support the original function if they are not
included in firmware.
There is no use of this function for application development purpose.
*/
WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t* pGeneric_OnOffParam,
- MOBLEUINT8 OptionalValid))
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t* plevelParam,
- MOBLEUINT8 OptionalValid))
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t* pdeltalevelParam,
- MOBLEUINT8 OptionalValid))
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
- MOBLEUINT8 OptionalValid))
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_PowerOnOff_Set(Generic_PowerOnOffParam_t* pPowerOnOffParam,
- MOBLEUINT8 OptionalValid))
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
-WEAK_FUNCTION (void Appli_Generic_Restore_PowerOn_Value(MOBLEUINT8 restoreValue))
+WEAK_FUNCTION (void Appli_Generic_Restore_PowerOn_Value(MOBLEUINT8 restoreValue,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{}
WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Set(Generic_DefaultTransitionParam_t* pDefaultTimeParam,
- MOBLEUINT8 OptionalValid))
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
-
-WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUINT32 plength))
+WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status,
+ MOBLEUINT32 plength,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
-WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_Level_Status(MOBLEUINT8 const *plevel_status, MOBLEUINT32 plength))
+WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_Level_Status(MOBLEUINT8 const *plevel_status,
+ MOBLEUINT32 plength,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
-WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status , MOBLEUINT32 plength))
+WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status,
+ MOBLEUINT32 plength,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
-WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status , MOBLEUINT32 plength))
+WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status,
+ MOBLEUINT32 plength,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
-WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_GetOnOffStatus(MOBLEUINT8* pOnOff_Status))
+WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_GetOnOffStatus(MOBLEUINT8* pOnOff_Status,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{return MOBLE_RESULT_SUCCESS;}
-WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_GetOnOffValue(MOBLEUINT8* pOnOff_Value) )
+WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_GetOnOffValue(MOBLEUINT8* pOnOff_Value,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{return MOBLE_RESULT_SUCCESS;}
-WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_GetLevelStatus(MOBLEUINT8* pLevel_Status))
+WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_GetLevelStatus(MOBLEUINT8* pLevel_Status,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{return MOBLE_RESULT_SUCCESS;}
-WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_GetPowerOnOffStatus(MOBLEUINT8* pPower_Status))
+WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_GetPowerOnOffStatus(MOBLEUINT8* pPower_Status,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{return MOBLE_RESULT_SUCCESS;}
-WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_Status))
+WEAK_FUNCTION (MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_Status,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{return MOBLE_RESULT_SUCCESS;}
WEAK_FUNCTION(MOBLE_RESULT Appli_GenericClient_Level_Set_Unack(void))
{return MOBLE_RESULT_SUCCESS;}
@@ -1529,5 +1835,5 @@ WEAK_FUNCTION(MOBLE_RESULT Appli_GenericClient_Level_Set_Unack(void))
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
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 014bfc90c..3708cb4c2 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
@@ -39,18 +39,41 @@
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
-extern MOBLEUINT8 TidSend;
+extern Model_Tid_t Model_Tid;;
const MODEL_OpcodeTableParam_t Generic_Client_Opcodes_Table[] = {
/* Generic OnOff Client */
- /* MOBLEUINT32 opcode, MOBLEBOOL reliable, MOBLEUINT16 min_payload_size,
- MOBLEUINT16 max_payload_size;
- Here in this array, Handler is not defined; */
+/* model_id opcode, reliable, min_payload_size, max_payload_size, response_opcode, min_response_size, max_response_size
+ Here in this array, Handler is not defined; */
#ifdef ENABLE_GENERIC_MODEL_CLIENT_ONOFF
- {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_CLIENT_LEVEL_MODEL_ID ,GENERIC_LEVEL_STATUS, MOBLE_FALSE, 2, 5, 0 , 2 , 5},
-#endif
+ {GENERIC_ONOFF_CLIENT_MODEL_ID, GENERIC_ON_OFF_GET, MOBLE_TRUE, 0, 0, GENERIC_ON_OFF_STATUS, 1, 3},
+ {GENERIC_ONOFF_CLIENT_MODEL_ID, GENERIC_ON_OFF_SET_ACK, MOBLE_TRUE, 2, 4, GENERIC_ON_OFF_STATUS, 1, 3},
+ {GENERIC_ONOFF_CLIENT_MODEL_ID, GENERIC_ON_OFF_SET_UNACK, MOBLE_FALSE, 2, 4, GENERIC_ON_OFF_STATUS, 1, 3},
+ {GENERIC_ONOFF_CLIENT_MODEL_ID, GENERIC_ON_OFF_STATUS, MOBLE_FALSE, 1, 3, 0, 1, 3},
+#endif
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_LEVEL
+ /* Generic Level Server */
+ {GENERIC_LEVEL_CLIENT_MODEL_ID, GENERIC_LEVEL_GET, MOBLE_TRUE, 0, 0, GENERIC_LEVEL_STATUS, 2, 5},
+ {GENERIC_LEVEL_CLIENT_MODEL_ID, GENERIC_LEVEL_SET_ACK, MOBLE_TRUE, 3, 5, GENERIC_LEVEL_STATUS, 2, 5},
+ {GENERIC_LEVEL_CLIENT_MODEL_ID, GENERIC_LEVEL_SET_UNACK, MOBLE_FALSE, 3, 5, GENERIC_LEVEL_STATUS, 2, 5},
+ {GENERIC_LEVEL_CLIENT_MODEL_ID, GENERIC_DELTA_SET, MOBLE_TRUE, 5, 7, GENERIC_LEVEL_STATUS, 2, 5},
+ {GENERIC_LEVEL_CLIENT_MODEL_ID, GENERIC_DELTA_SET_UNACK, MOBLE_FALSE, 5, 7, GENERIC_LEVEL_STATUS, 2, 5},
+ {GENERIC_LEVEL_CLIENT_MODEL_ID, GENERIC_MOVE_SET, MOBLE_TRUE, 3, 5, GENERIC_LEVEL_STATUS, 2, 5},
+ {GENERIC_LEVEL_CLIENT_MODEL_ID, GENERIC_MOVE_SET_UNACK, MOBLE_FALSE, 3, 5, GENERIC_LEVEL_STATUS, 2, 5},
+ {GENERIC_LEVEL_CLIENT_MODEL_ID, GENERIC_LEVEL_STATUS, MOBLE_FALSE, 2, 5, 0, 2, 5},
+#endif
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_POWER_ONOFF
+ {GENERIC_POWER_ONOFF_CLIENT_MODEL_ID, GENERIC_POWER_ON_OFF_GET , MOBLE_TRUE, 0, 0, GENERIC_POWER_ON_OFF_STATUS, 1, 1},
+ {GENERIC_POWER_ONOFF_CLIENT_MODEL_ID, GENERIC_POWER_ON_OFF_SET, MOBLE_TRUE, 1, 1, GENERIC_POWER_ON_OFF_STATUS, 1, 1},
+ {GENERIC_POWER_ONOFF_CLIENT_MODEL_ID, GENERIC_POWER_ON_OFF_SET_UNACK, MOBLE_FALSE, 1, 1, 0, 1, 1},
+ {GENERIC_POWER_ONOFF_CLIENT_MODEL_ID, GENERIC_POWER_ON_OFF_STATUS , MOBLE_FALSE, 1, 1, 0, 1, 1},
+#endif
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_DEFAULT_TRANSITION_TIME
+ /* Generic Default Transition Time Server Model */
+ {GENERIC_DEFAULT_TRANSITION_TIME_CLIENT_MODEL_ID, GENERIC_DEFAULT_TRANSITION_TIME_GET, MOBLE_TRUE, 0, 0, GENERIC_DEFAULT_TRANSITION_TIME_STATUS, 1, 1},
+ {GENERIC_DEFAULT_TRANSITION_TIME_CLIENT_MODEL_ID, GENERIC_DEFAULT_TRANSITION_TIME_SET, MOBLE_TRUE, 1, 1, GENERIC_DEFAULT_TRANSITION_TIME_STATUS, 1, 1},
+ {GENERIC_DEFAULT_TRANSITION_TIME_CLIENT_MODEL_ID, GENERIC_DEFAULT_TRANSITION_TIME_SET_UNACK, MOBLE_FALSE, 1, 1, GENERIC_DEFAULT_TRANSITION_TIME_STATUS, 1 , 1},
+ {GENERIC_DEFAULT_TRANSITION_TIME_CLIENT_MODEL_ID, GENERIC_DEFAULT_TRANSITION_TIME_STATUS, MOBLE_FALSE, 1, 1, 0, 1, 1},
+#endif
{0}
};
@@ -71,14 +94,54 @@ WEAK_FUNCTION (void Appli_Generic_Restore_PowerOn_Value(MOBLEUINT8 restoreValue)
/* Private functions ---------------------------------------------------------*/
+
+/******************************************************************************/
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_ONOFF
+/******************************************************************************/
/**
-* @brief Generic_OnOff_Set: This function is called for Acknowledged message
+* @brief GenericClient_OnOff_Get: This function is called to send Generic OnOff Get message
+* @param elementIndex : Index of the element
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT GenericClient_OnOff_Get(MOBLEUINT8 elementIndex)
+
+{
+ /* 3.2.1.1 Generic OnOff Get
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 msg_opcode;
+ MOBLEUINT8 const *msg_buff = NULL;
+ MOBLEBOOL ack_flag = MOBLE_FALSE;
+
+ TRACE_M(TF_GENERIC_CLIENT_M, "GenericClient_OnOff_Get Client Message \r\n");
+
+ msg_opcode = GENERIC_ON_OFF_GET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) GENERIC_ONOFF_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, 0,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_GENERIC_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief GenericClient_OnOff_Set_Ack: This function is called to send Generic OnOff Set message Acknowledged
+* @param elementIndex : Index of the element
* @param pOnOff_param: Pointer to the parameters received for message
* @param length: Length of the parameters received for message
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT GenericClient_OnOff_Set(MOBLE_ADDRESS element_number,
- _Generic_OnOffParam *pOnOff_param,
+MOBLE_RESULT GenericClient_OnOff_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pOnOff_param,
MOBLEUINT32 length)
{
@@ -94,22 +157,29 @@ MOBLE_RESULT GenericClient_OnOff_Set(MOBLE_ADDRESS element_number,
MOBLEUINT16 msg_opcode;
MOBLEBOOL ack_flag;
- TRACE_M(TF_GENERIC_CLIENT_M, "Generic_OnOff_Set Client Message \r\n");
-
- msg_buff = pOnOff_param->a_OnOff_param;
+ TRACE_M(TF_GENERIC_CLIENT_M, "GenericClient_OnOff_Set Client Message \r\n");
+ pOnOff_param[1] = Model_Tid.TidSend;
+ msg_buff = pOnOff_param;
ack_flag = MOBLE_TRUE;
msg_opcode = GENERIC_ON_OFF_SET_ACK;
- /*
- Manage the TID Here....
- */
- result = MeshClient_SetRemotePublication((MOBLEUINT32) GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
- element_number ,
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) GENERIC_ONOFF_CLIENT_MODEL_ID,
+ elementIndex ,
msg_opcode ,
msg_buff, length,
ack_flag,
MOBLE_FALSE);
+
+ /*
+ Manage the TID
+ */
+ Model_Tid.TidSend++;
+ if(Model_Tid.TidSend >= MAX_TID_VALUE)
+ {
+ Model_Tid.TidSend = 0;
+ }
+
if(result)
{
TRACE_M(TF_GENERIC_CLIENT_M, "Publication Error \r\n");
@@ -120,18 +190,19 @@ MOBLE_RESULT GenericClient_OnOff_Set(MOBLE_ADDRESS element_number,
/**
-* @brief GenericClient_OnOff_Set_Unack: This function is called for unacknowledged message
+* @brief GenericClient_OnOff_Set_Unack: This function is called to send Generic OnOff Set message UnAcknowledged
+* @param elementIndex : Index of the element
* @param pOnOff_param: Pointer to the parameters received for message
* @param length: Length of the parameters received for message
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT GenericClient_OnOff_Set_Unack(MOBLE_ADDRESS element_number,
- _Generic_OnOffParam *pOnOff_param,
+MOBLE_RESULT GenericClient_OnOff_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pOnOff_param,
MOBLEUINT32 length)
{
- /* 3.2.1.2 Generic OnOff Set unack
+ /* 3.2.1.3 Generic OnOff Set unack
OnOff: 1B The target value of the Generic OnOff state
TID : 1B Transaction Identifier
Transition Time: 1B Format as defined in Section 3.1.3. (Optional)
@@ -143,25 +214,26 @@ MOBLE_RESULT GenericClient_OnOff_Set_Unack(MOBLE_ADDRESS element_number,
MOBLEBOOL ack_flag;
TRACE_M(TF_GENERIC_CLIENT_M, "Generic_OnOff_Set Client Message \r\n");
- pOnOff_param->a_OnOff_param[1] = TidSend;
- msg_buff = pOnOff_param->a_OnOff_param;
+ pOnOff_param[1] = Model_Tid.TidSend;
+ msg_buff = pOnOff_param;
ack_flag = MOBLE_FALSE;
msg_opcode = GENERIC_ON_OFF_SET_UNACK;
- /*
- Manage the TID Here....
- */
- result = MeshClient_SetRemotePublication((MOBLEUINT32) GENERIC_MODEL_CLIENT_ONOFF_MODEL_ID,
- element_number ,
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) GENERIC_ONOFF_CLIENT_MODEL_ID,
+ elementIndex,
msg_opcode ,
msg_buff, length,
ack_flag,
MOBLE_FALSE);
- TidSend++;
- if(TidSend >= MAX_TID_VALUE)
+
+ /*
+ Manage the TID
+ */
+ Model_Tid.TidSend++;
+ if(Model_Tid.TidSend >= MAX_TID_VALUE)
{
- TidSend = 0;
+ Model_Tid.TidSend = 0;
}
if(result)
@@ -171,21 +243,63 @@ MOBLE_RESULT GenericClient_OnOff_Set_Unack(MOBLE_ADDRESS element_number,
return result;
}
+/******************************************************************************/
+#endif /// ENABLE_GENERIC_MODEL_CLIENT_ONOFF
+/******************************************************************************/
+
+
+/******************************************************************************/
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_LEVEL
+/******************************************************************************/
+/**
+* @brief GenericClient_Level_Get: This function is called to send Generic Level Get
+* @param elementIndex : Index of the element
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT GenericClient_Level_Get(MOBLEUINT8 elementIndex)
+
+{
+ /*
+ 3.2.2.1 Generic Level Get
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 msg_opcode;
+ MOBLEUINT8 const *msg_buff = NULL;
+ MOBLEBOOL ack_flag = MOBLE_FALSE;
+
+ TRACE_M(TF_GENERIC_CLIENT_M, "GenericClient_Level_Get Client Message \r\n");
+
+ msg_opcode = GENERIC_LEVEL_GET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) GENERIC_LEVEL_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, 0,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_GENERIC_CLIENT_M, "Publication Error \r\n");
+ }
+ return result;
+}
/**
-* @brief GenericClient_Level_Set_unack: This function is called for Acknowledged
-* @param plevel_paramr: Pointer to the parameters received for message
+* @brief GenericClient_Level_Set_Ack: This function is called to send Generic Level Set message Acknowledged
+* @param elementIndex : Index of the element
+* @param plevel_param: Pointer to the parameters received for message
* @param length: Length of the parameters received for message
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT GenericClient_Level_Set_Unack(MOBLE_ADDRESS element_number,
- _Generic_LevelParam *plevel_param,
+MOBLE_RESULT GenericClient_Level_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *plevel_param,
MOBLEUINT32 length)
{
/*
- 3.2.2.2 Generic Level Set unack
+ 3.2.2.2 Generic Level Set
Level: 2B The target value of the Generic Level state
TID : 1B Transaction Identifier
Transition Time: 1B Format as defined in Section 3.1.3. (Optional)
@@ -196,26 +310,234 @@ MOBLE_RESULT GenericClient_Level_Set_Unack(MOBLE_ADDRESS element_number,
MOBLEUINT16 msg_opcode;
MOBLEBOOL ack_flag;
- TRACE_M(TF_GENERIC_CLIENT_M, "Generic_Level_Set Client Message \r\n");
- plevel_param->a_Level_param[2] = TidSend;
- msg_buff = plevel_param->a_Level_param;
+ TRACE_M(TF_GENERIC_CLIENT_M, "GenericClient_Level_Set Client Message \r\n");
+ plevel_param[2] = Model_Tid.TidSend;
+ msg_buff = plevel_param;
ack_flag = MOBLE_TRUE;
+ msg_opcode = GENERIC_LEVEL_SET_ACK;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) GENERIC_LEVEL_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+ /*
+ Manage the TID
+ */
+ Model_Tid.TidSend++;
+ if(Model_Tid.TidSend >= MAX_TID_VALUE)
+ {
+ Model_Tid.TidSend = 0;
+ }
+ if(result)
+ {
+ TRACE_M(TF_GENERIC_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+/**
+* @brief GenericClient_Level_Set_Unack: This function is called to send Generic Level Set message UnAcknowledged
+* @param elementIndex: Index of the element
+* @param plevel_param: Pointer to the parameters received for message
+* @param length: Length of the parameters received for message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT GenericClient_Level_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8* plevel_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 3.2.2.3 Generic Level Set unack
+ Level: 2B The target value 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)
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_GENERIC_CLIENT_M, "GenericClient_Level_Set Client Message \r\n");
+ plevel_param[2] = Model_Tid.TidSend;
+ msg_buff = plevel_param;
+ ack_flag = MOBLE_FALSE;
msg_opcode = GENERIC_LEVEL_SET_UNACK;
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) GENERIC_LEVEL_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+ /*
+ Manage the TID
+ */
+ Model_Tid.TidSend++;
+ if(Model_Tid.TidSend >= MAX_TID_VALUE)
+ {
+ Model_Tid.TidSend = 0;
+ }
+ if(result)
+ {
+ TRACE_M(TF_GENERIC_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief GenericClient_Delta_Set_Ack: This function is called to send Generic Delta Level Set message UnAcknowledged
+* @param elementIndex : Index of the element
+* @param pdeltalevel_param: Pointer to the parameters message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT GenericClient_Delta_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pdeltalevel_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 3.2.2.4 Generic Delta Level 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)
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_GENERIC_CLIENT_M, "GenericClient_Delta_Set Client Message \r\n");
+ pdeltalevel_param[4] = Model_Tid.TidSend;
+ msg_buff = pdeltalevel_param;
+ ack_flag = MOBLE_TRUE;
+ msg_opcode = GENERIC_DELTA_SET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) GENERIC_LEVEL_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+ /*
+ Manage the TID
+ */
+ Model_Tid.TidSend++;
+ if(Model_Tid.TidSend >= MAX_TID_VALUE)
+ {
+ Model_Tid.TidSend = 0;
+ }
+ if(result)
+ {
+ TRACE_M(TF_GENERIC_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+/**
+* @brief GenericClient_Delta_Set_Unack: This function is called to send Generic Delta Level Set message UnAcknowledged
+* @param elementIndex : Index of the element
+* @param pdeltalevel_param: Pointer to the parameters message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT GenericClient_Delta_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pdeltalevel_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 3.2.2.5 Generic Delta Level Set UnAcnowedged
+ 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)
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_GENERIC_CLIENT_M, "GenericClient_Delta_Set Client Message \r\n");
+ pdeltalevel_param[4] = Model_Tid.TidSend;
+ msg_buff = pdeltalevel_param;
+ ack_flag = MOBLE_FALSE;
+ msg_opcode = GENERIC_DELTA_SET_UNACK;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) GENERIC_LEVEL_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
/*
- Manage the TID Here....
+ Manage the TID
*/
+ Model_Tid.TidSend++;
+ if(Model_Tid.TidSend >= MAX_TID_VALUE)
+ {
+ Model_Tid.TidSend = 0;
+ }
+ if(result)
+ {
+ TRACE_M(TF_GENERIC_CLIENT_M, "Publication Error \r\n");
+ }
- result = MeshClient_SetRemotePublication((MOBLEUINT32) GENERIC_MODEL_SERVER_LEVEL_MODEL_ID,
- element_number ,
+ return result;
+}
+
+/**
+* @brief GenericClient_Move_Set_Ack: This function is called to send Generic Delta Level Set message UnAcknowledged
+* @param elementIndex : Index of the element
+* @param plevelmove_param: Pointer to the parameters message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT GenericClient_Move_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *plevelmove_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 3.2.2.6 Generic Move Set
+ Delta Level: 2B The Delta Level step to calculate Move speed for 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)
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_GENERIC_CLIENT_M, "GenericClient_Move_Set Client Message \r\n");
+ plevelmove_param[2] = Model_Tid.TidSend;
+ msg_buff = plevelmove_param;
+ ack_flag = MOBLE_TRUE;
+ msg_opcode = GENERIC_MOVE_SET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) GENERIC_LEVEL_CLIENT_MODEL_ID,
+ elementIndex,
msg_opcode ,
msg_buff, length,
ack_flag,
MOBLE_FALSE);
- TidSend++;
- if(TidSend >= MAX_TID_VALUE)
+ /*
+ Manage the TID
+ */
+ Model_Tid.TidSend++;
+ if(Model_Tid.TidSend >= MAX_TID_VALUE)
{
- TidSend = 0;
+ Model_Tid.TidSend = 0;
}
if(result)
{
@@ -226,6 +548,313 @@ MOBLE_RESULT GenericClient_Level_Set_Unack(MOBLE_ADDRESS element_number,
}
/**
+* @brief GenericClient_Move_Set_Unack: This function is called to send Generic Delta Level Set message UnAcknowledged
+* @param elementIndex : Index of the element
+* @param plevelmove_param: Pointer to the parameters message
+* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT GenericClient_Move_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *plevelmove_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 3.2.2.7 Generic Move Set UnAcnowedged
+ Delta Level: 2B The Delta Level step to calculate Move speed for 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)
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_GENERIC_CLIENT_M, "GenericClient_Move_Set Client Message \r\n");
+ plevelmove_param[2] = Model_Tid.TidSend;
+ msg_buff = plevelmove_param;
+ ack_flag = MOBLE_FALSE;
+ msg_opcode = GENERIC_MOVE_SET_UNACK;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) GENERIC_LEVEL_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+ /*
+ Manage the TID
+ */
+ Model_Tid.TidSend++;
+ if(Model_Tid.TidSend >= MAX_TID_VALUE)
+ {
+ Model_Tid.TidSend = 0;
+ }
+ if(result)
+ {
+ TRACE_M(TF_GENERIC_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+/******************************************************************************/
+#endif /// ENABLE_GENERIC_MODEL_CLIENT_LEVEL
+/******************************************************************************/
+
+
+/******************************************************************************/
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_POWER_ONOFF
+/******************************************************************************/
+/**
+* @brief GenericClient_PowerOnOff_Get: This function is called to send Generic Power On Off Get
+* @param elementIndex : Index of the element
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT GenericClient_PowerOnOff_Get(MOBLEUINT8 elementIndex)
+
+{
+ /*
+3.2.4.1 Generic On Power Up Get
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 msg_opcode;
+ MOBLEUINT8 const *msg_buff = NULL;
+ MOBLEBOOL ack_flag = MOBLE_FALSE;
+
+ TRACE_M(TF_GENERIC_CLIENT_M, "GenericClient_PowerOnOff_Get Client Message \r\n");
+
+ msg_opcode = GENERIC_POWER_ON_OFF_GET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) GENERIC_POWER_ONOFF_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, 0,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_GENERIC_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+/**
+* @brief GenericClient_PowerOnOff_Set_Ack: This function is called to send Generic Level Set message Acknowledged
+* @param elementIndex : Index of the element
+* @param plevel_param: Pointer to the parameters received for message
+* @param length: Length of the parameters received for message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT GenericClient_PowerOnOff_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *ppoweronoff_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 3.2.4.2 Generic On Power Up Set
+ OnPowerUp: 1B The value of the Generic OnPowerUp state.
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_GENERIC_CLIENT_M, "Generic_PowerOnOff_Set Client Message \r\n");
+ msg_buff = ppoweronoff_param;
+ ack_flag = MOBLE_TRUE;
+ msg_opcode = GENERIC_POWER_ON_OFF_SET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) GENERIC_POWER_ONOFF_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_GENERIC_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+/**
+* @brief GenericClient_PowerOnOff_Set_Unack: This function is called to send Generic Level Set message UnAcknowledged
+* @param elementIndex : Index of the element
+* @param plevel_param: Pointer to the parameters received for message
+* @param length: Length of the parameters received for message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT GenericClient_PowerOnOff_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8* ppoweronoff_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 3.2.4.3 Generic On Power Up Set Unack
+ OnPowerUp: 1B The value of the Generic OnPowerUp state.
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_GENERIC_CLIENT_M, "Generic_PowerOnOff_Set Client Message \r\n");
+ msg_buff = ppoweronoff_param;
+ ack_flag = MOBLE_FALSE;
+ msg_opcode = GENERIC_POWER_ON_OFF_SET_UNACK;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) GENERIC_POWER_ONOFF_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_GENERIC_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+/******************************************************************************/
+#endif /// ENABLE_GENERIC_MODEL_CLIENT_POWER_ONOFF
+/******************************************************************************/
+
+
+/******************************************************************************/
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_DEFAULT_TRANSITION_TIME
+/******************************************************************************/
+/**
+* @brief GenericClient_DefaultTransitionTime_Get: This function is called to send Generic Transition Time Get
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT GenericClient_DefaultTransitionTime_Get(MOBLEUINT8 elementIndex)
+
+{
+ /*
+3.2.3.1 Generic Default Transition Time Get
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 msg_opcode;
+ MOBLEUINT8 const *msg_buff = NULL;
+ MOBLEBOOL ack_flag = MOBLE_FALSE;
+
+ TRACE_M(TF_GENERIC_CLIENT_M, "GenericClient_DefaultTransitionTime Client Message \r\n");
+
+ msg_opcode = GENERIC_DEFAULT_TRANSITION_TIME_GET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) GENERIC_DEFAULT_TRANSITION_TIME_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, 0,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_GENERIC_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+/**
+* @brief GenericClient_DefaultTransitionTime_Set_Ack: This function is called to send Generic Level Set message Acknowledged
+* @param elementIndex : Index of the element
+* @param plevel_param: Pointer to the parameters received for message
+* @param length: Length of the parameters received for message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT GenericClient_DefaultTransitionTime_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pdefaulttransitiontime_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 3.2.3.2 Generic Default Transition Time Set
+ Transition Time: 1B The value of the Generic Default Transition Time state.
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_GENERIC_CLIENT_M, "GenericClient_DefaultTransitionTime_Set_Ack Client Message \r\n");
+ msg_buff = pdefaulttransitiontime_param;
+ ack_flag = MOBLE_TRUE;
+ msg_opcode = GENERIC_DEFAULT_TRANSITION_TIME_SET;
+
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) GENERIC_DEFAULT_TRANSITION_TIME_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_GENERIC_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+/**
+* @brief GenericClient_DefaultTransitionTime_Set_Unack: This function is called to send Generic Level Set message UnAcknowledged
+* @param elementIndex : Index of the element
+* @param plevel_param: Pointer to the parameters received for message
+* @param length: Length of the parameters received for message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT GenericClient_DefaultTransitionTime_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8* pdefaulttransitiontime_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 3.2.3.3 Generic Default Transition Time Set Unack
+ Transition Time: 1B The value of the Generic Default Transition Time state.
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_GENERIC_CLIENT_M, "GenericClient_DefaultTransitionTime_Set_Unack Client Message \r\n");
+ msg_buff = pdefaulttransitiontime_param;
+ ack_flag = MOBLE_FALSE;
+ msg_opcode = GENERIC_DEFAULT_TRANSITION_TIME_SET_UNACK;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) GENERIC_DEFAULT_TRANSITION_TIME_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_GENERIC_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+/******************************************************************************/
+#endif /// ENABLE_GENERIC_MODEL_CLIENT_DEFAULT_TRANSITION_TIME
+/******************************************************************************/
+
+
+
+/**
* @brief GenericModelServer_GetOpcodeTableCb: This function is call-back
* from the library to send Model Opcode Table info to library
* @param MODEL_OpcodeTableParam_t: Pointer to the Generic Model opcode array
@@ -241,12 +870,12 @@ MOBLE_RESULT GenericModelClient_GetOpcodeTableCb(const MODEL_OpcodeTableParam_t
return MOBLE_RESULT_SUCCESS;
}
+
/**
* @brief GenericModelClient_GetStatusRequestCb : This function is call-back
* 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
+* @param *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* @param opcode: Received opcode of the Status message callback
* @param pResponsedata: Pointer to the buffer to be updated with status
* @param plength: Pointer to the Length of the data, to be updated by application
@@ -255,8 +884,7 @@ MOBLE_RESULT GenericModelClient_GetOpcodeTableCb(const MODEL_OpcodeTableParam_t
* @param response: Value to indicate wheather message is acknowledged meassage or not.
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT GenericModelClient_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+MOBLE_RESULT GenericModelClient_GetStatusRequestCb(MODEL_MessageHeader_t *pmsgParam,
MOBLEUINT16 opcode,
MOBLEUINT8 *pResponsedata,
MOBLEUINT32 *plength,
@@ -270,13 +898,11 @@ MOBLE_RESULT GenericModelClient_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
return MOBLE_RESULT_SUCCESS;
}
-
/**
* @brief GenericModelClient_ProcessMessageCb: This is a callback function from
* 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
+* @param *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* @param opcode: Received opcode of the Status message callback
* @param pData: Pointer to the buffer to be updated with status
* @param length: Length of the parameters received
@@ -286,41 +912,43 @@ MOBLE_RESULT GenericModelClient_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
* @param response: Value to indicate wheather message is acknowledged meassage or not.
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT GenericModelClient_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+MOBLE_RESULT GenericModelClient_ProcessMessageCb(MODEL_MessageHeader_t *pmsgParam,
MOBLEUINT16 opcode,
MOBLEUINT8 const *pRxData,
MOBLEUINT32 dataLength,
- MOBLEBOOL response
- )
+ MOBLEBOOL response)
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
- //tClockTime delay_t = Clock_Time();
- TRACE_M(TF_GENERIC_CLIENT_M, "dst_peer = %.2X , peer_add = %.2X, opcode= %.2X ,response= %.2X \r\n ",
- dst_peer, peer_addr, opcode , response);
+ TRACE_M(TF_GENERIC_CLIENT_M,
+ "elementIndex = %.2x, dst_peer = %.2X, peer_add = %.2X,opcode= %.2X ,response= %.2X\r\n",
+ pmsgParam->elementIndex,
+ pmsgParam->dst_peer,
+ pmsgParam->peer_addr,
+ opcode,
+ response);
switch(opcode)
{
case GENERIC_ON_OFF_STATUS:
{
- Generic_Client_OnOff_Status(pRxData, dataLength);
+ Generic_Client_OnOff_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
case GENERIC_LEVEL_STATUS:
{
- Generic_Client_Level_Status(pRxData, dataLength);
+ Generic_Client_Level_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
case GENERIC_DEFAULT_TRANSITION_TIME_STATUS:
{
- Generic_Client_DefaultTransitionTime_Status(pRxData, dataLength);
+ Generic_Client_DefaultTransitionTime_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
case GENERIC_POWER_ON_OFF_STATUS:
{
- Generic_Client_PowerOnOff_Status(pRxData, dataLength);
+ Generic_Client_PowerOnOff_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
default:
@@ -331,7 +959,7 @@ MOBLE_RESULT GenericModelClient_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
if((result == MOBLE_RESULT_SUCCESS) && (response == MOBLE_TRUE))
{
- Model_SendResponse(peer_addr,dst_peer,opcode,pRxData,dataLength);
+ Model_SendResponse(pmsgParam, opcode, pRxData, dataLength);
}
return MOBLE_RESULT_SUCCESS;
@@ -345,5 +973,5 @@ MOBLE_RESULT GenericModelClient_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
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 0cb259aea..80b5a774d 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light.c
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light.c
@@ -22,6 +22,7 @@
#include "light.h"
#include "generic.h"
#include "common.h"
+#include "models_if.h"
#include "light_lc.h"
#include "math.h"
#include "compiler.h"
@@ -38,225 +39,320 @@
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
-static Light_TimeParam_t Light_TimeParam;
-static Light_ModelFlag_t Light_ModelFlag;
-static Light_TemporaryStatus_t Light_TemporaryStatus;
+static Light_TimeParam_t Light_TimeParam[APPLICATION_NUMBER_OF_ELEMENTS];
+Light_ModelFlag_t Light_ModelFlag[APPLICATION_NUMBER_OF_ELEMENTS];
+static Light_TemporaryStatus_t Light_TemporaryStatus[APPLICATION_NUMBER_OF_ELEMENTS];
+/* Light Lightness */
static Light_LightnessParam_t Light_LightnessParam;
-static Light_LightnessStatus_t Light_LightnessStatus;
-static Light_LightnessDefaultParam_t Light_LightnessDefaultParam;
+static Light_LightnessStatus_t Light_LightnessStatus[APPLICATION_NUMBER_OF_ELEMENTS];
+static Light_LightnessDefaultParam_t Light_LightnessDefaultParam[APPLICATION_NUMBER_OF_ELEMENTS];
/* Initialize the light lighness range with maximum and minimuwm value as pr the spec */
-static Light_LightnessRangeParam_t Light_LightnessRangeParam = {0x00,MIN_VALID_RANGE,MAX_VALID_RANGE};
-
+static Light_LightnessRangeParam_t Light_LightnessRangeParam[APPLICATION_NUMBER_OF_ELEMENTS] =
+{
+ {0x00, MIN_VALID_RANGE, MAX_VALID_RANGE},
+#if (APPLICATION_NUMBER_OF_ELEMENTS == 2) || (APPLICATION_NUMBER_OF_ELEMENTS == 3)
+ {0x00, MIN_VALID_RANGE, MAX_VALID_RANGE},
+#endif
+#if (APPLICATION_NUMBER_OF_ELEMENTS == 3)
+ {0x00, MIN_VALID_RANGE, MAX_VALID_RANGE}
+#endif
+};
+
+
+/* Light CTL */
static Light_CtlParam_t Light_CtlParam;
/* Initialize the parameter with minimum value of temperature and delta */
-static Light_CtlStatus_t Light_CtlStatus = {0x00,MIN_CTL_TEMP_RANGE,MIN_CTL_DELTA_VALUE,0x00,0x00,0x00,0x00};
-static Light_CtlDefaultParam_t Light_CtlDefaultParam;
+static Light_CtlStatus_t Light_CtlStatus[APPLICATION_NUMBER_OF_ELEMENTS] ;//= {0x00,MIN_CTL_TEMP_RANGE,MIN_CTL_DELTA_VALUE,0x00,0x00,0x00,0x00};
+static Light_CtlDefaultParam_t Light_CtlDefaultParam[APPLICATION_NUMBER_OF_ELEMENTS];
+
/* Initialize the Ctl tepmerature range with minimum and maximum value as per the spec */
-static Light_CtlTemperatureRangeParam_t CtlTemperatureRangeParam = {0x00,MIN_CTL_TEMP_RANGE,MAX_CTL_TEMP_RANGE};
+static Light_CtlTemperatureRangeParam_t CtlTemperatureRangeParam[APPLICATION_NUMBER_OF_ELEMENTS];// = {0x00,MIN_CTL_TEMP_RANGE,MAX_CTL_TEMP_RANGE};
static Light_HslParam_t Light_HslParam;
-static Light_HslStatus_t Light_HslStatus;
+static Light_HslStatus_t Light_HslStatus[APPLICATION_NUMBER_OF_ELEMENTS];
+
/* Initialize the HSL parameter range with minimum and maximum value as per the spec */
-static Light_HslRangeParam_t Light_HslRangeParam = {0x00,MIN_HUE_RANGE,MAX_HUE_RANGE,
- MIN_SATURATION_RANGE,MAX_SATURATION_RANGE};
+static Light_HslRangeParam_t Light_HslRangeParam[APPLICATION_NUMBER_OF_ELEMENTS];// ={0x00,MIN_HUE_RANGE,MAX_HUE_RANGE,MIN_SATURATION_RANGE,MAX_SATURATION_RANGE};
Light_PublishOpcodeList_t Light_PublishOpcodeList;
+#ifdef ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
extern Generic_DefaultTransitionParam_t Generic_DefaultTransitionParam;
+#endif
MOBLEUINT8 LightUpdateFlag = 0;
-extern MOBLEUINT16 Model_Rx_Opcode;
-extern MOBLEUINT16 Model_ID;
-extern MOBLE_ADDRESS Dst_Peer;
+extern Model_Binding_Var_t Model_Binding_Var;
+
const MODEL_OpcodeTableParam_t Light_Opcodes_Table[] =
{
-/* model_id opcode reliable min_payload_size max_payload_size response_opcode min_response_size max_response_size */
+/* model_id opcode reliable min_payload_size max_payload_size response_opcode min_response_size max_response_size */
#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, 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, 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},
- {LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID, LIGHT_LIGHTNESS_RANGE_STATUS, MOBLE_FALSE, 5, 5, 0, 5, 5},
-#endif
-
-#ifdef ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS
- {LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID, LIGHT_LIGHTNESS_GET, MOBLE_TRUE, 0, 0, LIGHT_LIGHTNESS_STATUS, 2, 5},
- {LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID, LIGHT_LIGHTNESS_SET, MOBLE_TRUE, 3, 5, LIGHT_LIGHTNESS_STATUS, 2, 5},
- {LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID, LIGHT_LIGHTNESS_SET_UNACK, MOBLE_FALSE, 3, 5, LIGHT_LIGHTNESS_STATUS, 2, 5},
- {LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID, LIGHT_LIGHTNESS_STATUS, MOBLE_FALSE, 2, 5, 0, 2, 5},
- {LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID, LIGHT_LIGHTNESS_LINEAR_GET, MOBLE_TRUE, 0, 0, LIGHT_LIGHTNESS_LINEAR_STATUS, 2, 5},
- {LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID, LIGHT_LIGHTNESS_LINEAR_SET, MOBLE_TRUE, 3, 5, LIGHT_LIGHTNESS_LINEAR_STATUS, 2, 5},
- {LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID, LIGHT_LIGHTNESS_LINEAR_SET_UNACK, MOBLE_FALSE, 3, 5, LIGHT_LIGHTNESS_LINEAR_STATUS, 2, 5},
- {LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID, LIGHT_LIGHTNESS_LINEAR_STATUS, MOBLE_FALSE, 2, 5, 0, 2, 5},
- {LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID, LIGHT_LIGHTNESS_LAST_GET, MOBLE_TRUE, 0, 0, LIGHT_LIGHTNESS_LAST_STATUS, 2, 2},
- {LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID, LIGHT_LIGHTNESS_LAST_STATUS, MOBLE_FALSE, 2, 2, 0, 2, 2},
- {LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID, LIGHT_LIGHTNESS_DEFAULT_GET, MOBLE_TRUE, 0, 0, LIGHT_LIGHTNESS_DEFAULT_STATUS, 2, 2},
- {LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID, LIGHT_LIGHTNESS_DEFAULT_STATUS, MOBLE_FALSE, 2, 2, 0, 2, 2},
- {LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID, LIGHT_LIGHTNESS_RANGE_GET, MOBLE_TRUE, 0, 0, LIGHT_LIGHTNESS_RANGE_STATUS, 5, 5},
- {LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID, LIGHT_LIGHTNESS_RANGE_STATUS, MOBLE_FALSE, 5, 5, 0, 5, 5},
+ {LIGHT_LIGHTNESS_SERVER_MODEL_ID, LIGHT_LIGHTNESS_GET, MOBLE_TRUE, 0, 0, LIGHT_LIGHTNESS_STATUS, 2, 5},
+ {LIGHT_LIGHTNESS_SERVER_MODEL_ID, LIGHT_LIGHTNESS_SET, MOBLE_TRUE, 3, 5, LIGHT_LIGHTNESS_STATUS, 2, 5},
+ {LIGHT_LIGHTNESS_SERVER_MODEL_ID, LIGHT_LIGHTNESS_SET_UNACK, MOBLE_FALSE, 3, 5, LIGHT_LIGHTNESS_STATUS, 2, 5},
+ {LIGHT_LIGHTNESS_SERVER_MODEL_ID, LIGHT_LIGHTNESS_STATUS, MOBLE_FALSE, 2, 5, 0, 2, 5},
+ {LIGHT_LIGHTNESS_SERVER_MODEL_ID, LIGHT_LIGHTNESS_LINEAR_GET, MOBLE_TRUE, 0, 0, LIGHT_LIGHTNESS_LINEAR_STATUS, 2, 5},
+ {LIGHT_LIGHTNESS_SERVER_MODEL_ID, LIGHT_LIGHTNESS_LINEAR_SET, MOBLE_TRUE, 3, 5, LIGHT_LIGHTNESS_LINEAR_STATUS, 2, 5},
+ {LIGHT_LIGHTNESS_SERVER_MODEL_ID, LIGHT_LIGHTNESS_LINEAR_SET_UNACK, MOBLE_FALSE, 3, 5, LIGHT_LIGHTNESS_LINEAR_STATUS, 2, 5},
+ {LIGHT_LIGHTNESS_SERVER_MODEL_ID, LIGHT_LIGHTNESS_LINEAR_STATUS, MOBLE_FALSE, 2, 5, 0, 2, 5},
+ {LIGHT_LIGHTNESS_SERVER_MODEL_ID, LIGHT_LIGHTNESS_LAST_GET, MOBLE_TRUE, 0, 0, LIGHT_LIGHTNESS_LAST_STATUS, 2, 2},
+ {LIGHT_LIGHTNESS_SERVER_MODEL_ID, LIGHT_LIGHTNESS_LAST_STATUS, MOBLE_FALSE, 2, 2, 0, 2, 2},
+ {LIGHT_LIGHTNESS_SERVER_MODEL_ID, LIGHT_LIGHTNESS_DEFAULT_GET, MOBLE_TRUE, 0, 0, LIGHT_LIGHTNESS_DEFAULT_STATUS, 2, 2},
+ {LIGHT_LIGHTNESS_SERVER_MODEL_ID, LIGHT_LIGHTNESS_DEFAULT_STATUS, MOBLE_FALSE, 2, 2, 0, 2, 2},
+ {LIGHT_LIGHTNESS_SERVER_MODEL_ID, LIGHT_LIGHTNESS_RANGE_GET, MOBLE_TRUE, 0, 0, LIGHT_LIGHTNESS_RANGE_STATUS, 5, 5},
+ {LIGHT_LIGHTNESS_SERVER_MODEL_ID, LIGHT_LIGHTNESS_RANGE_STATUS, MOBLE_FALSE, 5, 5, 0, 5, 5},
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP
- {LIGHT_MODEL_SERVER_LIGHTNESS_SETUP_MODEL_ID, LIGHT_LIGHTNESS_DEFAULT_SET, MOBLE_TRUE, 2, 2, LIGHT_LIGHTNESS_DEFAULT_STATUS, 2, 2},
- {LIGHT_MODEL_SERVER_LIGHTNESS_SETUP_MODEL_ID, LIGHT_LIGHTNESS_DEFAULT_SET_UNACK, MOBLE_FALSE, 2, 2, 0, 2, 2},
- {LIGHT_MODEL_SERVER_LIGHTNESS_SETUP_MODEL_ID, LIGHT_LIGHTNESS_RANGE_SET, MOBLE_TRUE, 4, 4, LIGHT_LIGHTNESS_RANGE_STATUS, 5, 5},
- {LIGHT_MODEL_SERVER_LIGHTNESS_SETUP_MODEL_ID, LIGHT_LIGHTNESS_RANGE_SET_UNACK, MOBLE_FALSE, 4, 4, 0, 5, 5},
+ {LIGHT_LIGHTNESS_SETUP_SERVER_MODEL_ID, LIGHT_LIGHTNESS_DEFAULT_SET, MOBLE_TRUE, 2, 2, LIGHT_LIGHTNESS_DEFAULT_STATUS, 2, 2},
+ {LIGHT_LIGHTNESS_SETUP_SERVER_MODEL_ID, LIGHT_LIGHTNESS_DEFAULT_SET_UNACK, MOBLE_FALSE, 2, 2, 0, 2, 2},
+ {LIGHT_LIGHTNESS_SETUP_SERVER_MODEL_ID, LIGHT_LIGHTNESS_RANGE_SET, MOBLE_TRUE, 4, 4, LIGHT_LIGHTNESS_RANGE_STATUS, 5, 5},
+ {LIGHT_LIGHTNESS_SETUP_SERVER_MODEL_ID, LIGHT_LIGHTNESS_RANGE_SET_UNACK, MOBLE_FALSE, 4, 4, 0, 5, 5},
#endif
#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, 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},
- {LIGHT_MODEL_SERVER_CTL_MODEL_ID, LIGHT_CTL_DEFAULT_GET, MOBLE_TRUE, 0, 0, LIGHT_CTL_DEFAULT_STATUS, 6, 6},
- {LIGHT_MODEL_SERVER_CTL_MODEL_ID, LIGHT_CTL_DEFAULT_STATUS, MOBLE_TRUE, 6, 6, 0, 6, 6},
-#endif
-
-#ifdef ENABLE_LIGHT_MODEL_CLIENT_CTL
- {LIGHT_MODEL_CLIENT_CTL_MODEL_ID, LIGHT_CTL_GET, MOBLE_TRUE, 0, 0, LIGHT_CTL_STATUS, 4, 9},
- {LIGHT_MODEL_CLIENT_CTL_MODEL_ID, LIGHT_CTL_SET, MOBLE_TRUE, 7, 9, LIGHT_CTL_STATUS, 4, 9},
- {LIGHT_MODEL_CLIENT_CTL_MODEL_ID, LIGHT_CTL_SET_UNACK, MOBLE_FALSE, 7, 9, LIGHT_CTL_STATUS, 4, 9},
- {LIGHT_MODEL_CLIENT_CTL_MODEL_ID, LIGHT_CTL_STATUS, MOBLE_FALSE, 4, 9, 0, 4, 9},
- {LIGHT_MODEL_CLIENT_CTL_MODEL_ID, LIGHT_CTL_TEMPERATURE_RANGE_GET, MOBLE_TRUE, 0, 0, LIGHT_CTL_TEMPERATURE_RANGE_STATUS, 5, 5},
- {LIGHT_MODEL_CLIENT_CTL_MODEL_ID, LIGHT_CTL_TEMPERATURE_RANGE_STATUS, MOBLE_FALSE, 5, 5, 0, 5, 5},
- {LIGHT_MODEL_CLIENT_CTL_MODEL_ID, LIGHT_CTL_DEFAULT_GET, MOBLE_TRUE, 0, 0, LIGHT_CTL_DEFAULT_STATUS, 6, 6},
- {LIGHT_MODEL_CLIENT_CTL_MODEL_ID, LIGHT_CTL_DEFAULT_STATUS, MOBLE_TRUE, 6, 6, 0, 6, 6},
+ {LIGHT_CTL_SERVER_MODEL_ID, LIGHT_CTL_GET, MOBLE_TRUE, 0, 0, LIGHT_CTL_STATUS, 4, 9},
+ {LIGHT_CTL_SERVER_MODEL_ID, LIGHT_CTL_SET, MOBLE_TRUE, 7, 9, LIGHT_CTL_STATUS, 4, 9},
+ {LIGHT_CTL_SERVER_MODEL_ID, LIGHT_CTL_SET_UNACK, MOBLE_FALSE, 7, 9, LIGHT_CTL_STATUS, 4, 9},
+ {LIGHT_CTL_SERVER_MODEL_ID, LIGHT_CTL_STATUS, MOBLE_FALSE, 4, 9, 0, 4, 9},
+ {LIGHT_CTL_SERVER_MODEL_ID, LIGHT_CTL_TEMPERATURE_RANGE_GET, MOBLE_TRUE, 0, 0, LIGHT_CTL_TEMPERATURE_RANGE_STATUS, 5, 5},
+ {LIGHT_CTL_SERVER_MODEL_ID, LIGHT_CTL_TEMPERATURE_RANGE_STATUS, MOBLE_FALSE, 5, 5, 0, 5, 5},
+ {LIGHT_CTL_SERVER_MODEL_ID, LIGHT_CTL_DEFAULT_GET, MOBLE_TRUE, 0, 0, LIGHT_CTL_DEFAULT_STATUS, 6, 6},
+ {LIGHT_CTL_SERVER_MODEL_ID, LIGHT_CTL_DEFAULT_STATUS, MOBLE_TRUE, 6, 6, 0, 6, 6},
#endif
#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, 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},
+ {LIGHT_CTL_SETUP_SERVER_MODEL_ID, LIGHT_CTL_DEFAULT_SET, MOBLE_TRUE, 6, 6, LIGHT_CTL_DEFAULT_STATUS, 6, 6},
+ {LIGHT_CTL_SETUP_SERVER_MODEL_ID, LIGHT_CTL_DEFAULT_SET_UNACK, MOBLE_FALSE, 6, 6, LIGHT_CTL_DEFAULT_STATUS, 6, 6},
+ {LIGHT_CTL_SETUP_SERVER_MODEL_ID, LIGHT_CTL_TEMPERATURE_RANGE_SET, MOBLE_TRUE, 4, 4, LIGHT_CTL_TEMPERATURE_RANGE_STATUS, 5, 5},
+ {LIGHT_CTL_SETUP_SERVER_MODEL_ID, LIGHT_CTL_TEMPERATURE_RANGE_SET_UNACK, MOBLE_FALSE, 4, 4, 0, 5, 5},
#endif
#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, LIGHT_CTL_TEMPERATURE_STATUS, 4, 9},
- {LIGHT_MODEL_SERVER_CTL_TEMPERATURE_MODEL_ID, LIGHT_CTL_TEMPERATURE_STATUS, MOBLE_FALSE, 4, 9, 0, 4, 9},
+ {LIGHT_CTL_TEMPERATURE_SERVER_MODEL_ID, LIGHT_CTL_TEMPERATURE_GET, MOBLE_TRUE, 0, 0, LIGHT_CTL_TEMPERATURE_STATUS, 4, 9},
+ {LIGHT_CTL_TEMPERATURE_SERVER_MODEL_ID, LIGHT_CTL_TEMPERATURE_SET, MOBLE_TRUE, 5, 7, LIGHT_CTL_TEMPERATURE_STATUS, 4, 9},
+ {LIGHT_CTL_TEMPERATURE_SERVER_MODEL_ID, LIGHT_CTL_TEMPERATURE_SET_UNACK, MOBLE_FALSE, 5, 7, LIGHT_CTL_TEMPERATURE_STATUS, 4, 9},
+ {LIGHT_CTL_TEMPERATURE_SERVER_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, 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},
- {LIGHT_MODEL_SERVER_HSL_MODEL_ID, LIGHT_HSL_DEFAULT_GET, MOBLE_TRUE, 0, 0, LIGHT_HSL_DEFAULT_STATUS, 6, 6},
- {LIGHT_MODEL_SERVER_HSL_MODEL_ID, LIGHT_HSL_DEFAULT_STATUS, MOBLE_FALSE, 6, 6, 0, 6, 6},
- {LIGHT_MODEL_SERVER_HSL_MODEL_ID, LIGHT_HSL_RANGE_GET, MOBLE_TRUE, 0, 0, LIGHT_HSL_RANGE_STATUS, 9, 9},
- {LIGHT_MODEL_SERVER_HSL_MODEL_ID, LIGHT_HSL_RANGE_STATUS, MOBLE_TRUE, 9, 9, 0, 9, 9},
-#endif
-
-#ifdef ENABLE_LIGHT_MODEL_CLIENT_HSL
- {LIGHT_MODEL_CLIENT_HSL_MODEL_ID, LIGHT_HSL_GET, MOBLE_TRUE, 0, 0, LIGHT_HSL_STATUS, 6, 7},
- {LIGHT_MODEL_CLIENT_HSL_MODEL_ID, LIGHT_HSL_SET, MOBLE_TRUE, 7, 9, LIGHT_HSL_STATUS, 6, 7},
- {LIGHT_MODEL_CLIENT_HSL_MODEL_ID, LIGHT_HSL_SET_UNACK, MOBLE_FALSE, 7, 9, LIGHT_HSL_STATUS, 6, 7},
- {LIGHT_MODEL_CLIENT_HSL_MODEL_ID, LIGHT_HSL_STATUS, MOBLE_FALSE, 6, 7, 0, 6, 7},
- {LIGHT_MODEL_CLIENT_HSL_MODEL_ID, LIGHT_HSL_TARGET_GET, MOBLE_TRUE, 0, 0, LIGHT_HSL_TARGET_STATUS, 6, 7},
- {LIGHT_MODEL_CLIENT_HSL_MODEL_ID, LIGHT_HSL_TARGET_STATUS, MOBLE_FALSE, 6, 7, 0, 6, 7},
- {LIGHT_MODEL_CLIENT_HSL_MODEL_ID, LIGHT_HSL_DEFAULT_GET, MOBLE_TRUE, 0, 0, LIGHT_HSL_DEFAULT_STATUS, 6, 6},
- {LIGHT_MODEL_CLIENT_HSL_MODEL_ID, LIGHT_HSL_DEFAULT_STATUS, MOBLE_FALSE, 6, 6, 0, 6, 6},
- {LIGHT_MODEL_CLIENT_HSL_MODEL_ID, LIGHT_HSL_RANGE_GET, MOBLE_TRUE, 0, 0, LIGHT_HSL_RANGE_STATUS, 9, 9},
- {LIGHT_MODEL_CLIENT_HSL_MODEL_ID, LIGHT_HSL_RANGE_STATUS, MOBLE_TRUE, 9, 9, 0, 9, 9},
+ {LIGHT_HSL_SERVER_MODEL_ID, LIGHT_HSL_GET, MOBLE_TRUE, 0, 0, LIGHT_HSL_STATUS, 6, 7},
+ {LIGHT_HSL_SERVER_MODEL_ID, LIGHT_HSL_SET, MOBLE_TRUE, 7, 9, LIGHT_HSL_STATUS, 6, 7},
+ {LIGHT_HSL_SERVER_MODEL_ID, LIGHT_HSL_SET_UNACK, MOBLE_FALSE, 7, 9, LIGHT_HSL_STATUS, 6, 7},
+ {LIGHT_HSL_SERVER_MODEL_ID, LIGHT_HSL_STATUS, MOBLE_FALSE, 6, 7, 0, 6, 7},
+ {LIGHT_HSL_SERVER_MODEL_ID, LIGHT_HSL_TARGET_GET, MOBLE_TRUE, 0, 0, LIGHT_HSL_TARGET_STATUS, 6, 7},
+ {LIGHT_HSL_SERVER_MODEL_ID, LIGHT_HSL_TARGET_STATUS, MOBLE_FALSE, 6, 7, 0, 6, 7},
+ {LIGHT_HSL_SERVER_MODEL_ID, LIGHT_HSL_DEFAULT_GET, MOBLE_TRUE, 0, 0, LIGHT_HSL_DEFAULT_STATUS, 6, 6},
+ {LIGHT_HSL_SERVER_MODEL_ID, LIGHT_HSL_DEFAULT_STATUS, MOBLE_FALSE, 6, 6, 0, 6, 6},
+ {LIGHT_HSL_SERVER_MODEL_ID, LIGHT_HSL_RANGE_GET, MOBLE_TRUE, 0, 0, LIGHT_HSL_RANGE_STATUS, 9, 9},
+ {LIGHT_HSL_SERVER_MODEL_ID, LIGHT_HSL_RANGE_STATUS, MOBLE_TRUE, 9, 9, 0, 9, 9},
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP
- {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, LIGHT_HSL_DEFAULT_STATUS, 6, 6},
+ {LIGHT_HSL_SETUP_SERVER_MODEL_ID, LIGHT_HSL_DEFAULT_SET, MOBLE_TRUE, 6, 6, LIGHT_HSL_DEFAULT_STATUS, 6, 6},
+ {LIGHT_HSL_SETUP_SERVER_MODEL_ID, LIGHT_HSL_DEFAULT_SET_UNACK, MOBLE_FALSE, 6, 6, LIGHT_HSL_DEFAULT_STATUS, 6, 6},
+ {LIGHT_HSL_SETUP_SERVER_MODEL_ID, LIGHT_HSL_RANGE_SET, MOBLE_TRUE, 8, 8, LIGHT_HSL_RANGE_STATUS, 9, 9},
+ {LIGHT_HSL_SETUP_SERVER_MODEL_ID, LIGHT_HSL_RANGE_SET_UNACK, MOBLE_FALSE, 8, 8, 0, 9, 9},
#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, LIGHT_HSL_HUE_STATUS, 2, 5},
- {LIGHT_MODEL_SERVER_HSL_HUE_MODEL_ID, LIGHT_HSL_HUE_STATUS, MOBLE_FALSE, 2, 5, 0, 2, 5},
+ {LIGHT_HSL_HUE_SERVER_MODEL_ID, LIGHT_HSL_HUE_GET, MOBLE_TRUE, 0, 0, LIGHT_HSL_HUE_STATUS, 2, 5},
+ {LIGHT_HSL_HUE_SERVER_MODEL_ID, LIGHT_HSL_HUE_SET, MOBLE_TRUE, 3, 5, LIGHT_HSL_HUE_STATUS, 2, 5},
+ {LIGHT_HSL_HUE_SERVER_MODEL_ID, LIGHT_HSL_HUE_SET_UNACK, MOBLE_FALSE, 3, 5, LIGHT_HSL_HUE_STATUS, 2, 5},
+ {LIGHT_HSL_HUE_SERVER_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, LIGHT_HSL_SATURATION_STATUS, 2, 5},
- {LIGHT_MODEL_SERVER_HSL_SATURATION_MODEL_ID, LIGHT_HSL_SATURATION_STATUS, MOBLE_FALSE, 2, 5, 0, 2, 5},
+ {LIGHT_HSL_SATURATION_SERVER_MODEL_ID, LIGHT_HSL_SATURATION_GET, MOBLE_TRUE, 0, 0, LIGHT_HSL_SATURATION_STATUS, 2, 5},
+ {LIGHT_HSL_SATURATION_SERVER_MODEL_ID, LIGHT_HSL_SATURATION_SET, MOBLE_TRUE, 3, 5, LIGHT_HSL_SATURATION_STATUS, 2, 5},
+ {LIGHT_HSL_SATURATION_SERVER_MODEL_ID, LIGHT_HSL_SATURATION_SET_UNACK, MOBLE_FALSE, 3, 5, LIGHT_HSL_SATURATION_STATUS, 2, 5},
+ {LIGHT_HSL_SATURATION_SERVER_MODEL_ID, LIGHT_HSL_SATURATION_STATUS, MOBLE_FALSE, 2, 5, 0, 2, 5},
#endif
{0}
};
/* Private function prototypes -----------------------------------------------*/
-MOBLE_RESULT Light_Ctl_Status(MOBLEUINT8* pLightCtl_status, MOBLEUINT32 *pLength);
-MOBLE_RESULT Light_CtlTemperature_Status(MOBLEUINT8* pLightCtlTemp_status, MOBLEUINT32 *pLength);
+MOBLE_RESULT Light_Ctl_Status(MOBLEUINT8* pLightCtl_status,
+ MOBLEUINT32 *pLength,
+ MODEL_MessageHeader_t *pmsgParam);
+MOBLE_RESULT Light_CtlTemperature_Status(MOBLEUINT8* pLightCtlTemp_status,
+ MOBLEUINT32 *pLength,
+ MODEL_MessageHeader_t *pmsgParam);
WEAK_FUNCTION (MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_LightnessParam,
- MOBLEUINT8 OptionalValid));
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Lightness_Linear_Set(Light_LightnessStatus_t* pLight_LightnessLinearParam,
- MOBLEUINT8 OptionalValid));
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pLight_LightnessDefaultParam,
- MOBLEUINT8 OptionalValid));
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Lightness_Range_Set(Light_LightnessRangeParam_t* pLight_LightnessRangeParam,
- MOBLEUINT8 OptionalValid));
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Ctl_Set(Light_CtlStatus_t* pLight_CtlParam,
- MOBLEUINT8 OptionalValid));
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_CtlTemperature_Set(Light_CtlStatus_t* pLight_CtltempParam,
- MOBLEUINT8 OptionalValid));
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_CtlTemperature_Range_Set(Light_CtlTemperatureRangeParam_t* pLight_CtlTempRangeParam,
- MOBLEUINT8 OptionalValid));
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_CtlDefault_Set(Light_CtlDefaultParam_t* pLight_CtlDefaultParam,
- MOBLEUINT8 OptionalValid));
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Hsl_Set(Light_HslStatus_t* pLight_HslParam,
- MOBLEUINT8 OptionalValid));
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_HslHue_Set(Light_HslStatus_t* pLight_HslHueParam,
- MOBLEUINT8 OptionalValid));
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_HslSaturation_Set(Light_HslStatus_t* pLight_HslSaturationParam,
- MOBLEUINT8 OptionalValid));
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_HslDefault_Set(Light_HslStatus_t* pLight_HslDefaultParam,
- MOBLEUINT8 OptionalValid));
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_HslRange_Set(Light_HslRangeParam_t* pLight_HslRangeParam,
- MOBLEUINT8 OptionalValid));
-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));
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange));
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetCtlDefaultStatus(MOBLEUINT8* lCtlDefaultState));
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetHslStatus(MOBLEUINT8* lHslState));
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState));
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState));
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetHslHueRange(MOBLEUINT8* lHslHueRange));
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange));
-WEAK_FUNCTION(void HSL_RGB_Conversion(void));
-WEAK_FUNCTION(void RgbF_Create(MOBLEUINT16 value1, MOBLEUINT16 value2, MOBLEUINT16 value3));
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status,
+ MOBLEUINT32 pLength,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status,
+ MOBLEUINT32 pLength,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDefault_status,
+ MOBLEUINT32 pLength,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Lightness_Last_Status(MOBLEUINT8 const *pLightnessLast_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status,
+ MOBLEUINT32 pLength,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status,
+ MOBLEUINT32 pLength,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status,
+ MOBLEUINT32 pLength,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status,
+ MOBLEUINT32 pLength,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status,
+ MOBLEUINT32 pLength,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status,
+ MOBLEUINT32 pLength,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status,
+ MOBLEUINT32 pLength,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status,
+ MOBLEUINT32 pLength,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status,
+ MOBLEUINT32 pLength,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status,
+ MOBLEUINT32 pLength,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetLightnessRangeStatus(MOBLEUINT8* lRangeState,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetCtlLightStatus(MOBLEUINT8* lCtlLightState,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetCtlDefaultStatus(MOBLEUINT8* lCtlDefaultState,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetHslStatus(MOBLEUINT8* lHslState,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetHslHueRange(MOBLEUINT8* lHslHueRange,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION(void HSL2RGB_Conversion(MOBLEUINT8 elementIndex));
+WEAK_FUNCTION(void RgbF_Create(MOBLEUINT16 value1,
+ MOBLEUINT16 value2,
+ MOBLEUINT16 value3,
+ MOBLEUINT8 elementIndex));
WEAK_FUNCTION(void Light_UpdatePWMValue(MOBLEUINT8 state));
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState));
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, MOBLEUINT32 pLength));
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status, MOBLEUINT32 pLength));
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDefault_status, MOBLEUINT32 pLength));
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status, MOBLEUINT32 pLength));
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status, MOBLEUINT32 pLength));
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status, MOBLEUINT32 pLength));
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status, MOBLEUINT32 pLength));
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status, MOBLEUINT32 pLength));
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 pLength));
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUINT32 pLength));
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status, MOBLEUINT32 pLength));
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status, MOBLEUINT32 pLength));
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status, MOBLEUINT32 pLength));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lDefaultState,
+ uint16_t dstPeer,
+ uint8_t elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetCtlTargetStatus(MOBLEUINT8* lCtlLightState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetHslTargetStatus(MOBLEUINT8* lHslState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex));
+MOBLE_RESULT Light_LightnessStateUpdate_Process(MOBLEUINT8 elementIndex);
+#if 0
+MOBLE_RESULT Light_LC_LightnessStateUpdate_Process(Light_LC_TemporaryStatus_t *lc_Temp_Value,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+#endif
+MOBLE_RESULT LightLightness_ActualUpdate(MOBLEUINT16 lightActual,
+ MOBLEUINT8 elementIndex);
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Lightness_Last_Set(Light_LightnessStatus_t* pLight_LightnessParam,
+ MOBLEUINT8 elementIndex));
/* Private functions ---------------------------------------------------------*/
@@ -309,9 +405,13 @@ void Light_Publish_Add(MOBLEUINT16 model_id, MOBLEUINT16 opcode)
* unacknowledged message. The Acknowledgement is taken care by the Library
* @param plightness_param : Pointer to the parameters received for message
* @param length : Length of the parameters received for message
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_Lightness_Set(const MOBLEUINT8* plightness_param, MOBLEUINT32 length)
+MOBLE_RESULT Light_Lightness_Set(const MOBLEUINT8* plightness_param,
+ MOBLEUINT32 length,
+ MODEL_MessageHeader_t *pmsgParam)
{
/* 6.3.1.2 Light Lightness Set
@@ -320,13 +420,13 @@ MOBLE_RESULT Light_Lightness_Set(const MOBLEUINT8* plightness_param, MOBLEUINT32
Transition Time 1B Format as defined in Section 3.1.3. (Optional)
Delay 1B Message execution delay in 5 millisecond steps (C.1)
*/
- TRACE_M(TF_LIGHT_M, "Light_Lightness_Set callback received \r\n");
+ TRACE_M(TF_LIGHT_M, "Callback Received \r\n");
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, pmsgParam->elementIndex);
#endif
/* Check for Optional Parameters */
if ((length > 3) && (plightness_param[3] !=0))
@@ -337,45 +437,59 @@ MOBLE_RESULT Light_Lightness_Set(const MOBLEUINT8* plightness_param, MOBLEUINT32
/* Copy the received data in status message which needs
to be set in application messages */
- Light_LightnessStatus.TargetValue16 = Light_LightnessParam.TargetLightnessStatus;
- Light_LightnessStatus.RemainingTime = Light_LightnessParam.TransitionTime;
+ Light_LightnessStatus[pmsgParam->elementIndex].TargetValue16 = Light_LightnessParam.TargetLightnessStatus;
+ Light_LightnessStatus[pmsgParam->elementIndex].RemainingTime = Light_LightnessParam.TransitionTime;
/* copy status parameters in Temporary parameters for transition
process.
*/
- Light_TemporaryStatus.TargetParam_1 = Light_LightnessStatus.TargetValue16;
- Light_TemporaryStatus.RemainingTime = Light_LightnessStatus.RemainingTime;
+ Light_TemporaryStatus[pmsgParam->elementIndex].TargetParam_1 =
+ Light_LightnessStatus[pmsgParam->elementIndex].TargetValue16;
+ Light_TemporaryStatus[pmsgParam->elementIndex].RemainingTime =
+ Light_LightnessStatus[pmsgParam->elementIndex].RemainingTime;
/* Function to calculate time parameters, step resolution
step size for transition state machine.
*/
- Light_GetStepValue(plightness_param[3]);
+ Light_GetStepValue(plightness_param[3],pmsgParam->elementIndex);
/*option parameter flag, enable to sent all required parameter in status.*/
- Light_ModelFlag.LightTransitionFlag = LIGHT_LIGHTNESS_TRANSITION_START;
- Light_ModelFlag.LightOptionalParam = 1;
+ Light_ModelFlag[pmsgParam->elementIndex].LightTransitionFlag = LIGHT_LIGHTNESS_TRANSITION_START;
+ Light_ModelFlag[pmsgParam->elementIndex].LightOptionalParam = 1;
}
else
{
#ifdef ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
- Light_LightnessDefaultTransitionValue(&Light_LightnessParam);
+ Light_LightnessDefaultTransitionValue(&Light_LightnessParam,
+ pmsgParam->elementIndex);
#else
/* When no optional parameter received, target value will
be set as present value in application.
*/
- Light_LightnessStatus.LightnessPresentValue16 = Light_LightnessParam.TargetLightnessStatus;
+ Light_ModelFlag[pmsgParam->elementIndex].LightTransitionFlag = LIGHT_TRANSITION_STOP;
+
+ Light_LightnessStatus[pmsgParam->elementIndex].LightnessPresentValue16 =
+ Light_LightnessParam.TargetLightnessStatus;
#endif
+ if(Light_LightnessStatus[pmsgParam->elementIndex].LightnessPresentValue16 > 0x00)
+ {
+ Light_LightnessStatus[pmsgParam->elementIndex].LightnessLastStatus =
+ Light_LightnessStatus[pmsgParam->elementIndex].LightnessPresentValue16;
+
+ (LightAppli_cb.Lightness_Last_Set_cb)(&Light_LightnessStatus[pmsgParam->elementIndex],
+ pmsgParam->elementIndex);
+ }
}
- if(Light_LightnessStatus.LightnessPresentValue16 > 0x00)
- {
- Light_LightnessStatus.LightnessLastStatus = Light_LightnessStatus.LightnessPresentValue16;
- }
+
/* Application Callback */
- (LightAppli_cb.Lightness_Set_cb)(&Light_LightnessStatus, 0);
+ (LightAppli_cb.Lightness_Set_cb)(&Light_LightnessStatus[pmsgParam->elementIndex],
+ 0,pmsgParam->dst_peer,
+ pmsgParam->elementIndex);
#ifdef ENABLE_MODEL_BINDING
/* Binding of actual light lightness with other models */
- Light_Lightness_Binding(BINDING_LIGHT_LIGHTNESS_ACTUAL_SET , length);
+ Light_Lightness_Binding(BINDING_LIGHT_LIGHTNESS_ACTUAL_SET , length,
+ pmsgParam->elementIndex);
#endif
return MOBLE_RESULT_SUCCESS;
@@ -385,9 +499,12 @@ MOBLE_RESULT Light_Lightness_Set(const MOBLEUINT8* plightness_param, MOBLEUINT32
* @brief Light Lightness Status
* @param pLightness_status: Pointer to the status message, which needs to be updated
* @param pLength: Pointer to the Length of the Status message
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_Lightness_Status(MOBLEUINT8* pLightness_status, MOBLEUINT32* pLength)
+MOBLE_RESULT Light_Lightness_Status(MOBLEUINT8* pLightness_status, MOBLEUINT32* pLength,\
+ MODEL_MessageHeader_t *pmsgParam)
{
/*
Following is the status message:
@@ -397,44 +514,49 @@ MOBLE_RESULT Light_Lightness_Status(MOBLEUINT8* pLightness_status, MOBLEUINT32*
*/
- TRACE_M(TF_LIGHT_M, "Light_Lightness_Status callback received \r\n");
+ TRACE_M(TF_LIGHT_M, "callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#824B! \n\r");
+ *(pLightness_status) = Light_LightnessStatus[pmsgParam->elementIndex].LightnessPresentValue16;
+ *(pLightness_status+1) = Light_LightnessStatus[pmsgParam->elementIndex].LightnessPresentValue16 >> 8;
+
/* 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))
+ if((Light_ModelFlag[pmsgParam->elementIndex].LightOptionalParam == 1) || (Light_TimeParam[pmsgParam->elementIndex].StepValue != 0))
{
- *(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;
+ *(pLightness_status+2) = Light_LightnessStatus[pmsgParam->elementIndex].TargetValue16;
+ *(pLightness_status+3) = Light_LightnessStatus[pmsgParam->elementIndex].TargetValue16 >>8;
+ *(pLightness_status+4) = Light_LightnessStatus[pmsgParam->elementIndex].RemainingTime;
*pLength = 5;
- Light_ModelFlag.LightOptionalParam = 0;
+ Light_ModelFlag[pmsgParam->elementIndex].LightOptionalParam = 0;
+ TRACE_M(TF_LIGHT_M, "Light_Lightness_Status sent with transition \r\n");
}
else
{
/* When no optional parameter received then, target value will
be sent in status message.
*/
- *(pLightness_status) = Light_LightnessStatus.LightnessPresentValue16 ;
- *(pLightness_status+1) = Light_LightnessStatus.LightnessPresentValue16 >> 8;
*pLength = 2;
+ TRACE_M(TF_LIGHT_M, "Light_Lightness_Status sent without transition \r\n");
}
return MOBLE_RESULT_SUCCESS;
}
/**
-* @brief Light_Lightness_Linear_Set: This function is called for both Acknowledged and
+* @brief Light_LightnessLinear_Set: This function is called for both Acknowledged and
* unacknowledged message. The Acknowledgement is taken care by the Library
* @param plightnessLinear_param : Pointer to the parameters received for message
* @param length : Length of the parameters received for message
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_Lightness_Linear_Set(const MOBLEUINT8* plightnessLinear_param, MOBLEUINT32 length)
+MOBLE_RESULT Light_LightnessLinear_Set(const MOBLEUINT8* plightnessLinear_param,\
+ MOBLEUINT32 length,\
+ MODEL_MessageHeader_t *pmsgParam)
{
/* 6.3.1.6 Light Lightness Linear Set
@@ -445,7 +567,7 @@ MOBLE_RESULT Light_Lightness_Linear_Set(const MOBLEUINT8* plightnessLinear_param
*/
MOBLEUINT8 OptionalValid = 0;
- TRACE_M(TF_LIGHT_M, "Light_Lightness_Linear_Set callback received \r\n");
+ TRACE_M(TF_LIGHT_M, "Light_LightnessLinear_Set callback received \r\n");
Light_LightnessParam.TargetLightnessLinearStatus = ((plightnessLinear_param[0])
| (plightnessLinear_param[1] << 8));
@@ -460,38 +582,49 @@ MOBLE_RESULT Light_Lightness_Linear_Set(const MOBLEUINT8* plightnessLinear_param
/* Copy the received data in status message which needs
to be set in application messages */
- Light_LightnessStatus.TargetValue16 = Light_LightnessParam.TargetLightnessLinearStatus;
- Light_LightnessStatus.RemainingTime = Light_LightnessParam.TransitionTime;
+ Light_LightnessStatus[pmsgParam->elementIndex].TargetValue16 = Light_LightnessParam.TargetLightnessLinearStatus;
+ Light_LightnessStatus[pmsgParam->elementIndex].RemainingTime = Light_LightnessParam.TransitionTime;
/* copy status parameters in Temporary parameters for transition
process.
*/
- Light_TemporaryStatus.TargetParam_1 = Light_LightnessStatus.TargetValue16;
- Light_TemporaryStatus.RemainingTime = Light_LightnessStatus.RemainingTime;
+ Light_TemporaryStatus[pmsgParam->elementIndex].TargetParam_1 = Light_LightnessStatus[pmsgParam->elementIndex].TargetValue16;
+ Light_TemporaryStatus[pmsgParam->elementIndex].RemainingTime = Light_LightnessStatus[pmsgParam->elementIndex].RemainingTime;
/* Function to calculate time parameters, step resolution
step size for transition state machine.
*/
- Light_GetStepValue(plightnessLinear_param[3]);
+ Light_GetStepValue(plightnessLinear_param[3],pmsgParam->elementIndex);
/*transition process enable flag. */
- Light_ModelFlag.LightTransitionFlag = LIGHT_LINEAR_TRANSITION_START;
+ Light_ModelFlag[pmsgParam->elementIndex].LightTransitionFlag = LIGHT_LINEAR_TRANSITION_START;
/*option parameter flag, enable to sent all required parameter in status.*/
- Light_ModelFlag.LightOptionalParam = 1;
+ Light_ModelFlag[pmsgParam->elementIndex].LightOptionalParam = 1;
}
else
{
- Light_LightnessStatus.LinearPresentValue16 = Light_LightnessParam .TargetLightnessLinearStatus;
+#ifdef ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
+ Light_LightnessLinearDefaultTransitionValue(&Light_LightnessParam,
+ pmsgParam->elementIndex);
+#else
+ /* When no optional parameter received, target value will
+ be set as present value in application.
+ */
+ Light_ModelFlag[pmsgParam->elementIndex].LightTransitionFlag = LIGHT_TRANSITION_STOP;
+
+ Light_LightnessStatus[pmsgParam->elementIndex].LinearPresentValue16 =
+ Light_LightnessParam.TargetLightnessLinearStatus;
+#endif
}
/* Application Callback */
- (LightAppli_cb.Lightness_Linear_Set_cb)(&Light_LightnessStatus, OptionalValid);
+ (LightAppli_cb.Lightness_Linear_Set_cb)(&Light_LightnessStatus[pmsgParam->elementIndex], OptionalValid, pmsgParam->dst_peer, pmsgParam->elementIndex);
#ifdef ENABLE_MODEL_BINDING
/* Binding of data of light lightness with light linear */
- Light_Lightness_Linear_Binding(BINDING_LIGHT_LIGHTNESS_LINEAR_SET ,length);
+ Light_Lightness_Linear_Binding(BINDING_LIGHT_LIGHTNESS_LINEAR_SET ,length, pmsgParam->elementIndex);
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
- Light_Linear_ActualBinding(length);
+ Light_Linear_ActualBinding(length, pmsgParam->elementIndex);
#endif
return MOBLE_RESULT_SUCCESS;
}
@@ -501,9 +634,13 @@ MOBLE_RESULT Light_Lightness_Linear_Set(const MOBLEUINT8* plightnessLinear_param
* @brief Light Lightness Linear Status
* @param pLightnessLinear_status: Pointer to the status message, which needs to be updated
* @param pLength: Pointer to the Length of the Status message
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_Lightness_Linear_Status(MOBLEUINT8* pLightnessLinear_status, MOBLEUINT32 *pLength)
+MOBLE_RESULT Light_LightnessLinear_Status(MOBLEUINT8* pLightnessLinear_status,
+ MOBLEUINT32 *pLength,\
+ MODEL_MessageHeader_t *pmsgParam)
{
/*
Following is the status message:
@@ -512,49 +649,52 @@ MOBLE_RESULT Light_Lightness_Linear_Status(MOBLEUINT8* pLightnessLinear_status,
Remaining Time 1B Time to complete the transition to the target Light Lightness Li
*/
- TRACE_M(TF_LIGHT_M, "Light_Lightness_Linear_Status callback received \r\n");
+ TRACE_M(TF_LIGHT_M, "Light_LightnessLinear_Status callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#824F! \n\r");
+ *(pLightnessLinear_status) = Light_LightnessStatus[pmsgParam->elementIndex].LinearPresentValue16;
+ *(pLightnessLinear_status+1) = Light_LightnessStatus[pmsgParam->elementIndex].LinearPresentValue16 >> 8;
+
/* 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))
+ if((Light_ModelFlag[pmsgParam->elementIndex].LightOptionalParam == 1) || (Light_TimeParam[pmsgParam->elementIndex].StepValue != 0))
{
- *(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;
+ *(pLightnessLinear_status+2) = Light_LightnessStatus[pmsgParam->elementIndex].TargetValue16;
+ *(pLightnessLinear_status+3) = Light_LightnessStatus[pmsgParam->elementIndex].TargetValue16 >>8;
+ *(pLightnessLinear_status+4) = Light_LightnessStatus[pmsgParam->elementIndex].RemainingTime;
*pLength = 5;
- Light_ModelFlag.LightOptionalParam = 0U;
+ Light_ModelFlag[pmsgParam->elementIndex].LightOptionalParam = 0U;
}
else
{
/* When no optional parameter received then, target value will
be sent in status message.
*/
- *(pLightnessLinear_status) = Light_LightnessStatus.LinearPresentValue16;
- *(pLightnessLinear_status+1) = Light_LightnessStatus.LinearPresentValue16 >> 8;
*pLength = 2;
-
}
return MOBLE_RESULT_SUCCESS;
}
/**
-* @brief Light_Lightness_Last_Set: This function is called for both Acknowledged and
+* @brief Light_LightnessLast_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
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLE_RESULT
+
*/
-MOBLE_RESULT Light_Lightness_Last_Set(const MOBLEUINT8* plightnessLast_param, MOBLEUINT32 length)
+MOBLE_RESULT Light_LightnessLast_Set(const MOBLEUINT8* plightnessLast_param,
+ MOBLEUINT32 length,\
+ MODEL_MessageHeader_t *pmsgParam)
{
- Light_LightnessStatus.LightnessLastStatus = plightnessLast_param[1] << 8;
- Light_LightnessStatus.LightnessLastStatus |= plightnessLast_param[0];
+ Light_LightnessStatus[pmsgParam->elementIndex].LightnessLastStatus = plightnessLast_param[1] << 8;
+ Light_LightnessStatus[pmsgParam->elementIndex].LightnessLastStatus |= plightnessLast_param[0];
return MOBLE_RESULT_SUCCESS;
}
@@ -563,20 +703,24 @@ MOBLE_RESULT Light_Lightness_Last_Set(const MOBLEUINT8* plightnessLast_param, MO
* @brief Light Lightness Last Status
* @param pLightnessLast_status: Pointer to the status message, which needs to be updated
* @param pLength: Pointer to the Length of the Status message
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_Lightness_Last_Status(MOBLEUINT8* pLightnessLast_status, MOBLEUINT32 *pLength)
+MOBLE_RESULT Light_LightnessLast_Status(MOBLEUINT8* pLightnessLast_status,
+ MOBLEUINT32 *pLength,\
+ MODEL_MessageHeader_t *pmsgParam)
{
/* 6.3.1.10 Light Lightness Last State
Following is the status message:
Lightness 2B The value of the Light Lightness Last.
*/
- TRACE_M(TF_LIGHT_M, "Light_Lightness_Last_Status callback received \r\n");
+ TRACE_M(TF_LIGHT_M, "Light_LightnessLast_Status callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#8253! \n\r");
- *pLightnessLast_status = Light_LightnessStatus.LightnessLastStatus ;
- *(pLightnessLast_status+1) = Light_LightnessStatus.LightnessLastStatus >> 8;
+ *pLightnessLast_status = Light_LightnessStatus[pmsgParam->elementIndex].LightnessLastStatus ;
+ *(pLightnessLast_status+1) = Light_LightnessStatus[pmsgParam->elementIndex].LightnessLastStatus >> 8;
*pLength = 2;
return MOBLE_RESULT_SUCCESS;
@@ -584,26 +728,31 @@ MOBLE_RESULT Light_Lightness_Last_Status(MOBLEUINT8* pLightnessLast_status, MOBL
/**
-* @brief Light_Lightness_Default_Set: This function is called for both Acknowledged and
+* @brief Light_LightnessDefault_Set: This function is called for both Acknowledged and
* unacknowledged message. The Acknowledgement is taken care by the Library
* @param plightnessDefault_param : Pointer to the parameters received for message
* @param length : Length of the parameters received for message
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_Lightness_Default_Set(const MOBLEUINT8* plightnessDefault_param, MOBLEUINT32 length)
+MOBLE_RESULT Light_LightnessDefault_Set(const MOBLEUINT8* plightnessDefault_param,
+ MOBLEUINT32 length,\
+ MODEL_MessageHeader_t *pmsgParam)
{
/* 6.3.1.12 Light Default Lightness Set
Lightness 2B The target value of the Light Lightness Actual state.
*/
MOBLEUINT8 OptionalValid = 0;
- TRACE_M(TF_LIGHT_M, "Light_Lightness_Default_Set callback received \r\n");
+ TRACE_M(TF_LIGHT_M, "Light_LightnessDefault_Set callback received \r\n");
- Light_LightnessDefaultParam.LightnessDefaultStatus = plightnessDefault_param[1] << 8;
- Light_LightnessDefaultParam.LightnessDefaultStatus |= plightnessDefault_param[0];
+ Light_LightnessDefaultParam[pmsgParam->elementIndex].LightnessDefaultStatus = plightnessDefault_param[1] << 8;
+ Light_LightnessDefaultParam[pmsgParam->elementIndex].LightnessDefaultStatus |= plightnessDefault_param[0];
/* Application Callback */
- (LightAppli_cb.Lightness_Default_Set_cb)(&Light_LightnessDefaultParam, OptionalValid);
+ (LightAppli_cb.Lightness_Default_Set_cb)(&Light_LightnessDefaultParam[pmsgParam->elementIndex],
+ OptionalValid, pmsgParam->dst_peer, pmsgParam->elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -613,21 +762,25 @@ MOBLE_RESULT Light_Lightness_Default_Set(const MOBLEUINT8* plightnessDefault_par
* @brief Light Lightness Default Status
* @param pLightnessDefault_status: Pointer to the status message, which needs to be updated
* @param pLength: Pointer to the Length of the Status message
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_Lightness_Default_Status(MOBLEUINT8* pLightnessDefault_status, MOBLEUINT32 *pLength)
+MOBLE_RESULT Light_LightnessDefault_Status(MOBLEUINT8* pLightnessDefault_status,
+ MOBLEUINT32 *pLength,\
+ MODEL_MessageHeader_t *pmsgParam)
{
/*
Following is the status message:
Lightness 2B The value of the Light Lightness Default state.
*/
- TRACE_M(TF_LIGHT_M, "Light_Lightness_Default_Status callback received \r\n");
+ TRACE_M(TF_LIGHT_M, "Light_LightnessDefault_Status callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#8255! \n\r");
/* Function call back to get the values from application*/
- *pLightnessDefault_status = Light_LightnessDefaultParam.LightnessDefaultStatus ;
- *(pLightnessDefault_status+1) = Light_LightnessDefaultParam.LightnessDefaultStatus >>8;
+ *pLightnessDefault_status = Light_LightnessDefaultParam[pmsgParam->elementIndex].LightnessDefaultStatus ;
+ *(pLightnessDefault_status+1) = Light_LightnessDefaultParam[pmsgParam->elementIndex].LightnessDefaultStatus >>8;
*pLength = 2;
return MOBLE_RESULT_SUCCESS;
@@ -635,13 +788,17 @@ MOBLE_RESULT Light_Lightness_Default_Status(MOBLEUINT8* pLightnessDefault_status
/**
-* @brief Light_Lightness_Range_Set: This function is called for both Acknowledged and
+* @brief Light_LightnessRange_Set: This function is called for both Acknowledged and
* unacknowledged message. The Acknowledgement is taken care by the Library
* @param plightnessRange_param : Pointer to the parameters received for message
* @param length : Length of the parameters received for message
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_Lightness_Range_Set(const MOBLEUINT8* plightnessRange_param, MOBLEUINT32 length)
+MOBLE_RESULT Light_LightnessRange_Set(const MOBLEUINT8* plightnessRange_param,
+ MOBLEUINT32 length,\
+ MODEL_MessageHeader_t *pmsgParam)
{
/* 6.3.1.16 Light Lightness Range Set
Min Range 2B The Minimum range value of the Light Lightness state.
@@ -649,46 +806,50 @@ MOBLE_RESULT Light_Lightness_Range_Set(const MOBLEUINT8* plightnessRange_param,
*/
MOBLEUINT8 OptionalValid = 0;
- TRACE_M(TF_LIGHT_M, "Light_Lightness_Range_Set callback received \r\n");
+ TRACE_M(TF_LIGHT_M, "Light_LightnessRange_Set callback received \r\n");
- Light_LightnessRangeParam.MinRangeStatus = plightnessRange_param[1] << 8;
- Light_LightnessRangeParam.MinRangeStatus |= plightnessRange_param[0];
+ Light_LightnessRangeParam[pmsgParam->elementIndex].MinRangeStatus = plightnessRange_param[1] << 8;
+ Light_LightnessRangeParam[pmsgParam->elementIndex].MinRangeStatus |= plightnessRange_param[0];
- Light_LightnessRangeParam.MaxRangeStatus = plightnessRange_param[3] << 8;
- Light_LightnessRangeParam.MaxRangeStatus |= plightnessRange_param[2];
- Light_LightnessRangeParam.StatusCode = SUCCESS_STATUS_CODE;
+ Light_LightnessRangeParam[pmsgParam->elementIndex].MaxRangeStatus = plightnessRange_param[3] << 8;
+ Light_LightnessRangeParam[pmsgParam->elementIndex].MaxRangeStatus |= plightnessRange_param[2];
+ Light_LightnessRangeParam[pmsgParam->elementIndex].StatusCode = SUCCESS_STATUS_CODE;
/* condition to check the minimum range value according to the specification*/
/* set the status code for status message according to value of range*/
/* Application Callback */
- (LightAppli_cb.Lightness_Range_Set_cb)(&Light_LightnessRangeParam, OptionalValid);
+ (LightAppli_cb.Lightness_Range_Set_cb)(&Light_LightnessRangeParam[pmsgParam->elementIndex], OptionalValid,pmsgParam->dst_peer,pmsgParam->elementIndex);
return MOBLE_RESULT_SUCCESS;
}
/**
-* @brief Light_Lightness_Range_Status
+* @brief Light_LightnessRange_Status
* @param pLightnessRange_status: Pointer to the status message, which needs to be updated
* @param pLength: Pointer to the Length of the Status message
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_Lightness_Range_Status(MOBLEUINT8* pLightnessRange_status, MOBLEUINT32 *pLength)
+MOBLE_RESULT Light_LightnessRange_Status(MOBLEUINT8* pLightnessRange_status,
+ MOBLEUINT32 *pLength,\
+ MODEL_MessageHeader_t *pmsgParam)
{
/* 6.3.1.18 Light Lightness Range Status
Min Range 2B The Minimum range value of the Light Lightness state.
Max Range 2B The Maximum range value of the Light Lightness state
*/
- TRACE_M(TF_LIGHT_M, "Light_Lightness_Range_Status callback received \r\n");
+ TRACE_M(TF_LIGHT_M, "Light_LightnessRange_Status callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#8257! \n\r");
- *(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;
+ *(pLightnessRange_status) = Light_LightnessRangeParam[pmsgParam->elementIndex].StatusCode;
+ *(pLightnessRange_status+1) = Light_LightnessRangeParam[pmsgParam->elementIndex].MinRangeStatus;
+ *(pLightnessRange_status+2) = Light_LightnessRangeParam[pmsgParam->elementIndex].MinRangeStatus >> 8;
+ *(pLightnessRange_status+3) = Light_LightnessRangeParam[pmsgParam->elementIndex].MaxRangeStatus;
+ *(pLightnessRange_status+4) = Light_LightnessRangeParam[pmsgParam->elementIndex].MaxRangeStatus >> 8;
*pLength = 5;
return MOBLE_RESULT_SUCCESS;
@@ -700,9 +861,12 @@ MOBLE_RESULT Light_Lightness_Range_Status(MOBLEUINT8* pLightnessRange_status, MO
* unacknowledged message. The Acknowledgement is taken care by the Library
* @param pLightCtl_param : Pointer to the parameters received for message
* @param length : Length of the parameters received for message
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_Ctl_Set(const MOBLEUINT8* pLightCtl_param, MOBLEUINT32 length)
+MOBLE_RESULT Light_Ctl_Set(const MOBLEUINT8* pLightCtl_param, MOBLEUINT32 length,\
+ MODEL_MessageHeader_t *pmsgParam)
{
/* 6.3.2.2 Light Lightness Ctl Set
@@ -733,41 +897,44 @@ 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;
+ Light_CtlStatus[pmsgParam->elementIndex].PresentCtlDelta16 = Light_CtlParam.CTL_DeltaUv;
+ /* Check if the optional parameters are available for the transition */
if((length > 7) && (pLightCtl_param[7] !=0))
{
Light_CtlParam.CTL_TransitionTime = pLightCtl_param[7];
Light_CtlParam.CTL_Delay = pLightCtl_param[8];
- Light_CtlStatus.TargetCtlLightness16 = Light_CtlParam.CTL_Lightness;
- Light_CtlStatus.TargetCtlTemperature16 = Light_CtlParam.CTL_Temperature;
- Light_CtlStatus.RemainingTime = Light_CtlParam.CTL_TransitionTime;
+ Light_CtlStatus[pmsgParam->elementIndex].TargetCtlLightness16 = Light_CtlParam.CTL_Lightness;
+ Light_CtlStatus[pmsgParam->elementIndex].TargetCtlTemperature16 = Light_CtlParam.CTL_Temperature;
+ Light_CtlStatus[pmsgParam->elementIndex].RemainingTime = Light_CtlParam.CTL_TransitionTime;
- 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;
+ Light_TemporaryStatus[pmsgParam->elementIndex].TargetParam_1 = Light_CtlStatus[pmsgParam->elementIndex].TargetCtlLightness16;
+ Light_TemporaryStatus[pmsgParam->elementIndex].TargetParam_2 = Light_CtlStatus[pmsgParam->elementIndex].TargetCtlTemperature16;
+ Light_GetStepValue(pLightCtl_param[7],pmsgParam->elementIndex);
+ Light_ModelFlag[pmsgParam->elementIndex].LightOptionalParam = 1;
+ Light_ModelFlag[pmsgParam->elementIndex].LightTransitionFlag = LIGHT_CTL_TRANSITION_START;
}
else
{
#ifdef ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
- Light_CTLDefaultTransitionValue(&Light_CtlParam);
+ Light_CTLDefaultTransitionValue(&Light_CtlParam, pmsgParam->elementIndex);
#else
/* When no optional parameter received, target value will
be set as present value in application.
*/
- Light_CtlStatus.PresentCtlLightness16 = Light_CtlParam.CTL_Lightness;
- Light_CtlStatus.PresentCtlTemperature16 = Light_CtlParam.CTL_Temperature;
+ Light_ModelFlag[pmsgParam->elementIndex].LightTransitionFlag = LIGHT_TRANSITION_STOP;
+ Light_CtlStatus[pmsgParam->elementIndex].PresentCtlLightness16 = Light_CtlParam.CTL_Lightness;
+ Light_CtlStatus[pmsgParam->elementIndex].PresentCtlTemperature16 = Light_CtlParam.CTL_Temperature;
#endif
}
/* Application Callback */
- (LightAppli_cb.Light_Ctl_Set_cb)(&Light_CtlStatus, 0);
+ (LightAppli_cb.Light_Ctl_Set_cb)(&Light_CtlStatus[pmsgParam->elementIndex], 0,
+ pmsgParam->dst_peer,pmsgParam->elementIndex);
#ifdef ENABLE_MODEL_BINDING
/* binding of light ctl with actual lightness */
- Light_Ctl_LightActual_Binding(BINDING_LIGHT_CTL_SET);
+ Light_Ctl_LightActual_Binding(BINDING_LIGHT_CTL_SET,pmsgParam->elementIndex);
#endif
return MOBLE_RESULT_SUCCESS;
@@ -778,9 +945,12 @@ MOBLE_RESULT Light_Ctl_Set(const MOBLEUINT8* pLightCtl_param, MOBLEUINT32 length
* @brief Light CTL Status
* @param pLightCtl_status: Pointer to the status message, which needs to be updated
* @param pLength: Pointer to the Length of the Status message
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_Ctl_Status(MOBLEUINT8* pLightCtl_status, MOBLEUINT32 *pLength)
+MOBLE_RESULT Light_Ctl_Status(MOBLEUINT8* pLightCtl_status, MOBLEUINT32 *pLength,
+ MODEL_MessageHeader_t *pmsgParam)
{
/* 6.3.2.4 Light Lightness Ctl Status
Present Ctl Lightness 2B The Present ctl Lightness value of the model state.
@@ -793,27 +963,27 @@ MOBLE_RESULT Light_Ctl_Status(MOBLEUINT8* pLightCtl_status, MOBLEUINT32 *pLength
TRACE_M(TF_LIGHT_M,"Light_Ctl_Status callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#825D! \n\r");
- if((Light_ModelFlag.LightOptionalParam == 1) || (Light_TimeParam.StepValue != 0))
- {
- *(pLightCtl_status) = Light_CtlStatus.PresentCtlLightness16;
- *(pLightCtl_status+1) = Light_CtlStatus.PresentCtlLightness16 >> 8;
- *(pLightCtl_status+2) = Light_CtlStatus.PresentCtlTemperature16;
- *(pLightCtl_status+3) = Light_CtlStatus.PresentCtlTemperature16 >>8;
- *(pLightCtl_status+4) = Light_CtlStatus.TargetCtlLightness16;
- *(pLightCtl_status+5) = Light_CtlStatus.TargetCtlLightness16 >>8;
- *(pLightCtl_status+6) = Light_CtlStatus.TargetCtlTemperature16;
- *(pLightCtl_status+7) = Light_CtlStatus.TargetCtlTemperature16 >>8;
- *(pLightCtl_status+8) = Light_CtlStatus.RemainingTime;
+ *(pLightCtl_status) = Light_CtlStatus[pmsgParam->elementIndex].PresentCtlLightness16 ;
+ *(pLightCtl_status+1) = Light_CtlStatus[pmsgParam->elementIndex].PresentCtlLightness16 >> 8;
+ *(pLightCtl_status+2) = Light_CtlStatus[pmsgParam->elementIndex].PresentCtlTemperature16;
+ *(pLightCtl_status+3) = Light_CtlStatus[pmsgParam->elementIndex].PresentCtlTemperature16 >> 8;
+
+ /* Check if optional parameters are available */
+ if((Light_ModelFlag[pmsgParam->elementIndex].LightOptionalParam == 1) || (Light_TimeParam[pmsgParam->elementIndex].StepValue != 0))
+ {
+ *(pLightCtl_status+4) = Light_CtlStatus[pmsgParam->elementIndex].TargetCtlLightness16;
+ *(pLightCtl_status+5) = Light_CtlStatus[pmsgParam->elementIndex].TargetCtlLightness16 >>8;
+ *(pLightCtl_status+6) = Light_CtlStatus[pmsgParam->elementIndex].TargetCtlTemperature16;
+ *(pLightCtl_status+7) = Light_CtlStatus[pmsgParam->elementIndex].TargetCtlTemperature16 >>8;
+ *(pLightCtl_status+8) = Light_CtlStatus[pmsgParam->elementIndex].RemainingTime;
*pLength = 9;
- Light_ModelFlag.LightOptionalParam = 0;
+ Light_ModelFlag[pmsgParam->elementIndex].LightOptionalParam = 0;
+ TRACE_M(TF_LIGHT_M, "Light_Ctl_Status sent with transition \r\n");
}
else
{
- *(pLightCtl_status) = Light_CtlStatus.PresentCtlLightness16 ;
- *(pLightCtl_status+1) = Light_CtlStatus.PresentCtlLightness16 >> 8;
- *(pLightCtl_status+2) = Light_CtlStatus.PresentCtlTemperature16;
- *(pLightCtl_status+3) = Light_CtlStatus.PresentCtlTemperature16 >> 8;
*pLength = 4;
+ TRACE_M(TF_LIGHT_M, "Light_Ctl_Status sent without transition \r\n");
}
return MOBLE_RESULT_SUCCESS;
@@ -825,9 +995,13 @@ MOBLE_RESULT Light_Ctl_Status(MOBLEUINT8* pLightCtl_status, MOBLEUINT32 *pLength
* unacknowledged message. The Acknowledgement is taken care by the Library
* @param pLightCtlTemp_param : Pointer to the parameters received for message
* @param length : Length of the parameters received for message
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_CtlTemperature_Set(const MOBLEUINT8* pLightCtlTemp_param, MOBLEUINT32 length)
+MOBLE_RESULT Light_CtlTemperature_Set(const MOBLEUINT8* pLightCtlTemp_param,
+ MOBLEUINT32 length,\
+ MODEL_MessageHeader_t *pmsgParam)
{
/* 6.3.2.6 Light Ctl Temperature Set
Ctl Temperature 2B The target value of the Light Temperature Ctl state.
@@ -847,42 +1021,44 @@ 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 */
+ Light_CtlTemperature_TempRangeBinding(&Light_CtlParam, pmsgParam->elementIndex);
+ /* Check if optional parameters are available For transition */
if((length > 5) && (pLightCtlTemp_param[5] !=0))
{
Light_CtlParam.CTL_TransitionTime = pLightCtlTemp_param[5];
Light_CtlParam.CTL_Delay = pLightCtlTemp_param[6];
- Light_CtlStatus.TargetCtlTemperature16 = Light_CtlParam.CTL_Temperature;
- Light_CtlStatus.TargetCtlDeltaUv16 = Light_CtlParam.CTL_DeltaUv;
- Light_CtlStatus.RemainingTime = Light_CtlParam.CTL_TransitionTime;
+ Light_CtlStatus[pmsgParam->elementIndex].TargetCtlTemperature16 = Light_CtlParam.CTL_Temperature;
+ Light_CtlStatus[pmsgParam->elementIndex].TargetCtlDeltaUv16 = Light_CtlParam.CTL_DeltaUv;
+ Light_CtlStatus[pmsgParam->elementIndex].RemainingTime = Light_CtlParam.CTL_TransitionTime;
- 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;
+ Light_TemporaryStatus[pmsgParam->elementIndex].TargetParam_1 = Light_CtlStatus[pmsgParam->elementIndex].TargetCtlTemperature16;
+ Light_TemporaryStatus[pmsgParam->elementIndex].TargetParam_2 = Light_CtlStatus[pmsgParam->elementIndex].TargetCtlDeltaUv16;
+ Light_GetStepValue(pLightCtlTemp_param[5],pmsgParam->elementIndex);
+ Light_ModelFlag[pmsgParam->elementIndex].LightOptionalParam = 1;
+ Light_ModelFlag[pmsgParam->elementIndex].LightTransitionFlag = LIGHT_TEMPERATURE_TRANSITION_START;
}
else
{
#ifdef ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
- Light_CTLTemperatureDefaultTransitionValue(&Light_CtlParam);
+ Light_CTLTemperatureDefaultTransitionValue(&Light_CtlParam, pmsgParam->elementIndex);
#else
/* When no optional parameter received, target value will
be set as present value in application.
*/
- Light_CtlStatus.PresentCtlTemperature16 = Light_CtlParam.CTL_Temperature;
- Light_CtlStatus.PresentCtlDelta16 = Light_CtlParam.CTL_DeltaUv;
+ Light_ModelFlag[pmsgParam->elementIndex].LightTransitionFlag = LIGHT_TRANSITION_STOP;
+ Light_CtlStatus[pmsgParam->elementIndex].PresentCtlTemperature16 = Light_CtlParam.CTL_Temperature;
+ Light_CtlStatus[pmsgParam->elementIndex].PresentCtlDelta16 = Light_CtlParam.CTL_DeltaUv;
#endif
}
/* Application Callback */
- (LightAppli_cb.Light_CtlTemperature_Set_cb)(&Light_CtlStatus, OptionalValid);
+ (LightAppli_cb.Light_CtlTemperature_Set_cb)(&Light_CtlStatus[pmsgParam->elementIndex], OptionalValid,pmsgParam->dst_peer,pmsgParam->elementIndex);
#ifdef ENABLE_MODEL_BINDING
/* Binding of data Ctl Temperature with Generic Level */
- Light_CtlTemperature_Binding();
+ Light_CtlTemperature_Binding(pmsgParam->elementIndex);
#endif
return MOBLE_RESULT_SUCCESS;
@@ -893,9 +1069,13 @@ MOBLE_RESULT Light_CtlTemperature_Set(const MOBLEUINT8* pLightCtlTemp_param, MOB
* @brief Light_CtlTemperature_Status
* @param pLightCtlTemp_status: Pointer to the status message, which needs to be updated
* @param pLength: Pointer to the Length of the Status message
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_CtlTemperature_Status(MOBLEUINT8* pLightCtlTemp_status, MOBLEUINT32 *pLength)
+MOBLE_RESULT Light_CtlTemperature_Status(MOBLEUINT8* pLightCtlTemp_status,
+ MOBLEUINT32 *pLength,
+ MODEL_MessageHeader_t *pmsgParam)
{
/* 6.3.2.4 Light Lightness Ctl Status
@@ -909,30 +1089,30 @@ MOBLE_RESULT Light_CtlTemperature_Status(MOBLEUINT8* pLightCtlTemp_status, MOBLE
TRACE_M(TF_LIGHT_M,"Light_CtlTemperature_Status callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#8261! \n\r");
- if((Light_ModelFlag.LightOptionalParam == 1) || (Light_TimeParam.StepValue != 0))
- {
- *(pLightCtlTemp_status) = Light_CtlStatus.PresentCtlTemperature16;
- *(pLightCtlTemp_status+1) = Light_CtlStatus.PresentCtlTemperature16 >> 8;
- *(pLightCtlTemp_status+2) = Light_CtlStatus.PresentCtlDelta16;
- *(pLightCtlTemp_status+3) = Light_CtlStatus.PresentCtlDelta16 >>8;
- *(pLightCtlTemp_status+4) = Light_CtlStatus.TargetCtlTemperature16;
- *(pLightCtlTemp_status+5) = Light_CtlStatus.TargetCtlTemperature16 >>8;
- *(pLightCtlTemp_status+6) = Light_CtlStatus.TargetCtlDeltaUv16;
- *(pLightCtlTemp_status+7) = Light_CtlStatus.TargetCtlDeltaUv16 >>8;
- *(pLightCtlTemp_status+8) = Light_CtlStatus.RemainingTime;
+ *(pLightCtlTemp_status) = Light_CtlStatus[pmsgParam->elementIndex].PresentCtlTemperature16;
+ *(pLightCtlTemp_status+1) = Light_CtlStatus[pmsgParam->elementIndex].PresentCtlTemperature16 >> 8;
+ *(pLightCtlTemp_status+2) = Light_CtlStatus[pmsgParam->elementIndex].PresentCtlDelta16;
+ *(pLightCtlTemp_status+3) = Light_CtlStatus[pmsgParam->elementIndex].PresentCtlDelta16 >>8;
+
+ /* Check if optional parameters are available For transition */
+ if((Light_ModelFlag[pmsgParam->elementIndex].LightOptionalParam == 1) || (Light_TimeParam[pmsgParam->elementIndex].StepValue != 0))
+ {
+ *(pLightCtlTemp_status+4) = Light_CtlStatus[pmsgParam->elementIndex].TargetCtlTemperature16;
+ *(pLightCtlTemp_status+5) = Light_CtlStatus[pmsgParam->elementIndex].TargetCtlTemperature16 >>8;
+ *(pLightCtlTemp_status+6) = Light_CtlStatus[pmsgParam->elementIndex].TargetCtlDeltaUv16;
+ *(pLightCtlTemp_status+7) = Light_CtlStatus[pmsgParam->elementIndex].TargetCtlDeltaUv16 >>8;
+ *(pLightCtlTemp_status+8) = Light_CtlStatus[pmsgParam->elementIndex].RemainingTime;
*pLength = 9;
- Light_ModelFlag.LightOptionalParam = 0;
+ Light_ModelFlag[pmsgParam->elementIndex].LightOptionalParam = 0;
+ TRACE_M(TF_LIGHT_M, "Light_CtlTemperature_Status sent with transition \r\n");
}
else
{
/* When no optional parameter received then, target value will
be sent in status message.
*/
- *(pLightCtlTemp_status) = Light_CtlStatus.PresentCtlTemperature16;
- *(pLightCtlTemp_status+1) = Light_CtlStatus.PresentCtlTemperature16 >> 8;
- *(pLightCtlTemp_status+2) = Light_CtlStatus.PresentCtlDelta16;
- *(pLightCtlTemp_status+3) = Light_CtlStatus.PresentCtlDelta16 >>8;
*pLength = 4;
+ TRACE_M(TF_LIGHT_M, "Light_CtlTemperature_Status sent without transition \r\n");
}
return MOBLE_RESULT_SUCCESS;
@@ -940,13 +1120,17 @@ MOBLE_RESULT Light_CtlTemperature_Status(MOBLEUINT8* pLightCtlTemp_status, MOBLE
/**
-* @brief Light_CtlTemperature_Range_Set: This function is called for both Acknowledged and
+* @brief Light_CtlTemperatureRange_Set: This function is called for both Acknowledged and
* unacknowledged message. The Acknowledgement is taken care by the Library.
* @param plightCtlTempRange_param : Pointer to the parameters received for message.
* @param length : Length of the parameters received for message.
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_CtlTemperature_Range_Set(const MOBLEUINT8* plightCtlTempRange_param, MOBLEUINT32 length)
+MOBLE_RESULT Light_CtlTemperatureRange_Set(const MOBLEUINT8* plightCtlTempRange_param,
+ MOBLEUINT32 length,\
+ MODEL_MessageHeader_t *pmsgParam)
{
/* 6.3.2.10 Light Ctl Temperature Set
@@ -954,46 +1138,47 @@ MOBLE_RESULT Light_CtlTemperature_Range_Set(const MOBLEUINT8* plightCtlTempRange
Max Range 2B The maximum value for Ctl temperature state.
*/
MOBLEUINT8 OptionalValid = 0;
- TRACE_M(TF_LIGHT_M,"Light_CtlTemperature_Range_Set callback received \r\n");
+ TRACE_M(TF_LIGHT_M, "Light_CtlTemperatureRange_Set callback received \r\n");
- CtlTemperatureRangeParam.MinRangeStatus = plightCtlTempRange_param[1] << 8;
- CtlTemperatureRangeParam.MinRangeStatus |= plightCtlTempRange_param[0];
+ CtlTemperatureRangeParam[pmsgParam->elementIndex].MinRangeStatus = plightCtlTempRange_param[1] << 8;
+ CtlTemperatureRangeParam[pmsgParam->elementIndex].MinRangeStatus |= plightCtlTempRange_param[0];
- CtlTemperatureRangeParam.MaxRangeStatus = plightCtlTempRange_param[3] << 8;
- CtlTemperatureRangeParam.MaxRangeStatus |= plightCtlTempRange_param[2];
- CtlTemperatureRangeParam.StatusCode = SUCCESS_STATUS_CODE;
+ CtlTemperatureRangeParam[pmsgParam->elementIndex].MaxRangeStatus = plightCtlTempRange_param[3] << 8;
+ CtlTemperatureRangeParam[pmsgParam->elementIndex].MaxRangeStatus |= plightCtlTempRange_param[2];
+ CtlTemperatureRangeParam[pmsgParam->elementIndex].StatusCode = SUCCESS_STATUS_CODE;
- /* condition to check the minimum range value according to the specification*/
- /* set the status code for status message according to value of range*/
- if((CtlTemperatureRangeParam.MinRangeStatus < MIN_CTL_TEMP_RANGE) ||
- (CtlTemperatureRangeParam.MinRangeStatus >MAX_CTL_TEMP_RANGE))
- {
- CtlTemperatureRangeParam.StatusCode = MIN_RANGE_INVALID_STATUS_CODE;
- }
- if((CtlTemperatureRangeParam.MaxRangeStatus < MIN_CTL_TEMP_RANGE) ||
- (CtlTemperatureRangeParam.MaxRangeStatus >MAX_CTL_TEMP_RANGE))
+ /* Condition to check the minimum range value according to the specification */
+ /* Set the status code for status message according to value of range*/
+ if((CtlTemperatureRangeParam[pmsgParam->elementIndex].MinRangeStatus < MIN_CTL_TEMP_RANGE) ||
+ (CtlTemperatureRangeParam[pmsgParam->elementIndex].MinRangeStatus >MAX_CTL_TEMP_RANGE) ||
+ (CtlTemperatureRangeParam[pmsgParam->elementIndex].MaxRangeStatus < MIN_CTL_TEMP_RANGE) ||
+ (CtlTemperatureRangeParam[pmsgParam->elementIndex].MaxRangeStatus >MAX_CTL_TEMP_RANGE))
{
- CtlTemperatureRangeParam.StatusCode = MIN_RANGE_INVALID_STATUS_CODE;
+ CtlTemperatureRangeParam[pmsgParam->elementIndex].StatusCode = MIN_RANGE_INVALID_STATUS_CODE;
}
- if((CtlTemperatureRangeParam.MaxRangeStatus == UNKNOWN_CTL_TEMP_VALUE) ||
- (CtlTemperatureRangeParam.MaxRangeStatus < CtlTemperatureRangeParam.MinRangeStatus))
+ if((CtlTemperatureRangeParam[pmsgParam->elementIndex].MaxRangeStatus == UNKNOWN_CTL_TEMP_VALUE) ||
+ (CtlTemperatureRangeParam[pmsgParam->elementIndex].MaxRangeStatus < CtlTemperatureRangeParam[pmsgParam->elementIndex].MinRangeStatus))
{
- CtlTemperatureRangeParam.StatusCode = MAX_RANGE_INVALID_STATUS_CODE;
+ CtlTemperatureRangeParam[pmsgParam->elementIndex].StatusCode = MAX_RANGE_INVALID_STATUS_CODE;
}
/* Application Callback */
- (LightAppli_cb.Light_CtlTemperature_Range_Set_cb)(&CtlTemperatureRangeParam, OptionalValid);
+ (LightAppli_cb.Light_CtlTemperature_Range_Set_cb)(&CtlTemperatureRangeParam[pmsgParam->elementIndex], OptionalValid,pmsgParam->dst_peer,pmsgParam->elementIndex);
return MOBLE_RESULT_SUCCESS;
}
/**
-* @brief Light_CtlTemperature_Range_Status
+* @brief Light_CtlTemperatureRange_Status
* @param pCtlTempRange_status: Pointer to the status message, which needs to be updated.
* @param pLength: Pointer to the Length of the Status message.
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_CtlTemperature_Range_Status(MOBLEUINT8* pCtlTempRange_status, MOBLEUINT32 *pLength)
+MOBLE_RESULT Light_CtlTemperatureRange_Status(MOBLEUINT8* pCtlTempRange_status,
+ MOBLEUINT32 *pLength,\
+ MODEL_MessageHeader_t *pmsgParam)
{
/* 6.3.2.12 Light Ctl Temperature status
Status Code 1B The Status code for the temperature range status.
@@ -1001,14 +1186,14 @@ MOBLE_RESULT Light_CtlTemperature_Range_Status(MOBLEUINT8* pCtlTempRange_status,
Max Range 2B The maximum value for Ctl temperature state.
*/
- TRACE_M(TF_LIGHT_M,"Light_CtlTemperature_Range_Status callback received \r\n");
+ TRACE_M(TF_LIGHT_M, "Light_CtlTemperatureRange_Status callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#8262! \n\r");
- *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;
+ *pCtlTempRange_status = CtlTemperatureRangeParam[pmsgParam->elementIndex].StatusCode;
+ *(pCtlTempRange_status+1) = CtlTemperatureRangeParam[pmsgParam->elementIndex].MinRangeStatus ;
+ *(pCtlTempRange_status+2) = CtlTemperatureRangeParam[pmsgParam->elementIndex].MinRangeStatus >> 8;
+ *(pCtlTempRange_status+3) = CtlTemperatureRangeParam[pmsgParam->elementIndex].MaxRangeStatus ;
+ *(pCtlTempRange_status+4) = CtlTemperatureRangeParam[pmsgParam->elementIndex].MaxRangeStatus >> 8;
*pLength = 5;
@@ -1021,9 +1206,13 @@ MOBLE_RESULT Light_CtlTemperature_Range_Status(MOBLEUINT8* pCtlTempRange_status,
* unacknowledged message. The Acknowledgement is taken care by the Library.
* @param pCtlDefault_param : Pointer to the parameters received for message.
* @param length : Length of the parameters received for message.
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_CtlDefault_Set(const MOBLEUINT8* pCtlDefault_param, MOBLEUINT32 length)
+MOBLE_RESULT Light_CtlDefault_Set(const MOBLEUINT8* pCtlDefault_param,
+ MOBLEUINT32 length,\
+ MODEL_MessageHeader_t *pmsgParam)
{
/* 6.3.2.6 Light Ctl Default Set
Ctl Lightness 2B The Default value of the Ctl Lightness.
@@ -1034,17 +1223,19 @@ MOBLE_RESULT Light_CtlDefault_Set(const MOBLEUINT8* pCtlDefault_param, MOBLEUINT
TRACE_M(TF_LIGHT_M,"Light_CtlDefault_Set callback received \r\n");
- Light_CtlDefaultParam.CtlDefaultLightness16 = pCtlDefault_param[1] << 8;
- Light_CtlDefaultParam.CtlDefaultLightness16 |= pCtlDefault_param[0];
+ Light_CtlDefaultParam[pmsgParam->elementIndex].CtlDefaultLightness16 = pCtlDefault_param[1] << 8;
+ Light_CtlDefaultParam[pmsgParam->elementIndex].CtlDefaultLightness16 |= pCtlDefault_param[0];
- Light_CtlDefaultParam.CtlDefaultTemperature16 = pCtlDefault_param[3] << 8;
- Light_CtlDefaultParam.CtlDefaultTemperature16 |= pCtlDefault_param[2];
+ Light_CtlDefaultParam[pmsgParam->elementIndex].CtlDefaultTemperature16 = pCtlDefault_param[3] << 8;
+ Light_CtlDefaultParam[pmsgParam->elementIndex].CtlDefaultTemperature16 |= pCtlDefault_param[2];
- Light_CtlDefaultParam.CtlDefaultDeltaUv = pCtlDefault_param[5] << 8;
- Light_CtlDefaultParam.CtlDefaultDeltaUv |= pCtlDefault_param[4];
+ Light_CtlDefaultParam[pmsgParam->elementIndex].CtlDefaultDeltaUv = pCtlDefault_param[5] << 8;
+ Light_CtlDefaultParam[pmsgParam->elementIndex].CtlDefaultDeltaUv |= pCtlDefault_param[4];
/* Application Callback */
- (LightAppli_cb.Light_CtlDefault_Set_cb)(&Light_CtlDefaultParam , OptionalValid);
+ (LightAppli_cb.Light_CtlDefault_Set_cb)(&Light_CtlDefaultParam[pmsgParam->elementIndex] , OptionalValid,
+ pmsgParam->dst_peer,
+ pmsgParam->elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -1053,9 +1244,13 @@ MOBLE_RESULT Light_CtlDefault_Set(const MOBLEUINT8* pCtlDefault_param, MOBLEUINT
* @brief Light_CtlDefault_Status
* @param pCtlDefault_status: Pointer to the status message, which needs to be updated.
* @param pLength: Pointer to the Length of the Status message.
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_CtlDefault_Status(MOBLEUINT8* pCtlDefault_status, MOBLEUINT32 *pLength)
+MOBLE_RESULT Light_CtlDefault_Status(MOBLEUINT8* pCtlDefault_status,
+ MOBLEUINT32 *pLength,\
+ MODEL_MessageHeader_t *pmsgParam)
{
/* 6.3.2.16 Light Ctl Default Status
Ctl Lightness 2B The Default value of the Ctl Lightness.
@@ -1063,15 +1258,15 @@ MOBLE_RESULT Light_CtlDefault_Status(MOBLEUINT8* pCtlDefault_status, MOBLEUINT32
Ctl Delta Uv 2B The Default value of the Ctl Delta Uv..
*/
- TRACE_M(TF_LIGHT_M,"Light_Ctl_DefaultStatus callback received \r\n");
+ TRACE_M(TF_LIGHT_M, "Light_Ctl_DefaultStatus callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#8267! \n\r");
- *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;
+ *pCtlDefault_status = Light_CtlDefaultParam[pmsgParam->elementIndex].CtlDefaultLightness16 ;
+ *(pCtlDefault_status +1) = Light_CtlDefaultParam[pmsgParam->elementIndex].CtlDefaultLightness16 >> 8;
+ *(pCtlDefault_status +2) = Light_CtlDefaultParam[pmsgParam->elementIndex].CtlDefaultTemperature16;
+ *(pCtlDefault_status +3) = Light_CtlDefaultParam[pmsgParam->elementIndex].CtlDefaultTemperature16 >> 8;
+ *(pCtlDefault_status +4) = Light_CtlDefaultParam[pmsgParam->elementIndex].CtlDefaultDeltaUv;
+ *(pCtlDefault_status +5) = Light_CtlDefaultParam[pmsgParam->elementIndex].CtlDefaultDeltaUv >> 8;
*pLength = 6;
@@ -1084,9 +1279,13 @@ MOBLE_RESULT Light_CtlDefault_Status(MOBLEUINT8* pCtlDefault_status, MOBLEUINT32
* unacknowledged message. The Acknowledgement is taken care by the Library
* @param pHsl_param : Pointer to the parameters received for message
* @param length : Length of the parameters received for message
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_Hsl_Set(const MOBLEUINT8* pHsl_param, MOBLEUINT32 length)
+MOBLE_RESULT Light_Hsl_Set(const MOBLEUINT8* pHsl_param,
+ MOBLEUINT32 length,\
+ MODEL_MessageHeader_t *pmsgParam)
{
/* 6.1.4.1 Light Hsl Set
HSL Lightness 2B The target value of the Light HSL Lightness state.
@@ -1111,37 +1310,42 @@ MOBLE_RESULT Light_Hsl_Set(const MOBLEUINT8* pHsl_param, MOBLEUINT32 length)
Light_HslParam.Hsl_TID = pHsl_param[6];
+ /* Check if optional parameters are available For transition */
if((length > 7U) && (pHsl_param[7] !=0))
{
Light_HslParam.Hsl_TransitionTime = pHsl_param[7];
Light_HslParam.Hsl_Delay = pHsl_param[8];
- Light_HslStatus.TargetHslLightness16 = Light_HslParam.HslLightness16;
- Light_HslStatus.TargetHslHueLightness16 = Light_HslParam.HslHueLightness16;
- Light_HslStatus.TargetHslSaturation16 = Light_HslParam.HslSaturation16;
- Light_HslStatus.RemainingTime = Light_HslParam.Hsl_TransitionTime;
+ Light_HslStatus[pmsgParam->elementIndex].TargetHslLightness16 = Light_HslParam.HslLightness16;
+ Light_HslStatus[pmsgParam->elementIndex].TargetHslHueLightness16 = Light_HslParam.HslHueLightness16;
+ Light_HslStatus[pmsgParam->elementIndex].TargetHslSaturation16 = Light_HslParam.HslSaturation16;
+ Light_HslStatus[pmsgParam->elementIndex].RemainingTime = Light_HslParam.Hsl_TransitionTime;
- Light_TemporaryStatus.TargetParam_1 = Light_HslStatus.TargetHslLightness16;
- Light_TemporaryStatus.TargetParam_2 = Light_HslStatus.TargetHslHueLightness16;
- Light_TemporaryStatus.TargetParam_3 = Light_HslStatus.TargetHslSaturation16;
+ Light_TemporaryStatus[pmsgParam->elementIndex].TargetParam_1 = Light_HslStatus[pmsgParam->elementIndex].TargetHslLightness16;
+ Light_TemporaryStatus[pmsgParam->elementIndex].TargetParam_2 = Light_HslStatus[pmsgParam->elementIndex].TargetHslHueLightness16;
+ Light_TemporaryStatus[pmsgParam->elementIndex].TargetParam_3 = Light_HslStatus[pmsgParam->elementIndex].TargetHslSaturation16;
- Light_GetStepValue(pHsl_param[7]);
- Light_ModelFlag.LightOptionalParam = 1;
- Light_ModelFlag.LightTransitionFlag = LIGHT_HSL_TRANSITION_START;
+ Light_GetStepValue(pHsl_param[7],pmsgParam->elementIndex);
+ Light_ModelFlag[pmsgParam->elementIndex].LightOptionalParam = 1;
+ Light_ModelFlag[pmsgParam->elementIndex].LightTransitionFlag = LIGHT_HSL_TRANSITION_START;
}
else
{
- Light_HslStatus.PresentHslLightness16 = Light_HslParam.HslLightness16;
- Light_HslStatus.PresentHslHueLightness16 = Light_HslParam.HslHueLightness16;
- Light_HslStatus.PresentHslSaturation16 = Light_HslParam.HslSaturation16;
+#ifdef ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
+ Light_HSLDefaultTransitionValue(&Light_HslParam, pmsgParam->elementIndex);
+#else
+ Light_ModelFlag[pmsgParam->elementIndex].LightTransitionFlag = LIGHT_TRANSITION_STOP;
+ Light_HslStatus[pmsgParam->elementIndex].PresentHslLightness16 = Light_HslParam.HslLightness16;
+ Light_HslStatus[pmsgParam->elementIndex].PresentHslHueLightness16 = Light_HslParam.HslHueLightness16;
+ Light_HslStatus[pmsgParam->elementIndex].PresentHslSaturation16 = Light_HslParam.HslSaturation16;
+#endif
}
-
/* Application Callback */
- (LightAppli_cb.Light_Hsl_Set_cb)(&Light_HslStatus , OptionalValid);
+ (LightAppli_cb.Light_Hsl_Set_cb)(&Light_HslStatus[pmsgParam->elementIndex] , OptionalValid,pmsgParam->dst_peer,pmsgParam->elementIndex);
#ifdef ENABLE_MODEL_BINDING
/* Light Hsl Lightness binding with lightness Actual */
- Light_HslLightness_LightnessActualBinding();
+ Light_HslLightness_LightnessActualBinding(pmsgParam->elementIndex);
#endif
return MOBLE_RESULT_SUCCESS;
@@ -1152,9 +1356,13 @@ MOBLE_RESULT Light_Hsl_Set(const MOBLEUINT8* pHsl_param, MOBLEUINT32 length)
* @brief Light_Hsl_Status
* @param pHsl_status: Pointer to the status message, which needs to be updated
* @param pLength: Pointer to the Length of the Status message
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_Hsl_Status(MOBLEUINT8* pHsl_status, MOBLEUINT32 *pLength)
+MOBLE_RESULT Light_Hsl_Status(MOBLEUINT8* pHsl_status,
+ MOBLEUINT32 *pLength,\
+ MODEL_MessageHeader_t *pmsgParam)
{
/* 6.3.3.4 Light Hsl Status
HSL Lightness 2B The present value of the Light HSL Lightness state.
@@ -1166,34 +1374,22 @@ MOBLE_RESULT Light_Hsl_Status(MOBLEUINT8* pHsl_status, MOBLEUINT32 *pLength)
TRACE_M(TF_LIGHT_M,"Light_Hsl_Status callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#826D! \n\r");
- 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;
- *(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;
+ *(pHsl_status) = Light_HslStatus[pmsgParam->elementIndex].PresentHslLightness16 ;
+ *(pHsl_status+1) = Light_HslStatus[pmsgParam->elementIndex].PresentHslLightness16 >> 8;
+ *(pHsl_status+2) = Light_HslStatus[pmsgParam->elementIndex].PresentHslHueLightness16;
+ *(pHsl_status+3) = Light_HslStatus[pmsgParam->elementIndex].PresentHslHueLightness16 >> 8;
+ *(pHsl_status+4) = Light_HslStatus[pmsgParam->elementIndex].PresentHslSaturation16;
+ *(pHsl_status+5) = Light_HslStatus[pmsgParam->elementIndex].PresentHslSaturation16 >> 8;
+
+ /* Check if optional parameters are available For transition */
+ if((Light_ModelFlag[pmsgParam->elementIndex].LightOptionalParam == 1) || (Light_TimeParam[pmsgParam->elementIndex].StepValue != 0))
+ {
+ *(pHsl_status+6) = Light_HslStatus[pmsgParam->elementIndex].RemainingTime;
+ *pLength = 7; /* Total packet length with remaining time */
+ Light_ModelFlag[pmsgParam->elementIndex].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;
}
@@ -1206,9 +1402,13 @@ MOBLE_RESULT Light_Hsl_Status(MOBLEUINT8* pHsl_status, MOBLEUINT32 *pLength)
* unacknowledged message. The Acknowledgement is taken care by the Library
* @param pHslHue_param : Pointer to the parameters received for message
* @param length : Length of the parameters received for message
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_HslHue_Set(const MOBLEUINT8* pHslHue_param, MOBLEUINT32 length)
+MOBLE_RESULT Light_HslHue_Set(const MOBLEUINT8* pHslHue_param,
+ MOBLEUINT32 length,\
+ MODEL_MessageHeader_t *pmsgParam)
{
/* 6.3.3.8 Light Hsl Hue Set
HSL Lightness 2B The target value of the Light HSL Lightness state.
@@ -1226,37 +1426,42 @@ 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];
- Light_HslHue_RangeBinding(&Light_HslParam);
+ Light_HslHue_RangeBinding(&Light_HslParam, pmsgParam->elementIndex);
+
+ /* Check if optional parameters are available For transition */
if((length > 3U) && (pHslHue_param[3] !=0))
{
Light_HslParam.Hsl_TransitionTime = pHslHue_param[3];
Light_HslParam.Hsl_Delay = pHslHue_param[4];
- Light_HslStatus.TargetHslHueLightness16 = Light_HslParam.HslHueLightness16;
- Light_HslStatus.RemainingTime = Light_HslParam.Hsl_TransitionTime;
- /* copy status parameters in Temporary parameters for transition
- process.
- */
- Light_TemporaryStatus.TargetParam_1 = Light_HslStatus.TargetHslHueLightness16;
+ Light_HslStatus[pmsgParam->elementIndex].TargetHslHueLightness16 = Light_HslParam.HslHueLightness16;
+ Light_HslStatus[pmsgParam->elementIndex].RemainingTime = Light_HslParam.Hsl_TransitionTime;
- /* Function to calculate time parameters, step resolution
- step size for transition state machine.
- */
- Light_GetStepValue(pHslHue_param[3]);
+ /* Copy status parameters in Temporary parameters for transition process. */
+ Light_TemporaryStatus[pmsgParam->elementIndex].TargetParam_1 = Light_HslStatus[pmsgParam->elementIndex].TargetHslHueLightness16;
+
+ /* Function to calculate time parameters, step resolution step size for transition state machine. */
+ Light_GetStepValue(pHslHue_param[3],pmsgParam->elementIndex);
- Light_ModelFlag.LightOptionalParam = 1;
- Light_ModelFlag.LightTransitionFlag = LIGHT_HSL_HUE_TRANSITION_START;
+ Light_ModelFlag[pmsgParam->elementIndex].LightOptionalParam = 1;
+ Light_ModelFlag[pmsgParam->elementIndex].LightTransitionFlag = LIGHT_HSL_HUE_TRANSITION_START;
}
else
{
- Light_HslStatus.PresentHslHueLightness16 = Light_HslParam.HslHueLightness16;
+#ifdef ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
+ Light_HSLHueDefaultTransitionValue(&Light_HslParam, pmsgParam->elementIndex);
+#else
+ Light_ModelFlag[pmsgParam->elementIndex].LightTransitionFlag = LIGHT_TRANSITION_STOP;
+ Light_HslStatus[pmsgParam->elementIndex].PresentHslHueLightness16 = Light_HslParam.HslHueLightness16;
+#endif
}
/* Application Callback */
- (LightAppli_cb.Light_HslHue_Set_cb)(&Light_HslStatus , OptionalValid);
+ (LightAppli_cb.Light_HslHue_Set_cb)(&Light_HslStatus[pmsgParam->elementIndex], OptionalValid,
+ pmsgParam->dst_peer, pmsgParam->elementIndex);
#ifdef ENABLE_MODEL_BINDING
/* Light Hsl Hue binding with Generic level */
- Light_Hsl_Hue_Binding();
+ Light_Hsl_Hue_Binding(pmsgParam->elementIndex);
#endif
return MOBLE_RESULT_SUCCESS;
@@ -1267,9 +1472,13 @@ MOBLE_RESULT Light_HslHue_Set(const MOBLEUINT8* pHslHue_param, MOBLEUINT32 lengt
* @brief Light_HslHue_Status
* @param pHslHue_status: Pointer to the status message, which needs to be updated
* @param pLength: Pointer to the Length of the Status message
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_HslHue_Status(MOBLEUINT8* pHslHue_status, MOBLEUINT32 *pLength)
+MOBLE_RESULT Light_HslHue_Status(MOBLEUINT8* pHslHue_status,
+ MOBLEUINT32 *pLength,\
+ MODEL_MessageHeader_t *pmsgParam)
{
/* 6.3.3.10 Light Hsl Hue Status
Present HSL Hue 2B The Present value of the Light HSL Hue state.
@@ -1280,16 +1489,17 @@ MOBLE_RESULT Light_HslHue_Status(MOBLEUINT8* pHslHue_status, MOBLEUINT32 *pLengt
TRACE_M(TF_LIGHT_M,"Light_HslHue_Status callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#826E! \n\r");
- *(pHslHue_status) = Light_HslStatus.PresentHslHueLightness16;
- *(pHslHue_status+1) = Light_HslStatus.PresentHslHueLightness16 >> 8;
+ *(pHslHue_status) = Light_HslStatus[pmsgParam->elementIndex].PresentHslHueLightness16;
+ *(pHslHue_status+1) = Light_HslStatus[pmsgParam->elementIndex].PresentHslHueLightness16 >> 8;
- if((Light_ModelFlag.LightOptionalParam == 1) || (Light_TimeParam.StepValue != 0))
+ /* Check if optional parameters are available For transition */
+ if((Light_ModelFlag[pmsgParam->elementIndex].LightOptionalParam == 1) || (Light_TimeParam[pmsgParam->elementIndex].StepValue != 0))
{
- *(pHslHue_status+2) = Light_HslStatus.TargetHslHueLightness16;
- *(pHslHue_status+3) = Light_HslStatus.TargetHslHueLightness16 >> 8;
- *(pHslHue_status+4) = Light_HslStatus.RemainingTime;
+ *(pHslHue_status+2) = Light_HslStatus[pmsgParam->elementIndex].TargetHslHueLightness16;
+ *(pHslHue_status+3) = Light_HslStatus[pmsgParam->elementIndex].TargetHslHueLightness16 >> 8;
+ *(pHslHue_status+4) = Light_HslStatus[pmsgParam->elementIndex].RemainingTime;
*pLength = 5;
- Light_ModelFlag.LightOptionalParam = 5;
+ Light_ModelFlag[pmsgParam->elementIndex].LightOptionalParam = 5;
}
else
{
@@ -1305,9 +1515,13 @@ MOBLE_RESULT Light_HslHue_Status(MOBLEUINT8* pHslHue_status, MOBLEUINT32 *pLengt
* unacknowledged message. The Acknowledgement is taken care by the Library
* @param pHslSaturation_param : Pointer to the parameters received for message
* @param length : Length of the parameters received for message
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_HslSaturation_Set(const MOBLEUINT8* pHslSaturation_param, MOBLEUINT32 length)
+MOBLE_RESULT Light_HslSaturation_Set(const MOBLEUINT8* pHslSaturation_param,
+ MOBLEUINT32 length,\
+ MODEL_MessageHeader_t *pmsgParam)
{
/* 6.3.3.12 Light Hsl Saturation Set
HSL Saturation 2B The target value of the Light HSL Saturation state.
@@ -1324,38 +1538,42 @@ MOBLE_RESULT Light_HslSaturation_Set(const MOBLEUINT8* pHslSaturation_param, MOB
Light_HslParam.HslSaturation16 |= (MOBLEUINT16)pHslSaturation_param[0];
Light_HslParam.Hsl_TID = pHslSaturation_param[2];
- Light_HslSaturation_RangeBinding(&Light_HslParam);
+ Light_HslSaturation_RangeBinding(&Light_HslParam, pmsgParam->elementIndex);
if((length > 3U) && (pHslSaturation_param[3] != 0))
{
Light_HslParam.Hsl_TransitionTime = pHslSaturation_param[3];
Light_HslParam.Hsl_Delay = pHslSaturation_param[4];
- Light_HslStatus.TargetHslSaturation16 = Light_HslParam.HslSaturation16;
- Light_HslStatus.RemainingTime = Light_HslParam.Hsl_TransitionTime;
+ Light_HslStatus[pmsgParam->elementIndex].TargetHslSaturation16 = Light_HslParam.HslSaturation16;
+ Light_HslStatus[pmsgParam->elementIndex].RemainingTime = Light_HslParam.Hsl_TransitionTime;
- /* copy status parameters in Temporary parameters for transition
- process.
- */
- Light_TemporaryStatus.TargetParam_1 = Light_HslStatus.TargetHslSaturation16;
+ /* copy status parameters in Temporary parameters for transition process. */
+ Light_TemporaryStatus[pmsgParam->elementIndex].TargetParam_1 = Light_HslStatus[pmsgParam->elementIndex].TargetHslSaturation16;
/* Function to calculate time parameters, step resolution
step size for transition state machine.
*/
- Light_GetStepValue(pHslSaturation_param[3]);
+ Light_GetStepValue(pHslSaturation_param[3],pmsgParam->elementIndex);
- Light_ModelFlag.LightOptionalParam = 1;
- Light_ModelFlag.LightTransitionFlag = LIGHT_HSL_SATURATION_TRANSITION_START;
+ Light_ModelFlag[pmsgParam->elementIndex].LightOptionalParam = 1;
+ Light_ModelFlag[pmsgParam->elementIndex].LightTransitionFlag = LIGHT_HSL_SATURATION_TRANSITION_START;
}
else
{
- Light_HslStatus.PresentHslSaturation16= Light_HslParam.HslSaturation16;
+#ifdef ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
+ Light_HSLSaturationDefaultTransitionValue(&Light_HslParam, pmsgParam->elementIndex);
+#else
+ Light_ModelFlag[pmsgParam->elementIndex].LightTransitionFlag = LIGHT_TRANSITION_STOP;
+ Light_HslStatus[pmsgParam->elementIndex].PresentHslSaturation16= Light_HslParam.HslSaturation16;
+#endif
}
/* Application Callback */
- (LightAppli_cb.Light_HslSaturation_Set_cb)(&Light_HslStatus , OptionalValid);
+ (LightAppli_cb.Light_HslSaturation_Set_cb)(&Light_HslStatus[pmsgParam->elementIndex],
+ OptionalValid, pmsgParam->dst_peer, pmsgParam->elementIndex);
#ifdef ENABLE_MODEL_BINDING
/* Light Hsl Saturation binding with Generic level model*/
- Light_Hsl_Saturation_Binding();
+ Light_Hsl_Saturation_Binding(pmsgParam->elementIndex);
#endif
return MOBLE_RESULT_SUCCESS;
@@ -1366,9 +1584,13 @@ MOBLE_RESULT Light_HslSaturation_Set(const MOBLEUINT8* pHslSaturation_param, MOB
* @brief Light_HslSaturation_Status
* @param pHslSaturation_status: Pointer to the status message, which needs to be updated
* @param pLength: Pointer to the Length of the Status message
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_HslSaturation_Status(MOBLEUINT8* pHslSaturation_status, MOBLEUINT32 *pLength)
+MOBLE_RESULT Light_HslSaturation_Status(MOBLEUINT8* pHslSaturation_status,
+ MOBLEUINT32 *pLength,\
+ MODEL_MessageHeader_t *pmsgParam)
{
/* 6.3.3.14 Light Hsl Saturation Status
Present HSL Saturation 2B The Present value of the Light HSL Hue state.
@@ -1379,16 +1601,16 @@ MOBLE_RESULT Light_HslSaturation_Status(MOBLEUINT8* pHslSaturation_status, MOBLE
TRACE_M(TF_LIGHT_M,"Light_HslSaturation_Status callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#8272! \n\r");
- *(pHslSaturation_status) = Light_HslStatus.PresentHslSaturation16;
- *(pHslSaturation_status+1) = Light_HslStatus.PresentHslSaturation16 >> 8;
+ *(pHslSaturation_status) = Light_HslStatus[pmsgParam->elementIndex].PresentHslSaturation16;
+ *(pHslSaturation_status+1) = Light_HslStatus[pmsgParam->elementIndex].PresentHslSaturation16 >> 8;
- if((Light_ModelFlag.LightOptionalParam == 1) || (Light_TimeParam.StepValue != 0))
+ if((Light_ModelFlag[pmsgParam->elementIndex].LightOptionalParam == 1) || (Light_TimeParam[pmsgParam->elementIndex].StepValue != 0))
{
- *(pHslSaturation_status+2) = Light_HslStatus.TargetHslSaturation16;
- *(pHslSaturation_status+3) = Light_HslStatus.TargetHslSaturation16 >> 8;
- *(pHslSaturation_status+4) = Light_HslStatus.RemainingTime;
+ *(pHslSaturation_status+2) = Light_HslStatus[pmsgParam->elementIndex].TargetHslSaturation16;
+ *(pHslSaturation_status+3) = Light_HslStatus[pmsgParam->elementIndex].TargetHslSaturation16 >> 8;
+ *(pHslSaturation_status+4) = Light_HslStatus[pmsgParam->elementIndex].RemainingTime;
*pLength = 5;
- Light_ModelFlag.LightOptionalParam = 0;
+ Light_ModelFlag[pmsgParam->elementIndex].LightOptionalParam = 0;
}
else
{
@@ -1404,9 +1626,13 @@ MOBLE_RESULT Light_HslSaturation_Status(MOBLEUINT8* pHslSaturation_status, MOBLE
* unacknowledged message. The Acknowledgement is taken care by the Library
* @param pHslDefault_param : Pointer to the parameters received for message
* @param length : Length of the parameters received for message
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_HslDefault_Set(const MOBLEUINT8* pHslDefault_param, MOBLEUINT32 length)
+MOBLE_RESULT Light_HslDefault_Set(const MOBLEUINT8* pHslDefault_param,
+ MOBLEUINT32 length,\
+ MODEL_MessageHeader_t *pmsgParam)
{
/* 6.3.3.16 Light Hsl Saturation Set
HSL Lightness 2B The target value of the Light HSL Lightness state.
@@ -1417,17 +1643,18 @@ MOBLE_RESULT Light_HslDefault_Set(const MOBLEUINT8* pHslDefault_param, MOBLEUINT
TRACE_M(TF_LIGHT_M,"Light_HslDefault_Set callback received \r\n");
- Light_HslStatus.PresentHslLightness16 = (MOBLEUINT16)pHslDefault_param[1] << 8;
- Light_HslStatus.PresentHslLightness16 |= (MOBLEUINT16)pHslDefault_param[0];
+ Light_HslStatus[pmsgParam->elementIndex].PresentHslLightness16 = (MOBLEUINT16)pHslDefault_param[1] << 8;
+ Light_HslStatus[pmsgParam->elementIndex].PresentHslLightness16 |= (MOBLEUINT16)pHslDefault_param[0];
- Light_HslStatus.PresentHslHueLightness16 = (MOBLEUINT16)pHslDefault_param[3] << 8;
- Light_HslStatus.PresentHslHueLightness16 |= (MOBLEUINT16)pHslDefault_param[2];
+ Light_HslStatus[pmsgParam->elementIndex].PresentHslHueLightness16 = (MOBLEUINT16)pHslDefault_param[3] << 8;
+ Light_HslStatus[pmsgParam->elementIndex].PresentHslHueLightness16 |= (MOBLEUINT16)pHslDefault_param[2];
- Light_HslStatus.PresentHslSaturation16 = (MOBLEUINT16)pHslDefault_param[5] << 8;
- Light_HslStatus.PresentHslSaturation16 |= (MOBLEUINT16)pHslDefault_param[4];
+ Light_HslStatus[pmsgParam->elementIndex].PresentHslSaturation16 = (MOBLEUINT16)pHslDefault_param[5] << 8;
+ Light_HslStatus[pmsgParam->elementIndex].PresentHslSaturation16 |= (MOBLEUINT16)pHslDefault_param[4];
/* Application Callback */
- (LightAppli_cb.Light_HslDefault_Set_cb)(&Light_HslStatus , OptionalValid);
+ (LightAppli_cb.Light_HslDefault_Set_cb)(&Light_HslStatus[pmsgParam->elementIndex] , OptionalValid,
+ pmsgParam->dst_peer, pmsgParam->elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -1437,9 +1664,13 @@ MOBLE_RESULT Light_HslDefault_Set(const MOBLEUINT8* pHslDefault_param, MOBLEUINT
* @brief Light_HslDefault_Status
* @param pHslDefault_status: Pointer to the status message, which needs to be updated
* @param pLength: Pointer to the Length of the Status message
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_HslDefault_Status(MOBLEUINT8* pHslDefault_status, MOBLEUINT32 *pLength)
+MOBLE_RESULT Light_HslDefault_Status(MOBLEUINT8* pHslDefault_status,
+ MOBLEUINT32 *pLength,\
+ MODEL_MessageHeader_t *pmsgParam)
{
/* 6.3.3.18 Light Hsl Default Status
HSL Lightness 2B The target value of the Light HSL Lightness state.
@@ -1450,12 +1681,12 @@ MOBLE_RESULT Light_HslDefault_Status(MOBLEUINT8* pHslDefault_status, MOBLEUINT32
TRACE_M(TF_LIGHT_M,"Light_HslDefault_Status callback received \r\n");
TRACE_M(TF_SERIAL_CTRL,"#827B! \n\r");
- *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;
+ *pHslDefault_status = Light_HslStatus[pmsgParam->elementIndex].PresentHslLightness16;
+ *(pHslDefault_status+1) = Light_HslStatus[pmsgParam->elementIndex].PresentHslLightness16 >> 8;
+ *(pHslDefault_status+2) = Light_HslStatus[pmsgParam->elementIndex].PresentHslHueLightness16;
+ *(pHslDefault_status+3) = Light_HslStatus[pmsgParam->elementIndex].PresentHslHueLightness16 >> 8;
+ *(pHslDefault_status+4) = Light_HslStatus[pmsgParam->elementIndex].PresentHslSaturation16;
+ *(pHslDefault_status+5) = Light_HslStatus[pmsgParam->elementIndex].PresentHslSaturation16 >> 8;
*pLength = 6;
@@ -1468,9 +1699,13 @@ MOBLE_RESULT Light_HslDefault_Status(MOBLEUINT8* pHslDefault_status, MOBLEUINT32
* unacknowledged message. The Acknowledgement is taken care by the Library
* @param pHslRange_param : Pointer to the parameters received for message
* @param length : Length of the parameters received for message
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_HslRange_Set(const MOBLEUINT8* pHslRange_param, MOBLEUINT32 length)
+MOBLE_RESULT Light_HslRange_Set(const MOBLEUINT8* pHslRange_param,
+ MOBLEUINT32 length,\
+ MODEL_MessageHeader_t *pmsgParam)
{
/* 6.3.3.20 Light Hsl Range Set
Hue Range Min The value of the Hue Range Min field of the Light HSL Hue Range state
@@ -1481,20 +1716,20 @@ MOBLE_RESULT Light_HslRange_Set(const MOBLEUINT8* pHslRange_param, MOBLEUINT32 l
MOBLEUINT8 OptionalValid = 0;
TRACE_M(TF_LIGHT_M,"Light_HslRange_Set callback received \r\n");
- Light_HslRangeParam.HslHueMinRange16 = (MOBLEUINT16)pHslRange_param[1] << 8;
- Light_HslRangeParam.HslHueMinRange16 |= (MOBLEUINT16)pHslRange_param[0];
+ Light_HslRangeParam[pmsgParam->elementIndex].HslHueMinRange16 = (MOBLEUINT16)pHslRange_param[1] << 8;
+ Light_HslRangeParam[pmsgParam->elementIndex].HslHueMinRange16 |= (MOBLEUINT16)pHslRange_param[0];
- Light_HslRangeParam.HslHueMaxRange16 = (MOBLEUINT16)pHslRange_param[3] << 8;
- Light_HslRangeParam.HslHueMaxRange16 |= (MOBLEUINT16)pHslRange_param[2];
+ Light_HslRangeParam[pmsgParam->elementIndex].HslHueMaxRange16 = (MOBLEUINT16)pHslRange_param[3] << 8;
+ Light_HslRangeParam[pmsgParam->elementIndex].HslHueMaxRange16 |= (MOBLEUINT16)pHslRange_param[2];
- Light_HslRangeParam.HslMinSaturation16 = (MOBLEUINT16)pHslRange_param[5] << 8;
- Light_HslRangeParam.HslMinSaturation16 |= (MOBLEUINT16)pHslRange_param[4];
+ Light_HslRangeParam[pmsgParam->elementIndex].HslMinSaturation16 = (MOBLEUINT16)pHslRange_param[5] << 8;
+ Light_HslRangeParam[pmsgParam->elementIndex].HslMinSaturation16 |= (MOBLEUINT16)pHslRange_param[4];
- Light_HslRangeParam.HslMaxSaturation16 = (MOBLEUINT16)pHslRange_param[7] << 8;
- Light_HslRangeParam.HslMaxSaturation16 |= (MOBLEUINT16)pHslRange_param[6];
+ Light_HslRangeParam[pmsgParam->elementIndex].HslMaxSaturation16 = (MOBLEUINT16)pHslRange_param[7] << 8;
+ Light_HslRangeParam[pmsgParam->elementIndex].HslMaxSaturation16 |= (MOBLEUINT16)pHslRange_param[6];
/* Application Callback */
- (LightAppli_cb.Light_HslRange_Set_cb)(&Light_HslRangeParam , OptionalValid);
+ (LightAppli_cb.Light_HslRange_Set_cb)(&Light_HslRangeParam[pmsgParam->elementIndex] , OptionalValid,pmsgParam->dst_peer,pmsgParam->elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -1504,9 +1739,13 @@ MOBLE_RESULT Light_HslRange_Set(const MOBLEUINT8* pHslRange_param, MOBLEUINT32 l
* @brief Light_HslRange_Status
* @param pHslRange_status: Pointer to the status message, which needs to be updated
* @param pLength: Pointer to the Length of the Status message
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_HslRange_Status(MOBLEUINT8* pHslRange_status, MOBLEUINT32 *pLength)
+MOBLE_RESULT Light_HslRange_Status(MOBLEUINT8* pHslRange_status,
+ MOBLEUINT32 *pLength,\
+ MODEL_MessageHeader_t *pmsgParam)
{
/* 6.3.3.22 Light Hsl Range Set
Hue Range Min The value of the Hue Range Min field of the Light HSL Hue Range state
@@ -1519,15 +1758,15 @@ 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;
+ *pHslRange_status = Light_HslRangeParam[pmsgParam->elementIndex].Status_Code;
+ *(pHslRange_status+1) = Light_HslRangeParam[pmsgParam->elementIndex].HslHueMinRange16;
+ *(pHslRange_status+2) = Light_HslRangeParam[pmsgParam->elementIndex].HslHueMinRange16 >> 8;
+ *(pHslRange_status+3) = Light_HslRangeParam[pmsgParam->elementIndex].HslHueMaxRange16;
+ *(pHslRange_status+4) = Light_HslRangeParam[pmsgParam->elementIndex].HslHueMaxRange16 >> 8;
+ *(pHslRange_status+5) = Light_HslRangeParam[pmsgParam->elementIndex].HslMinSaturation16;
+ *(pHslRange_status+6) = Light_HslRangeParam[pmsgParam->elementIndex].HslMinSaturation16 >> 8;
+ *(pHslRange_status+7) = Light_HslRangeParam[pmsgParam->elementIndex].HslMaxSaturation16;
+ *(pHslRange_status+8) = Light_HslRangeParam[pmsgParam->elementIndex].HslMaxSaturation16 >> 8;
*pLength = 9;
@@ -1539,9 +1778,13 @@ MOBLE_RESULT Light_HslRange_Status(MOBLEUINT8* pHslRange_status, MOBLEUINT32 *pL
* @brief Light_HslTarget_Status
* @param pHslTarget_status: Pointer to the status message, which needs to be updated
* @param pLength: Pointer to the Length of the Status message
+* @param *pmsgParam: Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & ApkmpKey Offset
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_HslTarget_Status(MOBLEUINT8* pHslTarget_status, MOBLEUINT32 *pLength)
+MOBLE_RESULT Light_HslTarget_Status(MOBLEUINT8* pHslTarget_status,
+ MOBLEUINT32 *pLength,\
+ MODEL_MessageHeader_t *pmsgParam)
{
/* 6.3.3.5 Light HSL Target Get
HSL Lightness 2B The target value of the Light HSL Lightness state.
@@ -1553,18 +1796,18 @@ MOBLE_RESULT Light_HslTarget_Status(MOBLEUINT8* pHslTarget_status, MOBLEUINT32 *
TRACE_M(TF_SERIAL_CTRL,"#8279! \n\r");
/* Function call back to get the values from application*/
- *(pHslTarget_status) = Light_HslStatus.TargetHslLightness16 ;
- *(pHslTarget_status+1) = Light_HslStatus.TargetHslLightness16 >> 8;
- *(pHslTarget_status+2) = Light_HslStatus.TargetHslHueLightness16;
- *(pHslTarget_status+3) = Light_HslStatus.TargetHslHueLightness16 >> 8;
- *(pHslTarget_status+4) = Light_HslStatus.TargetHslSaturation16;
- *(pHslTarget_status+5) = Light_HslStatus.TargetHslSaturation16 >> 8;
+ *(pHslTarget_status) = Light_HslStatus[pmsgParam->elementIndex].TargetHslLightness16 ;
+ *(pHslTarget_status+1) = Light_HslStatus[pmsgParam->elementIndex].TargetHslLightness16 >> 8;
+ *(pHslTarget_status+2) = Light_HslStatus[pmsgParam->elementIndex].TargetHslHueLightness16;
+ *(pHslTarget_status+3) = Light_HslStatus[pmsgParam->elementIndex].TargetHslHueLightness16 >> 8;
+ *(pHslTarget_status+4) = Light_HslStatus[pmsgParam->elementIndex].TargetHslSaturation16;
+ *(pHslTarget_status+5) = Light_HslStatus[pmsgParam->elementIndex].TargetHslSaturation16 >> 8;
- if((Light_ModelFlag.LightOptionalParam == 1) || (Light_TimeParam.StepValue != 0))
+ if((Light_ModelFlag[pmsgParam->elementIndex].LightOptionalParam == 1) || (Light_TimeParam[pmsgParam->elementIndex].StepValue != 0))
{
- *(pHslTarget_status+6) = Light_HslStatus.RemainingTime;
+ *(pHslTarget_status+6) = Light_HslStatus[pmsgParam->elementIndex].RemainingTime;
*pLength = 7;
- Light_ModelFlag.LightOptionalParam = 0;
+ Light_ModelFlag[pmsgParam->elementIndex].LightOptionalParam = 0;
}
else
{
@@ -1595,9 +1838,8 @@ MOBLE_RESULT LightModelServer_GetOpcodeTableCb(const MODEL_OpcodeTableParam_t **
/**
* @brief LightModelServer_GetStatusRequestCb : This function is call-back
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
+* @param *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* @param opcode: Received opcode of the Status message callback
* @param pResponsedata: Pointer to the buffer to be updated with status
* @param plength: Pointer to the Length of the data, to be updated by application
@@ -1606,8 +1848,7 @@ from the library to send response to the message from peer
* @param response: Value to indicate wheather message is acknowledged meassage or not.
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT LightModelServer_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+MOBLE_RESULT LightModelServer_GetStatusRequestCb(MODEL_MessageHeader_t *pmsgParam,
MOBLEUINT16 opcode,
MOBLEUINT8 *pResponsedata,
MOBLEUINT32 *plength,
@@ -1615,33 +1856,34 @@ MOBLE_RESULT LightModelServer_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
MOBLEUINT32 dataLength,
MOBLEBOOL response)
{
+ TRACE_M(TF_LIGHT_M,"response status enable \n\r");
switch(opcode)
{
#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
case LIGHT_LIGHTNESS_STATUS:
{
- Light_Lightness_Status(pResponsedata, plength);
+ Light_Lightness_Status(pResponsedata, plength , pmsgParam);
break;
}
case LIGHT_LIGHTNESS_LINEAR_STATUS:
{
- Light_Lightness_Linear_Status(pResponsedata, plength);
+ Light_LightnessLinear_Status(pResponsedata,plength, pmsgParam);
break;
}
case LIGHT_LIGHTNESS_LAST_STATUS:
{
- Light_Lightness_Last_Status(pResponsedata, plength);
+ Light_LightnessLast_Status(pResponsedata,plength, pmsgParam);
break;
}
case LIGHT_LIGHTNESS_DEFAULT_STATUS:
{
- Light_Lightness_Default_Status(pResponsedata, plength);
+ Light_LightnessDefault_Status(pResponsedata,plength, pmsgParam);
break;
}
case LIGHT_LIGHTNESS_RANGE_STATUS:
{
- Light_Lightness_Range_Status(pResponsedata, plength);
+ Light_LightnessRange_Status(pResponsedata,plength, pmsgParam);
break;
}
#endif
@@ -1650,17 +1892,17 @@ MOBLE_RESULT LightModelServer_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
case LIGHT_CTL_STATUS:
{
- Light_Ctl_Status(pResponsedata , plength);
+ Light_Ctl_Status(pResponsedata ,plength, pmsgParam);
break;
}
case LIGHT_CTL_TEMPERATURE_RANGE_STATUS:
{
- Light_CtlTemperature_Range_Status(pResponsedata , plength);
+ Light_CtlTemperatureRange_Status(pResponsedata ,plength, pmsgParam);
break;
}
case LIGHT_CTL_DEFAULT_STATUS:
{
- Light_CtlDefault_Status(pResponsedata , plength);
+ Light_CtlDefault_Status(pResponsedata ,plength, pmsgParam);
break;
}
#endif
@@ -1669,7 +1911,7 @@ MOBLE_RESULT LightModelServer_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
case LIGHT_CTL_TEMPERATURE_STATUS:
{
- Light_CtlTemperature_Status(pResponsedata , plength);
+ Light_CtlTemperature_Status(pResponsedata ,plength, pmsgParam);
break;
}
#endif
@@ -1677,22 +1919,22 @@ MOBLE_RESULT LightModelServer_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL
case LIGHT_HSL_STATUS:
{
- Light_Hsl_Status(pResponsedata , plength);
+ Light_Hsl_Status(pResponsedata ,plength, pmsgParam);
break;
}
case LIGHT_HSL_DEFAULT_STATUS:
{
- Light_HslDefault_Status(pResponsedata , plength);
+ Light_HslDefault_Status(pResponsedata ,plength, pmsgParam);
break;
}
case LIGHT_HSL_RANGE_STATUS:
{
- Light_HslRange_Status(pResponsedata , plength);
+ Light_HslRange_Status(pResponsedata ,plength, pmsgParam);
break;
}
case LIGHT_HSL_TARGET_STATUS:
{
- Light_HslTarget_Status(pResponsedata , plength);
+ Light_HslTarget_Status(pResponsedata ,plength, pmsgParam);
break;
}
#endif
@@ -1700,7 +1942,7 @@ MOBLE_RESULT LightModelServer_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_HUE
case LIGHT_HSL_HUE_STATUS:
{
- Light_HslHue_Status(pResponsedata , plength);
+ Light_HslHue_Status(pResponsedata ,plength, pmsgParam);
break;
}
#endif
@@ -1708,7 +1950,7 @@ MOBLE_RESULT LightModelServer_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION
case LIGHT_HSL_SATURATION_STATUS:
{
- Light_HslSaturation_Status(pResponsedata , plength);
+ Light_HslSaturation_Status(pResponsedata ,plength, pmsgParam);
break;
}
#endif
@@ -1724,9 +1966,8 @@ MOBLE_RESULT LightModelServer_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
/**
* @brief LightModelServer_ProcessMessageCb: This is a callback function from
* the library whenever a Light 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
+* @param *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* @param opcode: Received opcode of the Status message callback
* @param pData: Pointer to the buffer to be updated with status
* @param length: Length of the parameters received
@@ -1736,8 +1977,7 @@ MOBLE_RESULT LightModelServer_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
* @param response: Value to indicate wheather message is acknowledged meassage or not.
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+MOBLE_RESULT LightModelServer_ProcessMessageCb(MODEL_MessageHeader_t* pmsgParam,
MOBLEUINT16 opcode,
MOBLEUINT8 const *pRxData,
MOBLEUINT32 dataLength,
@@ -1746,15 +1986,10 @@ 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;
+ MOBLEUINT8 modelStateChangeFlag = MOBLE_FALSE;
- Model_Rx_Opcode = opcode;
- my_Address = BLEMesh_GetAddress();
- Dst_Peer = dst_peer;
-
- TRACE_M(TF_LIGHT_M,"dst_peer = %.2X , peer_add = %.2X, opcode= %.2X,response= %.2X \r\n ",dst_peer, peer_addr, opcode,response);
+ TRACE_M(TF_LIGHT_M, "elementIndex %.2x dst_peer %.2X peer_add %.2X opcode %.2X response %.2X\r\n",
+ pmsgParam->elementIndex, pmsgParam->dst_peer, pmsgParam->peer_addr, opcode, response);
switch(opcode)
{
@@ -1768,11 +2003,13 @@ MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
if(result == MOBLE_RESULT_SUCCESS)
{
- if(!MOBLE_FAILED(result = Chk_TidValidity(peer_addr,dst_peer,pRxData[2])))
+ if(!MOBLE_FAILED(result = Chk_TidValidity(pmsgParam->peer_addr, pmsgParam->dst_peer,pRxData[2])))
{
- Light_Lightness_Set(pRxData, dataLength);
- Model_ID = (MOBLEUINT16)LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID;
- modelStateChangeFlag = MOBLE_TRUE;
+ Light_Lightness_Set(pRxData, dataLength,pmsgParam);
+ Model_Binding_Var.Model_ID = (MOBLEUINT16)LIGHT_LIGHTNESS_SERVER_MODEL_ID;
+ Model_Binding_Var.Model_Rx_Opcode = opcode;
+ modelStateChangeFlag = MOBLE_TRUE;
+ Model_Binding_Var.Dst_Peer = pmsgParam->dst_peer;
}
}
break;
@@ -1784,38 +2021,41 @@ MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
if(result == MOBLE_RESULT_SUCCESS)
{
- if(!MOBLE_FAILED(result = Chk_TidValidity(peer_addr,dst_peer,pRxData[2])))
+ if(!MOBLE_FAILED(result = Chk_TidValidity(pmsgParam->peer_addr,
+ pmsgParam->dst_peer,pRxData[2])))
{
- Light_Lightness_Linear_Set(pRxData, dataLength);
- Model_ID = (MOBLEUINT16)LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID;
- modelStateChangeFlag = MOBLE_TRUE;
+ Light_LightnessLinear_Set(pRxData, dataLength,pmsgParam);
+ Model_Binding_Var.Model_ID = (MOBLEUINT16)LIGHT_LIGHTNESS_SERVER_MODEL_ID;
+ Model_Binding_Var.Model_Rx_Opcode = opcode;
+ modelStateChangeFlag = MOBLE_TRUE;
+ Model_Binding_Var.Dst_Peer = pmsgParam->dst_peer;
}
}
break;
}
case LIGHT_LIGHTNESS_STATUS:
{
- Light_Client_Lightness_Status(pRxData, dataLength);
+ Light_Client_Lightness_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
case LIGHT_LIGHTNESS_LINEAR_STATUS:
{
- Light_Client_Lightness_Linear_Status(pRxData, dataLength);
+ Light_Client_Lightness_Linear_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
case LIGHT_LIGHTNESS_LAST_STATUS:
{
- Light_Client_Lightness_Last_Status(pRxData, dataLength);
+ Light_Client_Lightness_Last_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
case LIGHT_LIGHTNESS_DEFAULT_STATUS:
{
- Light_Client_Lightness_Default_Status(pRxData, dataLength);
+ Light_Client_Lightness_Default_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
case LIGHT_LIGHTNESS_RANGE_STATUS:
{
- Light_Client_Lightness_Range_Status(pRxData, dataLength);
+ Light_Client_Lightness_Range_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
#endif
@@ -1829,7 +2069,7 @@ MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
if(result == MOBLE_RESULT_SUCCESS)
{
- Light_Lightness_Default_Set(pRxData, dataLength);
+ Light_LightnessDefault_Set(pRxData, dataLength, pmsgParam);
}
break;
}
@@ -1840,7 +2080,7 @@ MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
if(result == MOBLE_RESULT_SUCCESS)
{
- Light_Lightness_Range_Set(pRxData, dataLength);
+ Light_LightnessRange_Set(pRxData, dataLength,pmsgParam);
}
break;
}
@@ -1855,28 +2095,30 @@ MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
if(result == MOBLE_RESULT_SUCCESS)
{
- if(!MOBLE_FAILED(result = Chk_TidValidity(peer_addr,dst_peer,pRxData[6])))
+ if(!MOBLE_FAILED(result = Chk_TidValidity(pmsgParam->peer_addr,pmsgParam->dst_peer,pRxData[6])))
{
- Light_Ctl_Set(pRxData, dataLength);
- Model_ID = (MOBLEUINT16)LIGHT_MODEL_SERVER_CTL_MODEL_ID;
- modelStateChangeFlag = MOBLE_TRUE;
+ Light_Ctl_Set(pRxData, dataLength, pmsgParam);
+ Model_Binding_Var.Model_ID = (MOBLEUINT16)LIGHT_CTL_SERVER_MODEL_ID;
+ Model_Binding_Var.Model_Rx_Opcode = opcode;
+ modelStateChangeFlag = MOBLE_TRUE;
+ Model_Binding_Var.Dst_Peer = pmsgParam->dst_peer;
}
}
break;
}
case LIGHT_CTL_STATUS:
{
- Light_Client_Ctl_Status(pRxData, dataLength);
+ Light_Client_Ctl_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
case LIGHT_CTL_TEMPERATURE_RANGE_STATUS:
{
- Light_Client_CtlTemperature_Range_Status(pRxData, dataLength);
+ Light_Client_CtlTemperature_Range_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
case LIGHT_CTL_DEFAULT_STATUS:
{
- Light_Client_CtlDefault_Status(pRxData, dataLength);
+ Light_Client_CtlDefault_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
#endif
@@ -1890,18 +2132,20 @@ MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
if(result == MOBLE_RESULT_SUCCESS)
{
- if(!MOBLE_FAILED(result = Chk_TidValidity(peer_addr,dst_peer,pRxData[4])))
+ if(!MOBLE_FAILED(result = Chk_TidValidity(pmsgParam->peer_addr,pmsgParam->dst_peer,pRxData[4])))
{
- Light_CtlTemperature_Set(pRxData, dataLength);
- Model_ID = (MOBLEUINT16)LIGHT_MODEL_SERVER_CTL_TEMPERATURE_MODEL_ID;
- modelStateChangeFlag = MOBLE_TRUE;
+ Light_CtlTemperature_Set(pRxData, dataLength, pmsgParam);
+ Model_Binding_Var.Model_ID = (MOBLEUINT16)LIGHT_CTL_TEMPERATURE_SERVER_MODEL_ID;
+ Model_Binding_Var.Model_Rx_Opcode = opcode;
+ modelStateChangeFlag = MOBLE_TRUE;
+ Model_Binding_Var.Dst_Peer = pmsgParam->dst_peer;
}
}
break;
}
case LIGHT_CTL_TEMPERATURE_STATUS:
{
- Light_Client_CtlTemperature_Status(pRxData, dataLength);
+ Light_Client_CtlTemperature_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
#endif
@@ -1915,7 +2159,7 @@ MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
if(result == MOBLE_RESULT_SUCCESS)
{
- Light_CtlTemperature_Range_Set(pRxData, dataLength);
+ Light_CtlTemperatureRange_Set(pRxData, dataLength,pmsgParam);
}
break;
}
@@ -1928,7 +2172,7 @@ MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
if(result == MOBLE_RESULT_SUCCESS)
{
- Light_CtlDefault_Set(pRxData, dataLength);
+ Light_CtlDefault_Set(pRxData, dataLength,pmsgParam);
}
break;
}
@@ -1945,33 +2189,35 @@ MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
if(result == MOBLE_RESULT_SUCCESS)
{
- if(!MOBLE_FAILED(result = Chk_TidValidity(peer_addr,dst_peer,pRxData[6])))
+ if(!MOBLE_FAILED(result = Chk_TidValidity(pmsgParam->peer_addr,pmsgParam->dst_peer,pRxData[6])))
{
- Light_Hsl_Set(pRxData, dataLength);
- Model_ID = (MOBLEUINT16)LIGHT_MODEL_SERVER_HSL_MODEL_ID;
- modelStateChangeFlag = MOBLE_TRUE;
+ Light_Hsl_Set(pRxData, dataLength, pmsgParam);
+ Model_Binding_Var.Model_ID = (MOBLEUINT16)LIGHT_HSL_SERVER_MODEL_ID;
+ Model_Binding_Var.Model_Rx_Opcode = opcode;
+ modelStateChangeFlag = MOBLE_TRUE;
+ Model_Binding_Var.Dst_Peer = pmsgParam->dst_peer;
}
}
break;
}
case LIGHT_HSL_STATUS:
{
- Light_Client_Hsl_Status(pRxData, dataLength);
+ Light_Client_Hsl_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
case LIGHT_HSL_DEFAULT_STATUS:
{
- Light_Client_HslDefault_Status(pRxData, dataLength);
+ Light_Client_HslDefault_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
case LIGHT_HSL_RANGE_STATUS:
{
- Light_Client_HslRange_Status(pRxData, dataLength);
+ Light_Client_HslRange_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
case LIGHT_HSL_TARGET_STATUS:
{
- Light_Client_HslTarget_Status(pRxData, dataLength);
+ Light_Client_HslTarget_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
#endif
@@ -1985,11 +2231,13 @@ MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
if(result == MOBLE_RESULT_SUCCESS)
{
- if(!MOBLE_FAILED(result = Chk_TidValidity(peer_addr,dst_peer,pRxData[2])))
+ if(!MOBLE_FAILED(result = Chk_TidValidity(pmsgParam->peer_addr,pmsgParam->dst_peer,pRxData[2])))
{
- Light_HslHue_Set(pRxData, dataLength);
- Model_ID = (MOBLEUINT16)LIGHT_MODEL_SERVER_HSL_HUE_MODEL_ID;
- modelStateChangeFlag = MOBLE_TRUE;
+ Light_HslHue_Set(pRxData, dataLength, pmsgParam);
+ Model_Binding_Var.Model_ID = (MOBLEUINT16)LIGHT_HSL_HUE_SERVER_MODEL_ID;
+ Model_Binding_Var.Model_Rx_Opcode = opcode;
+ modelStateChangeFlag = MOBLE_TRUE;
+ Model_Binding_Var.Dst_Peer = pmsgParam->dst_peer;
}
}
@@ -1997,7 +2245,7 @@ MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
}
case LIGHT_HSL_HUE_STATUS:
{
- Light_Client_HslHue_Status(pRxData, dataLength);
+ Light_Client_HslHue_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
#endif
@@ -2007,7 +2255,7 @@ MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
case LIGHT_HSL_DEFAULT_SET:
case LIGHT_HSL_DEFAULT_SET_UNACK:
{
- Light_HslDefault_Set(pRxData, dataLength);
+ Light_HslDefault_Set(pRxData, dataLength, pmsgParam);
break;
}
case LIGHT_HSL_RANGE_SET:
@@ -2017,7 +2265,7 @@ MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
MIN_SATURATION_RANGE,MAX_SATURATION_RANGE);
if(result == MOBLE_RESULT_SUCCESS)
{
- Light_HslRange_Set(pRxData , dataLength);
+ Light_HslRange_Set(pRxData , dataLength,pmsgParam);
}
break;
}
@@ -2028,17 +2276,19 @@ MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
case LIGHT_HSL_SATURATION_SET:
case LIGHT_HSL_SATURATION_SET_UNACK:
{
- if(!MOBLE_FAILED(result = Chk_TidValidity(peer_addr,dst_peer,pRxData[2])))
+ if(!MOBLE_FAILED(result = Chk_TidValidity(pmsgParam->peer_addr,pmsgParam->dst_peer,pRxData[2])))
{
- Light_HslSaturation_Set(pRxData, dataLength);
- Model_ID = (MOBLEUINT16)LIGHT_MODEL_SERVER_HSL_SATURATION_MODEL_ID;
+ Light_HslSaturation_Set(pRxData, dataLength, pmsgParam);
+ Model_Binding_Var.Model_ID = (MOBLEUINT16)LIGHT_HSL_SATURATION_SERVER_MODEL_ID;
+ Model_Binding_Var.Model_Rx_Opcode = opcode;
modelStateChangeFlag = MOBLE_TRUE;
+ Model_Binding_Var.Dst_Peer = pmsgParam->dst_peer;
}
break;
}
case LIGHT_HSL_SATURATION_STATUS:
{
- Light_Client_HslSaturation_Status(pRxData, dataLength);
+ Light_Client_HslSaturation_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
#endif
@@ -2048,9 +2298,11 @@ MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
}
} /* Switch ends */
- if((result == MOBLE_RESULT_SUCCESS) && (response == MOBLE_TRUE) && (ADDRESS_IS_UNICAST(dst_peer)))
- {
- Model_SendResponse(peer_addr, my_Address,opcode,pRxData, dataLength);
+
+
+ if((result == MOBLE_RESULT_SUCCESS) && (response == MOBLE_TRUE) && (ADDRESS_IS_UNICAST(pmsgParam->dst_peer)))
+ {
+ Model_SendResponse(pmsgParam, opcode, pRxData, dataLength);
}
/*
@@ -2059,13 +2311,13 @@ 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);
+ publishAddress = BLEMesh_GetPublishAddress(pmsgParam->elementIndex, Model_Binding_Var.Model_ID);
- if((result == MOBLE_RESULT_SUCCESS) && (publishAddress != 0x0000) && (modelStateChangeFlag == MOBLE_TRUE)
- && (ADDRESS_IS_UNICAST(dst_peer)))
+ if((result == MOBLE_RESULT_SUCCESS) && (publishAddress != 0x0000) && (modelStateChangeFlag == MOBLE_TRUE)
+ && (ADDRESS_IS_UNICAST(pmsgParam->dst_peer)))
{
- Model_SendResponse(publishAddress,my_Address,opcode,pRxData,dataLength);
+ pmsgParam->peer_addr = publishAddress;
+ Model_SendResponse(pmsgParam, opcode, pRxData, dataLength);
modelStateChangeFlag = MOBLE_FALSE;
@@ -2078,20 +2330,24 @@ MOBLE_RESULT LightModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
/**
* @brief Light_Client_Lightness_Status: Function called when status of the model
* received on the client.
-* @param pLightness_status: ointer to the parameters received for message
+* @param pLightness_status: pointer to the parameters received for message
* @param plength: Length of the parameters received for message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return MOBLE_RESULT_SUCCESS.
*/
-MOBLE_RESULT Light_Client_Lightness_Status(MOBLEUINT8 const *pLightness_status, MOBLEUINT32 plength)
+MOBLE_RESULT Light_Client_Lightness_Status(MOBLEUINT8 const *pLightness_status, MOBLEUINT32 plength, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
MOBLEUINT32 i;
TRACE_M(TF_LIGHT_CLIENT_M,"Light_Client_Lightness_Status received \r\n");
- LightAppli_cb.Lightness_Status_cb(pLightness_status, plength);
+ LightAppli_cb.Lightness_Status_cb(pLightness_status, plength, dstPeer, elementIndex);
for(i = 0; i < plength; i++)
{
- TRACE_M(TF_SERIAL_CTRL,"Light_Lightness_Status: %d\r\n",
+ TRACE_M(TF_LIGHT_M,"Light_Lightness_Status: 0x%x\r\n",
pLightness_status[i]);
}
@@ -2101,20 +2357,24 @@ MOBLE_RESULT Light_Client_Lightness_Status(MOBLEUINT8 const *pLightness_status,
/**
* @brief Light_Client_Lightness_Linear_Status: Function called when status of the model
* received on the client.
-* @param pLightnessLinear_status: ointer to the parameters received for message
+* @param pLightnessLinear_status: pointer to the parameters received for message
* @param plength: Length of the parameters received for message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return MOBLE_RESULT_SUCCESS.
*/
-MOBLE_RESULT Light_Client_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Light_Client_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status, MOBLEUINT32 pLength,MOBLEUINT16 dstPeer,MOBLEUINT8 elementIndex)
{
MOBLEUINT32 i;
TRACE_M(TF_LIGHT_M,"Light_Lightness_Linear_Status received \r\n");
- LightAppli_cb.Lightness_Linear_Status_cb(pLightnessLinear_status, pLength);
+ LightAppli_cb.Lightness_Linear_Status_cb(pLightnessLinear_status, pLength, dstPeer, elementIndex);
for(i = 0; i < pLength; i++)
{
- TRACE_M(TF_SERIAL_CTRL,"Light_Lightness_Linear_Status: %d\r\n",
+ TRACE_M(TF_LIGHT_M,"Light_Client_Lightness_Linear_Status: 0x%x\r\n",
pLightnessLinear_status[i]);
}
@@ -2124,19 +2384,24 @@ MOBLE_RESULT Light_Client_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLi
/**
* @brief Light_Client_Lightness_Last_Status: Function called when status of the model
* received on the client.
-* @param pLightnessLast_status: ointer to the parameters received for message
+* @param pLightnessLast_status: pointer to the parameters received for message
* @param plength: Length of the parameters received for message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return MOBLE_RESULT_SUCCESS.
*/
-MOBLE_RESULT Light_Client_Lightness_Last_Status(MOBLEUINT8 const *pLightnessLast_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Light_Client_Lightness_Last_Status(MOBLEUINT8 const *pLightnessLast_status, MOBLEUINT32 pLength,MOBLEUINT16 dstPeer,MOBLEUINT8 elementIndex)
{
MOBLEUINT32 i;
TRACE_M(TF_LIGHT_M,"Light_Lightness_Last_Status received \r\n");
+ LightAppli_cb.Lightness_Last_Status_cb(pLightnessLast_status, pLength, dstPeer, elementIndex);
for(i = 0; i < pLength; i++)
{
- TRACE_M(TF_SERIAL_CTRL,"Light_Lightness_Last_Status: %d\r\n",
+ TRACE_M(TF_LIGHT_M,"Light_Lightness_Last_Status: 0x%x\r\n",
pLightnessLast_status[i]);
}
@@ -2146,20 +2411,24 @@ MOBLE_RESULT Light_Client_Lightness_Last_Status(MOBLEUINT8 const *pLightnessLast
/**
* @brief Light_Client_Lightness_Default_Status: Function called when status of the model
* received on the client.
-* @param pLightnessDefault_status: ointer to the parameters received for message
+* @param pLightnessDefault_status: pointer to the parameters received for message
* @param plength: Length of the parameters received for message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return MOBLE_RESULT_SUCCESS.
*/
-MOBLE_RESULT Light_Client_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDefault_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Light_Client_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDefault_status, MOBLEUINT32 pLength,MOBLEUINT16 dstPeer,MOBLEUINT8 elementIndex)
{
MOBLEUINT32 i;
- TRACE_M(TF_LIGHT_M,"Light_Lightness_Default_Status received \r\n");
- LightAppli_cb.Lightness_Default_Status_cb(pLightnessDefault_status, pLength);
+ TRACE_M(TF_LIGHT_M,"Light_Client_Lightness_Default_Status received \r\n");
+ LightAppli_cb.Lightness_Default_Status_cb(pLightnessDefault_status, pLength,dstPeer, elementIndex);
for(i = 0; i < pLength; i++)
{
- TRACE_M(TF_SERIAL_CTRL,"Light_Lightness_Default_Status: %d\r\n",
+ TRACE_M(TF_LIGHT_M,"Light_Client_Lightness_Default_Status: 0x%x\r\n",
pLightnessDefault_status[i]);
}
@@ -2169,20 +2438,24 @@ MOBLE_RESULT Light_Client_Lightness_Default_Status(MOBLEUINT8 const *pLightnessD
/**
* @brief Light_Client_Lightness_Range_Status: Function called when status of the model
* received on the client.
-* @param pLightnessRange_status: ointer to the parameters received for message
+* @param pLightnessRange_status: pointer to the parameters received for message
* @param plength: Length of the parameters received for message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return MOBLE_RESULT_SUCCESS.
*/
-MOBLE_RESULT Light_Client_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Light_Client_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status, MOBLEUINT32 pLength,MOBLEUINT16 dstPeer,MOBLEUINT8 elementIndex)
{
MOBLEUINT32 i;
TRACE_M(TF_LIGHT_M,"Light_Lightness_Range_Status received \r\n");
- LightAppli_cb.Lightness_Range_Status_cb(pLightnessRange_status, pLength);
+ LightAppli_cb.Lightness_Range_Status_cb(pLightnessRange_status, pLength,dstPeer,elementIndex);
for(i = 0; i < pLength; i++)
{
- TRACE_M(TF_SERIAL_CTRL,"Light_Client_Lightness_Range_Status: %d\r\n",
+ TRACE_M(TF_LIGHT_M,"Light_Client_Lightness_Range_Status: 0x%x\r\n",
pLightnessRange_status[i]);
}
@@ -2192,20 +2465,24 @@ MOBLE_RESULT Light_Client_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRan
/**
* @brief Light_Client_Ctl_Status: Function called when status of the model
* received on the client.
-* @param pLightCtl_status: ointer to the parameters received for message
+* @param pLightCtl_status: pointer to the parameters received for message
* @param plength: Length of the parameters received for message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return MOBLE_RESULT_SUCCESS.
*/
-MOBLE_RESULT Light_Client_Ctl_Status(MOBLEUINT8 const *pLightCtl_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Light_Client_Ctl_Status(MOBLEUINT8 const *pLightCtl_status, MOBLEUINT32 pLength,MOBLEUINT16 dstPeer,MOBLEUINT8 elementIndex)
{
MOBLEUINT32 i;
TRACE_M(TF_LIGHT_M,"Light_Ctl_Status received \r\n");
- LightAppli_cb.Light_Ctl_Status_cb(pLightCtl_status, pLength);
+ LightAppli_cb.Light_Ctl_Status_cb(pLightCtl_status, pLength,dstPeer,elementIndex);
for(i = 0; i < pLength; i++)
{
- TRACE_M(TF_SERIAL_CTRL,"Light_Ctl_Status: %d\r\n",
+ TRACE_M(TF_LIGHT_M,"Light_Ctl_Status: 0x%x\r\n",
pLightCtl_status[i]);
}
@@ -2215,20 +2492,24 @@ MOBLE_RESULT Light_Client_Ctl_Status(MOBLEUINT8 const *pLightCtl_status, MOBLEUI
/**
* @brief Light_Client_CtlTemperature_Range_Status: Function called when status of the model
* received on the client.
-* @param pCtlTempRange_status: ointer to the parameters received for message
+* @param pCtlTempRange_status: pointer to the parameters received for message
* @param plength: Length of the parameters received for message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return MOBLE_RESULT_SUCCESS.
*/
-MOBLE_RESULT Light_Client_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Light_Client_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status, MOBLEUINT32 pLength,MOBLEUINT16 dstPeer,MOBLEUINT8 elementIndex)
{
MOBLEUINT32 i;
- TRACE_M(TF_LIGHT_M,"Light_CtlTemperature_Range_Status received \r\n");
- LightAppli_cb.Light_CtlTemperature_Range_Status_cb(pCtlTempRange_status, pLength);
+ TRACE_M(TF_LIGHT_M,"Light_Client_CtlTemperature_Range_Status received \r\n");
+ LightAppli_cb.Light_CtlTemperature_Range_Status_cb(pCtlTempRange_status, pLength,dstPeer,elementIndex);
for(i = 0; i < pLength; i++)
{
- TRACE_M(TF_SERIAL_CTRL,"Light_CtlTemperature_Range_Status: %d\r\n",
+ TRACE_M(TF_LIGHT_M,"Light_Client_CtlTemperature_Range_Status: 0x%x\r\n",
pCtlTempRange_status[i]);
}
@@ -2238,20 +2519,24 @@ MOBLE_RESULT Light_Client_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTemp
/**
* @brief Light_Client_CtlDefault_Status: Function called when status of the model
* received on the client.
-* @param pCtlDefault_status: ointer to the parameters received for message
+* @param pCtlDefault_status: pointer to the parameters received for message
* @param plength: Length of the parameters received for message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return MOBLE_RESULT_SUCCESS.
*/
-MOBLE_RESULT Light_Client_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Light_Client_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status, MOBLEUINT32 pLength,MOBLEUINT16 dstPeer,MOBLEUINT8 elementIndex)
{
MOBLEUINT32 i;
TRACE_M(TF_LIGHT_M,"Light_Ctl_DefaultStatus received \r\n");
- LightAppli_cb.Light_CtlDefault_Status_cb(pCtlDefault_status, pLength);
+ LightAppli_cb.Light_CtlDefault_Status_cb(pCtlDefault_status, pLength,dstPeer, elementIndex);
for(i = 0; i < pLength; i++)
{
- TRACE_M(TF_SERIAL_CTRL,"Light_Ctl_DefaultStatus: %d\r\n",
+ TRACE_M(TF_LIGHT_M,"Light_Ctl_DefaultStatus: 0x%x\r\n",
pCtlDefault_status[i]);
}
@@ -2261,20 +2546,23 @@ MOBLE_RESULT Light_Client_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status
/**
* @brief Light_Client_CtlTemperature_Status: Function called when status of the model
* received on the client.
-* @param pLightCtlTemp_status: ointer to the parameters received for message
+* @param pLightCtlTemp_status: pointer to the parameters received for message
* @param plength: Length of the parameters received for message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return MOBLE_RESULT_SUCCESS.
*/
-MOBLE_RESULT Light_Client_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Light_Client_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status, MOBLEUINT32 pLength,MOBLEUINT16 dstPeer,MOBLEUINT8 elementIndex)
{
MOBLEUINT32 i;
- TRACE_M(TF_LIGHT_M,"Light_CtlTemperature_Status received \r\n");
- LightAppli_cb.Light_CtlTemperature_Status_cb(pLightCtlTemp_status, pLength);
+ LightAppli_cb.Light_CtlTemperature_Status_cb(pLightCtlTemp_status, pLength,dstPeer,elementIndex);
for(i = 0; i < pLength; i++)
{
- TRACE_M(TF_SERIAL_CTRL,"Light_CtlTemperature_Status: %d\r\n",
+ TRACE_M(TF_LIGHT_M,"Light_CtlTemperature_Status: 0x%x\r\n",
pLightCtlTemp_status[i]);
}
@@ -2284,20 +2572,25 @@ MOBLE_RESULT Light_Client_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_
/**
* @brief Light_Client_Hsl_Status: Function called when status of the model
* received on the client.
-* @param pHsl_status: ointer to the parameters received for message
+* @param pHsl_status: pointer to the parameters received for message
* @param plength: Length of the parameters received for message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return MOBLE_RESULT_SUCCESS.
*/
-MOBLE_RESULT Light_Client_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Light_Client_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 pLength,MOBLEUINT16 dstPeer,MOBLEUINT8 elementIndex)
{
MOBLEUINT32 i;
- TRACE_M(TF_LIGHT_M,"Light_Hsl_Status received \r\n");
- LightAppli_cb.Light_Hsl_Status_cb(pHsl_status, pLength);
+ TRACE_M(TF_LIGHT_M, "Status received \r\n");
+
+ LightAppli_cb.Light_Hsl_Status_cb(pHsl_status, pLength,dstPeer,elementIndex);
for(i = 0; i < pLength; i++)
{
- TRACE_M(TF_SERIAL_CTRL,"Light_Hsl_Status: %d\r\n",
+ TRACE_M(TF_LIGHT_M,"Light_Hsl_Status: 0x%x\r\n",
pHsl_status[i]);
}
return MOBLE_RESULT_SUCCESS;
@@ -2306,20 +2599,24 @@ MOBLE_RESULT Light_Client_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32
/**
* @brief Light_Client_HslDefault_Status: Function called when status of the model
* received on the client.
-* @param pHslDefault_status: ointer to the parameters received for message
+* @param pHslDefault_status: pointer to the parameters received for message
* @param plength: Length of the parameters received for message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return MOBLE_RESULT_SUCCESS.
*/
-MOBLE_RESULT Light_Client_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Light_Client_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status, MOBLEUINT32 pLength,MOBLEUINT16 dstPeer,MOBLEUINT8 elementIndex)
{
MOBLEUINT32 i;
- TRACE_M(TF_LIGHT_M,"Light_HslDefault_Status received \r\n");
- LightAppli_cb.Light_HslDefault_Status_cb(pHslDefault_status, pLength);
+ TRACE_M(TF_LIGHT_M, "Status received \r\n");
+ LightAppli_cb.Light_HslDefault_Status_cb(pHslDefault_status, pLength,dstPeer,elementIndex);
for(i = 0; i < pLength; i++)
{
- TRACE_M(TF_SERIAL_CTRL,"Light_HslDefault_Status: %d\r\n",
+ TRACE_M(TF_LIGHT_M,"Light_HslDefault_Status: 0x%x\r\n",
pHslDefault_status[i]);
}
@@ -2329,20 +2626,24 @@ MOBLE_RESULT Light_Client_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status
/**
* @brief Light_Client_HslRange_Status: Function called when status of the model
* received on the client.
-* @param pHslRange_status: ointer to the parameters received for message
+* @param pHslRange_status: pointer to the parameters received for message
* @param plength: Length of the parameters received for message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return MOBLE_RESULT_SUCCESS.
*/
-MOBLE_RESULT Light_Client_HslRange_Status(MOBLEUINT8 const *pHslRange_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Light_Client_HslRange_Status(MOBLEUINT8 const *pHslRange_status, MOBLEUINT32 pLength,MOBLEUINT16 dstPeer,MOBLEUINT8 elementIndex)
{
MOBLEUINT32 i;
- TRACE_M(TF_LIGHT_M,"Light_HslRange_Status received \r\n");
- LightAppli_cb.Light_HslRange_Status_cb(pHslRange_status, pLength);
+ TRACE_M(TF_LIGHT_M, "Status received \r\n");
+ LightAppli_cb.Light_HslRange_Status_cb(pHslRange_status, pLength,dstPeer,elementIndex);
for(i = 0; i < pLength; i++)
{
- TRACE_M(TF_SERIAL_CTRL,"Light_HslRange_Status: %d\r\n",
+ TRACE_M(TF_LIGHT_M,"Light_HslRange_Status: 0x%x\r\n",
pHslRange_status[i]);
}
@@ -2352,19 +2653,23 @@ MOBLE_RESULT Light_Client_HslRange_Status(MOBLEUINT8 const *pHslRange_status, MO
/**
* @brief Light_Client_HslTarget_Status: Function called when status of the model
* received on the client.
-* @param pHslTarget_status: ointer to the parameters received for message
+* @param pHslTarget_status: pointer to the parameters received for message
* @param plength: Length of the parameters received for message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return MOBLE_RESULT_SUCCESS.
*/
-MOBLE_RESULT Light_Client_HslTarget_Status(MOBLEUINT8 const *pHslTarget_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Light_Client_HslTarget_Status(MOBLEUINT8 const *pHslTarget_status, MOBLEUINT32 pLength,MOBLEUINT16 dstPeer,MOBLEUINT8 elementIndex)
{
MOBLEUINT32 i;
- TRACE_M(TF_LIGHT_M,"Light_HslTarget_Status received \r\n");
+ TRACE_M(TF_LIGHT_M, "Status received \r\n");
for(i = 0; i < pLength; i++)
{
- TRACE_M(TF_SERIAL_CTRL,"Light_HslTarget_Status: %d\r\n",
+ TRACE_M(TF_LIGHT_M,"Light_HslTarget_Status: 0x%x\r\n",
pHslTarget_status[i]);
}
@@ -2374,20 +2679,24 @@ MOBLE_RESULT Light_Client_HslTarget_Status(MOBLEUINT8 const *pHslTarget_status,
/**
* @brief Light_Client_HslHue_Status: Function called when status of the model
* received on the client.
-* @param pHslHue_status: ointer to the parameters received for message
+* @param pHslHue_status: pointer to the parameters received for message
* @param plength: Length of the parameters received for message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return MOBLE_RESULT_SUCCESS.
*/
-MOBLE_RESULT Light_Client_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Light_Client_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUINT32 pLength,MOBLEUINT16 dstPeer,MOBLEUINT8 elementIndex)
{
MOBLEUINT32 i;
- TRACE_M(TF_LIGHT_M,"Light_HslHue_Status received \r\n");
- LightAppli_cb.Light_HslHue_Status_cb(pHslHue_status, pLength);
+ TRACE_M(TF_LIGHT_M, "Status Received \r\n");
+ LightAppli_cb.Light_HslHue_Status_cb(pHslHue_status, pLength,dstPeer,elementIndex);
for(i = 0; i < pLength; i++)
{
- TRACE_M(TF_SERIAL_CTRL,"Light_HslHue_Status: %d\r\n",
+ TRACE_M(TF_LIGHT_M,"Light_HslHue_Status: 0x%x\r\n",
pHslHue_status[i]);
}
@@ -2397,20 +2706,24 @@ MOBLE_RESULT Light_Client_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEU
/**
* @brief Light_Client_HslSaturation_Status: Function called when status of the model
* received on the client.
-* @param pHslSaturation_status: ointer to the parameters received for message
+* @param pHslSaturation_status: pointer to the parameters received for message
* @param plength: Length of the parameters received for message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return MOBLE_RESULT_SUCCESS.
*/
-MOBLE_RESULT Light_Client_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Light_Client_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status, MOBLEUINT32 pLength,MOBLEUINT16 dstPeer,MOBLEUINT8 elementIndex)
{
MOBLEUINT32 i;
- TRACE_M(TF_LIGHT_M,"Light_HslSaturation_Status received \r\n");
- LightAppli_cb.Light_HslSaturation_Status_cb(pHslSaturation_status, pLength);
+ TRACE_M(TF_LIGHT_M, "Status Received \r\n");
+ LightAppli_cb.Light_HslSaturation_Status_cb(pHslSaturation_status, pLength,dstPeer,elementIndex);
for(i = 0; i < pLength; i++)
{
- TRACE_M(TF_SERIAL_CTRL,"Light_HslSaturation_Status: %d\r\n",
+ TRACE_M(TF_LIGHT_M,"Light_HslSaturation_Status: 0x%x\r\n",
pHslSaturation_status[i]);
}
@@ -2424,7 +2737,8 @@ MOBLE_RESULT Light_Client_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_
* @param GetValue: Pointer of the array
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_TransitionBehaviourSingle_Param(MOBLEUINT8 *GetValue)
+MOBLE_RESULT Light_TransitionBehaviourSingle_Param(MOBLEUINT8 *GetValue,
+ MOBLEUINT8 elementIndex)
{
static MOBLEUINT8 Clockflag = 0;
@@ -2438,39 +2752,39 @@ MOBLE_RESULT Light_TransitionBehaviourSingle_Param(MOBLEUINT8 *GetValue)
Clockflag = 1;
}
/* Values from application are copied into temporary vaiables for processing */
- Light_TemporaryStatus.PresentParam_1 = GetValue[1] << 8;
- Light_TemporaryStatus.PresentParam_1 |= GetValue[0];
+ Light_TemporaryStatus[elementIndex].PresentParam_1 = GetValue[1] << 8;
+ Light_TemporaryStatus[elementIndex].PresentParam_1 |= GetValue[0];
/*if condition to wait untill the time is equal to the given resolution time */
- if(((Clock_Time()- Check_time) >= Light_TimeParam.Res_Value))
+ if(((Clock_Time()- Check_time) >= Light_TimeParam[elementIndex].Res_Value))
{
- if(Light_TimeParam.StepValue == 0)
+ if(Light_TimeParam[elementIndex].StepValue == 0)
{
- Light_TimeParam.StepValue = 1;
+ Light_TimeParam[elementIndex].StepValue = 1;
}
- if(Light_TemporaryStatus.TargetParam_1 > Light_TemporaryStatus.PresentParam_1)
+ if(Light_TemporaryStatus[elementIndex].TargetParam_1 > Light_TemporaryStatus[elementIndex].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
+ /* calulating the target range to be acheived which is target value
+ which is target value minus present value if target value is greater
than present value.
*/
- targetRange = Light_TemporaryStatus.TargetParam_1 - Light_TemporaryStatus.PresentParam_1;
+ targetRange = Light_TemporaryStatus[elementIndex].TargetParam_1 - Light_TemporaryStatus[elementIndex].PresentParam_1;
/*target slot = time to cover in single step */
- targetSlot = targetRange/Light_TimeParam.StepValue;
+ targetSlot = targetRange/Light_TimeParam[elementIndex].StepValue;
/* target slot added to present value to achieve target value */
- Light_TemporaryStatus.PresentParam_1 += targetSlot;
+ Light_TemporaryStatus[elementIndex].PresentParam_1 += targetSlot;
}
else
{
/* if present value is greater than target value, this condition executes */
- targetRange = Light_TemporaryStatus.PresentParam_1 - Light_TemporaryStatus.TargetParam_1;;
- targetSlot = targetRange/Light_TimeParam.StepValue;
- Light_TemporaryStatus.PresentParam_1 -= targetSlot;
+ targetRange = Light_TemporaryStatus[elementIndex].PresentParam_1 - Light_TemporaryStatus[elementIndex].TargetParam_1;
+ targetSlot = targetRange/Light_TimeParam[elementIndex].StepValue;
+ Light_TemporaryStatus[elementIndex].PresentParam_1 -= targetSlot;
}
- Light_TimeParam.StepValue--;
+ Light_TimeParam[elementIndex].StepValue=Light_TimeParam[elementIndex].StepValue-1;
/* updating the remaining time after each step covered*/
- Light_TemporaryStatus.RemainingTime = Light_TimeParam.StepValue | (Light_TimeParam.ResBitValue << 6) ;
+ Light_TemporaryStatus[elementIndex].RemainingTime = Light_TimeParam[elementIndex].StepValue | (Light_TimeParam[elementIndex].ResBitValue << 6) ;
LightUpdateFlag = VALUE_UPDATE_SET;
Check_time = 0;
Clockflag = 0;
@@ -2478,16 +2792,16 @@ MOBLE_RESULT Light_TransitionBehaviourSingle_Param(MOBLEUINT8 *GetValue)
/* when transition is completed, disable the transition by disabling
transition flag
*/
- if(Light_TimeParam.StepValue == 0)
+ if(Light_TimeParam[elementIndex].StepValue == 0)
{
- Light_ModelFlag.LightTransitionFlag = LIGHT_TRANSITION_STOP;
- Light_ModelFlag.Light_Trnsn_Cmplt = 1;
+ Light_ModelFlag[elementIndex].LightTransitionFlag = LIGHT_TRANSITION_STOP;
+ Light_ModelFlag[elementIndex].Light_Trnsn_Cmplt = 1;
}
- TRACE_M(TF_LIGHT_M,"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);
+ TRACE_M(TF_LIGHT_M, "Inside light lightness transition time at %d, Current state 0x%.2x ,target state 0x%.2x , Remaining Time 0x%.2x\n\r",
+ Clock_Time(),Light_TemporaryStatus[elementIndex].PresentParam_1,Light_TemporaryStatus[elementIndex].TargetParam_1,\
+ Light_TemporaryStatus[elementIndex].RemainingTime);
}
@@ -2504,7 +2818,9 @@ MOBLE_RESULT Light_TransitionBehaviourSingle_Param(MOBLEUINT8 *GetValue)
* @param
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Light_TransitionBehaviourMulti_Param(MOBLEUINT8 *GetValue , MOBLEUINT8 param_Count)
+MOBLE_RESULT Light_TransitionBehaviourMulti_Param(MOBLEUINT8 *GetValue ,
+ MOBLEUINT8 param_Count,
+ MOBLEUINT8 elementIndex)
{
static MOBLEUINT8 Clockflag = 0;
@@ -2521,75 +2837,75 @@ MOBLE_RESULT Light_TransitionBehaviourMulti_Param(MOBLEUINT8 *GetValue , MOBLEUI
Clockflag = 1;
}
/* Values from application are copied into Temporary vaiables for processing */
- Light_TemporaryStatus.PresentParam_1 = GetValue[1] << 8;
- Light_TemporaryStatus.PresentParam_1 |= GetValue[0];
- Light_TemporaryStatus.PresentParam_2 = GetValue[3] << 8;
- Light_TemporaryStatus.PresentParam_2 |= GetValue[2];
- Light_TemporaryStatus.PresentParam_3 = GetValue[5] << 8;
- Light_TemporaryStatus.PresentParam_3 |= GetValue[4];
- /*if condition to wait untill the time is equal to the given resolution time */
- if(((Clock_Time()- Check_time) >= Light_TimeParam.Res_Value))
- {
- if(Light_TimeParam.StepValue == 0)
+ Light_TemporaryStatus[elementIndex].PresentParam_1 = GetValue[1] << 8;
+ Light_TemporaryStatus[elementIndex].PresentParam_1 |= GetValue[0];
+ Light_TemporaryStatus[elementIndex].PresentParam_2 = GetValue[3] << 8;
+ Light_TemporaryStatus[elementIndex].PresentParam_2 |= GetValue[2];
+ Light_TemporaryStatus[elementIndex].PresentParam_3 = GetValue[5] << 8;
+ Light_TemporaryStatus[elementIndex].PresentParam_3 |= GetValue[4];
+ /* if condition to wait untill the time is equal to the given resolution time */
+ if(((Clock_Time()- Check_time) >= Light_TimeParam[elementIndex].Res_Value))
+ {
+ if(Light_TimeParam[elementIndex].StepValue == 0)
{
- Light_TimeParam.StepValue = 1;
+ Light_TimeParam[elementIndex].StepValue = 1;
}
- if(Light_TemporaryStatus.TargetParam_1 > Light_TemporaryStatus.PresentParam_1)
+ if(Light_TemporaryStatus[elementIndex].TargetParam_1 > Light_TemporaryStatus[elementIndex].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
+ /* calulating the target range to be acheived which is target value
+ which is target value minus present value if target value is greater
than present value.
*/
- targetRangeLightness = Light_TemporaryStatus.TargetParam_1 - Light_TemporaryStatus.PresentParam_1;
+ targetRangeLightness = Light_TemporaryStatus[elementIndex].TargetParam_1 - Light_TemporaryStatus[elementIndex].PresentParam_1;
/*target slot = time to cover in single step */
- targetSlotParam_1 = targetRangeLightness/Light_TimeParam.StepValue;
+ targetSlotParam_1 = targetRangeLightness/Light_TimeParam[elementIndex].StepValue;
/* target slot added to present value to achieve target value */
- Light_TemporaryStatus.PresentParam_1 += targetSlotParam_1;
+ Light_TemporaryStatus[elementIndex].PresentParam_1 += targetSlotParam_1;
}
else
{
/* condition execute when transition is negative */
/* target range = total range to be covered */
- targetRangeLightness = Light_TemporaryStatus.PresentParam_1 - Light_TemporaryStatus.TargetParam_1;
+ targetRangeLightness = Light_TemporaryStatus[elementIndex].PresentParam_1 - Light_TemporaryStatus[elementIndex].TargetParam_1;
/*target slot = time to cover in single step */
- targetSlotParam_1 = targetRangeLightness/Light_TimeParam.StepValue;
+ targetSlotParam_1 = targetRangeLightness/Light_TimeParam[elementIndex].StepValue;
/*target slot = time to cover in single step */
- Light_TemporaryStatus.PresentParam_1 -= targetSlotParam_1;
+ Light_TemporaryStatus[elementIndex].PresentParam_1 -= targetSlotParam_1;
}
- if(Light_TemporaryStatus.TargetParam_2 > Light_TemporaryStatus.PresentParam_2 )
+ if(Light_TemporaryStatus[elementIndex].TargetParam_2 > Light_TemporaryStatus[elementIndex].PresentParam_2 )
{
- targetRangeTemperature = Light_TemporaryStatus.TargetParam_2 - Light_TemporaryStatus.PresentParam_2;
- targetSlotParam_2 = targetRangeTemperature/Light_TimeParam.StepValue;
- Light_TemporaryStatus.PresentParam_2 += targetSlotParam_2;
+ targetRangeTemperature = Light_TemporaryStatus[elementIndex].TargetParam_2 - Light_TemporaryStatus[elementIndex].PresentParam_2;
+ targetSlotParam_2 = targetRangeTemperature/Light_TimeParam[elementIndex].StepValue;
+ Light_TemporaryStatus[elementIndex].PresentParam_2 += targetSlotParam_2;
}
else
{
- targetRangeTemperature = Light_TemporaryStatus.PresentParam_2 - Light_TemporaryStatus.TargetParam_2;
- targetSlotParam_2 = targetRangeTemperature/Light_TimeParam.StepValue;
- Light_TemporaryStatus.PresentParam_2 -= targetSlotParam_2;
+ targetRangeTemperature = Light_TemporaryStatus[elementIndex].PresentParam_2 - Light_TemporaryStatus[elementIndex].TargetParam_2;
+ targetSlotParam_2 = targetRangeTemperature/Light_TimeParam[elementIndex].StepValue;
+ Light_TemporaryStatus[elementIndex].PresentParam_2 -= targetSlotParam_2;
}
if(param_Count == 3)
{
- if(Light_TemporaryStatus.TargetParam_3 > Light_TemporaryStatus.PresentParam_3 )
+ if(Light_TemporaryStatus[elementIndex].TargetParam_3 > Light_TemporaryStatus[elementIndex].PresentParam_3 )
{
- targetRangeTemperature = Light_TemporaryStatus.TargetParam_3 - Light_TemporaryStatus.PresentParam_3;
- targetSlotParam_3 = targetRangeTemperature/Light_TimeParam.StepValue;
- Light_TemporaryStatus.PresentParam_3 += targetSlotParam_3;
+ targetRangeTemperature = Light_TemporaryStatus[elementIndex].TargetParam_3 - Light_TemporaryStatus[elementIndex].PresentParam_3;
+ targetSlotParam_3 = targetRangeTemperature/Light_TimeParam[elementIndex].StepValue;
+ Light_TemporaryStatus[elementIndex].PresentParam_3 += targetSlotParam_3;
}
else
{
- targetRangeTemperature = Light_TemporaryStatus.PresentParam_3 - Light_TemporaryStatus.TargetParam_3;
- targetSlotParam_3 = targetRangeTemperature/Light_TimeParam.StepValue;
- Light_TemporaryStatus.PresentParam_3 -= targetSlotParam_3;
+ targetRangeTemperature = Light_TemporaryStatus[elementIndex].PresentParam_3 - Light_TemporaryStatus[elementIndex].TargetParam_3;
+ targetSlotParam_3 = targetRangeTemperature/Light_TimeParam[elementIndex].StepValue;
+ Light_TemporaryStatus[elementIndex].PresentParam_3 -= targetSlotParam_3;
}
}
- Light_TimeParam.StepValue--;
+ Light_TimeParam[elementIndex].StepValue--;
/* updating the remaining time after each step covered*/
- Light_TemporaryStatus.RemainingTime = Light_TimeParam.StepValue | (Light_TimeParam.ResBitValue << 6) ;
+ Light_TemporaryStatus[elementIndex].RemainingTime = Light_TimeParam[elementIndex].StepValue | (Light_TimeParam[elementIndex].ResBitValue << 6) ;
LightUpdateFlag = VALUE_UPDATE_SET;
Check_time = 0;
Clockflag = 0;
@@ -2597,16 +2913,16 @@ MOBLE_RESULT Light_TransitionBehaviourMulti_Param(MOBLEUINT8 *GetValue , MOBLEUI
transition flag
*/
- if(Light_TimeParam.StepValue <= 0)
+ if(Light_TimeParam[elementIndex].StepValue <= 0)
{
- Light_ModelFlag.LightTransitionFlag = LIGHT_TRANSITION_STOP;
- Light_ModelFlag.Light_Trnsn_Cmplt = 1;
- }
- TRACE_M(TF_LIGHT_M,"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,
- Light_TemporaryStatus.RemainingTime);
+ Light_ModelFlag[elementIndex].LightTransitionFlag = LIGHT_TRANSITION_STOP;
+ Light_ModelFlag[elementIndex].Light_Trnsn_Cmplt = 1;
+ }
+ TRACE_M(TF_LIGHT_M, "Inside light transition %d,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[elementIndex].PresentParam_1,Light_TemporaryStatus[elementIndex].TargetParam_1,
+ Light_TemporaryStatus[elementIndex].PresentParam_2,Light_TemporaryStatus[elementIndex].TargetParam_2,
+ Light_TemporaryStatus[elementIndex].PresentParam_3, Light_TemporaryStatus[elementIndex].TargetParam_3,
+ Light_TemporaryStatus[elementIndex].RemainingTime);
}
@@ -2623,38 +2939,55 @@ MOBLE_RESULT Light_TransitionBehaviourMulti_Param(MOBLEUINT8 *GetValue , MOBLEUI
void Model_BindingPublishStatus(void)
{
MOBLE_ADDRESS publishAddress;
- MOBLEUINT8 elementNumber;
+ MOBLEUINT8 elementIndex;
+ MODEL_MessageHeader_t msgParam;
MOBLEUINT16 opcode;
MOBLEUINT8 const pRxData[12] = {0};
MOBLEUINT32 dataLength = 0;
- MOBLEUINT8 count = 0;
+ static 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((Light_PublishOpcodeList.BindedStateCount > 0) &&(ADDRESS_IS_UNICAST(Model_Binding_Var.Dst_Peer)))
+ {
+ for(elementIndex = 0; elementIndex < APPLICATION_NUMBER_OF_ELEMENTS; elementIndex++)
+ {
+
+ my_Address = BLEMesh_GetAddress();
+ publishAddress = BLEMesh_GetPublishAddress(elementIndex, Light_PublishOpcodeList.Model_ID[count]);
+ opcode = (MOBLEUINT16)Light_PublishOpcodeList.PublishStateOpcode[count];
+
+ /*Initialize the Parameters*/
+ msgParam.dst_peer = my_Address;
+ msgParam.peer_addr = publishAddress;
+ msgParam.elementIndex = elementIndex;
+ msgParam.rcvdAppKeyOffset = 0;
+ msgParam.rcvdNetKeyOffset = 0;
+ msgParam.rssi = 0;
+ msgParam.ttl = 0;
-#if 0
- if((publishAddress != 0x0000 ) && (ADDRESS_IS_UNICAST(Dst_Peer)))
-#else
- if((publishAddress != 0x0000 ) &&
- ((ADDRESS_IS_UNICAST(Dst_Peer)) || (ADDRESS_IS_GROUP(Dst_Peer))))
-#endif
- {
- Model_SendResponse(publishAddress,my_Address,opcode,pRxData,dataLength);
- TRACE_I(TF_LIGHT_M,"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;
- Light_Publish_Reset();
- }
-
+ if(publishAddress != 0x0000)
+ {
+
+ /*Using the same API used for Acknowledgement, where src & dst getting interchanged.
+ Therefore PublishAddress is copied in peer_addr & vice versa*/
+ Model_SendResponse(&msgParam, opcode, pRxData, dataLength);
+ TRACE_M(TF_LIGHT_M, "Binded publishing address %.2x opcode %.2x model id %.2x \r\n",
+ publishAddress,Light_PublishOpcodeList.PublishStateOpcode[count],Light_PublishOpcodeList.Model_ID[count]);
+ }
+ Light_PublishOpcodeList.Model_ID[count] = 0;
+ Light_PublishOpcodeList.PublishStateOpcode[count] = 0;
+ }
+ count++;
+ if(count > Light_PublishOpcodeList.BindedStateCount)
+ {
+ count = 0;
+ Light_PublishOpcodeList.BindedStateCount = 0;
+ }
+ }
+ else
+ {
+ Light_PublishOpcodeList.BindedStateCount = 0;
+ }
}
/**
@@ -2663,7 +2996,7 @@ void Model_BindingPublishStatus(void)
* @param stepParam is transition time set value.
* retval void.
*/
-void Light_GetStepValue(MOBLEUINT8 stepParam)
+void Light_GetStepValue(MOBLEUINT8 stepParam,MOBLEUINT8 elementIndex)
{
/*
Two MSB bit of transition time is dedicated to resolution.
@@ -2674,18 +3007,18 @@ void Light_GetStepValue(MOBLEUINT8 stepParam)
Last bits from 0 to 5th index is step number.
*/
- Light_TimeParam.ResBitValue = stepParam >> 6 ;
- Light_TimeParam.Res_Value = Get_StepResolutionValue(Light_TimeParam.ResBitValue);
- Light_TimeParam.StepValue = stepParam & 0x3F ;
+ Light_TimeParam[elementIndex].ResBitValue = stepParam >> 6 ;
+ Light_TimeParam[elementIndex].Res_Value = Get_StepResolutionValue(Light_TimeParam[elementIndex].ResBitValue);
+ Light_TimeParam[elementIndex].StepValue = stepParam & 0x3F ;
- if(Light_TimeParam.Res_Value >= 100)
+ if(Light_TimeParam[elementIndex].Res_Value >= 100)
{
- Light_TimeParam.Res_Value = Light_TimeParam.Res_Value/TRANSITION_SCALER;
- Light_TimeParam.StepValue = (Light_TimeParam.StepValue * TRANSITION_SCALER);
+ Light_TimeParam[elementIndex].Res_Value = Light_TimeParam[elementIndex].Res_Value/TRANSITION_SCALER;
+ Light_TimeParam[elementIndex].StepValue = (Light_TimeParam[elementIndex].StepValue * TRANSITION_SCALER);
}
- TRACE_M(TF_LIGHT_M," step resolution 0x%.2lx, number of step 0x%.2x \r\n",Light_TimeParam.Res_Value ,
- Light_TimeParam.StepValue );
+ TRACE_M(TF_LIGHT_M, "step resolution 0x%.2x, number of step 0x%.2x \r\n",Light_TimeParam[elementIndex].Res_Value ,
+ Light_TimeParam[elementIndex].StepValue );
}
@@ -2697,10 +3030,16 @@ void Light_GetStepValue(MOBLEUINT8 stepParam)
void Lighting_Process(void)
{
MOBLE_ADDRESS publishAddress;
- MOBLE_ADDRESS my_Address;
- MOBLEUINT8 elementNumber;
+ MOBLE_ADDRESS my_Address = BLEMesh_GetAddress();
+ MODEL_MessageHeader_t msgParam;
+ MOBLEUINT8 elementIndex;
MOBLEUINT8 const pRxData[12] = {0};
MOBLEUINT32 dataLength = 0;
+
+ for(elementIndex = 0; elementIndex < APPLICATION_NUMBER_OF_ELEMENTS; elementIndex++)
+ {
+ my_Address = my_Address+elementIndex;
+
#if defined ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS || defined ENABLE_LIGHT_MODEL_SERVER_CTL \
|| defined ENABLE_LIGHT_MODEL_SERVER_HSL
@@ -2708,248 +3047,363 @@ void Lighting_Process(void)
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
- if(Light_ModelFlag.LightTransitionFlag == LIGHT_LIGHTNESS_TRANSITION_START)
+ if(Light_ModelFlag[elementIndex].LightTransitionFlag == LIGHT_LIGHTNESS_TRANSITION_START)
{
- /* Fetching the state value from the applcation layer to middle layer */
- (Appli_Light_GetStatus_cb.GetLightLightness_cb)(Light_GetBuff);
+ /* Fetching the state value from the application layer to middle layer */
+ (Appli_Light_GetStatus_cb.GetLightLightness_cb)(Light_GetBuff, my_Address, elementIndex);
/* Transition function called to change the state in transition */
- Light_TransitionBehaviourSingle_Param(Light_GetBuff);
+ Light_TransitionBehaviourSingle_Param(Light_GetBuff, elementIndex);
if(LightUpdateFlag == VALUE_UPDATE_SET)
{
/* updating the state value after the each transition step complete */
- LightLightnessStateUpdate_Process();
+ Light_LightnessStateUpdate_Process(elementIndex);
/*Application Callback */
- (LightAppli_cb.Lightness_Set_cb)(&Light_LightnessStatus,0);
+ (LightAppli_cb.Lightness_Set_cb)(&Light_LightnessStatus[elementIndex],0, my_Address, elementIndex);
/* Binding of actual light lightness with other models */
- Light_Lightness_Binding(BINDING_LIGHT_LIGHTNESS_ACTUAL_SET , 0);
+ Light_Lightness_Binding(BINDING_LIGHT_LIGHTNESS_ACTUAL_SET , 0,elementIndex);
LightUpdateFlag = VALUE_UPDATE_RESET;
}
}
- if(Light_ModelFlag.LightTransitionFlag == LIGHT_LINEAR_TRANSITION_START)
+ if(Light_ModelFlag[elementIndex].LightTransitionFlag == LIGHT_LINEAR_TRANSITION_START)
{
/* Fetching the state value from the applcation layer to middle layer */
- (Appli_Light_GetStatus_cb.GetLightLightnessLinear_cb)(Light_GetBuff);
+ (Appli_Light_GetStatus_cb.GetLightLightnessLinear_cb)(Light_GetBuff,my_Address, elementIndex);
/* Transition function called to change the state in transition */
- Light_TransitionBehaviourSingle_Param(Light_GetBuff);
+ Light_TransitionBehaviourSingle_Param(Light_GetBuff,elementIndex);
if(LightUpdateFlag == VALUE_UPDATE_SET)
{
/* updating the state value after the each transition step complete */
- LightLinearStateUpdate_Process();
+ Light_LinearStateUpdate_Process(elementIndex);
/*Application Callback */
- (LightAppli_cb.Lightness_Linear_Set_cb)(&Light_LightnessStatus,0);
+ (LightAppli_cb.Lightness_Linear_Set_cb)(&Light_LightnessStatus[elementIndex], 0, my_Address, elementIndex);
/* Binding of data of light lightness with light linear */
- Light_Lightness_Binding(BINDING_LIGHT_LIGHTNESS_LINEAR_SET , 0);
+ Light_Lightness_Binding(BINDING_LIGHT_LIGHTNESS_LINEAR_SET , 0,elementIndex);
LightUpdateFlag = VALUE_UPDATE_RESET;
}
}
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL
- if(Light_ModelFlag.LightTransitionFlag == LIGHT_CTL_TRANSITION_START)
+ if(Light_ModelFlag[elementIndex].LightTransitionFlag == LIGHT_CTL_TRANSITION_START)
{
- (Appli_Light_GetStatus_cb.GetLightCtl_cb)(Light_GetBuff);
- Light_TransitionBehaviourMulti_Param(Light_GetBuff , 0);
+ (Appli_Light_GetStatus_cb.GetLightCtl_cb)(Light_GetBuff,my_Address, elementIndex);
+ Light_TransitionBehaviourMulti_Param(Light_GetBuff , 0,elementIndex);
if(LightUpdateFlag == VALUE_UPDATE_SET)
{
- LightCtlStateUpdate_Process();
- (LightAppli_cb.Light_Ctl_Set_cb)(&Light_CtlStatus , 0);
+ Light_CtlStateUpdate_Process(elementIndex);
+ (LightAppli_cb.Light_Ctl_Set_cb)(&Light_CtlStatus[elementIndex], 0, my_Address, elementIndex);
/* binding of light ctl with actual lightness */
- Light_Ctl_LightActual_Binding(BINDING_LIGHT_CTL_SET);
+ Light_Ctl_LightActual_Binding(BINDING_LIGHT_CTL_SET,elementIndex);
LightUpdateFlag = VALUE_UPDATE_RESET;
}
}
- if(Light_ModelFlag.LightTransitionFlag == LIGHT_TEMPERATURE_TRANSITION_START)
+ if(Light_ModelFlag[elementIndex].LightTransitionFlag == LIGHT_TEMPERATURE_TRANSITION_START)
{
- (Appli_Light_GetStatus_cb.GetLightCtlTemp_cb)(Light_GetBuff);
- Light_TransitionBehaviourMulti_Param(Light_GetBuff , 0);
+ (Appli_Light_GetStatus_cb.GetLightCtlTemp_cb)(Light_GetBuff, my_Address, elementIndex);
+ Light_TransitionBehaviourMulti_Param(Light_GetBuff , 0,elementIndex);
if(LightUpdateFlag == VALUE_UPDATE_SET)
{
- LightCtlTemperatureStateUpdate_Process();
- (LightAppli_cb.Light_CtlTemperature_Set_cb)(&Light_CtlStatus , 0);
+ Light_CtlTemperatureStateUpdate_Process(elementIndex);
+ (LightAppli_cb.Light_CtlTemperature_Set_cb)(&Light_CtlStatus[elementIndex], 0, my_Address, elementIndex);
/* Binding of data Ctl Temperature with Generic Level */
- Light_CtlTemperature_Binding();
+ Light_CtlTemperature_Binding(elementIndex);
LightUpdateFlag = VALUE_UPDATE_RESET;
}
}
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL
- if(Light_ModelFlag.LightTransitionFlag == LIGHT_HSL_TRANSITION_START)
+ if(Light_ModelFlag[elementIndex].LightTransitionFlag == LIGHT_HSL_TRANSITION_START)
{
- (Appli_Light_GetStatus_cb.GetLightHsl_cb)(Light_GetBuff);
- Light_TransitionBehaviourMulti_Param(Light_GetBuff , 3);
+ (Appli_Light_GetStatus_cb.GetLightHsl_cb)(Light_GetBuff,my_Address, elementIndex);
+ Light_TransitionBehaviourMulti_Param(Light_GetBuff , 3,elementIndex);
if(LightUpdateFlag == VALUE_UPDATE_SET)
{
- LightHslStateUpdate_Process();
- (LightAppli_cb.Light_Hsl_Set_cb)(&Light_HslStatus , 0);
+ Light_HslStateUpdate_Process(elementIndex);
+ (LightAppli_cb.Light_Hsl_Set_cb)(&Light_HslStatus[elementIndex], 0, my_Address, elementIndex);
/* Light Hsl Lightness binding with lightness Actual */
- Light_HslLightness_LightnessActualBinding();
+ Light_HslLightness_LightnessActualBinding(elementIndex);
LightUpdateFlag = VALUE_UPDATE_RESET;
}
}
- if(Light_ModelFlag.LightTransitionFlag == LIGHT_HSL_HUE_TRANSITION_START)
+ if(Light_ModelFlag[elementIndex].LightTransitionFlag == LIGHT_HSL_HUE_TRANSITION_START)
{
- (Appli_Light_GetStatus_cb.GetLightHslHue_cb)(Light_GetBuff);
- Light_TransitionBehaviourSingle_Param(Light_GetBuff);
+ (Appli_Light_GetStatus_cb.GetLightHslHue_cb)(Light_GetBuff,my_Address, elementIndex);
+ Light_TransitionBehaviourSingle_Param(Light_GetBuff,elementIndex);
if(LightUpdateFlag == VALUE_UPDATE_SET)
{
- LightHslHueStateUpdate_Process();
- (LightAppli_cb.Light_HslHue_Set_cb)(&Light_HslStatus , 0);
+ Light_HslHueStateUpdate_Process(elementIndex);
+ (LightAppli_cb.Light_HslHue_Set_cb)(&Light_HslStatus[elementIndex], 0, my_Address, elementIndex);
/* Light Hsl Hue binding with Generic level */
- Light_Hsl_Hue_Binding();
+ Light_Hsl_Hue_Binding(elementIndex);
LightUpdateFlag = VALUE_UPDATE_RESET;
}
}
- if(Light_ModelFlag.LightTransitionFlag == LIGHT_HSL_SATURATION_TRANSITION_START)
+ if(Light_ModelFlag[elementIndex].LightTransitionFlag == LIGHT_HSL_SATURATION_TRANSITION_START)
{
- (Appli_Light_GetStatus_cb.GetLightHslSaturation_cb)(Light_GetBuff);
- Light_TransitionBehaviourSingle_Param(Light_GetBuff);
+ (Appli_Light_GetStatus_cb.GetLightHslSaturation_cb)(Light_GetBuff,my_Address, elementIndex);
+ Light_TransitionBehaviourSingle_Param(Light_GetBuff,elementIndex);
if(LightUpdateFlag == VALUE_UPDATE_SET)
{
- LightHslSaturationStateUpdate_Process();
- (LightAppli_cb.Light_HslSaturation_Set_cb)(&Light_HslStatus , 0);
+ Light_HslSaturationStateUpdate_Process(elementIndex);
+ (LightAppli_cb.Light_HslSaturation_Set_cb)(&Light_HslStatus[elementIndex], 0, my_Address, elementIndex);
/* Light Hsl Saturation binding with Generic level model*/
- Light_Hsl_Saturation_Binding();
+ Light_Hsl_Saturation_Binding(elementIndex);
LightUpdateFlag = VALUE_UPDATE_RESET;
}
}
#endif
-
- if(Light_ModelFlag.Light_Trnsn_Cmplt == MOBLE_TRUE)
+ /* Check if Transition is completed */
+ if(Light_ModelFlag[elementIndex].Light_Trnsn_Cmplt == MOBLE_TRUE)
{
- elementNumber = BLE_GetElementNumber();
my_Address = BLEMesh_GetAddress();
- publishAddress = BLEMesh_GetPublishAddress(elementNumber,Model_ID);
+ publishAddress = BLEMesh_GetPublishAddress(elementIndex, Model_Binding_Var.Model_ID);
+
+ /* Initialize the messageParam*/
+ msgParam.dst_peer = my_Address;
+ msgParam.peer_addr = publishAddress;
+ msgParam.elementIndex = elementIndex;
+ msgParam.rcvdAppKeyOffset = 0;
+ msgParam.rcvdNetKeyOffset = 0;
+ msgParam.rssi = 0;
+ msgParam.ttl = 0;
+
if(publishAddress != 0x00)
{
- Model_SendResponse(publishAddress,my_Address,Model_Rx_Opcode,pRxData,dataLength);
+ /*Using the same API used for Acknowledgement, where src & dst getting interchanged.
+ Therefore PublishAddress is copied in peer_addr & vice versa*/
+ Model_SendResponse(&msgParam, Model_Binding_Var.Model_Rx_Opcode, pRxData, dataLength);
+ TRACE_M(TF_LIGHT_M, "Publishing the status after transition complete opcode %.2x model id %.2x \r\n",
+ Model_Binding_Var.Model_Rx_Opcode,Model_Binding_Var.Model_ID);
}
- Light_ModelFlag.Light_Trnsn_Cmplt = MOBLE_FALSE;
+ Light_ModelFlag[elementIndex].Light_Trnsn_Cmplt = MOBLE_FALSE;
}
#ifdef ENABLE_MODEL_BINDING
+ /* publish the status of the node to the publish address */
Model_BindingPublishStatus();
#endif
}
+}
/**
-* @brief LightLightnessStateUpdate_Process:Function to update the parametes of light
+* @brief Light_LightnessStateUpdate_Process:Function to update the parametes of light
* lightness model in application file from Temporary parameter in model file.
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
+* return MOBLE_RESULT.
+*/
+MOBLE_RESULT Light_LightnessStateUpdate_Process(MOBLEUINT8 elementIndex)
+{
+ Light_LightnessStatus[elementIndex].LightnessPresentValue16 = Light_TemporaryStatus[elementIndex].PresentParam_1;
+ Light_LightnessStatus[elementIndex].TargetValue16 = Light_TemporaryStatus[elementIndex].TargetParam_1;
+ Light_LightnessStatus[elementIndex].RemainingTime = Light_TemporaryStatus[elementIndex].RemainingTime ;
+
+ if((Light_LightnessStatus[elementIndex].LightnessPresentValue16 == Light_LightnessStatus[elementIndex].TargetValue16) &&
+ (Light_LightnessStatus[elementIndex].LightnessPresentValue16 > 0))
+ {
+ Light_LightnessStatus[elementIndex].LightnessLastStatus = Light_LightnessStatus[elementIndex].LightnessPresentValue16;
+
+ (LightAppli_cb.Lightness_Last_Set_cb)(&Light_LightnessStatus[elementIndex],elementIndex);
+ }
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief Light_ModelRangeInit: Function called to initialise the minimum and maximum range of model state.
* @param void
+* return void.
+*/
+void Light_ModelRangeInit(void)
+{
+
+ for(uint8_t elementIndex = 0; elementIndex < APPLICATION_NUMBER_OF_ELEMENTS; elementIndex++)
+ {
+ Light_LightnessRangeParam[elementIndex].StatusCode = 0x00;
+ Light_LightnessRangeParam[elementIndex].MinRangeStatus = MIN_VALID_RANGE;
+ Light_LightnessRangeParam[elementIndex].MaxRangeStatus = MAX_VALID_RANGE;
+
+ CtlTemperatureRangeParam[elementIndex].StatusCode = 0x00;
+ CtlTemperatureRangeParam[elementIndex].MinRangeStatus = MIN_CTL_TEMP_RANGE;
+ CtlTemperatureRangeParam[elementIndex].MaxRangeStatus = MAX_CTL_TEMP_RANGE;
+
+ Light_HslRangeParam[elementIndex].Status_Code = 0x00;
+ Light_HslRangeParam[elementIndex].HslHueMinRange16 = MIN_HUE_RANGE;
+ Light_HslRangeParam[elementIndex].HslHueMaxRange16 = MAX_HUE_RANGE;
+ Light_HslRangeParam[elementIndex].HslMinSaturation16 = MIN_SATURATION_RANGE;
+ Light_HslRangeParam[elementIndex].HslMaxSaturation16 = MAX_SATURATION_RANGE;
+
+ }
+}
+
+
+/**
+* @brief Light_LightnessActualUpdate updates lightness actual state
+* It can be called from LC power up sequence
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return MOBLE_RESULT.
*/
-MOBLE_RESULT LightLightnessStateUpdate_Process(void)
+MOBLE_RESULT Light_LightnessActualUpdate(MOBLEUINT16 lightActual, MOBLEUINT8 elementIndex)
{
- Light_LightnessStatus.LightnessPresentValue16 = Light_TemporaryStatus.PresentParam_1;
- Light_LightnessStatus.TargetValue16 = Light_TemporaryStatus.TargetParam_1;
- Light_LightnessStatus.RemainingTime = Light_TemporaryStatus.RemainingTime ;
+#ifdef ENABLE_MODEL_BINDING
+ /* Binding of actual light lightness with other models */
+#endif
return MOBLE_RESULT_SUCCESS;
}
+/**
+ * @brief Update Light Lightness Linear
+ * Can be used to update binded light lightness linear state
+ * @param
+ * @retval
+ */
+void Light_LightnessLinearUpdate(MOBLEUINT8 elementIndex, MOBLEUINT16 linear)
+{
+ Light_LightnessStatus[elementIndex].LinearPresentValue16 = linear;
+ Light_LightnessStatus[elementIndex].LightnessPresentValue16 = (MOBLEUINT16)(sqrt((double)linear * (double)65535));
+
+ /* Status publish pending */
+
+ if(LightAppli_cb.Lightness_Set_cb != NULL)
+ {
+ /* Application Callback */
+ (LightAppli_cb.Lightness_Set_cb)(&Light_LightnessStatus[elementIndex], 0, 0, elementIndex);
+ }
+}
+
+
+#if 0
/**
* @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
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return MOBLE_RESULT.
*/
-MOBLE_RESULT Light_LC_LightnessStateUpdate_Process(Light_LC_TemporaryStatus_t *lc_Temp_Value)
+MOBLE_RESULT Light_LC_LightnessStateUpdate_Process(Light_LC_TemporaryStatus_t *lc_Temp_Value, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- Light_LightnessStatus.LightnessPresentValue16 = lc_Temp_Value->PresentParam_1;
- Light_LightnessStatus.TargetValue16 = lc_Temp_Value->TargetParam_1;
- Light_LightnessStatus.RemainingTime = lc_Temp_Value->RemainingTime;
+ Light_LightnessStatus[elementIndex].LightnessPresentValue16 = lc_Temp_Value->PresentParam_1;
+ Light_LightnessStatus[elementIndex].TargetValue16 = lc_Temp_Value->TargetParam_1;
+ Light_LightnessStatus[elementIndex].RemainingTime = lc_Temp_Value->RemainingTime;
- (LightAppli_cb.Lightness_Set_cb)(&Light_LightnessStatus,0);
+ (LightAppli_cb.Lightness_Set_cb)(&Light_LightnessStatus[elementIndex], 0, dstPeer, elementIndex);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+#endif
+
+/**
+* @brief LightLightness_ActualUpdate updates lightness actual state
+* It can be called from LC power up sequence
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
+* return MOBLE_RESULT.
+*/
+MOBLE_RESULT LightLightness_ActualUpdate(MOBLEUINT16 lightActual, MOBLEUINT8 elementIndex)
+{
+#ifdef ENABLE_MODEL_BINDING
+ /* Binding of actual light lightness with other models */
+#endif
return MOBLE_RESULT_SUCCESS;
}
+
+
/**
-* @brief LightLinearStateUpdate_Process:function to update the parametes of light
+* @brief Light_LinearStateUpdate_Process:function to update the parametes of light
* lightness linear model in application file from Temporary parameter in model file.
-* @param void
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return MOBLE_RESULT.
*/
-MOBLE_RESULT LightLinearStateUpdate_Process(void)
+MOBLE_RESULT Light_LinearStateUpdate_Process(MOBLEUINT8 elementIndex)
{
- Light_LightnessStatus.LinearPresentValue16 = Light_TemporaryStatus.PresentParam_1;
- Light_LightnessStatus.TargetValue16 = Light_TemporaryStatus.TargetParam_1;
- Light_LightnessStatus.RemainingTime = Light_TemporaryStatus.RemainingTime ;
+ Light_LightnessStatus[elementIndex].LinearPresentValue16 = Light_TemporaryStatus[elementIndex].PresentParam_1;
+ Light_LightnessStatus[elementIndex].TargetValue16 = Light_TemporaryStatus[elementIndex].TargetParam_1;
+ Light_LightnessStatus[elementIndex].RemainingTime = Light_TemporaryStatus[elementIndex].RemainingTime ;
return MOBLE_RESULT_SUCCESS;
}
/**
-* @brief LightCtlStateUpdate_Process:Function to update the parametes of light
+* @brief Light_CtlStateUpdate_Process:Function to update the parametes of light
* CTL model in application file from Temporary parameter in model file.
-* @param void
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return MOBLE_RESULT.
*/
-MOBLE_RESULT LightCtlStateUpdate_Process(void)
+MOBLE_RESULT Light_CtlStateUpdate_Process(MOBLEUINT8 elementIndex)
{
- Light_CtlStatus.PresentCtlLightness16 =Light_TemporaryStatus.PresentParam_1;
- Light_CtlStatus.PresentCtlTemperature16 = Light_TemporaryStatus.PresentParam_2;
- Light_CtlStatus.PresentCtlDelta16 = Light_TemporaryStatus.PresentParam_3;
- Light_CtlStatus.RemainingTime = Light_TemporaryStatus.RemainingTime;
+ Light_CtlStatus[elementIndex].PresentCtlLightness16 =Light_TemporaryStatus[elementIndex].PresentParam_1;
+ Light_CtlStatus[elementIndex].PresentCtlTemperature16 = Light_TemporaryStatus[elementIndex].PresentParam_2;
+ Light_CtlStatus[elementIndex].PresentCtlDelta16 = Light_TemporaryStatus[elementIndex].PresentParam_3;
+ Light_CtlStatus[elementIndex].RemainingTime = Light_TemporaryStatus[elementIndex].RemainingTime;
return MOBLE_RESULT_SUCCESS;
}
/**
-* @brief LightCtlTemperatureStateUpdate_Process:Function to update the parametes of
+* @brief Light_CtlTemperatureStateUpdate_Process:Function to update the parametes of
* light CTL Temperature model in application file from Temporary parameter in model file.
-* @param void
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return MOBLE_RESULT.
*/
-MOBLE_RESULT LightCtlTemperatureStateUpdate_Process(void)
+MOBLE_RESULT Light_CtlTemperatureStateUpdate_Process(MOBLEUINT8 elementIndex)
{
- Light_CtlStatus.PresentCtlTemperature16 = Light_TemporaryStatus.PresentParam_1;
- Light_CtlStatus.PresentCtlDelta16 = Light_TemporaryStatus.PresentParam_2;
- Light_CtlStatus.RemainingTime = Light_TemporaryStatus.RemainingTime;
+ Light_CtlStatus[elementIndex].PresentCtlTemperature16 = Light_TemporaryStatus[elementIndex].PresentParam_1;
+ Light_CtlStatus[elementIndex].PresentCtlDelta16 = Light_TemporaryStatus[elementIndex].PresentParam_2;
+ Light_CtlStatus[elementIndex].RemainingTime = Light_TemporaryStatus[elementIndex].RemainingTime;
return MOBLE_RESULT_SUCCESS;
}
/**
-* @brief LightHslStateUpdate_Process:Function to update the parametes of
+* @brief Light_HslStateUpdate_Process:Function to update the parametes of
* light HSL model in application file from Temporary parameter in model file.
-* @param void
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return MOBLE_RESULT.
*/
-MOBLE_RESULT LightHslStateUpdate_Process(void)
+MOBLE_RESULT Light_HslStateUpdate_Process(MOBLEUINT8 elementIndex)
{
- Light_HslStatus.PresentHslLightness16= Light_TemporaryStatus.PresentParam_1;
- Light_HslStatus.PresentHslHueLightness16 = Light_TemporaryStatus.PresentParam_2;
- Light_HslStatus.PresentHslSaturation16 = Light_TemporaryStatus.PresentParam_3;
- Light_HslStatus.RemainingTime = Light_TemporaryStatus.RemainingTime;
+ Light_HslStatus[elementIndex].PresentHslLightness16= Light_TemporaryStatus[elementIndex].PresentParam_1;
+ Light_HslStatus[elementIndex].PresentHslHueLightness16 = Light_TemporaryStatus[elementIndex].PresentParam_2;
+ Light_HslStatus[elementIndex].PresentHslSaturation16 = Light_TemporaryStatus[elementIndex].PresentParam_3;
+ Light_HslStatus[elementIndex].RemainingTime = Light_TemporaryStatus[elementIndex].RemainingTime;
return MOBLE_RESULT_SUCCESS;
}
/**
-* @brief LightHslHueStateUpdate_Process:Function to update the parametes of
+* @brief Light_HslHueStateUpdate_Process:Function to update the parametes of
* light HSL Hue model in application file from Temporary parameter in model file.
-* @param void
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return MOBLE_RESULT.
*/
-MOBLE_RESULT LightHslHueStateUpdate_Process(void)
+MOBLE_RESULT Light_HslHueStateUpdate_Process(MOBLEUINT8 elementIndex)
{
- Light_HslStatus.PresentHslHueLightness16= Light_TemporaryStatus.PresentParam_1;
- Light_HslStatus.RemainingTime = Light_TemporaryStatus.RemainingTime;
+ Light_HslStatus[elementIndex].PresentHslHueLightness16= Light_TemporaryStatus[elementIndex].PresentParam_1;
+ Light_HslStatus[elementIndex].RemainingTime = Light_TemporaryStatus[elementIndex].RemainingTime;
return MOBLE_RESULT_SUCCESS;
}
/**
-* @brief LightHslSaturationStateUpdate_Process:Function to update the parametes of
+* @brief Light_HslSaturationStateUpdate_Process:Function to update the parametes of
* light HSL Saturation model in application file from Temporary parameter in model file.
-* @param void
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return MOBLE_RESULT.
*/
-MOBLE_RESULT LightHslSaturationStateUpdate_Process(void)
+MOBLE_RESULT Light_HslSaturationStateUpdate_Process(MOBLEUINT8 elementIndex)
{
- Light_HslStatus.PresentHslSaturation16 = Light_TemporaryStatus.PresentParam_1;
- Light_HslStatus.RemainingTime = Light_TemporaryStatus.RemainingTime;
+ Light_HslStatus[elementIndex].PresentHslSaturation16 = Light_TemporaryStatus[elementIndex].PresentParam_1;
+ Light_HslStatus[elementIndex].RemainingTime = Light_TemporaryStatus[elementIndex].RemainingTime;
return MOBLE_RESULT_SUCCESS;
}
@@ -2958,38 +3412,36 @@ MOBLE_RESULT LightHslSaturationStateUpdate_Process(void)
* @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
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return void
*/
-void Light_Ctl_LightActual_Binding(MOBLEUINT8 bindingFlag)
+void Light_Ctl_LightActual_Binding(MOBLEUINT8 bindingFlag, MOBLEUINT8 elementIndex)
{
if(bindingFlag == BINDING_LIGHT_CTL_SET)
{
- Light_LightnessStatus.LightnessPresentValue16 = Light_CtlParam.CTL_Lightness;
- Light_Publish_Add(LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID,
- LIGHT_LIGHTNESS_SET_UNACK);
-// 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_LightnessStatus[elementIndex].LightnessPresentValue16 = Light_CtlParam.CTL_Lightness;
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= LIGHT_LIGHTNESS_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = LIGHT_LIGHTNESS_SERVER_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
- TRACE_M(TF_LIGHT_M, "Light_Ctl_LightActual_Binding Function - Present Light lightness value 0x%.2x \r\n"
- , Light_LightnessStatus.LightnessPresentValue16);
+ TRACE_M(TF_LIGHT_M,
+ "Light CTL binding with Light Actual 0x%.2x \r\n",
+ Light_LightnessStatus[elementIndex].LightnessPresentValue16);
+ /* Ligtness Linear updated on its own
+ Supported only for Light Lightness on element index 0 */
+ BindingDisable_LcLinearOut_LightLightnessLinear(0);
}
+
if(bindingFlag == BINDING_LIGHT_LIGHTNESS_ACTUAL_SET)
{
- Light_CtlStatus.PresentCtlLightness16 = Light_LightnessParam.TargetLightnessStatus;
- Light_Publish_Add(LIGHT_MODEL_SERVER_CTL_MODEL_ID,
- LIGHT_CTL_SET_UNACK);
-// 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++;
+ Light_CtlStatus[elementIndex].PresentCtlLightness16 = Light_LightnessParam.TargetLightnessStatus;
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= LIGHT_CTL_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = LIGHT_CTL_SERVER_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
- TRACE_M(TF_LIGHT_M, "Light Lightness set Function - Present CTL lightness value 0x%.2x \r\n"
- , Light_CtlStatus.PresentCtlLightness16);
+ TRACE_M(TF_LIGHT_M, "Light Actual binding with Light CTL 0x%.2x \r\n", Light_CtlStatus[elementIndex].PresentCtlLightness16);
}
-
- //Light_Lightness_Binding(bindingFlag , 0);/*Commented by SJ as it was creating the infinity loop*/
-
-
}
/**
@@ -2997,30 +3449,32 @@ void Light_Ctl_LightActual_Binding(MOBLEUINT8 bindingFlag)
lightness and Linear Lightness is implicit binding with generic on off state.
* @param bindingFlag: flag value passed in function
* @param length:length of data
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return void
*/
-void Light_Lightness_Linear_Binding(MOBLEUINT8 bindingFlag ,MOBLEUINT32 length)
+void Light_Lightness_Linear_Binding(MOBLEUINT8 bindingFlag ,MOBLEUINT32 length, MOBLEUINT8 elementIndex)
{
if(bindingFlag == BINDING_LIGHT_LIGHTNESS_LINEAR_SET)
{
- Light_Linear_ActualBinding(length);
- Light_Publish_Add(LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID,
- LIGHT_LIGHTNESS_SET);
-// 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_Linear_ActualBinding(length, elementIndex);
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= LIGHT_LIGHTNESS_SET;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = LIGHT_LIGHTNESS_SERVER_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
}
- Light_Lightness_Binding(bindingFlag , 0);
+ Light_Lightness_Binding(bindingFlag , 0,elementIndex);
}
/**
* @brief Light_Lightness_Binding:Function for binding the data of actual
-lightness and Linear Lightness is implicit binding with generic on off state.
+* lightness and Linear Lightness is implicit binding with generic on off state.
* @param bindingFlag: flag value passed in function
* @param length:length of data
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return void
*/
-void Light_Lightness_Binding(MOBLEUINT8 bindingFlag ,MOBLEUINT32 length)
+void Light_Lightness_Binding(MOBLEUINT8 bindingFlag , MOBLEUINT32 length, MOBLEUINT8 elementIndex)
{
/*
6.1.2.1.1 - actual lightness = 655354 * squareroot(linear lightness/ 655354).
@@ -3028,12 +3482,11 @@ void Light_Lightness_Binding(MOBLEUINT8 bindingFlag ,MOBLEUINT32 length)
if(bindingFlag != BINDING_LIGHT_LIGHTNESS_LINEAR_SET)
{
- Light_Actual_LinearBinding();
- Light_Publish_Add(LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID,
- LIGHT_LIGHTNESS_SET);
-// 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_Actual_LinearBinding(elementIndex);
+ TRACE_M(TF_LIGHT_M, "Light Lightness binding with Light Linear \r\n");
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= LIGHT_LIGHTNESS_LINEAR_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = LIGHT_LIGHTNESS_SERVER_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
}
/* Implicit binding of linear lightness with generic on off.
linear lightnes set -> actual lightness set -> generic on off set.
@@ -3044,12 +3497,10 @@ void Light_Lightness_Binding(MOBLEUINT8 bindingFlag ,MOBLEUINT32 length)
/* Binding of data b/w light lightness actual and Generic on off */
if(bindingFlag != BINDING_GENERIC_ON_OFF_SET)
{
- LightActual_GenericOnOffBinding(&Light_LightnessStatus);
- Light_Publish_Add(GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
- GENERIC_ON_OFF_SET_UNACK);
-// 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++;
+ LightActual_GenericOnOffBinding(&Light_LightnessStatus[elementIndex],elementIndex);
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= GENERIC_ON_OFF_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = GENERIC_ONOFF_SERVER_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
}
#endif
@@ -3062,12 +3513,10 @@ void Light_Lightness_Binding(MOBLEUINT8 bindingFlag ,MOBLEUINT32 length)
/* Binding of data b/w light lightness actual and Generic Level */
if(bindingFlag != BINDING_GENERIC_LEVEL_SET)
{
- LightActual_GenericLevelBinding(&Light_LightnessStatus);
- Light_Publish_Add(GENERIC_MODEL_SERVER_LEVEL_MODEL_ID,
- GENERIC_LEVEL_SET_UNACK);
-// 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++;
+ LightActual_GenericLevelBinding(&Light_LightnessStatus[elementIndex],elementIndex);
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= GENERIC_LEVEL_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = GENERIC_LEVEL_SERVER_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
}
#endif
@@ -3075,12 +3524,10 @@ void Light_Lightness_Binding(MOBLEUINT8 bindingFlag ,MOBLEUINT32 length)
/* Binding of Light Ctl with Actual Light Lightness */
if(bindingFlag != BINDING_LIGHT_CTL_SET)
{
- Light_Ctl_LightActual_Binding(BINDING_LIGHT_LIGHTNESS_ACTUAL_SET);
- Light_Publish_Add(LIGHT_MODEL_SERVER_CTL_MODEL_ID,
- LIGHT_CTL_SET_UNACK);
-// 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++;
+ Light_Ctl_LightActual_Binding(BINDING_LIGHT_LIGHTNESS_ACTUAL_SET,elementIndex);
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= LIGHT_CTL_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = LIGHT_CTL_SERVER_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
}
#endif
@@ -3088,19 +3535,16 @@ void Light_Lightness_Binding(MOBLEUINT8 bindingFlag ,MOBLEUINT32 length)
/* Binding of data b/W Actual Lightness and Hsl Lightness.*/
if(bindingFlag != BINDING_LIGHT_HSL_SET)
{
- Light_ActualLightness_HslLightnessBinding(&Light_LightnessStatus);
- Light_Publish_Add(LIGHT_MODEL_SERVER_HSL_MODEL_ID,
- LIGHT_HSL_SET_UNACK);
-// 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++;
+ Light_ActualLightness_HslLightnessBinding(&Light_LightnessStatus[elementIndex], elementIndex);
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= LIGHT_HSL_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = LIGHT_HSL_SERVER_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
}
#endif
- TRACE_M(TF_LIGHT_M,"Light_Lightness_Binding - Actual Lightness value 0x%.2x , Linear Lightness value 0x%.2x \r\n " ,
- Light_LightnessStatus.LightnessPresentValue16,
- Light_LightnessStatus.LinearPresentValue16 );
-
+ /* Ligtness Linear updated on its own
+ Supported only for Light Lightness on element index 0 */
+ BindingDisable_LcLinearOut_LightLightnessLinear(0);
}
/**
@@ -3108,9 +3552,11 @@ void Light_Lightness_Binding(MOBLEUINT8 bindingFlag ,MOBLEUINT32 length)
* 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.
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return void.
*/
-void GenericOnOff_LightActualBinding(Generic_OnOffStatus_t* onOff_param)
+void GenericOnOff_LightActualBinding(Generic_OnOffStatus_t* onOff_param, MOBLEUINT8 elementIndex)
{
/*
6.1.2.2.3 - Binding of actual light lightness with Generic on off.
@@ -3120,35 +3566,33 @@ void GenericOnOff_LightActualBinding(Generic_OnOffStatus_t* onOff_param)
/* condition is depends on the generic on off state */
if(onOff_param->Present_OnOff_State == 0x00)
{
- Light_LightnessStatus.LightnessPresentValue16 = 0x00;
+ Light_LightnessStatus[elementIndex].LightnessPresentValue16 = 0x00;
}
else if((onOff_param->Present_OnOff_State == 0x01) &&
- (Light_LightnessDefaultParam.LightnessDefaultStatus == 0x00))
+ (Light_LightnessDefaultParam[elementIndex].LightnessDefaultStatus == 0x00))
{
- Light_LightnessStatus.LightnessPresentValue16 = Light_LightnessStatus.LightnessLastStatus;
+ Light_LightnessStatus[elementIndex].LightnessPresentValue16 = Light_LightnessStatus[elementIndex].LightnessLastStatus;
}
else if((onOff_param->Present_OnOff_State == 0x01) &&
- (Light_LightnessDefaultParam.LightnessDefaultStatus != 0x000))
+ (Light_LightnessDefaultParam[elementIndex].LightnessDefaultStatus != 0x000))
{
- Light_LightnessStatus.LightnessPresentValue16 = Light_LightnessDefaultParam.LightnessDefaultStatus;
+ Light_LightnessStatus[elementIndex].LightnessPresentValue16 = Light_LightnessDefaultParam[elementIndex].LightnessDefaultStatus;
}
else
{
/* no condition to Execute */
}
- Light_Publish_Add(LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID,
- LIGHT_LIGHTNESS_SET_UNACK);
-// 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_M, "Generic On Off binding with Ligth Actual \r\n");
+
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= LIGHT_LIGHTNESS_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = LIGHT_LIGHTNESS_SERVER_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
/*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.
*/
- Light_Lightness_Binding(BINDING_GENERIC_ON_OFF_SET,0);
-
-
+ Light_Lightness_Binding(BINDING_GENERIC_ON_OFF_SET, 0, elementIndex);
}
/*
@@ -3156,9 +3600,12 @@ void GenericOnOff_LightActualBinding(Generic_OnOffStatus_t* onOff_param)
* 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 flag: flag for the binding
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return void.
*/
-void GenericLevel_LightBinding(Generic_LevelStatus_t* gLevel_param , MOBLEUINT8 flag)
+void GenericLevel_LightBinding(Generic_LevelStatus_t* gLevel_param , MOBLEUINT8 flag, MOBLEUINT8 elementIndex)
{
/*
6.1.2.2.2 - Binding of actual light lightness with generic level
@@ -3167,60 +3614,50 @@ void GenericLevel_LightBinding(Generic_LevelStatus_t* gLevel_param , MOBLEUINT8
*/
#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
Light_PublishOpcodeList.BindedStateCount = 0;
- Light_LightnessStatus.LightnessPresentValue16 = gLevel_param->Present_Level16 + 32768;
+ Light_LightnessStatus[elementIndex].LightnessPresentValue16 = gLevel_param->Present_Level16 + 32768;
- Light_Publish_Add(LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID,
- LIGHT_LIGHTNESS_SET_UNACK);
-// 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_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= LIGHT_LIGHTNESS_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = LIGHT_LIGHTNESS_SERVER_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();
+ Light_Actual_LinearBinding(elementIndex);
- Light_Publish_Add(LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID,
- LIGHT_LIGHTNESS_LINEAR_SET_UNACK);
-// 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++;
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= LIGHT_LIGHTNESS_LINEAR_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = LIGHT_LIGHTNESS_SERVER_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE
if(flag != BINDING_LIGHT_CTL_TEMP_SET)
{
- GenericLevel_CtlTempBinding(gLevel_param);
- Light_Publish_Add(LIGHT_MODEL_SERVER_CTL_TEMPERATURE_MODEL_ID,
- LIGHT_CTL_TEMPERATURE_SET_UNACK);
-// 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++;
+ GenericLevel_CtlTempBinding(gLevel_param,elementIndex);
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= LIGHT_CTL_TEMPERATURE_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = LIGHT_CTL_TEMPERATURE_SERVER_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
}
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_HUE
- if(flag != BINDIG_LIGHT_HSL_HUE_SET)
+ if(flag != BINDING_LIGHT_HSL_HUE_SET)
{
- GenericLevel_HslHueBinding(gLevel_param);
- Light_Publish_Add(LIGHT_MODEL_SERVER_HSL_HUE_MODEL_ID,
- LIGHT_HSL_HUE_SET_UNACK);
-// 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++;
+ GenericLevel_HslHueBinding(gLevel_param,elementIndex);
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= LIGHT_HSL_HUE_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = LIGHT_HSL_HUE_SERVER_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
}
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION
- if(flag != BINDIG_LIGHT_HSL_SATURATION_SET)
+ if(flag != BINDING_LIGHT_HSL_SATURATION_SET)
{
- GenericLevel_HslSaturationBinding(gLevel_param);
- Light_Publish_Add(LIGHT_MODEL_SERVER_HSL_SATURATION_MODEL_ID,
- LIGHT_HSL_SATURATION_SET_UNACK);
-// 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++;
+ GenericLevel_HslSaturationBinding(gLevel_param,elementIndex);
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= LIGHT_HSL_SATURATION_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = LIGHT_HSL_SATURATION_SERVER_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
}
#endif
@@ -3230,18 +3667,18 @@ void GenericLevel_LightBinding(Generic_LevelStatus_t* gLevel_param , MOBLEUINT8
* @brief Light_Actual_LinearBinding:Light_Actual_LinearBinding:Function used for
* binding the data of actual lightness and lineaer lightness.this function
* changes the value of linear lightness as actual lightness value is set.
-* @param void
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return MOBLEUINT16
*/
-MOBLEUINT16 Light_Actual_LinearBinding(void)
+MOBLEUINT16 Light_Actual_LinearBinding(MOBLEUINT8 elementIndex)
{
-
float productValue;
- productValue = pow((((float)Light_LightnessStatus.LightnessPresentValue16)/65535) , 2);
- Light_LightnessStatus.LinearPresentValue16 = (MOBLEUINT16)(65535 * productValue);
+ productValue = pow((((float)Light_LightnessStatus[elementIndex].LightnessPresentValue16)/65535) , 2);
+ Light_LightnessStatus[elementIndex].LinearPresentValue16 = (MOBLEUINT16)(65535 * productValue);
- return Light_LightnessStatus.LinearPresentValue16;
+ return Light_LightnessStatus[elementIndex].LinearPresentValue16;
}
@@ -3250,28 +3687,31 @@ 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
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return MOBLEUINT16
*/
-MOBLEUINT16 Light_Linear_ActualBinding(MOBLEUINT32 length)
+MOBLEUINT16 Light_Linear_ActualBinding(MOBLEUINT32 length, MOBLEUINT8 elementIndex)
{
/*
6.1.2.1.1 - actual lightness = 655354 * squareroot(linear lightness/ 655354).
*/
float productValue;
+
if(length <= 3)
{
- productValue = sqrt((((float)Light_LightnessStatus.LinearPresentValue16) / 65535));
- Light_LightnessStatus.LightnessPresentValue16 = (MOBLEUINT16)(65535 * productValue);
- return Light_LightnessStatus.LightnessPresentValue16;
+ productValue = sqrt((((float)Light_LightnessStatus[elementIndex].LinearPresentValue16) / 65535));
+ Light_LightnessStatus[elementIndex].LightnessPresentValue16 = (MOBLEUINT16)(65535 * productValue);
-}
+ return Light_LightnessStatus[elementIndex].LightnessPresentValue16;
+ }
else
{
- productValue = sqrt((((float)Light_LightnessStatus.TargetValue16) / 65535));
- Light_LightnessStatus.TargetValue16 = (MOBLEUINT16)(65535 * productValue);
- Light_TemporaryStatus.TargetParam_1 = Light_LightnessStatus.TargetValue16;
- return Light_LightnessStatus.TargetValue16;
+ productValue = sqrt((((float)Light_LightnessStatus[elementIndex].TargetValue16) / 65535));
+ Light_LightnessStatus[elementIndex].TargetValue16 = (MOBLEUINT16)(65535 * productValue);
+ Light_TemporaryStatus[elementIndex].TargetParam_1 = Light_LightnessStatus[elementIndex].TargetValue16;
+
+ return Light_LightnessStatus[elementIndex].TargetValue16;
}
}
@@ -3281,9 +3721,11 @@ MOBLEUINT16 Light_Linear_ActualBinding(MOBLEUINT32 length)
* lightness and lightness range this function set the value of Actual
* lightness according to the min range and max range value.
* @param lightActual: Pointer which needs to be set.
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return void
*/
-void Light_Actual_RangeBinding(Light_LightnessParam_t* lightActual)
+void Light_Actual_RangeBinding(Light_LightnessParam_t* lightActual, MOBLEUINT8 elementIndex)
{
/*
6.1.2.2.5 - actual lightness = range minimum if actual lighteness is less than range min
@@ -3291,15 +3733,15 @@ void Light_Actual_RangeBinding(Light_LightnessParam_t* lightActual)
actual lightness = range maximum if actual lighteness is greater than range max
value.
*/
- if((lightActual->TargetLightnessStatus < Light_LightnessRangeParam.MinRangeStatus)
+ if((lightActual->TargetLightnessStatus < Light_LightnessRangeParam[elementIndex].MinRangeStatus)
&& (lightActual->TargetLightnessStatus != 0))
{
- lightActual->TargetLightnessStatus = Light_LightnessRangeParam.MinRangeStatus;
+ lightActual->TargetLightnessStatus = Light_LightnessRangeParam[elementIndex].MinRangeStatus;
}
- else if((lightActual->TargetLightnessStatus > Light_LightnessRangeParam.MaxRangeStatus)
+ else if((lightActual->TargetLightnessStatus > Light_LightnessRangeParam[elementIndex].MaxRangeStatus)
&& (lightActual->TargetLightnessStatus != 0))
{
- lightActual->TargetLightnessStatus = Light_LightnessRangeParam.MaxRangeStatus;
+ lightActual->TargetLightnessStatus = Light_LightnessRangeParam[elementIndex].MaxRangeStatus;
}
else
{
@@ -3310,19 +3752,18 @@ 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
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return void
*/
-void Light_CtlTemperature_Binding(void)
+void Light_CtlTemperature_Binding(MOBLEUINT8 elementIndex)
{
#ifdef ENABLE_GENERIC_MODEL_SERVER_LEVEL
- Light_CtlTemp_GenericLevelBinding(&Light_CtlStatus);
+ Light_CtlTemp_GenericLevelBinding(&Light_CtlStatus[elementIndex], elementIndex);
- Light_Publish_Add(GENERIC_MODEL_SERVER_LEVEL_MODEL_ID,
- GENERIC_LEVEL_SET_UNACK);
-// 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++;
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= GENERIC_LEVEL_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = GENERIC_LEVEL_SERVER_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
#endif
}
@@ -3332,9 +3773,11 @@ void Light_CtlTemperature_Binding(void)
* Ctl temperature and Ctl temperature range this function changes the value of
* Ctl temperature according to the min range and max range value.
* @param ctlTempemerature: Pointer which needs to be set.
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return void
*/
-void Light_CtlTemperature_TempRangeBinding(Light_CtlParam_t* ctlTemperature)
+void Light_CtlTemperature_TempRangeBinding(Light_CtlParam_t* ctlTemperature, MOBLEUINT8 elementIndex)
{
/*
6.1.2.2.5 - actual lightness = range minimum if actual lighteness is less than range min
@@ -3343,13 +3786,13 @@ void Light_CtlTemperature_TempRangeBinding(Light_CtlParam_t* ctlTemperature)
value.
*/
- if(ctlTemperature->CTL_Temperature < CtlTemperatureRangeParam.MinRangeStatus)
+ if(ctlTemperature->CTL_Temperature < CtlTemperatureRangeParam[elementIndex].MinRangeStatus)
{
- ctlTemperature->CTL_Temperature = CtlTemperatureRangeParam.MinRangeStatus;
+ ctlTemperature->CTL_Temperature = CtlTemperatureRangeParam[elementIndex].MinRangeStatus;
}
- else if(ctlTemperature->CTL_Temperature > CtlTemperatureRangeParam.MaxRangeStatus)
+ else if(ctlTemperature->CTL_Temperature > CtlTemperatureRangeParam[elementIndex].MaxRangeStatus)
{
- ctlTemperature->CTL_Temperature = CtlTemperatureRangeParam.MaxRangeStatus;
+ ctlTemperature->CTL_Temperature = CtlTemperatureRangeParam[elementIndex].MaxRangeStatus;
}
else
{
@@ -3361,9 +3804,11 @@ void Light_CtlTemperature_TempRangeBinding(Light_CtlParam_t* ctlTemperature)
* @brief GenericLevel_CtlTempBinding: Data binding b/w Generic level and Ctl
* Temperature set.
* @param bLevelParam: pointer to the structure, which should be set.
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return void.
*/
-void GenericLevel_CtlTempBinding(Generic_LevelStatus_t * bLevelParam)
+void GenericLevel_CtlTempBinding(Generic_LevelStatus_t * bLevelParam, MOBLEUINT8 elementIndex)
{
/* 6.1.3.1.1 Binding with the Generic Level state.
Light CTL Temperature = T_MIN + (Generic Level + 32768) * (T_MAX - T_MIN) / 65535
@@ -3373,69 +3818,68 @@ void GenericLevel_CtlTempBinding(Generic_LevelStatus_t * bLevelParam)
MOBLEUINT32 productValue;
productValue = (bLevelParam->Present_Level16 + 32768) * (MAX_CTL_TEMP_RANGE - MIN_CTL_TEMP_RANGE) ;
- Light_CtlStatus.PresentCtlTemperature16 = MIN_CTL_TEMP_RANGE + ((productValue) /65535);
+ Light_CtlStatus[elementIndex].PresentCtlTemperature16 = (MOBLEUINT16)(MIN_CTL_TEMP_RANGE + round(((productValue) / (float)65535)));
+ TRACE_M(TF_LIGHT_M, "PresentGeneric = %ld,\r\n", bLevelParam->Present_Level16);
+ TRACE_M(TF_LIGHT_M, "Present Level value %d\r\n", Light_CtlStatus[elementIndex].PresentCtlTemperature16);
}
/**
* @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
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return void.
*/
-void Light_HslLightness_LightnessActualBinding(void)
+void Light_HslLightness_LightnessActualBinding(MOBLEUINT8 elementIndex)
{
/* 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_Publish_Add(LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID,
- LIGHT_LIGHTNESS_SET_UNACK);
-// 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_LightnessStatus[elementIndex].LightnessPresentValue16= Light_HslStatus[elementIndex].PresentHslLightness16;
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= LIGHT_LIGHTNESS_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = LIGHT_LIGHTNESS_SERVER_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
- Light_Lightness_Binding(BINDING_LIGHT_HSL_SET , 0);
+ Light_Lightness_Binding(BINDING_LIGHT_HSL_SET , 0,elementIndex);
}
/**
* @brief Light_HSL_HUE_Binding: Function used for binding the data of
* hsl hue parameter with other models.
-* @param void.
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return void
*/
-void Light_Hsl_Hue_Binding(void)
+void Light_Hsl_Hue_Binding(MOBLEUINT8 elementIndex)
{
#ifdef ENABLE_GENERIC_MODEL_SERVER_LEVEL
/* Hsl Hue binding with Generic Level */
- Light_HslHue_GenericLevelBinding(&Light_HslStatus);
- Light_Publish_Add(GENERIC_MODEL_SERVER_LEVEL_MODEL_ID,
- GENERIC_LEVEL_SET_UNACK);
-// 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++;
+ Light_HslHue_GenericLevelBinding(&Light_HslStatus[elementIndex], elementIndex);
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= GENERIC_LEVEL_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = GENERIC_LEVEL_SERVER_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
#endif
}
/**
* @brief Light_HSL_Saturation_Binding: Function used for binding the data of
* hsl saturation parameter with other models.
-* @param void.
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return void
*/
-void Light_Hsl_Saturation_Binding(void)
+void Light_Hsl_Saturation_Binding(MOBLEUINT8 elementIndex)
{
#ifdef ENABLE_GENERIC_MODEL_SERVER_LEVEL
/* Hsl Hue binding with Generic Level */
- Light_HslSaturation_GenericLevelBinding(&Light_HslStatus);
- Light_Publish_Add(GENERIC_MODEL_SERVER_LEVEL_MODEL_ID,
- GENERIC_LEVEL_SET_UNACK);
-// 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++;
+ Light_HslSaturation_GenericLevelBinding(&Light_HslStatus[elementIndex], elementIndex);
+ Light_PublishOpcodeList.PublishStateOpcode[Light_PublishOpcodeList.BindedStateCount]= GENERIC_LEVEL_SET_UNACK;
+ Light_PublishOpcodeList.Model_ID[Light_PublishOpcodeList.BindedStateCount] = GENERIC_LEVEL_SERVER_MODEL_ID;
+ Light_PublishOpcodeList.BindedStateCount++;
#endif
}
@@ -3443,28 +3887,33 @@ void Light_Hsl_Saturation_Binding(void)
* @brief GenericLevel_HslSaturationBinding: Data binding b/w Generic level and Hsl
* Hue set.
* @param bLevelParam: pointer to the structure, which should be set.
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return void.
*/
-void GenericLevel_HslSaturationBinding(Generic_LevelStatus_t * bLevelParam)
+void GenericLevel_HslSaturationBinding(Generic_LevelStatus_t * bLevelParam, MOBLEUINT8 elementIndex)
{
/* 6.1.4.1.1 Binding with the Generic Level state
Light HSL Hue = Generic Level + 32768
*/
- Light_HslStatus.PresentHslSaturation16 = bLevelParam->Present_Level16 + 32768;
+ Light_HslStatus[elementIndex].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.
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return void.
*/
-void GenericLevel_HslHueBinding(Generic_LevelStatus_t * bLevelParam)
+void GenericLevel_HslHueBinding(Generic_LevelStatus_t * bLevelParam, MOBLEUINT8 elementIndex)
{
/* 6.1.4.1.1 Binding with the Generic Level state
Light HSL Hue = Generic Level + 32768
*/
- Light_HslStatus.PresentHslHueLightness16 = bLevelParam->Present_Level16 + 32768;
+ Light_HslStatus[elementIndex].PresentHslHueLightness16 = bLevelParam->Present_Level16 + 32768;
}
/**
@@ -3472,9 +3921,11 @@ void GenericLevel_HslHueBinding(Generic_LevelStatus_t * bLevelParam)
* Hsl Hue value and Hsl Hue range. this function changes the value of
* Hsl Hue according to the min range and max range value.
* @param bHslHueParam: Pointer which needs to be set.
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return void
*/
-void Light_HslHue_RangeBinding(Light_HslParam_t* bHslHueParam)
+void Light_HslHue_RangeBinding(Light_HslParam_t* bHslHueParam, MOBLEUINT8 elementIndex)
{
/*
6.1.4.1.3 Binding with the HSL Hue Range state
@@ -3482,13 +3933,13 @@ void Light_HslHue_RangeBinding(Light_HslParam_t* bHslHueParam)
Light HSL Hue = Light HSL Hue Range Max->for (Light HSL Hue > Light HSL Hue Range Min)
*/
- if(bHslHueParam->HslHueLightness16 < Light_HslRangeParam.HslHueMinRange16)
+ if(bHslHueParam->HslHueLightness16< Light_HslRangeParam[elementIndex].HslHueMinRange16)
{
- bHslHueParam->HslHueLightness16 = Light_HslRangeParam.HslHueMinRange16;
+ bHslHueParam->HslHueLightness16 = Light_HslRangeParam[elementIndex].HslHueMinRange16;
}
- else if(bHslHueParam->HslHueLightness16 > Light_HslRangeParam.HslHueMaxRange16)
+ else if(bHslHueParam->HslHueLightness16 > Light_HslRangeParam[elementIndex].HslHueMaxRange16)
{
- bHslHueParam->HslHueLightness16 = Light_HslRangeParam.HslHueMaxRange16;
+ bHslHueParam->HslHueLightness16 = Light_HslRangeParam[elementIndex].HslHueMaxRange16;
}
else
{
@@ -3501,9 +3952,11 @@ void Light_HslHue_RangeBinding(Light_HslParam_t* bHslHueParam)
* Hsl saturation value and Hsl saturation range. this function changes the value of
* Hsl saturation according to the min range and max range value.
* @param bHslSatParam: Pointer which needs to be set.
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return void
*/
-void Light_HslSaturation_RangeBinding(Light_HslParam_t* bHslSatParam)
+void Light_HslSaturation_RangeBinding(Light_HslParam_t* bHslSatParam, MOBLEUINT8 elementIndex)
{
/*
6.1.4.4.3 Binding with the HSL Saturation Range state
@@ -3511,13 +3964,13 @@ void Light_HslSaturation_RangeBinding(Light_HslParam_t* bHslSatParam)
Light HSL Saturation = Light HSL Saturation Range Max->for (Light HSL Saturation > Light HSL Saturation Max)
*/
- if(bHslSatParam->HslSaturation16 < Light_HslRangeParam.HslMinSaturation16)
+ if(bHslSatParam->HslSaturation16 < Light_HslRangeParam[elementIndex].HslMinSaturation16)
{
- bHslSatParam->HslSaturation16 = Light_HslRangeParam.HslMinSaturation16;
+ bHslSatParam->HslSaturation16 = Light_HslRangeParam[elementIndex].HslMinSaturation16;
}
- else if(bHslSatParam->HslSaturation16 > Light_HslRangeParam.HslMaxSaturation16)
+ else if(bHslSatParam->HslSaturation16 > Light_HslRangeParam[elementIndex].HslMaxSaturation16)
{
- bHslSatParam->HslSaturation16 = Light_HslRangeParam.HslMaxSaturation16;
+ bHslSatParam->HslSaturation16 = Light_HslRangeParam[elementIndex].HslMaxSaturation16;
}
else
{
@@ -3529,12 +3982,14 @@ void Light_HslSaturation_RangeBinding(Light_HslParam_t* bHslSatParam)
* @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..
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return void
*/
-void Light_Linear_Ligth_LC_binding(MOBLEUINT16 lc_OutValue)
+void Light_Linear_Ligth_LC_binding(MOBLEUINT16 lc_OutValue, MOBLEUINT8 elementIndex)
{
- Light_LightnessStatus.LinearPresentValue16 = lc_OutValue;
- Light_Lightness_Binding(BINDING_LIGHT_LIGHTNESS_LINEAR_SET , 3);
+ Light_LightnessStatus[elementIndex].LinearPresentValue16 = lc_OutValue;
+ Light_Lightness_Binding(BINDING_LIGHT_LIGHTNESS_LINEAR_SET , 3,elementIndex);
}
/**
@@ -3542,60 +3997,234 @@ void Light_Linear_Ligth_LC_binding(MOBLEUINT16 lc_OutValue)
* Hsl lightness . this function will set the Hsl Lightness value
* at the time of Lightness Actual value set.
* @param bActualLightParam: Pointer to the data which needs to be checked.
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return void.
*/
-void Light_ActualLightness_HslLightnessBinding(Light_LightnessStatus_t* bActualLightParam)
+void Light_ActualLightness_HslLightnessBinding(Light_LightnessStatus_t* bActualLightParam, MOBLEUINT8 elementIndex)
{
/* 6.1.4.7.1 Binding with the Light Lightness Actual state
Light HSL Lightness = Light Lightness Actual
*/
- Light_HslStatus.PresentHslLightness16= bActualLightParam->LightnessPresentValue16;
+ Light_HslStatus[elementIndex].PresentHslLightness16= bActualLightParam->LightnessPresentValue16;
TRACE_M(TF_LIGHT_M, "Light_ActualLightness_HslLightnessBinding Function - Present HSL lightness value 0x%.2x \r\n"
- , Light_HslStatus.PresentHslLightness16);
+ , Light_HslStatus[elementIndex].PresentHslLightness16);
}
+#ifdef ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
/**
* @brief function called in Light lightness when the default transition time is enabled.
* @param pLightnessValue: pointer to the function
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
+* return void.
+*/
+void Light_LightnessDefaultTransitionValue(Light_LightnessParam_t* pLightnessValue, MOBLEUINT8 elementIndex)
+{
+ Light_GetStepValue((MOBLEUINT8)Generic_DefaultTransitionParam.DefaultTransitionTime,elementIndex);
+ TRACE_M(TF_LIGHT_M, "Light_LightnessDefaultTransition StepValue is =%.2x \r\n", Light_TimeParam[elementIndex].StepValue);
+
+ /* Check if the Transition Time is immediate or not */
+ if(Light_TimeParam[elementIndex].StepValue != 0x00){
+
+ Light_TemporaryStatus[elementIndex].TargetParam_1 = pLightnessValue->TargetLightnessStatus;
+ Light_TemporaryStatus[elementIndex].RemainingTime = Generic_DefaultTransitionParam.DefaultTransitionTime;
+ Light_ModelFlag[elementIndex].LightTransitionFlag = LIGHT_LIGHTNESS_TRANSITION_START;
+ Light_ModelFlag[elementIndex].LightOptionalParam = 1;
+ }
+ else{
+ Light_ModelFlag[elementIndex].LightOptionalParam = 0;
+ Light_LightnessStatus[elementIndex].LightnessPresentValue16 =
+ Light_LightnessParam.TargetLightnessStatus;
+ Light_ModelFlag[elementIndex].LightTransitionFlag = LIGHT_TRANSITION_STOP;
+ }
+}
+
+
+/**
+* @brief function called in Light lightness linear when the l transition time is enabled.
+* @param pLightnessValue: pointer to the function
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return void.
*/
-void Light_LightnessDefaultTransitionValue(Light_LightnessParam_t* pLightnessValue)
+void Light_LightnessLinearDefaultTransitionValue(Light_LightnessParam_t* pLightnessValue, MOBLEUINT8 elementIndex)
{
- Light_TemporaryStatus.TargetParam_1 = pLightnessValue->TargetLightnessStatus;
- Light_TemporaryStatus.RemainingTime = Generic_DefaultTransitionParam.DefaultTransitionTime;
- Light_GetStepValue((MOBLEUINT8)Generic_DefaultTransitionParam.DefaultTransitionTime);
- Light_ModelFlag.LightTransitionFlag = LIGHT_LIGHTNESS_TRANSITION_START;
- Light_ModelFlag.LightOptionalParam = 1;
+ Light_GetStepValue((MOBLEUINT8)Generic_DefaultTransitionParam.DefaultTransitionTime,elementIndex);
+ TRACE_M(TF_LIGHT_M, "Light_LightnessLinearDefaultTransition StepValue is =%.2x \r\n", Light_TimeParam[elementIndex].StepValue);
+ /* Check if the Transition Time is immediate or not */
+ if(Light_TimeParam[elementIndex].StepValue != 0x00){
+
+ Light_TemporaryStatus[elementIndex].TargetParam_1 = Light_LightnessParam.TargetLightnessLinearStatus;
+ Light_TemporaryStatus[elementIndex].RemainingTime = Generic_DefaultTransitionParam.DefaultTransitionTime;
+ Light_ModelFlag[elementIndex].LightTransitionFlag = LIGHT_LINEAR_TRANSITION_START;
+ Light_ModelFlag[elementIndex].LightOptionalParam = 1;
+}
+ else{
+ Light_ModelFlag[elementIndex].LightOptionalParam = 0;
+ Light_LightnessStatus[elementIndex].LinearPresentValue16 =
+ Light_LightnessParam.TargetLightnessLinearStatus;
+ Light_ModelFlag[elementIndex].LightTransitionFlag = LIGHT_TRANSITION_STOP;
+ }
}
/**
* @brief function called in Light CTL set when the default transition time is enabled.
* @param pCTLValue: pointer to the function
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return void.
*/
-void Light_CTLDefaultTransitionValue(Light_CtlParam_t* pCTLValue)
+void Light_CTLDefaultTransitionValue(Light_CtlParam_t* pCTLValue,MOBLEUINT8 elementIndex)
{
- Light_TemporaryStatus.TargetParam_1 = pCTLValue->CTL_Lightness;
- Light_TemporaryStatus.TargetParam_2 = pCTLValue->CTL_Temperature;
- Light_GetStepValue((MOBLEUINT8)Generic_DefaultTransitionParam.DefaultTransitionTime);
- Light_ModelFlag.LightTransitionFlag = LIGHT_CTL_TRANSITION_START;
- Light_ModelFlag.LightOptionalParam = 1;
+ Light_GetStepValue((MOBLEUINT8)Generic_DefaultTransitionParam.DefaultTransitionTime,elementIndex);
+ TRACE_M(TF_LIGHT_M, "Light_LightnessDefaultTransition StepValue is =%.2x \r\n", Light_TimeParam[elementIndex].StepValue);
+
+ /* Check if the Transition Time is immediate or not */
+ if(Light_TimeParam[elementIndex].StepValue != 0x00)
+ {
+ Light_TemporaryStatus[elementIndex].TargetParam_1 = pCTLValue->CTL_Lightness;
+ Light_TemporaryStatus[elementIndex].TargetParam_2 = pCTLValue->CTL_Temperature;
+ Light_ModelFlag[elementIndex].LightTransitionFlag = LIGHT_CTL_TRANSITION_START;
+ Light_ModelFlag[elementIndex].LightOptionalParam = 1;
+}
+ else
+ {
+ Light_ModelFlag[elementIndex].LightOptionalParam = 0;
+ Light_CtlStatus[elementIndex].PresentCtlLightness16 = pCTLValue->CTL_Lightness;
+ Light_CtlStatus[elementIndex].PresentCtlTemperature16 = pCTLValue->CTL_Temperature;
+ Light_ModelFlag[elementIndex].LightTransitionFlag = LIGHT_TRANSITION_STOP;
+ }
+ TRACE_M(TF_LIGHT_M, "PresentCtlTemperature16: %d\r\n", Light_CtlStatus[elementIndex].PresentCtlTemperature16);
}
/**
* @brief function called in Light CTL temperature set when the default transition time is enabled.
* @param pCTLValue:pointer to the function
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* return void.
*/
-void Light_CTLTemperatureDefaultTransitionValue(Light_CtlParam_t* pCTLValue)
+void Light_CTLTemperatureDefaultTransitionValue(Light_CtlParam_t* pCTLValue,
+ MOBLEUINT8 elementIndex)
+{
+ Light_GetStepValue((MOBLEUINT8)Generic_DefaultTransitionParam.DefaultTransitionTime,elementIndex);
+ TRACE_M(TF_LIGHT_M, "Light_LightnessDefaultTransition StepValue is =%.2x \r\n", Light_TimeParam[elementIndex].StepValue);
+
+ /* Check if the Transition Time is immediate or not */
+ if(Light_TimeParam[elementIndex].StepValue != 0x00)
+{
+ Light_TemporaryStatus[elementIndex].TargetParam_1 = pCTLValue->CTL_Temperature;
+ Light_TemporaryStatus[elementIndex].TargetParam_2 = pCTLValue->CTL_DeltaUv;
+ Light_ModelFlag[elementIndex].LightTransitionFlag = LIGHT_TEMPERATURE_TRANSITION_START;
+ Light_ModelFlag[elementIndex].LightOptionalParam = 1;
+ }
+ else
+ {
+ Light_ModelFlag[elementIndex].LightOptionalParam = 0;
+ Light_CtlStatus[elementIndex].PresentCtlTemperature16 = pCTLValue->CTL_Temperature;
+ Light_CtlStatus[elementIndex].PresentCtlDelta16 = pCTLValue->CTL_DeltaUv;
+ Light_ModelFlag[elementIndex].LightTransitionFlag = LIGHT_TRANSITION_STOP;
+ }
+ TRACE_M(TF_LIGHT_M, "PresentCtlTemperature16: %d\r\n", Light_CtlStatus[elementIndex].PresentCtlTemperature16);
+}
+
+/**
+* @brief function called in Light HSL set when the default transition time is enabled.
+* @param pCTLValue: pointer to the function
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
+* return void.
+*/
+void Light_HSLDefaultTransitionValue(Light_HslParam_t* pHSLValue,
+ MOBLEUINT8 elementIndex)
+{
+ Light_GetStepValue((MOBLEUINT8)Generic_DefaultTransitionParam.DefaultTransitionTime,elementIndex);
+ TRACE_M(TF_LIGHT_M, "StepValue is =%.2x \r\n", Light_TimeParam[elementIndex].StepValue);
+
+ /* Check if the Transition Time is immediate or not */
+ if(Light_TimeParam[elementIndex].StepValue != 0x00)
+ {
+ Light_TemporaryStatus[elementIndex].TargetParam_1 = pHSLValue->HslLightness16;
+ Light_TemporaryStatus[elementIndex].TargetParam_2 = pHSLValue->HslHueLightness16;
+ Light_ModelFlag[elementIndex].LightTransitionFlag = LIGHT_HSL_TRANSITION_START;
+ Light_ModelFlag[elementIndex].LightOptionalParam = 1;
+ }
+ else
+ {
+ Light_ModelFlag[elementIndex].LightOptionalParam = 0;
+ Light_HslStatus[elementIndex].PresentHslLightness16 = pHSLValue->HslLightness16;
+ Light_HslStatus[elementIndex].PresentHslHueLightness16 = pHSLValue->HslHueLightness16;
+ Light_HslStatus[elementIndex].PresentHslSaturation16 = pHSLValue->HslSaturation16;
+ Light_ModelFlag[elementIndex].LightTransitionFlag = LIGHT_TRANSITION_STOP;
+ }
+ TRACE_M(TF_LIGHT_M, "PresentHSLLightness: %d \r\n", Light_HslStatus[elementIndex].PresentHslLightness16);
+}
+/**
+* @brief function called in Light HSL Hue set when the default transition time is enabled.
+* @param pCTLValue: pointer to the HSL Parameters
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
+* return void.
+*/
+void Light_HSLHueDefaultTransitionValue(Light_HslParam_t* pHSLHueValue,
+ MOBLEUINT8 elementIndex)
+{
+ Light_GetStepValue((MOBLEUINT8)Generic_DefaultTransitionParam.DefaultTransitionTime,elementIndex);
+ TRACE_M(TF_LIGHT_M, "StepValue is =%.2x \r\n", Light_TimeParam[elementIndex].StepValue);
+
+ /* Check if the Transition Time is immediate or not */
+ if(Light_TimeParam[elementIndex].StepValue != 0x00)
+ {
+ Light_TemporaryStatus[elementIndex].TargetParam_1 = pHSLHueValue->HslHueLightness16;
+ Light_TemporaryStatus[elementIndex].RemainingTime = Generic_DefaultTransitionParam.DefaultTransitionTime;
+
+ /* Load status register with updated value for Status response */
+ Light_HslStatus[elementIndex].RemainingTime = Generic_DefaultTransitionParam.DefaultTransitionTime;
+ Light_ModelFlag[elementIndex].LightTransitionFlag = LIGHT_HSL_HUE_TRANSITION_START;
+ Light_ModelFlag[elementIndex].LightOptionalParam = 1;
+}
+ else
+ {
+ Light_ModelFlag[elementIndex].LightOptionalParam = 0;
+ Light_HslStatus[elementIndex].PresentHslHueLightness16 = pHSLHueValue->HslHueLightness16;
+ Light_ModelFlag[elementIndex].LightTransitionFlag = LIGHT_TRANSITION_STOP;
+ }
+ TRACE_M(TF_LIGHT_M, "PresentHSLLightness: %d\r\n", Light_HslStatus[elementIndex].PresentHslLightness16);
+}
+/**
+* @brief function called in Light HSL Saturation set when the default transition time is enabled.
+* @param pHSLSaturationValue: pointer to the HSL Parameters
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
+* return void.
+*/
+void Light_HSLSaturationDefaultTransitionValue(Light_HslParam_t* pHSLSaturationValue,
+ MOBLEUINT8 elementIndex)
{
- Light_TemporaryStatus.TargetParam_1 = pCTLValue->CTL_Temperature;
- Light_TemporaryStatus.TargetParam_2 = pCTLValue->CTL_DeltaUv;
- Light_GetStepValue((MOBLEUINT8)Generic_DefaultTransitionParam.DefaultTransitionTime);
- Light_ModelFlag.LightTransitionFlag = LIGHT_TEMPERATURE_TRANSITION_START;
- Light_ModelFlag.LightOptionalParam = 1;
+ Light_GetStepValue((MOBLEUINT8)Generic_DefaultTransitionParam.DefaultTransitionTime,elementIndex);
+ TRACE_M(TF_LIGHT_M, "StepValue is =%.2x \r\n", Light_TimeParam[elementIndex].StepValue);
+
+ /* Check if the Transition Time is immediate or not */
+ if(Light_TimeParam[elementIndex].StepValue != 0x00)
+ {
+ Light_TemporaryStatus[elementIndex].TargetParam_1 = pHSLSaturationValue->HslSaturation16;
+ Light_TemporaryStatus[elementIndex].RemainingTime = Generic_DefaultTransitionParam.DefaultTransitionTime;
+ /* Load status register with updated value for Status response */
+ Light_HslStatus[elementIndex].RemainingTime = Generic_DefaultTransitionParam.DefaultTransitionTime;
+ Light_ModelFlag[elementIndex].LightTransitionFlag = LIGHT_HSL_SATURATION_TRANSITION_START;
+ Light_ModelFlag[elementIndex].LightOptionalParam = 1;
+ }
+ else
+ {
+ Light_ModelFlag[elementIndex].LightOptionalParam = 0;
+ Light_HslStatus[elementIndex].PresentHslSaturation16 = pHSLSaturationValue->HslSaturation16;
+ Light_ModelFlag[elementIndex].LightTransitionFlag = LIGHT_TRANSITION_STOP;
+ }
+ TRACE_M(TF_LIGHT_M, "PresentHSLSaturation: %d\r\n", Light_HslStatus[elementIndex].PresentHslSaturation16);
}
+#endif
/**
Weak function are defined to support the original function if they are not
@@ -3603,131 +4232,239 @@ included in firmware.
There is no use of this function for application development purpose.
*/
WEAK_FUNCTION (MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_LightnessParam,
- MOBLEUINT8 OptionalValid))
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Lightness_Linear_Set(Light_LightnessStatus_t* pLight_LightnessLinearParam,
- MOBLEUINT8 OptionalValid))
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pLight_LightnessDefaultParam,
- MOBLEUINT8 OptionalValid))
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
+{ return MOBLE_RESULT_SUCCESS;}
+
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Lightness_Last_Set(Light_LightnessStatus_t* pLight_LightnessParam,\
+ MOBLEUINT8 elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Lightness_Range_Set(Light_LightnessRangeParam_t* pLight_LightnessRangeParam,
- MOBLEUINT8 OptionalValid))
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Ctl_Set(Light_CtlStatus_t* pLight_CtlParam,
- MOBLEUINT8 OptionalValid))
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_CtlTemperature_Set(Light_CtlStatus_t* pLight_CtltempParam,
- MOBLEUINT8 OptionalValid))
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_CtlTemperature_Range_Set(Light_CtlTemperatureRangeParam_t* pLight_CtlTempRangeParam,
- MOBLEUINT8 OptionalValid))
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_CtlDefault_Set(Light_CtlDefaultParam_t* pLight_CtlDefaultParam,
- MOBLEUINT8 OptionalValid))
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Hsl_Set(Light_HslStatus_t* pLight_HslParam,
- MOBLEUINT8 OptionalValid))
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_HslHue_Set(Light_HslStatus_t* pLight_HslHueParam,
- MOBLEUINT8 OptionalValid))
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_HslSaturation_Set(Light_HslStatus_t* pLight_HslSaturationParam,
- MOBLEUINT8 OptionalValid))
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_HslDefault_Set(Light_HslStatus_t* pLight_HslDefaultParam,
- MOBLEUINT8 OptionalValid))
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
WEAK_FUNCTION(MOBLE_RESULT Appli_Light_HslRange_Set(Light_HslRangeParam_t* pLight_HslRangeParam,
- MOBLEUINT8 OptionalValid))
+ MOBLEUINT8 OptionalValid,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, MOBLEUINT32 pLength))
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status,
+ MOBLEUINT32 pLength,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status, MOBLEUINT32 pLength))
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status,
+ MOBLEUINT32 pLength,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDefault_status, MOBLEUINT32 pLength))
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDefault_status,
+ MOBLEUINT32 pLength,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status, MOBLEUINT32 pLength))
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status,
+ MOBLEUINT32 pLength,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status, MOBLEUINT32 pLength))
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status,
+ MOBLEUINT32 pLength,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status, MOBLEUINT32 pLength))
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status,
+ MOBLEUINT32 pLength,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status, MOBLEUINT32 pLength))
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status,
+ MOBLEUINT32 pLength,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status, MOBLEUINT32 pLength))
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status,
+ MOBLEUINT32 pLength,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 pLength))
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status,
+ MOBLEUINT32 pLength,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUINT32 pLength))
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status,
+ MOBLEUINT32 pLength,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status, MOBLEUINT32 pLength))
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status,
+ MOBLEUINT32 pLength,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status, MOBLEUINT32 pLength))
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status,
+ MOBLEUINT32 pLength,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status, MOBLEUINT32 pLength))
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status,
+ MOBLEUINT32 pLength,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS;}
-
-
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState))
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS; }
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState))
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS; }
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState))
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS; }
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState))
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lDefaultState,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS; }
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetLightnessRangeStatus(MOBLEUINT8* lRangeState))
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetLightnessRangeStatus(MOBLEUINT8* lRangeState,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS; }
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetCtlLightStatus(MOBLEUINT8* lCtlLightState))
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetCtlLightStatus(MOBLEUINT8* lCtlLightState,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS; }
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState))
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetCtlTargetStatus(MOBLEUINT8* lCtlLightState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex))
{ return MOBLE_RESULT_SUCCESS; }
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange))
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS; }
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetCtlDefaultStatus(MOBLEUINT8* lCtlDefaultState))
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS; }
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetHslStatus(MOBLEUINT8* lHslState))
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetCtlDefaultStatus(MOBLEUINT8* lCtlDefaultState,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS; }
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState))
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetHslStatus(MOBLEUINT8* lHslState,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS; }
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState))
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetHslTargetStatus(MOBLEUINT8* lHslState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex))
{ return MOBLE_RESULT_SUCCESS; }
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetHslHueRange(MOBLEUINT8* lHslHueRange))
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS; }
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange))
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS; }
-WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState))
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetHslHueRange(MOBLEUINT8* lHslHueRange,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
{ return MOBLE_RESULT_SUCCESS; }
-WEAK_FUNCTION(void HSL2RGB_Conversion(void));
-WEAK_FUNCTION(void RgbF_Create(MOBLEUINT16 value1, MOBLEUINT16 value2, MOBLEUINT16 value3));
-WEAK_FUNCTION(void Light_UpdatePWMValue(MOBLEUINT8 state));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
+{ return MOBLE_RESULT_SUCCESS; }
+WEAK_FUNCTION(MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState,
+ uint16_t dstPeer,
+ uint8_t elementIndex))
+{ return MOBLE_RESULT_SUCCESS; }
+WEAK_FUNCTION(void HSL2RGB_Conversion(MOBLEUINT8 elementIndex) {})
+WEAK_FUNCTION(void RgbF_Create(MOBLEUINT16 value1,
+ MOBLEUINT16 value2,
+ MOBLEUINT16 value3,
+ MOBLEUINT8 elementIndex) {})
+WEAK_FUNCTION(void Light_UpdatePWMValue(MOBLEUINT8 state) {})
/**
* @}
*/
@@ -3737,6 +4474,6 @@ WEAK_FUNCTION(void Light_UpdatePWMValue(MOBLEUINT8 state));
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_client.c b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_client.c
index b8b53b29c..3067dc114 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_client.c
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_client.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
@@ -19,7 +19,8 @@
/* Includes ------------------------------------------------------------------*/
#include "hal_common.h"
#include "mesh_cfg.h"
-#include "light.h"
+#include "light.h" //Included as Light LC model is included in Lightness Group for Client
+#include "light_lc.h"
#include "light_client.h"
#include "common.h"
#include "models_if.h"
@@ -38,99 +39,779 @@
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
-extern MOBLEUINT8 TidSend;
+extern Model_Tid_t Model_Tid;;
const MODEL_OpcodeTableParam_t Light_Client_Opcodes_Table[] =
{
/* Light Lightness Client */
/* MOBLEUINT32 opcode, MOBLEBOOL reliable, MOBLEUINT16 min_payload_size,
MOBLEUINT16 max_payload_size;
Here in this array, Handler is not defined; */
-/* model_id opcode reliable min_payload_size max_payload_size response_opcode min_response_size max_response_size */
-
-#ifdef ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS
- {LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID, LIGHT_LIGHTNESS_GET, MOBLE_TRUE, 0, 0, LIGHT_LIGHTNESS_STATUS, 2, 5},
- {LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID, LIGHT_LIGHTNESS_SET, MOBLE_TRUE, 3, 5, LIGHT_LIGHTNESS_STATUS, 2, 5},
- {LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID, LIGHT_LIGHTNESS_SET_UNACK, MOBLE_FALSE, 3, 5, LIGHT_LIGHTNESS_STATUS, 2, 5},
- {LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID, LIGHT_LIGHTNESS_STATUS, MOBLE_FALSE, 2, 5, 0, 2, 5},
- {LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID, LIGHT_LIGHTNESS_LINEAR_GET, MOBLE_TRUE, 0, 0, LIGHT_LIGHTNESS_LINEAR_STATUS, 2, 5},
- {LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID, LIGHT_LIGHTNESS_LINEAR_SET, MOBLE_TRUE, 3, 5, LIGHT_LIGHTNESS_LINEAR_STATUS, 2, 5},
- {LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID, LIGHT_LIGHTNESS_LINEAR_SET_UNACK, MOBLE_FALSE, 3, 5, LIGHT_LIGHTNESS_LINEAR_STATUS, 2, 5},
- {LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID, LIGHT_LIGHTNESS_LINEAR_STATUS, MOBLE_FALSE, 2, 5, 0, 2, 5},
- {LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID, LIGHT_LIGHTNESS_LAST_GET, MOBLE_TRUE, 0, 0, LIGHT_LIGHTNESS_LAST_STATUS, 2, 2},
- {LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID, LIGHT_LIGHTNESS_LAST_STATUS, MOBLE_FALSE, 2, 2, 0, 2, 2},
- {LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID, LIGHT_LIGHTNESS_DEFAULT_GET, MOBLE_TRUE, 0, 0, LIGHT_LIGHTNESS_DEFAULT_STATUS, 2, 2},
- {LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID, LIGHT_LIGHTNESS_DEFAULT_STATUS, MOBLE_FALSE, 2, 2, 0, 2, 2},
- {LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID, LIGHT_LIGHTNESS_RANGE_GET, MOBLE_TRUE, 0, 0, LIGHT_LIGHTNESS_RANGE_STATUS, 5, 5},
- {LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID, LIGHT_LIGHTNESS_RANGE_STATUS, MOBLE_FALSE, 5, 5, 0, 5, 5},
-#endif
-
-#ifdef ENABLE_LIGHT_MODEL_CLIENT_CTL
- {LIGHT_MODEL_CLIENT_CTL_MODEL_ID, LIGHT_CTL_GET, MOBLE_TRUE, 0, 0, LIGHT_CTL_STATUS, 4, 9},
- {LIGHT_MODEL_CLIENT_CTL_MODEL_ID, LIGHT_CTL_SET, MOBLE_TRUE, 7, 9, LIGHT_CTL_STATUS, 4, 9},
- {LIGHT_MODEL_CLIENT_CTL_MODEL_ID, LIGHT_CTL_SET_UNACK, MOBLE_FALSE, 7, 9, LIGHT_CTL_STATUS, 4, 9},
- {LIGHT_MODEL_CLIENT_CTL_MODEL_ID, LIGHT_CTL_STATUS, MOBLE_FALSE, 4, 9, 0, 4, 9},
- {LIGHT_MODEL_CLIENT_CTL_MODEL_ID, LIGHT_CTL_TEMPERATURE_RANGE_GET, MOBLE_TRUE, 0, 0, LIGHT_CTL_TEMPERATURE_RANGE_STATUS, 5, 5},
- {LIGHT_MODEL_CLIENT_CTL_MODEL_ID, LIGHT_CTL_TEMPERATURE_RANGE_STATUS, MOBLE_FALSE, 5, 5, 0, 5, 5},
- {LIGHT_MODEL_CLIENT_CTL_MODEL_ID, LIGHT_CTL_DEFAULT_GET, MOBLE_TRUE, 0, 0, LIGHT_CTL_DEFAULT_STATUS, 6, 6},
- {LIGHT_MODEL_CLIENT_CTL_MODEL_ID, LIGHT_CTL_DEFAULT_STATUS, MOBLE_TRUE, 6, 6, 0, 6, 6},
-#endif
-
+/* model_id opcode reliable min_payload_size max_payload_size response_opcode min_response_size max_response_size */
+
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS
+ {LIGHT_LIGHTNESS_CLIENT_MODEL_ID, LIGHT_LIGHTNESS_GET, MOBLE_TRUE, 0, 0, LIGHT_LIGHTNESS_STATUS, 2, 5},
+ {LIGHT_LIGHTNESS_CLIENT_MODEL_ID, LIGHT_LIGHTNESS_SET, MOBLE_TRUE, 3, 5, LIGHT_LIGHTNESS_STATUS, 2, 5},
+ {LIGHT_LIGHTNESS_CLIENT_MODEL_ID, LIGHT_LIGHTNESS_SET_UNACK, MOBLE_FALSE, 3, 5, LIGHT_LIGHTNESS_STATUS, 2, 5},
+ {LIGHT_LIGHTNESS_CLIENT_MODEL_ID, LIGHT_LIGHTNESS_STATUS, MOBLE_FALSE, 2, 5, 0, 2, 5},
+ {LIGHT_LIGHTNESS_CLIENT_MODEL_ID, LIGHT_LIGHTNESS_LINEAR_GET, MOBLE_TRUE, 0, 0, LIGHT_LIGHTNESS_LINEAR_STATUS, 2, 5},
+ {LIGHT_LIGHTNESS_CLIENT_MODEL_ID, LIGHT_LIGHTNESS_LINEAR_SET, MOBLE_TRUE, 3, 5, LIGHT_LIGHTNESS_LINEAR_STATUS, 2, 5},
+ {LIGHT_LIGHTNESS_CLIENT_MODEL_ID, LIGHT_LIGHTNESS_LINEAR_SET_UNACK, MOBLE_FALSE, 3, 5, LIGHT_LIGHTNESS_LINEAR_STATUS, 2, 5},
+ {LIGHT_LIGHTNESS_CLIENT_MODEL_ID, LIGHT_LIGHTNESS_LINEAR_STATUS, MOBLE_FALSE, 2, 5, 0, 2, 5},
+ {LIGHT_LIGHTNESS_CLIENT_MODEL_ID, LIGHT_LIGHTNESS_LAST_GET, MOBLE_TRUE, 0, 0, LIGHT_LIGHTNESS_LAST_STATUS, 2, 2},
+ {LIGHT_LIGHTNESS_CLIENT_MODEL_ID, LIGHT_LIGHTNESS_LAST_STATUS, MOBLE_FALSE, 2, 2, 0, 2, 2},
+ {LIGHT_LIGHTNESS_CLIENT_MODEL_ID, LIGHT_LIGHTNESS_DEFAULT_GET, MOBLE_TRUE, 0, 0, LIGHT_LIGHTNESS_DEFAULT_STATUS, 2, 2},
+ {LIGHT_LIGHTNESS_CLIENT_MODEL_ID, LIGHT_LIGHTNESS_DEFAULT_SET, MOBLE_TRUE, 2, 2, LIGHT_LIGHTNESS_DEFAULT_STATUS, 2, 2},
+ {LIGHT_LIGHTNESS_CLIENT_MODEL_ID, LIGHT_LIGHTNESS_DEFAULT_SET_UNACK, MOBLE_FALSE, 2, 2, 0, 2, 2},
+ {LIGHT_LIGHTNESS_CLIENT_MODEL_ID, LIGHT_LIGHTNESS_DEFAULT_STATUS, MOBLE_FALSE, 2, 2, 0, 2, 2},
+ {LIGHT_LIGHTNESS_CLIENT_MODEL_ID, LIGHT_LIGHTNESS_RANGE_GET, MOBLE_TRUE, 0, 0, LIGHT_LIGHTNESS_RANGE_STATUS, 5, 5},
+ {LIGHT_LIGHTNESS_CLIENT_MODEL_ID, LIGHT_LIGHTNESS_RANGE_SET, MOBLE_TRUE, 4, 4, LIGHT_LIGHTNESS_RANGE_STATUS, 5, 5},
+ {LIGHT_LIGHTNESS_CLIENT_MODEL_ID, LIGHT_LIGHTNESS_RANGE_SET_UNACK, MOBLE_FALSE, 4, 4, 0, 5, 5},
+ {LIGHT_LIGHTNESS_CLIENT_MODEL_ID, LIGHT_LIGHTNESS_RANGE_STATUS, MOBLE_FALSE, 5, 5, 0, 5, 5},
+#endif
+
+
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_CTL
+ {LIGHT_CTL_CLIENT_MODEL_ID, LIGHT_CTL_GET, MOBLE_TRUE, 0, 0, LIGHT_CTL_STATUS, 4, 9},
+ {LIGHT_CTL_CLIENT_MODEL_ID, LIGHT_CTL_SET, MOBLE_TRUE, 7, 9, LIGHT_CTL_STATUS, 4, 9},
+ {LIGHT_CTL_CLIENT_MODEL_ID, LIGHT_CTL_SET_UNACK, MOBLE_FALSE, 7, 9, LIGHT_CTL_STATUS, 4, 9},
+ {LIGHT_CTL_CLIENT_MODEL_ID, LIGHT_CTL_STATUS, MOBLE_FALSE, 4, 9, 0, 4, 9},
+ {LIGHT_CTL_CLIENT_MODEL_ID, LIGHT_CTL_DEFAULT_GET, MOBLE_TRUE, 0, 0, LIGHT_CTL_DEFAULT_STATUS, 6, 6},
+ {LIGHT_CTL_CLIENT_MODEL_ID, LIGHT_CTL_DEFAULT_SET, MOBLE_TRUE, 6, 6, LIGHT_CTL_DEFAULT_STATUS, 6, 6},
+ {LIGHT_CTL_CLIENT_MODEL_ID, LIGHT_CTL_DEFAULT_SET_UNACK, MOBLE_FALSE, 6, 6, LIGHT_CTL_DEFAULT_STATUS, 6, 6},
+ {LIGHT_CTL_CLIENT_MODEL_ID, LIGHT_CTL_DEFAULT_STATUS, MOBLE_TRUE, 6, 6, 0, 6, 6},
+ {LIGHT_CTL_CLIENT_MODEL_ID, LIGHT_CTL_TEMPERATURE_GET, MOBLE_TRUE, 0, 0, LIGHT_CTL_TEMPERATURE_STATUS, 4, 9},
+ {LIGHT_CTL_CLIENT_MODEL_ID, LIGHT_CTL_TEMPERATURE_SET, MOBLE_TRUE, 5, 7, LIGHT_CTL_TEMPERATURE_STATUS, 4, 9},
+ {LIGHT_CTL_CLIENT_MODEL_ID, LIGHT_CTL_TEMPERATURE_SET_UNACK, MOBLE_FALSE, 5, 7, LIGHT_CTL_TEMPERATURE_STATUS, 4, 9},
+ {LIGHT_CTL_CLIENT_MODEL_ID, LIGHT_CTL_TEMPERATURE_STATUS, MOBLE_FALSE, 4, 9, 0, 4, 9},
+ {LIGHT_CTL_CLIENT_MODEL_ID, LIGHT_CTL_TEMPERATURE_RANGE_GET, MOBLE_TRUE, 0, 0, LIGHT_CTL_TEMPERATURE_RANGE_STATUS, 5, 5},
+ {LIGHT_CTL_CLIENT_MODEL_ID, LIGHT_CTL_TEMPERATURE_RANGE_SET, MOBLE_TRUE, 4, 4, LIGHT_CTL_TEMPERATURE_RANGE_STATUS, 5, 5},
+ {LIGHT_CTL_CLIENT_MODEL_ID, LIGHT_CTL_TEMPERATURE_RANGE_SET_UNACK, MOBLE_FALSE, 4, 4, 0, 5, 5},
+ {LIGHT_CTL_CLIENT_MODEL_ID, LIGHT_CTL_TEMPERATURE_RANGE_STATUS, MOBLE_FALSE, 5, 5, 0, 5, 5},
+#endif
+
#ifdef ENABLE_LIGHT_MODEL_CLIENT_HSL
- {LIGHT_MODEL_CLIENT_HSL_MODEL_ID, LIGHT_HSL_GET, MOBLE_TRUE, 0, 0, LIGHT_HSL_STATUS, 6, 7},
- {LIGHT_MODEL_CLIENT_HSL_MODEL_ID, LIGHT_HSL_SET, MOBLE_TRUE, 7, 9, LIGHT_HSL_STATUS, 6, 7},
- {LIGHT_MODEL_CLIENT_HSL_MODEL_ID, LIGHT_HSL_SET_UNACK, MOBLE_FALSE, 7, 9, LIGHT_HSL_STATUS, 6, 7},
- {LIGHT_MODEL_CLIENT_HSL_MODEL_ID, LIGHT_HSL_STATUS, MOBLE_FALSE, 6, 7, 0, 6, 7},
- {LIGHT_MODEL_CLIENT_HSL_MODEL_ID, LIGHT_HSL_TARGET_GET, MOBLE_TRUE, 0, 0, LIGHT_HSL_TARGET_STATUS, 6, 7},
- {LIGHT_MODEL_CLIENT_HSL_MODEL_ID, LIGHT_HSL_TARGET_STATUS, MOBLE_FALSE, 6, 7, 0, 6, 7},
- {LIGHT_MODEL_CLIENT_HSL_MODEL_ID, LIGHT_HSL_DEFAULT_GET, MOBLE_TRUE, 0, 0, LIGHT_HSL_DEFAULT_STATUS, 6, 6},
- {LIGHT_MODEL_CLIENT_HSL_MODEL_ID, LIGHT_HSL_DEFAULT_STATUS, MOBLE_FALSE, 6, 6, 0, 6, 6},
- {LIGHT_MODEL_CLIENT_HSL_MODEL_ID, LIGHT_HSL_RANGE_GET, MOBLE_TRUE, 0, 0, LIGHT_HSL_RANGE_STATUS, 9, 9},
- {LIGHT_MODEL_CLIENT_HSL_MODEL_ID, LIGHT_HSL_RANGE_STATUS, MOBLE_TRUE, 9, 9, 0, 9, 9},
+ {LIGHT_HSL_CLIENT_MODEL_ID, LIGHT_HSL_GET, MOBLE_TRUE, 0, 0, LIGHT_HSL_STATUS, 6, 7},
+ {LIGHT_HSL_CLIENT_MODEL_ID, LIGHT_HSL_SET, MOBLE_TRUE, 7, 9, LIGHT_HSL_STATUS, 6, 7},
+ {LIGHT_HSL_CLIENT_MODEL_ID, LIGHT_HSL_SET_UNACK, MOBLE_FALSE, 7, 9, LIGHT_HSL_STATUS, 6, 7},
+ {LIGHT_HSL_CLIENT_MODEL_ID, LIGHT_HSL_STATUS, MOBLE_FALSE, 6, 7, 0, 6, 7},
+ {LIGHT_HSL_CLIENT_MODEL_ID, LIGHT_HSL_TARGET_GET, MOBLE_TRUE, 0, 0, LIGHT_HSL_TARGET_STATUS, 6, 7},
+ {LIGHT_HSL_CLIENT_MODEL_ID, LIGHT_HSL_TARGET_STATUS, MOBLE_FALSE, 6, 7, 0, 6, 7},
+ {LIGHT_HSL_CLIENT_MODEL_ID, LIGHT_HSL_DEFAULT_GET, MOBLE_TRUE, 0, 0, LIGHT_HSL_DEFAULT_STATUS, 6, 6},
+ {LIGHT_HSL_CLIENT_MODEL_ID, LIGHT_HSL_DEFAULT_SET, MOBLE_TRUE, 6, 6, LIGHT_HSL_DEFAULT_STATUS, 6, 6},
+ {LIGHT_HSL_CLIENT_MODEL_ID, LIGHT_HSL_DEFAULT_SET_UNACK, MOBLE_FALSE, 6, 6, LIGHT_HSL_DEFAULT_STATUS, 6, 6},
+ {LIGHT_HSL_CLIENT_MODEL_ID, LIGHT_HSL_DEFAULT_STATUS, MOBLE_FALSE, 6, 6, 0, 6, 6},
+ {LIGHT_HSL_CLIENT_MODEL_ID, LIGHT_HSL_RANGE_GET, MOBLE_TRUE, 0, 0, LIGHT_HSL_RANGE_STATUS, 9, 9},
+ {LIGHT_HSL_CLIENT_MODEL_ID, LIGHT_HSL_RANGE_SET, MOBLE_TRUE, 8, 8, LIGHT_HSL_RANGE_STATUS, 9, 9},
+ {LIGHT_HSL_CLIENT_MODEL_ID, LIGHT_HSL_RANGE_SET_UNACK, MOBLE_FALSE, 8, 8, 0, 9, 9},
+ {LIGHT_HSL_CLIENT_MODEL_ID, LIGHT_HSL_RANGE_STATUS, MOBLE_TRUE, 9, 9, 0, 9, 9},
+ {LIGHT_HSL_CLIENT_MODEL_ID, LIGHT_HSL_HUE_GET, MOBLE_TRUE, 0, 0, LIGHT_HSL_HUE_STATUS, 2, 5},
+ {LIGHT_HSL_CLIENT_MODEL_ID, LIGHT_HSL_HUE_SET, MOBLE_TRUE, 3, 5, LIGHT_HSL_HUE_STATUS, 2, 5},
+ {LIGHT_HSL_CLIENT_MODEL_ID, LIGHT_HSL_HUE_SET_UNACK, MOBLE_FALSE, 3, 5, LIGHT_HSL_HUE_STATUS, 2, 5},
+ {LIGHT_HSL_CLIENT_MODEL_ID, LIGHT_HSL_HUE_STATUS, MOBLE_FALSE, 2, 5, 0, 2, 5},
+ {LIGHT_HSL_CLIENT_MODEL_ID, LIGHT_HSL_SATURATION_GET, MOBLE_TRUE, 0, 0, LIGHT_HSL_SATURATION_STATUS, 2, 5},
+ {LIGHT_HSL_CLIENT_MODEL_ID, LIGHT_HSL_SATURATION_SET, MOBLE_TRUE, 3, 5, LIGHT_HSL_SATURATION_STATUS, 2, 5},
+ {LIGHT_HSL_CLIENT_MODEL_ID, LIGHT_HSL_SATURATION_SET_UNACK, MOBLE_FALSE, 3, 5, LIGHT_HSL_SATURATION_STATUS, 2, 5},
+ {LIGHT_HSL_CLIENT_MODEL_ID, LIGHT_HSL_SATURATION_STATUS, MOBLE_FALSE, 2, 5, 0, 2, 5},
+#endif
+
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_LC
+ {LIGHT_LC_CLIENT_MODEL_ID, LIGHT_LC_MODE_GET, MOBLE_TRUE, 0, 0, LIGHT_LC_MODE_STATUS , 1, 1},
+ {LIGHT_LC_CLIENT_MODEL_ID, LIGHT_LC_MODE_SET, MOBLE_TRUE, 1, 1, LIGHT_LC_MODE_STATUS , 1, 1},
+ {LIGHT_LC_CLIENT_MODEL_ID, LIGHT_LC_MODE_SET_UNACK, MOBLE_FALSE, 1, 1, LIGHT_LC_MODE_STATUS , 1, 1},
+ {LIGHT_LC_CLIENT_MODEL_ID, LIGHT_LC_MODE_STATUS, MOBLE_FALSE, 1, 1, 0 , 1, 1},
+ {LIGHT_LC_CLIENT_MODEL_ID, LIGHT_LC_OM_GET, MOBLE_TRUE, 0, 0, LIGHT_LC_OM_STATUS , 1, 1},
+ {LIGHT_LC_CLIENT_MODEL_ID, LIGHT_LC_OM_SET, MOBLE_TRUE, 1, 1, LIGHT_LC_OM_STATUS , 1, 1},
+ {LIGHT_LC_CLIENT_MODEL_ID, LIGHT_LC_OM_SET_UNACK, MOBLE_FALSE, 1, 1, LIGHT_LC_OM_STATUS , 1, 1},
+ {LIGHT_LC_CLIENT_MODEL_ID, LIGHT_LC_OM_STATUS, MOBLE_FALSE, 1, 1, 0 , 1, 1},
+ {LIGHT_LC_CLIENT_MODEL_ID, LIGHT_LC_ON_OFF_GET, MOBLE_TRUE, 0, 0, LIGHT_LC_ON_OFF_STATUS, 1, 3},
+ {LIGHT_LC_CLIENT_MODEL_ID, LIGHT_LC_ON_OFF_SET, MOBLE_TRUE, 2, 4, LIGHT_LC_ON_OFF_STATUS, 1, 3},
+ {LIGHT_LC_CLIENT_MODEL_ID, LIGHT_LC_ON_OFF_SET_UNACK, MOBLE_FALSE, 2, 4, LIGHT_LC_ON_OFF_STATUS, 1, 3},
+ {LIGHT_LC_CLIENT_MODEL_ID, LIGHT_LC_ON_OFF_STATUS, MOBLE_FALSE, 1, 3, 0 , 1, 3},
+ {LIGHT_LC_CLIENT_MODEL_ID, LIGHT_LC_PROPERTY_GET, MOBLE_TRUE, 2, 2, LIGHT_LC_PROPERTY_STATUS, 2, 10},
+ {LIGHT_LC_CLIENT_MODEL_ID, LIGHT_LC_PROPERTY_SET, MOBLE_TRUE, 2, 10, LIGHT_LC_PROPERTY_STATUS, 2, 10},
+ {LIGHT_LC_CLIENT_MODEL_ID, LIGHT_LC_PROPERTY_SET_UNACK, MOBLE_FALSE, 2, 10, LIGHT_LC_PROPERTY_STATUS, 2, 10},
+ {LIGHT_LC_CLIENT_MODEL_ID, LIGHT_LC_PROPERTY_STATUS, MOBLE_FALSE, 2, 10, 0 , 2, 10},
#endif
- {0}
+ {0}
};
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
+/******************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS
+/******************************************************************************/
+/**
+* @brief LightClient_Lightness_Get: This function is called to send Light Lightness Get message
+* @param elementIndex : Index of the element
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Lightness_Get(MOBLEUINT8 elementIndex)
+
+{
+ /* 6.3.1.1 Light Lightness Get
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 msg_opcode;
+ MOBLEUINT8 const *msg_buff = NULL;
+ MOBLEBOOL ack_flag = MOBLE_TRUE;
+
+ TRACE_M(TF_LIGHT_CLIENT_M, "LightClient_Lightness_Get Client Message \r\n");
+
+ msg_opcode = LIGHT_LIGHTNESS_GET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_LIGHTNESS_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, 0,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
/**
-* @brief LightClient_Lightness_Set_Unack: This function is called for Acknowledged message
-* @param element_number: number for the element present on the node
-* @param pLightness_param: pointer ot the function
+* @brief LightClient_Lightness_Set_Ack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightness_param: pointer to the parameters received for message
* @param length:length of the data received
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT LightClient_Lightness_Set_Unack(MOBLE_ADDRESS element_number,
- _Light_LightnessParam *pLightness_param,
+MOBLE_RESULT LightClient_Lightness_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightness_param,
MOBLEUINT32 length)
{
+/*
+ 6.3.1.2 Light Lightness Set
+ Lightness: 2B The target value of the Light Lightness Actual 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)
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_Lightness_Set_Ack Client Message \r\n");
+ pLightness_param[2] = Model_Tid.TidSend;
+ msg_buff = pLightness_param;
+ ack_flag = MOBLE_TRUE;
+ msg_opcode = LIGHT_LIGHTNESS_SET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_LIGHTNESS_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+ /*
+ Manage the TID
+ */
+ Model_Tid.TidSend++;
+ if(Model_Tid.TidSend >= MAX_TID_VALUE)
+ {
+ Model_Tid.TidSend = 0;
+ }
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+/**
+* @brief LightClient_Lightness_Set_Unack: This function is called for Unacknowledged message
+* @param elementIndex: Index of the element
+* @param pLightness_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Lightness_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightness_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.1.3 Light Lightness Set Unacknowledged
+ Lightness: 2B The target value of the Light Lightness Actual 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)
+*/
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
MOBLEUINT8 const *msg_buff;
MOBLEUINT16 msg_opcode;
MOBLEBOOL ack_flag;
- TRACE_M(TF_LIGHT_CLIENT_M,"Light_Lightness_Set_Unack Client Message \r\n");
- pLightness_param->a_Lightness_param[2] = TidSend;
- msg_buff = pLightness_param->a_Lightness_param;
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_Lightness_Set_Unack Client Message \r\n");
+ pLightness_param[2] = Model_Tid.TidSend;
+ msg_buff = pLightness_param;
ack_flag = MOBLE_FALSE;
msg_opcode = LIGHT_LIGHTNESS_SET_UNACK;
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_LIGHTNESS_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+ /*
+ Manage the TID
+ */
+ Model_Tid.TidSend++;
+ if(Model_Tid.TidSend >= MAX_TID_VALUE)
+ {
+ Model_Tid.TidSend = 0;
+ }
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+
+/**
+* @brief LightClient_Lightness_Linear_Get: This function is called to send Light Lightness Get message
+* @param elementIndex : Index of the element
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Lightness_Linear_Get(MOBLEUINT8 elementIndex)
+
+{
+ /*
+ 6.3.1.5 Light Lightness Linear Get
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 msg_opcode;
+ MOBLEUINT8 const *msg_buff = NULL;
+ MOBLEBOOL ack_flag = MOBLE_TRUE;
+
+ TRACE_M(TF_LIGHT_CLIENT_M, "LightClient_Lightness_Linear_Get Client Message \r\n");
+
+ msg_opcode = LIGHT_LIGHTNESS_LINEAR_GET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_LIGHTNESS_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, 0,
+ ack_flag,
+ MOBLE_FALSE);
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+
+/**
+* @brief LightClient_Lightness_Linear_Set_Ack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightnessLinear_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Lightness_Linear_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightnessLinear_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.1.6 Light Lightness Linear Set
+ Lightness: 2B The target value of the Light Lightness Linear 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)
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_Lightness_Linear_Set_Ack Client Message \r\n");
+ pLightnessLinear_param[2] = Model_Tid.TidSend;
+ msg_buff = pLightnessLinear_param;
+ ack_flag = MOBLE_TRUE;
+ msg_opcode = LIGHT_LIGHTNESS_LINEAR_SET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_LIGHTNESS_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+ /*
+ Manage the TID
+ */
+ Model_Tid.TidSend++;
+ if(Model_Tid.TidSend >= MAX_TID_VALUE)
+ {
+ Model_Tid.TidSend = 0;
+ }
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_Lightness_Linear_Set_Unack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightnessLinear_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Lightness_Linear_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightnessLinear_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.1.7 Light Lightness Linear Set Unacknowledged
+ Lightness: 2B The target value of the Light Lightness Linear 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)
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_Lightness_Linear_Set_Unack Client Message \r\n");
+ pLightnessLinear_param[2] = Model_Tid.TidSend;
+ msg_buff = pLightnessLinear_param;
+ ack_flag = MOBLE_FALSE;
+ msg_opcode = LIGHT_LIGHTNESS_LINEAR_SET_UNACK;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_LIGHTNESS_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+ /*
+ Manage the TID
+ */
+ Model_Tid.TidSend++;
+ if(Model_Tid.TidSend >= MAX_TID_VALUE)
+ {
+ Model_Tid.TidSend = 0;
+ }
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_Lightness_Default_Get: This function is called to send Light Default Get message
+* @param elementIndex : Index of the element
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Lightness_Default_Get(MOBLEUINT8 elementIndex)
+
+{
+ /*
+ 6.3.1.11 Light Lightness Default Get
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 msg_opcode;
+ MOBLEUINT8 const *msg_buff = NULL;
+ MOBLEBOOL ack_flag = MOBLE_TRUE;
+
+ TRACE_M(TF_LIGHT_CLIENT_M, "LightClient_Lightness_Default_Get Client Message \r\n");
+
+ msg_opcode = LIGHT_LIGHTNESS_DEFAULT_GET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_LIGHTNESS_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, 0,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_Lightness_Default_Set_Ack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightnessDefault_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Lightness_Default_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightnessDefault_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.1.12 Light Lightness Default Set
+ Lightness: 2B The value of the Light Lightness Default state.
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_Lightness_Default_Set_Ack Client Message \r\n");
+ msg_buff = pLightnessDefault_param;
+ ack_flag = MOBLE_TRUE;
+ msg_opcode = LIGHT_LIGHTNESS_DEFAULT_SET;
+
/*
Manage the TID Here....
*/
- result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID,
- element_number ,
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_LIGHTNESS_CLIENT_MODEL_ID,
+ elementIndex,
msg_opcode ,
msg_buff, length,
ack_flag,
MOBLE_FALSE);
- TidSend++;
- if(TidSend >= MAX_TID_VALUE)
+
+ if(result)
{
- TidSend = 0;
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_Lightness_Default_Set_Unack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightnessDefault_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Lightness_Default_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightnessDefault_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.1.13 Light Lightness Default Set Unacknowledged
+ Lightness: 2B The value of the Light Lightness Default state.
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_Lightness_Default_Set_Unack Client Message \r\n");
+ msg_buff = pLightnessDefault_param;
+ ack_flag = MOBLE_FALSE;
+ msg_opcode = LIGHT_LIGHTNESS_DEFAULT_SET_UNACK;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_LIGHTNESS_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_Lightness_Range_Get: This function is called to send Light Range Get message
+* @param elementIndex : Index of the element
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Lightness_Range_Get(MOBLEUINT8 elementIndex)
+
+{
+ /*
+ 6.3.1.15 Light Lightness Range Get
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 msg_opcode;
+ MOBLEUINT8 const *msg_buff = NULL;
+ MOBLEBOOL ack_flag = MOBLE_TRUE;
+
+ TRACE_M(TF_LIGHT_CLIENT_M, "LightClient_Lightness_Range_Get Client Message \r\n");
+
+ msg_opcode = LIGHT_LIGHTNESS_RANGE_GET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_LIGHTNESS_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, 0,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_Lightness_Range_Set_Ack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightnessRange_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Lightness_Range_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightnessRange_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.1.16 Light Lightness Range Set
+ Range Min: 2B The value of the Lightness Range Min field of the Light Lightness Range state.
+ Range Max: 2B The value of the Lightness Range Max field of the Light Lightness Range state
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_Lightness_Range_Set_Ack Client Message \r\n");
+ msg_buff = pLightnessRange_param;
+ ack_flag = MOBLE_TRUE;
+ msg_opcode = LIGHT_LIGHTNESS_RANGE_SET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_LIGHTNESS_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_Lightness_Range_Set_Unack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightnessRange_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Lightness_Range_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightnessRange_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.1.17 Light Lightness Range Set Unacknowledged
+ Range Min: 2B The value of the Lightness Range Min field of the Light Lightness Range state.
+ Range Max: 2B The value of the Lightness Range Max field of the Light Lightness Range state
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_Lightness_Range_Set_Unack Client Message \r\n");
+ msg_buff = pLightnessRange_param;
+ ack_flag = MOBLE_FALSE;
+ msg_opcode = LIGHT_LIGHTNESS_RANGE_SET_UNACK;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_LIGHTNESS_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+
+/******************************************************************************/
+#endif /* ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS */
+/******************************************************************************/
+
+/******************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_CTL
+/******************************************************************************/
+/**
+* @brief LightClient_Ctl_Get: This function is called to send Light CTL Get message
+* @param elementIndex : Index of the element
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Ctl_Get(MOBLEUINT8 elementIndex)
+{
+ /*
+ 6.3.2.1 Light CTL Get
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 msg_opcode;
+ MOBLEUINT8 const *msg_buff = NULL;
+ MOBLEBOOL ack_flag = MOBLE_TRUE;
+
+ TRACE_M(TF_LIGHT_CLIENT_M, "LightClient_Ctl_Get Client Message \r\n");
+
+ msg_opcode = LIGHT_CTL_GET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_CTL_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, 0,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+
+/**
+* @brief LightClient_Ctl_Set_Ack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightCtl_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Ctl_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightCtl_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.2.2 Light CTL Set
+ CTL Lightness: 2B The target value of the Light CTL Lightness state.
+ CTL Temperature: 2B The target value of the Light CTL Temperature state.
+ CTL Delta UV: 2B The target value of the Light CTL Delta UV 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)
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_Ctl_Set_Ack Client Message \r\n");
+ pLightCtl_param[6] = Model_Tid.TidSend;
+ msg_buff = pLightCtl_param;
+ ack_flag = MOBLE_TRUE;
+ msg_opcode = LIGHT_CTL_SET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_CTL_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+ /*
+ Manage the TID
+ */
+ Model_Tid.TidSend++;
+ if(Model_Tid.TidSend >= MAX_TID_VALUE)
+ {
+ Model_Tid.TidSend = 0;
+ }
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_Ctl_Set_Unack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightCtl_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Ctl_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightCtl_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.2.3 Light CTL Set Unacknowleged
+ CTL Lightness: 2B The target value of the Light CTL Lightness state.
+ CTL Temperature: 2B The target value of the Light CTL Temperature state.
+ CTL Delta UV: 2B The target value of the Light CTL Delta UV 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)
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_Ctl_Set_Unack Client Message \r\n");
+ pLightCtl_param[6] = Model_Tid.TidSend;
+ msg_buff = pLightCtl_param;
+ ack_flag = MOBLE_FALSE;
+ msg_opcode = LIGHT_CTL_SET_UNACK;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_CTL_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+ /*
+ Manage the TID
+ */
+ Model_Tid.TidSend++;
+ if(Model_Tid.TidSend >= MAX_TID_VALUE)
+ {
+ Model_Tid.TidSend = 0;
}
if(result)
{
@@ -140,6 +821,1609 @@ MOBLE_RESULT LightClient_Lightness_Set_Unack(MOBLE_ADDRESS element_number,
return result;
}
+
+/**
+* @brief LightClient_Ctl_Temperature_Get: This function is called to send Light CTL Temperature Get message
+* @param elementIndex : Index of the element
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Ctl_Temperature_Get(MOBLEUINT8 elementIndex)
+{
+ /*
+ 6.3.2.5 Light CTL Temperature Get
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 msg_opcode;
+ MOBLEUINT8 const *msg_buff = NULL;
+ MOBLEBOOL ack_flag = MOBLE_TRUE;
+
+ TRACE_M(TF_LIGHT_CLIENT_M, "LightClient_Ctl_Temperature_Get Client Message \r\n");
+
+ msg_opcode = LIGHT_CTL_TEMPERATURE_GET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_CTL_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, 0,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+
+/**
+* @brief LightClient_Ctl_Temperature_Set_Ack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightCtlTemperature_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Ctl_Temperature_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightCtlTemperature_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.2.6 Light CTL Temperature Set
+ CTL Temperature: 2B The target value of the Light CTL Temperature state.
+ CTL Delta UV: 2B The target value of the Light CTL Delta UV 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)
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_Ctl_Temperature_Temperature_Set_Ack Client Message \r\n");
+ pLightCtlTemperature_param[4] = Model_Tid.TidSend;
+ msg_buff = pLightCtlTemperature_param;
+ ack_flag = MOBLE_TRUE;
+ msg_opcode = LIGHT_CTL_TEMPERATURE_SET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_CTL_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+ /*
+ Manage the TID
+ */
+ Model_Tid.TidSend++;
+ if(Model_Tid.TidSend >= MAX_TID_VALUE)
+ {
+ Model_Tid.TidSend = 0;
+ }
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_Ctl_Temperature_Set_Unack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightCtlTemperature_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Ctl_Temperature_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightCtlTemperature_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.2.7 Light CTL Temperature Set Unacknowleged
+ CTL Temperature: 2B The target value of the Light CTL Temperature state.
+ CTL Delta UV: 2B The target value of the Light CTL Delta UV 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)
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_Ctl_Temperature_Set_Unack Client Message \r\n");
+ pLightCtlTemperature_param[4] = Model_Tid.TidSend;
+ msg_buff = pLightCtlTemperature_param;
+ ack_flag = MOBLE_FALSE;
+ msg_opcode = LIGHT_CTL_TEMPERATURE_SET_UNACK;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_CTL_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+ /*
+ Manage the TID
+ */
+ Model_Tid.TidSend++;
+ if(Model_Tid.TidSend >= MAX_TID_VALUE)
+ {
+ Model_Tid.TidSend = 0;
+ }
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_Ctl_Temperature_Range_Get: This function is called to send Light CTL Temperature Range Get message
+* @param elementIndex : Index of the element
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Ctl_Temperature_Range_Get(MOBLEUINT8 elementIndex)
+{
+ /*
+ 6.3.2.9 Light CTL Temperature Range Get
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 msg_opcode;
+ MOBLEUINT8 const *msg_buff = NULL;
+ MOBLEBOOL ack_flag = MOBLE_TRUE;
+
+ TRACE_M(TF_LIGHT_CLIENT_M, "LightClient_Ctl_Temperature_Range_Get Client Message \r\n");
+
+ msg_opcode = LIGHT_CTL_TEMPERATURE_RANGE_GET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_CTL_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, 0,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+
+/**
+* @brief LightClient_Ctl_Temperature_Range_Set_Ack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightCtlTemperatureRange_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Ctl_Temperature_Range_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightCtlTemperatureRange_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.2.10 Light CTL Temperature Range Set
+ Range Min: 2B The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ Range Max 2B The value of the Temperature Range Max field of the Light CTL Temperature Range state
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_Ctl_Temperature_Temperature_Range_Set_Ack Client Message \r\n");
+ msg_buff = pLightCtlTemperatureRange_param;
+ ack_flag = MOBLE_TRUE;
+ msg_opcode = LIGHT_CTL_TEMPERATURE_RANGE_SET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_CTL_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_Ctl_Temperature_Range_Set_Unack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightCtlTemperatureRange_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Ctl_Temperature_Range_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightCtlTemperatureRange_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.2.11 Light CTL Temperature Range Set Unacknowleged
+ Range Min: 2B The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ Range Max 2B The value of the Temperature Range Max field of the Light CTL Temperature Range state
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_Ctl_Temperature_Range_Set_Unack Client Message \r\n");
+ msg_buff = pLightCtlTemperatureRange_param;
+ ack_flag = MOBLE_FALSE;
+ msg_opcode = LIGHT_CTL_TEMPERATURE_RANGE_SET_UNACK;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_CTL_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_Ctl_Default_Get: This function is called to send Light CTL Default Get message
+* @param elementIndex : Index of the element
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Ctl_Default_Get(MOBLEUINT8 elementIndex)
+{
+ /*
+ 6.3.2.13 Light CTL Default Get
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 msg_opcode;
+ MOBLEUINT8 const *msg_buff = NULL;
+ MOBLEBOOL ack_flag = MOBLE_TRUE;
+
+ TRACE_M(TF_LIGHT_CLIENT_M, "LightClient_Ctl_Default_Get Client Message \r\n");
+
+ msg_opcode = LIGHT_CTL_DEFAULT_GET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_CTL_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, 0,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+
+/**
+* @brief LightClient_Ctl_Default_Set_Ack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightCtlDefault_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Ctl_Default_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightCtlDefault_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.2.14 Light CTL Default Set
+ CTL Lightness: 2B The target value of the Light CTL Lightness Default state.
+ CTL Temperature: 2B The target value of the Light CTL Temperature Default state.
+ CTL Delta UV: 2B The target value of the Light CTL Delta UV Default state.
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_Ctl_Default_Set_Ack Client Message \r\n");
+ msg_buff = pLightCtlDefault_param;
+ ack_flag = MOBLE_TRUE;
+ msg_opcode = LIGHT_CTL_DEFAULT_SET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_CTL_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_Ctl_Default_Set_Unack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightCtlDefault_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Ctl_Default_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightCtlDefault_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.2.15 Light CTL Default Set Unacknowleged
+ CTL Lightness: 2B The target value of the Light CTL Lightness Default state.
+ CTL Temperature: 2B The target value of the Light CTL Temperature Default state.
+ CTL Delta UV: 2B The target value of the Light CTL Delta UV Default state.
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_Ctl_Default_Set_Unack Client Message \r\n");
+ msg_buff = pLightCtlDefault_param;
+ ack_flag = MOBLE_FALSE;
+ msg_opcode = LIGHT_CTL_DEFAULT_SET_UNACK;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_CTL_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/******************************************************************************/
+#endif /* ENABLE_LIGHT_MODEL_CLIENT_CTL */
+/******************************************************************************/
+
+
+/******************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_HSL
+/******************************************************************************/
+/**
+* @brief LightClient_Hsl_Get: This function is called to send Light HSL Get message
+* @param elementIndex : Index of the element
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Hsl_Get(MOBLEUINT8 elementIndex)
+{
+ /*
+ 6.3.3.1 Light HSL Get
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 msg_opcode;
+ MOBLEUINT8 const *msg_buff = NULL;
+ MOBLEBOOL ack_flag = MOBLE_TRUE;
+
+ TRACE_M(TF_LIGHT_CLIENT_M, "LightClient_Hsl_Get Client Message \r\n");
+
+ msg_opcode = LIGHT_HSL_GET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_HSL_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, 0,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+
+/**
+* @brief LightClient_Hsl_Set_Ack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightHsl_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Hsl_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightHsl_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.3.2 Light HSL Set
+ HSL Lightness: 2B The target value of the Light HSL Lightness state
+ HSL Hue: 2B The target value of the Light HSL Hue state
+ HSL Saturation: 2B The target value of the Light HSL Saturation 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)
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_Hsl_Set_Ack Client Message \r\n");
+ pLightHsl_param[6] = Model_Tid.TidSend;
+ msg_buff = pLightHsl_param;
+ ack_flag = MOBLE_TRUE;
+ msg_opcode = LIGHT_HSL_SET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_HSL_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+ /*
+ Manage the TID
+ */
+ Model_Tid.TidSend++;
+ if(Model_Tid.TidSend >= MAX_TID_VALUE)
+ {
+ Model_Tid.TidSend = 0;
+ }
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_Hsl_Set_Unack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightHsl_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Hsl_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightHsl_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.3.3 Light HSL Set Unacknowleged
+ HSL Lightness: 2B The target value of the Light HSL Lightness state
+ HSL Hue: 2B The target value of the Light HSL Hue state
+ HSL Saturation: 2B The target value of the Light HSL Saturation 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)
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_Hsl_Set_Ack Client Message \r\n");
+ pLightHsl_param[6] = Model_Tid.TidSend;
+ msg_buff = pLightHsl_param;
+ ack_flag = MOBLE_FALSE;
+ msg_opcode = LIGHT_HSL_SET_UNACK;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_HSL_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+ /*
+ Manage the TID
+ */
+ Model_Tid.TidSend++;
+ if(Model_Tid.TidSend >= MAX_TID_VALUE)
+ {
+ Model_Tid.TidSend = 0;
+ }
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_Hsl_Default_Get: This function is called to send Light HSL Default Get message
+* @param elementIndex : Index of the element
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Hsl_Default_Get(MOBLEUINT8 elementIndex)
+{
+ /*
+ 6.3.3.15 Light HSL Default Get
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 msg_opcode;
+ MOBLEUINT8 const *msg_buff = NULL;
+ MOBLEBOOL ack_flag = MOBLE_TRUE;
+
+ TRACE_M(TF_LIGHT_CLIENT_M, "LightClient_Hsl_Default_Get Client Message \r\n");
+
+ msg_opcode = LIGHT_HSL_DEFAULT_GET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_HSL_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, 0,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+
+/**
+* @brief LightClient_Hsl_Default_Set_Ack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightHslDefault_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Hsl_Default_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightHslDefault_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.3.16 Light HSL Default Set
+ Lightness: 2B The value of the Light HSL Lightness Default state
+ Hue: 2B The value of the Light HSL Hue Default state
+ Saturation: 2B The value of the Light HSL Saturation Default state
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_Hsl_Default_Set_Ack Client Message \r\n");
+ msg_buff = pLightHslDefault_param;
+ ack_flag = MOBLE_TRUE;
+ msg_opcode = LIGHT_HSL_DEFAULT_SET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_HSL_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_Hsl_Default_Set_Unack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightHslDefault_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Hsl_Default_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightHslDefault_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.3.17 Light HSL Default Set Unacknowleged
+ Lightness: 2B The value of the Light HSL Lightness Default state
+ Hue: 2B The value of the Light HSL Hue Default state
+ Saturation: 2B The value of the Light HSL Saturation Default state
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_Hsl_Default_Set_Unack Client Message \r\n");
+ msg_buff = pLightHslDefault_param;
+ ack_flag = MOBLE_FALSE;
+ msg_opcode = LIGHT_HSL_DEFAULT_SET_UNACK;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_HSL_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_Hsl_Range_Get: This function is called to send Light HSL Range Get message
+* @param elementIndex : Index of the element
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Hsl_Range_Get(MOBLEUINT8 elementIndex)
+{
+ /*
+ 6.3.3.19 Light HSL Range Get
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 msg_opcode;
+ MOBLEUINT8 const *msg_buff = NULL;
+ MOBLEBOOL ack_flag = MOBLE_TRUE;
+
+ TRACE_M(TF_LIGHT_CLIENT_M, "LightClient_Hsl_Range_Get Client Message \r\n");
+
+ msg_opcode = LIGHT_HSL_RANGE_GET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_HSL_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, 0,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_Hsl_Range_Set_Ack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightHslRange_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Hsl_Range_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightHslRange_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.3.20 Light HSL Range Set
+ Hue Range Min: 2B The value of the Hue Range Min field of the Light HSL Hue Range state
+ Hue Range Max: 2B The value of the Hue Range Max field of the Light HSL Hue Range state
+ Saturation Range Min: 2B The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ Saturation Range Max: 2B The value of the Saturation Range Max field of the Light HSL Saturation Range state
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_Hsl_Range_Set_Ack Client Message \r\n");
+ msg_buff = pLightHslRange_param;
+ ack_flag = MOBLE_TRUE;
+ msg_opcode = LIGHT_HSL_RANGE_SET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_HSL_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_Hsl_Range_Set_Unack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightHslRange_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Hsl_Range_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightHslRange_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.3.21 Light HSL Range Set Unacknowleged
+ Hue Range Min: 2B The value of the Hue Range Min field of the Light HSL Hue Range state
+ Hue Range Max: 2B The value of the Hue Range Max field of the Light HSL Hue Range state
+ Saturation Range Min: 2B The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ Saturation Range Max: 2B The value of the Saturation Range Max field of the Light HSL Saturation Range state
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_Hsl_Range_Set_Unack Client Message \r\n");
+ msg_buff = pLightHslRange_param;
+ ack_flag = MOBLE_FALSE;
+ msg_opcode = LIGHT_HSL_RANGE_SET_UNACK;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_HSL_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_Hsl_Hue_Get: This function is called to send Light HSL Hue Get message
+* @param elementIndex : Index of the element
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Hsl_Hue_Get(MOBLEUINT8 elementIndex)
+{
+ /*
+ 6.3.3.7 Light HSL Hue Get
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 msg_opcode;
+ MOBLEUINT8 const *msg_buff = NULL;
+ MOBLEBOOL ack_flag = MOBLE_TRUE;
+
+ TRACE_M(TF_LIGHT_CLIENT_M, "LightClient_Hsl_Hue_Get Client Message \r\n");
+
+ msg_opcode = LIGHT_HSL_HUE_GET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_HSL_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, 0,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_Hsl_Hue_Set_Ack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightHslHue_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Hsl_Hue_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightHslHue_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.3.8 Light HSL Hue Set
+ HSL Hue: 2B The target value of the Light HSL Hue 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)
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_Hsl_Hue_Set_Ack Client Message \r\n");
+ pLightHslHue_param[2] = Model_Tid.TidSend;
+ msg_buff = pLightHslHue_param;
+ ack_flag = MOBLE_TRUE;
+ msg_opcode = LIGHT_HSL_HUE_SET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_HSL_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+ /*
+ Manage the TID
+ */
+ Model_Tid.TidSend++;
+ if(Model_Tid.TidSend >= MAX_TID_VALUE)
+ {
+ Model_Tid.TidSend = 0;
+ }
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_Hsl_Hue_Set_Unack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightHslHue_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Hsl_Hue_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightHslHue_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.3.9 Light HSL Hue Set Unacknowleged
+ HSL Hue: 2B The target value of the Light HSL Hue 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)
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_Hsl_Hue_Set_Unack Client Message \r\n");
+ pLightHslHue_param[2] = Model_Tid.TidSend;
+ msg_buff = pLightHslHue_param;
+ ack_flag = MOBLE_FALSE;
+ msg_opcode = LIGHT_HSL_HUE_SET_UNACK;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_HSL_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+
+ /*
+ Manage the TID
+ */
+ Model_Tid.TidSend++;
+ if(Model_Tid.TidSend >= MAX_TID_VALUE)
+ {
+ Model_Tid.TidSend = 0;
+ }
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+
+
+
+
+
+
+
+/**
+* @brief LightClient_Hsl_Saturation_Get: This function is called to send Light HSL Saturation Get message
+* @param elementIndex : Index of the element
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Hsl_Saturation_Get(MOBLEUINT8 elementIndex)
+{
+ /*
+ 6.3.3.11 Light HSL Saturation Get
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 msg_opcode;
+ MOBLEUINT8 const *msg_buff = NULL;
+ MOBLEBOOL ack_flag = MOBLE_TRUE;
+
+ TRACE_M(TF_LIGHT_CLIENT_M, "LightClient_Hsl_Saturation_Get Client Message \r\n");
+
+ msg_opcode = LIGHT_HSL_SATURATION_GET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_HSL_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, 0,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_Hsl_Saturation_Set_Ack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightHslSaturation_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Hsl_Saturation_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightHslSaturation_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.3.8 Light HSL Saturation Set
+ HSL Saturation: 2B The target value of the Light HSL Saturation 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)
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_Hsl_Saturation_Set_Ack Client Message \r\n");
+ pLightHslSaturation_param[2] = Model_Tid.TidSend;
+ msg_buff = pLightHslSaturation_param;
+ ack_flag = MOBLE_TRUE;
+ msg_opcode = LIGHT_HSL_SATURATION_SET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_HSL_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+ /*
+ Manage the TID
+ */
+ Model_Tid.TidSend++;
+ if(Model_Tid.TidSend >= MAX_TID_VALUE)
+ {
+ Model_Tid.TidSend = 0;
+ }
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_Hsl_Saturation_Set_Unack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightHslSaturation_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_Hsl_Saturation_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightHslSaturation_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.3.9 Light HSL Saturation Set Unacknowleged
+ HSL Saturation: 2B The target value of the Light HSL Saturation 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)
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_Hsl_Saturation_Set_Unack Client Message \r\n");
+ pLightHslSaturation_param[2] = Model_Tid.TidSend;
+ msg_buff = pLightHslSaturation_param;
+ ack_flag = MOBLE_FALSE;
+ msg_opcode = LIGHT_HSL_SATURATION_SET_UNACK;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_HSL_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+
+ /*
+ Manage the TID
+ */
+ Model_Tid.TidSend++;
+ if(Model_Tid.TidSend >= MAX_TID_VALUE)
+ {
+ Model_Tid.TidSend = 0;
+ }
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/******************************************************************************/
+#endif /* ENABLE_LIGHT_MODEL_CLIENT_HSL */
+/******************************************************************************/
+
+
+/******************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_LC
+/******************************************************************************/
+/**
+* @brief LightClient_LC_Mode_Get: This function is called to send Light CTL Get message
+* @param elementIndex : Index of the element
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_LC_Mode_Get(MOBLEUINT8 elementIndex)
+{
+ /*
+ 6.3.5.1.1 Light LC Mode Get
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 msg_opcode;
+ MOBLEUINT8 const *msg_buff = NULL;
+ MOBLEBOOL ack_flag = MOBLE_TRUE;
+
+ TRACE_M(TF_LIGHT_CLIENT_M, "LightClient_LC_Mode_Get Client Message \r\n");
+
+ msg_opcode = LIGHT_LC_MODE_GET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_LC_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, 0,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+
+/**
+* @brief LightClient_LC_Mode_Set_Ack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightLCMode_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_LC_Mode_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightLCMode_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.5.1.2 Light LC Mode Set
+ Mode: 1B The target value of the Light LC Mode state
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_LC_Mode_Set_Ack Client Message \r\n");
+
+ msg_buff = pLightLCMode_param;
+ ack_flag = MOBLE_TRUE;
+ msg_opcode = LIGHT_LC_MODE_SET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_LC_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_LC_Mode_Set_Unack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightLCMode_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_LC_Mode_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightLCMode_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.5.1.3 Light LC Mode Set Unacknowledged
+ Mode: 1B The target value of the Light LC Mode state
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_LC_Mode_Set_Unack Client Message \r\n");
+
+ msg_buff = pLightLCMode_param;
+ ack_flag = MOBLE_FALSE;
+ msg_opcode = LIGHT_LC_MODE_SET_UNACK;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_LC_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+/**
+* @brief LightClient_LC_OM_Get: This function is called to send Light CTL Get message
+* @param elementIndex : Index of the element
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_LC_OM_Get(MOBLEUINT8 elementIndex)
+{
+ /*
+ 6.3.5.2.1 Light LC OM Get
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 msg_opcode;
+ MOBLEUINT8 const *msg_buff = NULL;
+ MOBLEBOOL ack_flag = MOBLE_TRUE;
+
+ TRACE_M(TF_LIGHT_CLIENT_M, "LightClient_LC_OM_Get Client Message \r\n");
+
+ msg_opcode = LIGHT_LC_OM_GET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_LC_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, 0,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_LC_OM_Set_Ack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightLCOccupancyMode_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_LC_OM_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightLCOccupancyMode_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.5.2.2 Light LC Mode Set
+ Mode: 1B The target value of the Light LC Occupancy Mode state
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_LC_OM_Set_Ack Client Message \r\n");
+
+ msg_buff = pLightLCOccupancyMode_param;
+ ack_flag = MOBLE_TRUE;
+ msg_opcode = LIGHT_LC_OM_SET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_LC_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_LC_OM_Set_Unack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightLCOccupancyMode_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_LC_OM_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightLCOccupancyMode_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.5.2.3 Light LC Mode Set Unacknowledged
+ Mode: 1B The target value of the Light LC Occupancy Mode state
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_LC_OM_Set_Unack Client Message \r\n");
+
+ msg_buff = pLightLCOccupancyMode_param;
+ ack_flag = MOBLE_FALSE;
+ msg_opcode = LIGHT_LC_OM_SET_UNACK;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_LC_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_LC_OnOff_Get: This function is called to send Light CTL Get message
+* @param elementIndex : Index of the element
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_LC_OnOff_Get(MOBLEUINT8 elementIndex)
+{
+ /*
+ 6.3.5.3.1 Light LC Light OnOff Get
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 msg_opcode;
+ MOBLEUINT8 const *msg_buff = NULL;
+ MOBLEBOOL ack_flag = MOBLE_TRUE;
+
+ TRACE_M(TF_LIGHT_CLIENT_M, "LightClient_LC_OnOff_Get Client Message \r\n");
+
+ msg_opcode = LIGHT_LC_ON_OFF_GET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_LC_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, 0,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_LC_OnOff_Set_Ack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightLCOnOff_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_LC_OnOff_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightLCOnOff_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.5.3.2 Light LC Light OnOff Set
+ Light OnOff: 1B The target value of the Light LC Light OnOff state
+ TID: 1B Transaction Identifier
+ Transition Time: 1B Format as defined in Section 3.1.3.
+ Delay: 1B Message execution delay in 5 millisecond steps
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_LC_OnOff_Set_Ack Client Message \r\n");
+ pLightLCOnOff_param[1] = Model_Tid.TidSend;
+ msg_buff = pLightLCOnOff_param;
+ ack_flag = MOBLE_TRUE;
+ msg_opcode = LIGHT_LC_ON_OFF_SET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_LC_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+ /*
+ Manage the TID
+ */
+ Model_Tid.TidSend++;
+ if(Model_Tid.TidSend >= MAX_TID_VALUE)
+ {
+ Model_Tid.TidSend = 0;
+ }
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_LC_OnOff_Set_Unack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightLCOnOff_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_LC_OnOff_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightLCOnOff_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.5.3.3 Light LC Light OnOff Set Unacknowledged
+ Light OnOff: 1B The target value of the Light LC Light OnOff state
+ TID: 1B Transaction Identifier
+ Transition Time: 1B Format as defined in Section 3.1.3.
+ Delay: 1B Message execution delay in 5 millisecond steps
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_LC_OnOff_Set_Unack Client Message \r\n");
+ pLightLCOnOff_param[1] = Model_Tid.TidSend;
+ msg_buff = pLightLCOnOff_param;
+ ack_flag = MOBLE_FALSE;
+ msg_opcode = LIGHT_LC_ON_OFF_SET_UNACK;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_LC_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+ /*
+ Manage the TID
+ */
+ Model_Tid.TidSend++;
+ if(Model_Tid.TidSend >= MAX_TID_VALUE)
+ {
+ Model_Tid.TidSend = 0;
+ }
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+/**
+* @brief LightClient_LC_Property_Get: This function is called to send Light CTL Get message
+* @param elementIndex : Index of the element
+* @param pPropertyID : Property ID identifying a Light LC Property
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_LC_Property_Get(MOBLEUINT8 elementIndex, MOBLEUINT8 *pPropertyID)
+{
+ /*
+ 6.3.6.1 Light LC Property Get
+ Light LC Property ID: 2B Property ID identifying a Light LC Property.
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 msg_opcode;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEBOOL ack_flag = MOBLE_TRUE;
+
+ msg_buff = pPropertyID;
+ TRACE_M(TF_LIGHT_CLIENT_M, "LightClient_LC_Property_Get Client Message \r\n");
+
+ msg_opcode = LIGHT_LC_PROPERTY_GET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_LC_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, 2,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_LC_Property_Set_Ack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightLCProperty_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_LC_Property_Set_Ack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightLCProperty_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.6.2 Light LC Property Set
+ Light LC Property ID: 2B Property ID identifying a Light LC Property.
+ Light LC Property Value: [Variable] Raw value for the Light LC Property
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_LC_Property_Set_Ack Client Message \r\n");
+ msg_buff = pLightLCProperty_param;
+ ack_flag = MOBLE_TRUE;
+ msg_opcode = LIGHT_LC_PROPERTY_SET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_LC_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief LightClient_LC_Property_Set_Unack: This function is called for Acknowledged message
+* @param elementIndex: Index of the element
+* @param pLightLCProperty_param: pointer to the parameters received for message
+* @param length:length of the data received
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT LightClient_LC_Property_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pLightLCProperty_param,
+ MOBLEUINT32 length)
+
+{
+/*
+ 6.3.6.3 Light LC Property Set Unacknowledged
+ Light LC Property ID: 2B Property ID identifying a Light LC Property.
+ Light LC Property Value: [Variable] Raw value for the Light LC Property
+*/
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightClient_LC_Property_Set_Unack Client Message \r\n");
+ msg_buff = pLightLCProperty_param;
+ ack_flag = MOBLE_FALSE;
+ msg_opcode = LIGHT_LC_PROPERTY_SET_UNACK;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) LIGHT_LC_CLIENT_MODEL_ID,
+ elementIndex,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+ if(result)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+
+/******************************************************************************/
+#endif /* ENABLE_LIGHT_MODEL_CLIENT_LC */
+/******************************************************************************/
+
/**
* @brief LightModelClient_GetOpcodeTableCb: This function is call-back
@@ -160,9 +2444,8 @@ MOBLE_RESULT LightModelClient_GetOpcodeTableCb(const MODEL_OpcodeTableParam_t **
/**
* @brief LightModelClient_GetStatusRequestCb : This function is call-back
* 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
+* @param *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* @param opcode: Received opcode of the Status message callback
* @param pResponsedata: Pointer to the buffer to be updated with status
* @param plength: Pointer to the Length of the data, to be updated by application
@@ -171,8 +2454,7 @@ MOBLE_RESULT LightModelClient_GetOpcodeTableCb(const MODEL_OpcodeTableParam_t **
* @param response: Value to indicate wheather message is acknowledged meassage or not.
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT LightModelClient_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+MOBLE_RESULT LightModelClient_GetStatusRequestCb(MODEL_MessageHeader_t *pmsgParam,
MOBLEUINT16 opcode,
MOBLEUINT8 *pResponsedata,
MOBLEUINT32 *plength,
@@ -186,13 +2468,11 @@ MOBLE_RESULT LightModelClient_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
return MOBLE_RESULT_SUCCESS;
}
-
/**
* @brief LightModelClient_ProcessMessageCb: This is a callback function from
* 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
+* @param *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* @param opcode: Received opcode of the Status message callback
* @param pData: Pointer to the buffer to be updated with status
* @param length: Length of the parameters received
@@ -202,8 +2482,7 @@ MOBLE_RESULT LightModelClient_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
* @param response: Value to indicate wheather message is acknowledged meassage or not.
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT LightModelClient_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+MOBLE_RESULT LightModelClient_ProcessMessageCb(MODEL_MessageHeader_t *pmsgParam,
MOBLEUINT16 opcode,
MOBLEUINT8 const *pRxData,
MOBLEUINT32 dataLength,
@@ -212,88 +2491,116 @@ MOBLE_RESULT LightModelClient_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
- //tClockTime delay_t = Clock_Time();
-
- TRACE_M(TF_LIGHT_CLIENT_M,"dst_peer = %.2X , peer_add = %.2X, opcode= %.2X ,response= %.2X \r\n ",
- dst_peer, peer_addr, opcode , response);
+// tClockTime delay_t = Clock_Time();
+// MOBLEUINT8 elementIndex = BLEMesh_ModelsGetElementIndex(pmsgParam->dst_peer);
+
+ TRACE_M(TF_LIGHT_CLIENT_M,
+ "elementIndex = %.2x, dst_peer = %.2X , peer_add = %.2X, opcode= %.2X ,response= %.2X\r\n",
+ pmsgParam->elementIndex,
+ pmsgParam->dst_peer,
+ pmsgParam->peer_addr,
+ opcode,
+ response);
switch(opcode)
{
case LIGHT_LIGHTNESS_STATUS:
{
- Light_Client_Lightness_Status(pRxData, dataLength);
+ Light_Client_Lightness_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
case LIGHT_LIGHTNESS_LINEAR_STATUS:
{
- Light_Client_Lightness_Linear_Status(pRxData, dataLength);
+ Light_Client_Lightness_Linear_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
case LIGHT_LIGHTNESS_LAST_STATUS:
{
- Light_Client_Lightness_Last_Status(pRxData, dataLength);
+ Light_Client_Lightness_Last_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
case LIGHT_LIGHTNESS_DEFAULT_STATUS:
{
- Light_Client_Lightness_Default_Status(pRxData, dataLength);
+ Light_Client_Lightness_Default_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
case LIGHT_LIGHTNESS_RANGE_STATUS:
{
- Light_Client_Lightness_Range_Status(pRxData, dataLength);
+ Light_Client_Lightness_Range_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
case LIGHT_CTL_STATUS:
{
- Light_Client_Ctl_Status(pRxData, dataLength);
+ Light_Client_Ctl_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
case LIGHT_CTL_TEMPERATURE_RANGE_STATUS:
{
- Light_Client_CtlTemperature_Range_Status(pRxData, dataLength);
+ Light_Client_CtlTemperature_Range_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
case LIGHT_CTL_TEMPERATURE_STATUS:
{
- Light_Client_CtlTemperature_Status(pRxData, dataLength);
+ Light_Client_CtlTemperature_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
case LIGHT_CTL_DEFAULT_STATUS:
{
- Light_Client_CtlDefault_Status(pRxData, dataLength);
+ Light_Client_CtlDefault_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
case LIGHT_HSL_HUE_STATUS:
{
- Light_Client_HslHue_Status(pRxData, dataLength);
+ Light_Client_HslHue_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
case LIGHT_HSL_SATURATION_STATUS:
{
- Light_Client_HslSaturation_Status(pRxData, dataLength);
+ Light_Client_HslSaturation_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
case LIGHT_HSL_STATUS:
{
- Light_Client_Hsl_Status(pRxData, dataLength);
+ Light_Client_Hsl_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
case LIGHT_HSL_TARGET_STATUS:
{
- Light_Client_HslTarget_Status(pRxData, dataLength);
+ Light_Client_HslTarget_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
case LIGHT_HSL_DEFAULT_STATUS:
{
- Light_Client_HslDefault_Status(pRxData, dataLength);
+ Light_Client_HslDefault_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
case LIGHT_HSL_RANGE_STATUS:
{
- Light_Client_HslRange_Status(pRxData, dataLength);
+ Light_Client_HslRange_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
+ break;
+ }
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_LC
+ case LIGHT_LC_MODE_STATUS:
+ {
+ LightLC_Client_Mode_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
break;
}
+ case LIGHT_LC_OM_STATUS:
+ {
+ LightLC_Client_OM_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
+ break;
+ }
+ case LIGHT_LC_ON_OFF_STATUS:
+ {
+ LightLC_Client_OnOff_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
+ break;
+ }
+ case LIGHT_LC_PROPERTY_STATUS:
+ {
+ LightLC_Client_Property_Status(pRxData, dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
+ break;
+ }
+#endif
default:
{
break;
@@ -302,7 +2609,7 @@ MOBLE_RESULT LightModelClient_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
if((result == MOBLE_RESULT_SUCCESS) && (response == MOBLE_TRUE))
{
- Model_SendResponse(peer_addr,dst_peer,opcode,pRxData,dataLength);
+ Model_SendResponse(pmsgParam, opcode, pRxData, dataLength);
}
return MOBLE_RESULT_SUCCESS;
@@ -316,5 +2623,5 @@ MOBLE_RESULT LightModelClient_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
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 b0149ab99..cd6453027 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
@@ -17,10 +17,12 @@
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
+#include "ble_const.h"
#include "hal_common.h"
#include "mesh_cfg.h"
#include "generic.h"
#include "light.h"
+#include "models_if.h"
#include "common.h"
#include "light_lc.h"
#include <string.h>
@@ -35,1558 +37,4193 @@
* @{
*/
-#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
-MOBLEUINT16 Get_LengthInByteProprtyValue(MOBLEUINT16 property_ID);
-#endif
-
-/* Private define ------------------------------------------------------------*/
-
-/* Private macro -------------------------------------------------------------*/
-
-/* Private variables ---------------------------------------------------------*/
-#ifdef ENABLE_LIGHT_MODEL_SERVER_LC_SETUP
-Lc_Event_e Lc_Event = LC_NO_EVENT;
+/* Private typedef -----------------------------------------------------------*/
+/**
+ * LC states enum
+ */
+typedef enum
+{
+ OFF = 0,
+ STANDBY,
+ POST_STANDBY,
+ PRE_FADE_ON,
+ FADE_ON,
+ RUN,
+ FADE,
+ PROLONG,
+ FADE_STANDBY_AUTO,
+ PRE_FADE_STANDBY_MANUAL,
+ FADE_STANDBY_MANUAL,
+} lc_state_e;
-Light_LC_States LightLC_States = {LC_STANDBY};
+/**
+ * LC events enum
+ */
+typedef enum
+{
+ NO_EVENT = 0,
+ MODE_OFF,
+ MODE_ON,
+ LIGHT_OFF,
+ LIGHT_ON,
+ OCCUPANCY_ON,
+ AMBIENT_LUX_MODIFIED,
+ PROPERTY_MODIFIED,
+ TIMER_ON,
+ TIMER_TRIGGER,
+ TIMER_OFF
+} lc_event_e;
-Light_LC_TimeParam_t Light_LC_TimeParam;
+/**
+ * LC property id structure
+ */
+typedef struct
+{
+ MOBLEUINT16 id;
+ MOBLEUINT8 size;
+ MOBLEUINT8 valueIndex;
+} light_lc_propertyId_t;
-Light_LC_Param_t Light_LC_Param;
+/**
+ * LC Server param structure
+ */
+typedef struct
+{
+ /* LC server callback reference */
+ const light_lc_cb_t* p_cb;
+ /* Reference to LC property Id table */
+ const light_lc_propertyId_t* pPropertyId;
+ /* LC property value table */
+ MOBLEUINT32 propertyValue[LC_PROPERTY_TABLE_COUNT];
+ /* LC TID struct */
+ tid_param_t lastMsgTidParams;
+ /* LC transition struct */
+ transition_params_t transitionParams;
+ /* Actual value to be multiplied with 0.01 */
+ MOBLEUINT32 ambientLuxLevel;
+ /* Light Level (Lux) out from state machine */
+ MOBLEUINT32 luxLevelOut;
+ /* Used to calculate intermediate lux value in transition */
+ MOBLEUINT32 initialLightLuxOut;
+ /* Used to caluculate intermediate lux value in transition */
+ MOBLEUINT32 targetLightLuxOut;
+ /* Last lightness update tick in PI regulator */
+ MOBLEUINT32 piLightnessUpdateTick;
+ /* Last internal sum in PI regulator */
+ MOBLEUINT16 piLastInternalSum;
+ /* Lightness Linear out not regulated with regulator */
+ MOBLEUINT16 lightnessLinearUnreg;
+ /* Used to calculate intermedicate lightness in transition */
+ MOBLEUINT16 initialLightnessOut;
+ /* Used to calculate intermediate lightness in transition */
+ MOBLEUINT16 targetLightnessOut;
+ /* Temporary variable for LC state machine */
+ MOBLEUINT16 lcActualSmOut;
+ /* LC linear out binded with instance of Light Lightness Linear */
+ MOBLEUINT16 lcLinearOut;
+ /* LC server element index, configured by mesh_cfg_usr.h */
+ MOBLEUINT8 elementIndex;
+ /* LC state machine current state */
+ lc_state_e state;
+ /* LC occupancy mode */
+ MOBLEUINT8 occupancyMode;
+ /* Temporary variable for LC state machine */
+ MOBLEUINT8 updateLcLinearOut;
+ /* LC OnOff status publish */
+ MOBLEUINT8 publish;
+ MOBLEUINT8 res[3];
+} lc_param_t;
-Light_LC_ModelFlag_t Light_LC_ModelFlag;
+/* Private define ------------------------------------------------------------*/
+#define LC_REGULATOR_ACCURACY_PID_SIZE 1
+#define LC_LIGHTNESS_ON_PID_SIZE 2
+#define LC_LIGHTNESS_PROLONG_PID_SIZE 2
+#define LC_LIGHTNESS_STANDBY_PID_SIZE 2
+#define LC_AMBIENT_LUXLEVEL_ON_PID_SIZE 3
+#define LC_AMBIENT_LUXLEVEL_PROLONG_PID_SIZE 3
+#define LC_AMBIENT_LUXLEVEL_STANDBY_PID_SIZE 3
+#define LC_TIME_FADE_PID_SIZE 3
+#define LC_TIME_FADE_ON_PID_SIZE 3
+#define LC_TIME_FADE_STANDBY_AUTO_PID_SIZE 3
+#define LC_TIME_FADE_STANDBY_MANUAL_PID_SIZE 3
+#define LC_TIME_OCCUPANCY_DELAY_PID_SIZE 3
+#define LC_TIME_PROLONG_PID_SIZE 3
+#define LC_TIME_RUN_ON_PID_SIZE 3
+#define LC_REGULATOR_KID_PID_SIZE 4
+#define LC_REGULATOR_KIU_PID_SIZE 4
+#define LC_REGULATOR_KPD_PID_SIZE 4
+#define LC_REGULATOR_KPU_PID_SIZE 4
-Light_LC_TemporaryStatus_t Light_LC_TemporaryStatus;
+#define LC_REGULATOR_ACCURACY_PID_INDEX 0
+#define LC_LIGHTNESS_ON_PID_INDEX 1
+#define LC_LIGHTNESS_PROLONG_PID_INDEX 2
+#define LC_LIGHTNESS_STANDBY_PID_INDEX 3
+#define LC_AMBIENT_LUXLEVEL_ON_PID_INDEX 4
+#define LC_AMBIENT_LUXLEVEL_PROLONG_PID_INDEX 5
+#define LC_AMBIENT_LUXLEVEL_STANDBY_PID_INDEX 6
+#define LC_TIME_FADE_PID_INDEX 7
+#define LC_TIME_FADE_ON_PID_INDEX 8
+#define LC_TIME_FADE_STANDBY_AUTO_PID_INDEX 9
+#define LC_TIME_FADE_STANDBY_MANUAL_PID_INDEX 10
+#define LC_TIME_OCCUPANCY_DELAY_PID_INDEX 11
+#define LC_TIME_PROLONG_PID_INDEX 12
+#define LC_TIME_RUN_ON_PID_INDEX 13
+#define LC_REGULATOR_KID_PID_INDEX 14
+#define LC_REGULATOR_KIU_PID_INDEX 15
+#define LC_REGULATOR_KPD_PID_INDEX 16
+#define LC_REGULATOR_KPU_PID_INDEX 17
-//extern Light_PublishOpcodeList_t Light_PublishOpcodeList;
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
-MOBLEUINT8 Light_LC_UpdateFlag = 0;
-MOBLEUINT32 Timer_value;
-extern MOBLEUINT8 TidSend;
-extern MOBLE_ADDRESS Dst_Peer;
-#endif
+lc_param_t* LcServerP = NULL;
MODEL_OpcodeTableParam_t Light_LC_Opcodes_Table[] = {
-/* model_id opcode reliable min_payload_size max_payload_size response_opcode min_response_size max_response_size */
-#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, 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, 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, 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_CLIENT_LC
- {LIGHT_MODEL_CLIENT_LC_MODEL_ID, LIGHT_LC_MODE_GET, MOBLE_TRUE, 0, 0, LIGHT_LC_MODE_STATUS , 1, 1},
- {LIGHT_MODEL_CLIENT_LC_MODEL_ID, LIGHT_LC_MODE_SET, MOBLE_TRUE, 1, 1, LIGHT_LC_MODE_STATUS , 1, 1},
- {LIGHT_MODEL_CLIENT_LC_MODEL_ID, LIGHT_LC_MODE_SET_UNACK, MOBLE_FALSE, 1, 1, LIGHT_LC_MODE_STATUS , 1, 1},
- {LIGHT_MODEL_CLIENT_LC_MODEL_ID, LIGHT_LC_MODE_STATUS, MOBLE_FALSE, 1, 1, 0 , 1, 1},
- {LIGHT_MODEL_CLIENT_LC_MODEL_ID, LIGHT_LC_OM_GET, MOBLE_TRUE, 0, 0, LIGHT_LC_OM_STATUS , 1, 1},
- {LIGHT_MODEL_CLIENT_LC_MODEL_ID, LIGHT_LC_OM_SET, MOBLE_TRUE, 1, 1, LIGHT_LC_OM_STATUS , 1, 1},
- {LIGHT_MODEL_CLIENT_LC_MODEL_ID, LIGHT_LC_OM_SET_UNACK, MOBLE_FALSE, 1, 1, LIGHT_LC_OM_STATUS , 1, 1},
- {LIGHT_MODEL_CLIENT_LC_MODEL_ID, LIGHT_LC_OM_STATUS, MOBLE_FALSE, 1, 1, 0 , 1, 1},
- {LIGHT_MODEL_CLIENT_LC_MODEL_ID, LIGHT_LC_ON_OFF_GET, MOBLE_TRUE, 0, 0, LIGHT_LC_ON_OFF_STATUS, 1, 3},
- {LIGHT_MODEL_CLIENT_LC_MODEL_ID, LIGHT_LC_ON_OFF_SET, MOBLE_TRUE, 2, 4, LIGHT_LC_ON_OFF_STATUS, 1, 3},
- {LIGHT_MODEL_CLIENT_LC_MODEL_ID, LIGHT_LC_ON_OFF_SET_UNACK, MOBLE_FALSE, 2, 4, LIGHT_LC_ON_OFF_STATUS, 1, 3},
- {LIGHT_MODEL_CLIENT_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, 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
+/* model_id opcode reliable min_payload_size max_payload_size response_opcode min_response_size max_response_size */
+ {LIGHT_LC_SERVER_MODEL_ID, LIGHT_LC_MODE_GET, MOBLE_TRUE, 0, 0, LIGHT_LC_MODE_STATUS , 1, 1},
+ {LIGHT_LC_SERVER_MODEL_ID, LIGHT_LC_MODE_SET, MOBLE_TRUE, 1, 1, LIGHT_LC_MODE_STATUS , 1, 1},
+ {LIGHT_LC_SERVER_MODEL_ID, LIGHT_LC_MODE_SET_UNACK, MOBLE_FALSE, 1, 1, LIGHT_LC_MODE_STATUS , 1, 1},
+ {LIGHT_LC_SERVER_MODEL_ID, LIGHT_LC_MODE_STATUS, MOBLE_FALSE, 1, 1, 0 , 1, 1},
+ {LIGHT_LC_SERVER_MODEL_ID, LIGHT_LC_OM_GET, MOBLE_TRUE, 0, 0, LIGHT_LC_OM_STATUS , 1, 1},
+ {LIGHT_LC_SERVER_MODEL_ID, LIGHT_LC_OM_SET, MOBLE_TRUE, 1, 1, LIGHT_LC_OM_STATUS , 1, 1},
+ {LIGHT_LC_SERVER_MODEL_ID, LIGHT_LC_OM_SET_UNACK, MOBLE_FALSE, 1, 1, LIGHT_LC_OM_STATUS , 1, 1},
+ {LIGHT_LC_SERVER_MODEL_ID, LIGHT_LC_OM_STATUS, MOBLE_FALSE, 1, 1, 0 , 1, 1},
+ {LIGHT_LC_SERVER_MODEL_ID, LIGHT_LC_ON_OFF_GET, MOBLE_TRUE, 0, 0, LIGHT_LC_ON_OFF_STATUS, 1, 3},
+ {LIGHT_LC_SERVER_MODEL_ID, LIGHT_LC_ON_OFF_SET, MOBLE_TRUE, 2, 4, LIGHT_LC_ON_OFF_STATUS, 1, 3},
+ {LIGHT_LC_SERVER_MODEL_ID, LIGHT_LC_ON_OFF_SET_UNACK, MOBLE_FALSE, 2, 4, LIGHT_LC_ON_OFF_STATUS, 1, 3},
+ {LIGHT_LC_SERVER_MODEL_ID, LIGHT_LC_ON_OFF_STATUS, MOBLE_FALSE, 1, 3, 0 , 1, 3},
+
+ {LIGHT_LC_SETUP_SERVER_MODEL_ID, LIGHT_LC_PROPERTY_GET, MOBLE_TRUE, 2, 2, LIGHT_LC_PROPERTY_STATUS, 2, 10},
+ {LIGHT_LC_SETUP_SERVER_MODEL_ID, LIGHT_LC_PROPERTY_SET, MOBLE_TRUE, 2, 10, LIGHT_LC_PROPERTY_STATUS, 2, 10},
+ {LIGHT_LC_SETUP_SERVER_MODEL_ID, LIGHT_LC_PROPERTY_SET_UNACK, MOBLE_FALSE, 2, 10, LIGHT_LC_PROPERTY_STATUS, 2, 10},
+ {LIGHT_LC_SETUP_SERVER_MODEL_ID, LIGHT_LC_PROPERTY_STATUS, MOBLE_FALSE, 2, 10, 0 , 2, 10},
{0}
};
-/* This table is structure consisting structures of array, this has parameters LC
- Property and Lc Property value.
- Table has 4 structures depending on the data type.
+/*
+ Light LC property table
+ Property ID
+ Property Size - one byte, two byte, three byte or four byte
+ Property index within table
+ Table is shared for all elements, only property values would be different
*/
-Light_Property_Table_t Light_Property_Table = {
-
+const light_lc_propertyId_t LC_PropertyId[LC_PROPERTY_TABLE_COUNT] =
+{
+ {
+ LIGHT_CONTROL_REGULATOR_ACCURACY_PID,
+ LC_REGULATOR_ACCURACY_PID_SIZE,
+ LC_REGULATOR_ACCURACY_PID_INDEX
+ },
+ {
+ LIGHT_CONTROL_LIGHTNESS_ON_PID,
+ LC_LIGHTNESS_ON_PID_SIZE,
+ LC_LIGHTNESS_ON_PID_INDEX
+ },
+ {
+ LIGHT_CONTROL_LIGHTNESS_PROLONG_PID,
+ LC_LIGHTNESS_PROLONG_PID_SIZE,
+ LC_LIGHTNESS_PROLONG_PID_INDEX
+ },
+ {
+ LIGHT_CONTROL_LIGHTNESS_STANDBY_PID,
+ LC_LIGHTNESS_STANDBY_PID_SIZE,
+ LC_LIGHTNESS_STANDBY_PID_INDEX
+ },
+ {
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_ON_PID,
+ LC_AMBIENT_LUXLEVEL_ON_PID_SIZE,
+ LC_AMBIENT_LUXLEVEL_ON_PID_INDEX
+ },
+ {
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_PROLONG_PID,
+ LC_AMBIENT_LUXLEVEL_PROLONG_PID_SIZE,
+ LC_AMBIENT_LUXLEVEL_PROLONG_PID_INDEX
+ },
+ {
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_STANDBY_PID,
+ LC_AMBIENT_LUXLEVEL_STANDBY_PID_SIZE,
+ LC_AMBIENT_LUXLEVEL_STANDBY_PID_INDEX
+ },
{
- /* regulator accxuracy id which is 8 bit value */
- { LIGHT_CONTROL_REGULATOR_ACCURACY_ID , LIGHT_CONTROL_REGULATOR_ACCURACY_VALUE},
+ LIGHT_CONTROL_TIME_FADE_PID,
+ LC_TIME_FADE_PID_SIZE,
+ LC_TIME_FADE_PID_INDEX
},
{
- /*structure consist of Lc Property value of data type 16 bit */
- {LIGHT_CONTROL_LIGHTNESS_ON_ID , LIGHT_CONTROL_LIGHTNESS_ON_VALUE},
- {LIGHT_CONTROL_LIGHTNESS_PROLONG_ID , LIGHT_CONTROL_LIGHTNESS_PROLONG_VALUE},
- {LIGHT_CONTROL_LIGHTNESS_STANDBY_ID , LIGHT_CONTROL_LIGHTNESS_STANDBY_VALUE},
+ LIGHT_CONTROL_TIME_FADE_ON_PID,
+ LC_TIME_FADE_ON_PID_SIZE,
+ LC_TIME_FADE_ON_PID_INDEX
},
{
- /*structure consist of Lc Property value of Maximum range of data 24 bit */
- {LIGHT_CONTROL_LUX_LEVEL_ON_ID ,LIGHT_CONTROL_AMBIENT_LUXLEVEL_ON},
- {LIGHT_CONTROL_LUX_LEVEL_PROLONG_ID ,LIGHT_CONTROL_AMBIENT_LUXLEVEL_PROLONG} ,
- {LIGHT_CONTROL_LUX_LEVEL_STANDBY_ID ,LIGHT_CONTROL_AMBIENT_LUXLEVEL_STANDBY},
- {LIGHT_CONTROL_TIME_FADE_ID ,LIGHT_CONTROL_TIME_FADE_VALUE},
- {LIGHT_CONTROL_TIME_FADE_ON_ID ,LIGHT_CONTROL_TIME_FADE_ON_VALUE},
- {LIGHT_CONTROL_TIME_FADE_STANDBY_AUTO_ID ,LIGHT_CONTROL_TIME_FADE_STANDBY_AUTO_VALUE},
- {LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL_ID ,LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL_VALUE},
- {LIGHT_CONTROL_TIME_PROLONG_ID ,LIGHT_CONTROL_TIME_PROLONG_VALUE},
- {LIGHT_CONTROL_TIME_RUN_ON_ID ,LIGHT_CONTROL_TIME_RUN_ON_VALUE},
+ LIGHT_CONTROL_TIME_FADE_STANDBY_AUTO_PID,
+ LC_TIME_FADE_STANDBY_AUTO_PID_SIZE,
+ LC_TIME_FADE_STANDBY_AUTO_PID_INDEX
},
{
- /*structure consist of Lc Property value of data type float. */
- {LIGHT_CONTROL_REGULATOR_KID_ID ,LIGHT_CONTROL_KID},
- {LIGHT_CONTROL_REGULATOR_KIU_ID ,LIGHT_CONTROL_KIU} ,
- {LIGHT_CONTROL_REGULATOR_KPD_ID ,LIGHT_CONTROL_KPD},
- {LIGHT_CONTROL_REGULATOR_KPU_ID ,LIGHT_CONTROL_KPU},
+ LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL_PID,
+ LC_TIME_FADE_STANDBY_MANUAL_PID_SIZE,
+ LC_TIME_FADE_STANDBY_MANUAL_PID_INDEX
},
+ {
+ LIGHT_CONTROL_TIME_OCCUPANCY_DELAY_PID,
+ LC_TIME_OCCUPANCY_DELAY_PID_SIZE,
+ LC_TIME_OCCUPANCY_DELAY_PID_INDEX
+ },
+ {
+ LIGHT_CONTROL_TIME_PROLONG_PID,
+ LC_TIME_PROLONG_PID_SIZE,
+ LC_TIME_PROLONG_PID_INDEX
+ },
+ {
+ LIGHT_CONTROL_TIME_RUN_ON_PID,
+ LC_TIME_RUN_ON_PID_SIZE,
+ LC_TIME_RUN_ON_PID_INDEX
+ },
+ {
+ LIGHT_CONTROL_REGULATOR_KID_PID,
+ LC_REGULATOR_KID_PID_SIZE,
+ LC_REGULATOR_KID_PID_INDEX
+ },
+ {
+ LIGHT_CONTROL_REGULATOR_KIU_PID,
+ LC_REGULATOR_KIU_PID_SIZE,
+ LC_REGULATOR_KIU_PID_INDEX
+ },
+ {
+ LIGHT_CONTROL_REGULATOR_KPD_PID,
+ LC_REGULATOR_KPD_PID_SIZE,
+ LC_REGULATOR_KPD_PID_INDEX
+ },
+ {
+ LIGHT_CONTROL_REGULATOR_KPU_PID,
+ LC_REGULATOR_KPU_PID_SIZE,
+ LC_REGULATOR_KPU_PID_INDEX
+ }
};
-
-#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+#else
+lc_param_t* LcServerP = NULL;
+const light_lc_propertyId_t* LC_PropertyId = NULL;
+const MODEL_OpcodeTableParam_t* Light_LC_Opcodes_Table = NULL;
+#endif /* ENABLE_LIGHT_MODEL_SERVER_LC */
+
+/* Private function prototypes -----------------------------------------------*/
+static
+MOBLE_RESULT Light_LC_ModeGet(lc_param_t* pLcParams,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 length,
+ MODEL_MessageHeader_t *pmsgParam);
+static
+MOBLE_RESULT Light_LC_ModeSet(lc_param_t* pLcParams,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 length,
+ MODEL_MessageHeader_t *pmsgParam);
+static
+MOBLE_RESULT Light_LC_ModeSetUnack(lc_param_t* pLcParams,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 length,
+ MODEL_MessageHeader_t *pmsgParam,
+ MOBLEUINT8 reply);
+static
+MOBLE_RESULT Light_LC_OmGet(lc_param_t* pLcParams,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 length,
+ MODEL_MessageHeader_t *pmsgParam);
+static
+MOBLE_RESULT Light_LC_OmSet(lc_param_t* pLcParams,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 length,
+ MODEL_MessageHeader_t *pmsgParam);
+static
+MOBLE_RESULT Light_LC_OmSetUnack(lc_param_t* pLcParams,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 length,
+ MODEL_MessageHeader_t *pmsgParam,
+ MOBLEUINT8 reply);
+static
+MOBLE_RESULT Light_LC_OnOffGet(lc_param_t* pLcParams,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 length,
+ MODEL_MessageHeader_t *pmsgParam);
+static
+MOBLE_RESULT Light_LC_OnOffSet(lc_param_t* pLcParams,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 length,
+ MODEL_MessageHeader_t *pmsgParam);
+static
+MOBLE_RESULT Light_LC_OnOffSetUnack(lc_param_t* pLcParams,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 length,
+ MODEL_MessageHeader_t *pmsgParam,
+ MOBLEUINT8 reply);
+static
+MOBLE_RESULT Light_LC_PropertyGet(lc_param_t* pLcParams,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 length,
+ MODEL_MessageHeader_t *pmsgParam);
+static
+MOBLE_RESULT Light_LC_PropertySet(lc_param_t* pLcParams,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 length,
+ MODEL_MessageHeader_t *pmsgParam);
+static
+MOBLE_RESULT Light_LC_PropertySetUnack(lc_param_t* pLcParams,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 length,
+ MODEL_MessageHeader_t *pmsgParam,
+ MOBLEUINT8 reply);
+static
+MOBLE_RESULT Light_LC_Fsm(lc_event_e event,
+ lc_param_t* pLcParams,
+ MOBLEUINT8 optionalParamsOnOffMsg,
+ MOBLEUINT32 delayMsOOnOD,
+ MOBLEUINT32 stepResMsOnOffMsg,
+ MOBLEUINT32 transitionTimeMsOnOffMsg);
+static
+MOBLE_RESULT Light_LC_PropertyValueGet(const light_lc_propertyId_t* pPropertyIdTable,
+ MOBLEUINT32* pPropertyValueTable,
+ MOBLEUINT16 propertyId,
+ MOBLEUINT8 propertyIndex,
+ MOBLEUINT32* value);
+static
+MOBLE_RESULT Light_LC_PropertyValueSet(const light_lc_propertyId_t* pPropertyIdTable,
+ MOBLEUINT32* pPropertyValueTable,
+ MOBLEUINT16 propertyId,
+ MOBLEUINT8 propertySize,
+ MOBLEUINT32 value);
+
+/* Extern function prototypes ------------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
/**
-* @brief Light_LC_ModeSet: This function is called for both Acknowledged and
-* unacknowledged message
-* @param lcMode_param: Pointer to the parameters received for message
-* @param length: Length of the parameters received for message
-* @retval MOBLE_RESULT
-*/
-MOBLE_RESULT Light_LC_ModeSet(MOBLEUINT8 const *lcMode_param, MOBLEUINT32 length)
-{
-
- TRACE_I(TF_LIGHT_LC_M, "Light_LC_ModeSet callback received \r\n");
-
- Light_LC_Param.LC_mode = lcMode_param[0];
-
- /* Application Callback */
- (LightLCAppli_cb.LightLC_Mode_Set_cb)(&Light_LC_Param , 0);
+ * @brief LightLcServer_GetOpcodeTableCb: This function is call-back
+ * from the library to send Model Opcode Table info to library
+ * @param MODEL_OpcodeTableParam_t: Pointer to the Generic Model opcode array
+ * @param length: Pointer to the Length of Generic Model opcode array
+ * @retval MOBLE_RESULT
+ */
+__weak
+MOBLE_RESULT LightLcServer_GetOpcodeTableCb(const MODEL_OpcodeTableParam_t **data,
+ MOBLEUINT16 *length)
+{
+ *data = Light_LC_Opcodes_Table;
+ *length = sizeof(Light_LC_Opcodes_Table)/sizeof(Light_LC_Opcodes_Table[0]);
return MOBLE_RESULT_SUCCESS;
}
+
/**
-* @brief Light_LC_ModeStatus
-* @param lcMode_status: Pointer to the status message, which needs to be updated
-* @param plength: Pointer to the Length of the Status message
-* @retval MOBLE_RESULT
-*/
-MOBLE_RESULT Light_LC_ModeStatus(MOBLEUINT8* lcMode_status, MOBLEUINT32 *plength)
+ * @brief LightLcServer_GetStatusRequestCb : This function is call-back
+ * from the library to send response to the message from peer
+ * @param pmsgParam: Pointer to structure of message header for parameters:
+ * elementIndex, src, dst addresses, TTL, RSSI, netkey & appkey Offset
+ * @param opcode: Received opcode of the Status message callback
+ * @param pResponsedata: Pointer to the buffer to be updated with status
+ * @param plength: Pointer to the Length of the data, to be updated by application
+ * @param pRxData: Pointer to the data received in packet.
+ * @param dataLength: length of the data in packet.
+ * @param response: Value to indicate wheather message is acknowledged meassage or not.
+ * @retval MOBLE_RESULT_SUCCESS
+ */
+__weak
+MOBLE_RESULT LightLcServer_GetStatusRequestCb(MODEL_MessageHeader_t *pmsgParam,
+ MOBLEUINT16 opcode,
+ MOBLEUINT8 *pResponsedata,
+ MOBLEUINT32 *plength,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 dataLength,
+ MOBLEBOOL response)
+
{
- MOBLEUINT8 LightLC_GetBuff[2];
- TRACE_I(TF_LIGHT_LC_M,"Light_LC_ModeStatus callback received \r\n");
- Appli_LightLC_GetStatus_cb.GetLightLC_ModeState_cb(LightLC_GetBuff);
-
- *lcMode_status = LightLC_GetBuff[0];
- *plength = 1;
- return MOBLE_RESULT_SUCCESS;
+ return MOBLE_RESULT_SUCCESS;
}
+
/**
-* @brief Light_LC_OMSet: This function is called for both Acknowledged and
-* unacknowledged message
-* @param lcOM_param: Pointer to the parameters received for message
-* @param length: Length of the parameters received for message
-* @retval MOBLE_RESULT
-*/
-MOBLE_RESULT Light_LC_OMSet(MOBLEUINT8 const *lcOM_param, MOBLEUINT32 length)
+ * @brief LightLcServer_ProcessMessageCb callback from access layer
+ * @param pmsgParams: message parameters
+ * @param opcode: message opcode
+ * @param pRxData: data received in packet
+ * @param dataLength: length of the data
+ * @param response: not applicable
+ * @retval MOBLE_RESULT as set by callee
+ */
+__weak
+MOBLE_RESULT LightLcServer_ProcessMessageCb(MODEL_MessageHeader_t *pmsgParam,
+ MOBLEUINT16 opcode,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 dataLength,
+ MOBLEBOOL response)
{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ lc_param_t* pLcParams = LcServerP; /* single instance of LC server supported */
- TRACE_I(TF_LIGHT_LC_M,"Light_LC_OMSet callback received \r\n");
-
- Light_LC_Param.LC_OM = lcOM_param[0];
-
- if(Light_LC_Param.LC_OM == 1)
+ if((pLcParams != NULL) && (pmsgParam->elementIndex == pLcParams->elementIndex))
{
- Lc_Event = LC_OCCUPANCY_ON;
+ result = MOBLE_RESULT_SUCCESS;
}
else
{
- Lc_Event = LC_OCCUPANCY_OFF;
+ TRACE_M(TF_LIGHT_LC_M, "LC server not supported on element %d", pmsgParam->elementIndex);
+ result = MOBLE_RESULT_FAIL;
}
- /* Application Callback */
- (LightLCAppli_cb.LightLC_OM_Set_cb)(&Light_LC_Param , 0);
+ if(MOBLE_FAILED(result))
+ {
+ /* TRACE_M(TF_LIGHT_LC_M, "Element with LC server not found\r\n"); */
+ }
+ else
+ {
+ switch(opcode)
+ {
+ case LIGHT_LC_MODE_GET:
+ result = Light_LC_ModeGet(pLcParams, pRxData, dataLength, pmsgParam);
+ break;
+ case LIGHT_LC_MODE_SET:
+ result = Light_LC_ModeSet(pLcParams, pRxData, dataLength, pmsgParam);
+ break;
+ case LIGHT_LC_MODE_SET_UNACK:
+ result = Light_LC_ModeSetUnack(pLcParams, pRxData, dataLength, pmsgParam, 0);
+ break;
+ case LIGHT_LC_OM_GET:
+ result = Light_LC_OmGet(pLcParams, pRxData, dataLength, pmsgParam);
+ break;
+ case LIGHT_LC_OM_SET:
+ result = Light_LC_OmSet(pLcParams, pRxData, dataLength, pmsgParam);
+ break;
+ case LIGHT_LC_OM_SET_UNACK:
+ result = Light_LC_OmSetUnack(pLcParams, pRxData, dataLength, pmsgParam, 0);
+ break;
+ case LIGHT_LC_ON_OFF_GET:
+ result = Light_LC_OnOffGet(pLcParams, pRxData, dataLength, pmsgParam);
+ break;
+ case LIGHT_LC_ON_OFF_SET:
+ result = Light_LC_OnOffSet(pLcParams, pRxData, dataLength, pmsgParam);
+ break;
+ case LIGHT_LC_ON_OFF_SET_UNACK:
+ result = Light_LC_OnOffSetUnack(pLcParams, pRxData, dataLength, pmsgParam, 0);
+ break;
+ case LIGHT_LC_PROPERTY_GET:
+ Light_LC_PropertyGet(pLcParams, pRxData, dataLength, pmsgParam);
+ break;
+ case LIGHT_LC_PROPERTY_SET:
+ Light_LC_PropertySet(pLcParams, pRxData, dataLength, pmsgParam);
+ break;
+ case LIGHT_LC_PROPERTY_SET_UNACK:
+ Light_LC_PropertySetUnack(pLcParams, pRxData, dataLength, pmsgParam, 0);
+ break;
+ default:
+ break;
+ }
+ }
- return MOBLE_RESULT_SUCCESS;
+ return result;
}
+
/**
-* @brief Light_LC_OMStatus
-* @param lcOM_status: Pointer to the status message, which needs to be updated
-* @param plength: Pointer to the Length of the Status message
-* @retval MOBLE_RESULT
-*/
-MOBLE_RESULT Light_LC_OMStatus(MOBLEUINT8* lcOM_status, MOBLEUINT32 *plength)
+ * @brief Light_LC_ModeStatus message as per model specification v1.0.1
+ * Sent in response of LC Mode Get, LC Mode Set or LC Mode SetUnack to
+ * publish group
+ * @param Reference to msg parameters
+ * @param LC mode
+ * @param status to be sent only to client or to be published or to do both
+ * @retval False if reply or publish not successful else success
+ */
+static
+MOBLE_RESULT Light_LC_ModeStatus(MODEL_MessageHeader_t *pmsgParam,
+ MOBLEUINT8 mode,
+ status_send_e statusSend)
{
- MOBLEUINT8 LightLC_GetBuff[2];
- TRACE_I(TF_LIGHT_LC_M,"Light_LC_OMStatus callback received \r\n");
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 dataBufLen = 0;
+ MOBLEUINT8 data[1];
+ MOBLE_ADDRESS srcElementAddr = BLEMesh_GetAddress() + pmsgParam->elementIndex;
+ MOBLE_ADDRESS dstAddr;
- Appli_LightLC_GetStatus_cb.GetLightLC_OMState_cb(LightLC_GetBuff);
+ TRACE_M(TF_LIGHT_LC_M, "LC mode %d\r\n", mode);
- *lcOM_status = LightLC_GetBuff[0];
- *plength = 1;
+ if(srcElementAddr == MOBLE_ADDRESS_UNASSIGNED)
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Can't send from unassigned source address\r\n");
+ }
- return MOBLE_RESULT_SUCCESS;
+ data[0] = mode;
+ dataBufLen = 1;
+
+ if (statusSend == STATUS_SEND_REPLY ||
+ statusSend == STATUS_SEND_REPLY_PUBLISH)
+ {
+ dstAddr = pmsgParam->peer_addr;
+
+ if (dstAddr != MOBLE_ADDRESS_UNASSIGNED)
+ {
+ result = BLEMesh_ModelSendMessage(srcElementAddr,
+ dstAddr,
+ LIGHT_LC_SERVER_MODEL_ID,
+ (MOBLEUINT16)LIGHT_LC_MODE_STATUS,
+ data,
+ dataBufLen);
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Reply sent\r\n");
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Reply failed\r\n");
+ }
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Reply can't be sent. Client destination address is unassigned\r\n");
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+
+ if (statusSend == STATUS_SEND_PUBLISH ||
+ statusSend == STATUS_SEND_REPLY_PUBLISH)
+ {
+ result = BLEMesh_SetRemotePublication(LIGHT_LC_SERVER_MODEL_ID,
+ srcElementAddr,
+ (MOBLEUINT16)LIGHT_LC_MODE_STATUS,
+ data,
+ dataBufLen,
+ MOBLE_FALSE,
+ MOBLE_FALSE);
+ result = MOBLE_RESULT_FALSE;
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Published\r\n");
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Publication failed\r\n");
+ }
+ }
+
+ return result;
}
+
/**
-* @brief Light_LC_OnOffSet: This function is called for both Acknowledged and
-* unacknowledged message
-* @param lcOnOff_param: Pointer to the parameters received for message
-* @param length: Length of the parameters received for message
-* @retval MOBLE_RESULT
-*/
-MOBLE_RESULT Light_LC_OnOffSet(MOBLEUINT8 const *lcOnOff_param, MOBLEUINT32 length)
+ * @brief Light_LC_OmStatus message as per model specification v1.0.1
+ * Sent in response of LC OM Get, LC OM Set or LC OM SetUnack to
+ * publish group
+ * @param Reference to msg parameters
+ * @param LC occupancy mode
+ * @param status to be sent only to client or to be published or to do both
+ * @retval False if reply or publish not successful else success
+ */
+static
+MOBLE_RESULT Light_LC_OmStatus(MODEL_MessageHeader_t *pmsgParam,
+ MOBLEUINT8 occupancyMode,
+ status_send_e statusSend)
{
- TRACE_I(TF_LIGHT_LC_M,"Light_LC_OnOffSet callback received \r\n");
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 dataBufLen = 0;
+ MOBLEUINT8 data[1];
+ MOBLE_ADDRESS srcElementAddr = BLEMesh_GetAddress() + pmsgParam->elementIndex;
+ MOBLE_ADDRESS dstAddr;
+
+ TRACE_M(TF_LIGHT_LC_M, "LC occupancy mode %d\r\n", occupancyMode);
+
+ if(srcElementAddr == MOBLE_ADDRESS_UNASSIGNED)
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Can't send from unassigned source address\r\n");
+ }
+
+ data[0] = occupancyMode;
+ dataBufLen = 1;
- Light_LC_Param.Target_Light_OnOff = lcOnOff_param[0];
- Light_LC_Param.Tid = lcOnOff_param[1];
- MOBLEUINT16 property_ID;
- MOBLEUINT32 prop_Value;
+ if (statusSend == STATUS_SEND_REPLY ||
+ statusSend == STATUS_SEND_REPLY_PUBLISH)
+ {
+ dstAddr = pmsgParam->peer_addr;
+
+ if (dstAddr != MOBLE_ADDRESS_UNASSIGNED)
+ {
+ result = BLEMesh_ModelSendMessage(srcElementAddr,
+ dstAddr,
+ LIGHT_LC_SERVER_MODEL_ID,
+ (MOBLEUINT16)LIGHT_LC_OM_STATUS,
+ data,
+ dataBufLen);
+ result = MOBLE_RESULT_FALSE;
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Reply sent\r\n");
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Reply failed\r\n");
+ }
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Reply can't be sent. Client destination address is unassigned\r\n");
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+
+ if (statusSend == STATUS_SEND_PUBLISH ||
+ statusSend == STATUS_SEND_REPLY_PUBLISH)
+ {
+ result = BLEMesh_SetRemotePublication(LIGHT_LC_SERVER_MODEL_ID,
+ srcElementAddr,
+ (MOBLEUINT16)LIGHT_LC_OM_STATUS,
+ data,
+ dataBufLen,
+ MOBLE_FALSE,
+ MOBLE_FALSE);
+ result = MOBLE_RESULT_FALSE;
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Published\r\n");
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Publication failed\r\n");
+ }
+ }
+
+ return result;
+}
+
- /* Event set to descide the state to be process for LC state machine */
- if(Light_LC_Param.Target_Light_OnOff == 1)
+/**
+ * @brief Light_LC_OnOffStatus message as per model specification v1.0.1
+ * Sent in response of LC OnOff Get, LC OnOff Set or LC OnOff SetUnack to
+ * publish group
+ * @param Reference to LC parameters
+ * @param Reference to msg parameters
+ * @param status to be sent only to client or to be published or to do both
+ * @retval False if reply or publish not successful else success
+ */
+static
+MOBLE_RESULT Light_LC_OnOffStatus(lc_param_t* pLcParams,
+ MODEL_MessageHeader_t *pmsgParam,
+ status_send_e statusSend)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+ MOBLEUINT16 dataBufLen = 0;
+ MOBLEUINT8 data[3];
+ MOBLE_ADDRESS srcElementAddr = BLEMesh_GetAddress() + pmsgParam->elementIndex;
+ MOBLE_ADDRESS dstAddr;
+ MOBLEUINT8 remTimeStatusMsg = 0;
+ MOBLEUINT8 presentOnOff = 0;
+ MOBLEUINT8 targetOnOff = 0;
+ MOBLEUINT32 remainingTimeMs = 0;
+
+ if(srcElementAddr == MOBLE_ADDRESS_UNASSIGNED)
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Can't send from unassigned source address\r\n");
+ }
+
+ /* Compute present on off state from LC state */
+ if(pLcParams->state == OFF ||
+ pLcParams->state == STANDBY ||
+ pLcParams->state == POST_STANDBY)
{
- Lc_Event = LC_LIGHT_ON;
+ presentOnOff = 0;
}
else
{
- Lc_Event = LC_LIGHT_OFF;
+ presentOnOff = 1;
}
- if((length > 2) && (lcOnOff_param[2] != 0))
+ data[0] = presentOnOff;
+ dataBufLen = 1;
+
+ /* Compute target OnOff state from LC state and remaining time from transition parameters */
+ if(pLcParams->state != STANDBY &&
+ pLcParams->state != RUN &&
+ pLcParams->state != PROLONG)
{
- 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)
+ if (pLcParams->state == FADE_STANDBY_AUTO ||
+ pLcParams->state == FADE_STANDBY_MANUAL)
{
- property_ID = LIGHT_CONTROL_TIME_FADE_ON_ID;
- Light_LC_SetPropertyID_value(prop_Value , property_ID);
+ targetOnOff = 0;
}
- else if(LightLC_States.Lc_States == LC_RUN)
+ else
{
- property_ID = LIGHT_CONTROL_TIME_FADE_ID;
- Light_LC_SetPropertyID_value(prop_Value , property_ID);
- }
- else if(LightLC_States.Lc_States == LC_PROLONG)
+ targetOnOff = 1;
+ }
+
+ data[dataBufLen] = targetOnOff;
+ dataBufLen += 1;
+
+ remainingTimeMs = Transition_RemainingTimeGet(&pLcParams->transitionParams);
+
+ TRACE_M(TF_LIGHT_LC_M, "LC present on off state %d target on off state %d remaining time %ldms\r\n", presentOnOff, targetOnOff, remainingTimeMs);
+
+ result = TimeDttFGet(remainingTimeMs, &remTimeStatusMsg);
+ if(result != MOBLE_RESULT_SUCCESS)
{
- property_ID = LIGHT_CONTROL_TIME_FADE_STANDBY_AUTO_ID;
- Light_LC_SetPropertyID_value(prop_Value , property_ID);
- }
+ TRACE_M(TF_LIGHT_LC_M, "Remaining time %ldms > max possible value\r\n", remainingTimeMs);
+ }
+
+ data[dataBufLen] = remTimeStatusMsg;
+ dataBufLen += 1;
+ }
else
{
- /* No Comment */
+ /* do nothing */
+ TRACE_M(TF_LIGHT_LC_M, "LC present on off state %d\r\n", presentOnOff);
+ }
+
+ if (statusSend == STATUS_SEND_REPLY ||
+ statusSend == STATUS_SEND_REPLY_PUBLISH)
+ {
+ dstAddr = pmsgParam->peer_addr;
+
+ if (dstAddr != MOBLE_ADDRESS_UNASSIGNED)
+ {
+ result = BLEMesh_ModelSendMessage(srcElementAddr,
+ dstAddr,
+ LIGHT_LC_SERVER_MODEL_ID,
+ (MOBLEUINT16)LIGHT_LC_ON_OFF_STATUS,
+ data,
+ dataBufLen);
+ result = MOBLE_RESULT_FALSE;
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Reply sent\r\n");
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Reply failed\r\n");
+ }
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Reply can't be sent. Client destination address is unassigned\r\n");
+ result = MOBLE_RESULT_FAIL;
}
+ }
+
+ if (statusSend == STATUS_SEND_PUBLISH ||
+ statusSend == STATUS_SEND_REPLY_PUBLISH)
+ {
+ result = BLEMesh_SetRemotePublication(LIGHT_LC_SERVER_MODEL_ID,
+ srcElementAddr,
+ (MOBLEUINT16)LIGHT_LC_ON_OFF_STATUS,
+ data,
+ dataBufLen,
+ MOBLE_FALSE,
+ MOBLE_FALSE);
+ result = MOBLE_RESULT_FALSE;
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Published\r\n");
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Publication failed\r\n");
+ }
}
- else
+
+ return result;
+}
+
+
+/**
+ * @brief Light_LC_OnOffStatus message as per model specification v1.0.1
+ * Sent in response of LC OnOff Get, LC OnOff Set or LC OnOff SetUnack to
+ * publish group
+ * @param Reference to msg parameters
+ * @param Property ID
+ * @param Property size (in bytes)
+ * @param Property value
+ * @param status to be sent only to client or to be published or to do both
+ * @retval Success if property size is appropriate, reply is success and publication is success
+ */
+static
+MOBLE_RESULT Light_LC_PropertyStatus(MODEL_MessageHeader_t *pmsgParam,
+ MOBLEUINT16 propertyId,
+ MOBLEUINT8 propertySize,
+ MOBLEUINT32 propertyValue,
+ status_send_e statusSend)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 dataBufLen = 0;
+ MOBLEUINT8 data[6];
+ MOBLE_ADDRESS srcElementAddr = BLEMesh_GetAddress() + pmsgParam->elementIndex;
+ MOBLE_ADDRESS dstAddr;
+
+ if(srcElementAddr == MOBLE_ADDRESS_UNASSIGNED)
{
- Light_LC_Param.Present_Light_OnOff = Light_LC_Param.Target_Light_OnOff;
+ TRACE_M(TF_LIGHT_LC_M, "Can't send from unassigned source address\r\n");
}
- /* Application Callback */
- (LightLCAppli_cb.LightLC_OnOff_Set_cb)(&Light_LC_Param , 0);
+ TRACE_M(TF_LIGHT_LC_M, "Id %x size %d value %lx\r\n", propertyId, propertySize, propertyValue);
-#ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF
- Light_LC_OnOff_Generic_OnOffBinding();
-#endif
+ if(propertySize > FOUR_BYTE_VALUE)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ }
- return MOBLE_RESULT_SUCCESS;
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ data[0] = propertyId;
+ data[1] = propertyId >> 8;
+ dataBufLen = 2;
+
+ PutLittleEndian(data+dataBufLen, propertyValue, propertySize);
+ dataBufLen += propertySize;
+
+ if (statusSend == STATUS_SEND_REPLY ||
+ statusSend == STATUS_SEND_REPLY_PUBLISH)
+ {
+ dstAddr = pmsgParam->peer_addr;
+
+ if (dstAddr != MOBLE_ADDRESS_UNASSIGNED)
+ {
+ result = BLEMesh_ModelSendMessage(srcElementAddr,
+ dstAddr,
+ LIGHT_LC_SETUP_SERVER_MODEL_ID,
+ (MOBLEUINT16)LIGHT_LC_PROPERTY_STATUS,
+ data,
+ dataBufLen);
+ result = MOBLE_RESULT_FALSE;
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Reply sent\r\n");
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Reply failed\r\n");
+ }
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Reply can't be sent. Client destination address is unassigned\r\n");
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+
+ if (statusSend == STATUS_SEND_PUBLISH ||
+ statusSend == STATUS_SEND_REPLY_PUBLISH)
+ {
+ result = BLEMesh_SetRemotePublication(LIGHT_LC_SETUP_SERVER_MODEL_ID,
+ srcElementAddr,
+ (MOBLEUINT16)LIGHT_LC_PROPERTY_STATUS,
+ data,
+ dataBufLen,
+ MOBLE_FALSE,
+ MOBLE_FALSE);
+ result = MOBLE_RESULT_FALSE;
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Published\r\n");
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Publication failed\r\n");
+ }
+ }
+ }
+
+ return result;
}
+
/**
-* @brief Light_LC_OnOffStatus
-* @param lcOnOff_status: Pointer to the status message, which needs to be updated
-* @param plength: Pointer to the Length of the Status message
-* @retval MOBLE_RESULT
-*/
-MOBLE_RESULT Light_LC_OnOffStatus(MOBLEUINT8* lcOnOff_status, MOBLEUINT32 *plength)
+ * @brief Light_LC_ModeGet callback
+ * response to be sent only to client node and not to pulish group
+ * @param Reference to LC parameters
+ * @param Parameters as set by client
+ * @param Parameters length
+ * @param Reference to message parameters
+ * @retval Invalid if length is not appropriate, else as set by status function
+ */
+static
+MOBLE_RESULT Light_LC_ModeGet(lc_param_t* pLcParams,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 length,
+ MODEL_MessageHeader_t *pmsgParam)
{
- TRACE_I(TF_LIGHT_LC_M,"Light_LC_OnOffStatus callback received \r\n");
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 mode;
+
+ TRACE_M(TF_LIGHT_LC_M, "length %ld, peer %.4x, dst %.4x, element index %d \r\n",
+ length, pmsgParam->peer_addr, pmsgParam->dst_peer, pmsgParam->elementIndex);
- 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;
+ if(length == 0)
+ {
+ if(pLcParams->state == OFF)
+ {
+ mode = 0;
+ }
+ else
+ {
+ mode = 1;
+ }
+
+ /* Application callback */
+ if(pLcParams->p_cb->LightLCs_ModeGet_cb != NULL)
+ {
+ (pLcParams->p_cb->LightLCs_ModeGet_cb)(pmsgParam);
+ }
}
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;
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_LIGHT_LC_M, "Invalid message length %ld\r\n", length);
+ }
+
+ if(MOBLE_SUCCEEDED(result))
+ {
+ result = Light_LC_ModeStatus(pmsgParam,
+ mode,
+ STATUS_SEND_REPLY);
+ }
+
+ return result;
}
+
/**
-* @brief Light_LC_PropertySet: This function is called for both Acknowledged and
-* unacknowledged message
-* @param lcProp_param: Pointer to the parameters received for message
-* @param length: Length of the parameters received for message
-* @retval MOBLE_RESULT
-*/
-MOBLE_RESULT Light_LC_PropertySet(MOBLEUINT8 const *lcProp_param, MOBLEUINT32 length)
+ * @brief Light_LC_ModeSet callback
+ * response to be sent to client node and publish to pulish group
+ * @param Reference to LC parameters
+ * @param Parameters as set by client
+ * @param Parameters length
+ * @param Reference to message parameters
+ * @retval As set by unack function
+ */
+static
+MOBLE_RESULT Light_LC_ModeSet(lc_param_t* pLcParams,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 length,
+ MODEL_MessageHeader_t *pmsgParam)
{
- TRACE_I(TF_LIGHT_LC_M,"Light_LC_PropertySet callback received \r\n");
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+
+ TRACE_M(TF_LIGHT_LC_M, "length %ld, peer %.4x, dst %.4x, element index %d \r\n",
+ length, pmsgParam->peer_addr, pmsgParam->dst_peer, pmsgParam->elementIndex);
- MOBLEUINT16 Light_LC_PropertyID;
- MOBLEUINT32 property_Value;
+ result = Light_LC_ModeSetUnack(pLcParams, pRxData, length, pmsgParam, 1);
- Light_LC_Value_t Light_LC_Value;
+ if (MOBLE_SUCCEEDED(result))
+ {
+ /* Application callback */
+ if(pLcParams->p_cb->LightLCs_ModeSet_cb != NULL)
+ {
+ (pLcParams->p_cb->LightLCs_ModeSet_cb)(pRxData, pmsgParam);
+ }
+ }
+
+ return result;
+}
- Light_LC_Value.Property_Value = 0;
- Light_LC_PropertyID = lcProp_param[1] << 8;
- Light_LC_PropertyID |= lcProp_param[0];
+/**
+ * @brief Light_LC_ModeSetUnack callback
+ * Publish to pulish group if called by process message
+ * Reply to client as well if called by set function
+ * @param Reference to LC parameters
+ * @param Parameters as set by client
+ * @param Parameters length
+ * @param Reference to message parameters
+ * @param reply to client flag
+ * @retval Fail if length is inappropriate else as set by fsm or status function
+ */
+static
+MOBLE_RESULT Light_LC_ModeSetUnack(lc_param_t* pLcParams,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 length,
+ MODEL_MessageHeader_t *pmsgParam,
+ MOBLEUINT8 reply)
+{
+ MOBLEUINT8 mode;
+
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+
+ if(reply == 0)
+ {
+ TRACE_M(TF_LIGHT_LC_M, "length %ld, peer %.4x, dst %.4x, element index %d \r\n",
+ length, pmsgParam->peer_addr, pmsgParam->dst_peer, pmsgParam->elementIndex);
+ }
- switch (length)
+ if(length == 1)
{
- case 3:
- Light_LC_Value.Property_Value = lcProp_param[2];
- break;
- case 4:
- Light_LC_Value.Property_Value = lcProp_param[3] << 8;
- Light_LC_Value.Property_Value |= lcProp_param[2];
- break;
+ TRACE_I(TF_LIGHT_LC_M, "LC mode %d\r\n", pRxData[0]);
- case 5:
- 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;
-
- case 6:
- 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];
+ if(pRxData[0] == 1)
+ {
+ result = Light_LC_Fsm(MODE_ON, LcServerP, 0, 0, 0, 0);
+ }
+ else if(pRxData[0] == 0)
+ {
+ result = Light_LC_Fsm(MODE_OFF, LcServerP, 0, 0, 0, 0);
+ }
+ else
+ {
+ TRACE_I(TF_LIGHT_LC_M,"Invalid mode value\r\n");
+ }
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_I(TF_LIGHT_LC_M, "Invalid message length %ld\r\n", length);
+ }
+
+ if (MOBLE_SUCCEEDED(result))
+ {
+ if(pLcParams->state == OFF)
+ {
+ mode = 0;
+ }
+ else
+ {
+ mode = 1;
+ }
- break;
+ /* Application callback */
+ if(pLcParams->p_cb->LightLCs_ModeSetUnack_cb != NULL)
+ {
+ (pLcParams->p_cb->LightLCs_ModeSetUnack_cb)(pRxData, pmsgParam);
+ }
- default:
- break;
+ if(reply == 0)
+ {
+ result = Light_LC_ModeStatus(pmsgParam,
+ mode,
+ STATUS_SEND_PUBLISH);
+ }
+ else
+ {
+ result = Light_LC_ModeStatus(pmsgParam,
+ mode,
+ STATUS_SEND_REPLY_PUBLISH);
+ }
}
- property_Value = Light_LC_Value.Property_Value;
- Light_LC_SetPropertyID_value(property_Value,Light_LC_PropertyID);
- return MOBLE_RESULT_SUCCESS;
+ return result;
}
+
/**
-* @brief Light_LC_PropertyStatus
-* @param lcData_param: Pointer to the status message, which needs to be updated
-* @param plength: Pointer to the status message length, which needs to be updated
-* @param pData: Pointer to the message received.
-* @param length: Received message length.
-* @retval MOBLE_RESULT
-*/
-MOBLE_RESULT Light_LC_PropertyStatus( MOBLEUINT8* lcData_param, MOBLEUINT32* plength ,
- MOBLEUINT8 const *pData, MOBLEUINT32 length)
+ * @brief Light_LC_OmGet callback
+ * response to be sent only to client node and not to pulish group
+ * @param Reference to LC parameters
+ * @param Parameters as set by client
+ * @param Parameters length
+ * @param Reference to message parameters
+ * @retval Invalid if length is not appropriate, else as set by status function
+ */
+static
+MOBLE_RESULT Light_LC_OmGet(lc_param_t* pLcParams,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 length,
+ MODEL_MessageHeader_t *pmsgParam)
{
- MOBLEUINT16 prop_ID = 0x00;
- MOBLEUINT32 Property_Value;
- MOBLEUINT16 prop_value_length;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 occupancyMode = 0;
- TRACE_M(TF_LIGHT_LC_M,"Light_LC_PropertyStatus callback received \r\n");
+ TRACE_M(TF_LIGHT_LC_M, "length %ld, peer %.4x, dst %.4x, element index %d \r\n",
+ length, pmsgParam->peer_addr, pmsgParam->dst_peer, pmsgParam->elementIndex);
- if(length > 0)
+ if(length == 0)
{
- prop_ID = pData[1] << 8;
- prop_ID |= pData[0];
+ occupancyMode = pLcParams->occupancyMode;
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_LIGHT_LC_M, "Invalid message length %ld\r\n", length);
}
-
- Property_Value = Light_LC_GetPropertyID_value(prop_ID,&prop_value_length);
-
- *lcData_param = prop_ID;
- *(lcData_param+1) = prop_ID >> 8;
- switch (prop_value_length)
+ if(MOBLE_SUCCEEDED(result))
{
- case ONE_BYTE_VALUE:
- *(lcData_param+2) = Property_Value;
- *plength = 3;
- break;
- case TWO_BYTE_VALUE:
- *(lcData_param+2) = Property_Value ;
- *(lcData_param+3) = Property_Value >> 8;
- *plength = 4;
- break;
-
- case THREE_BYTE_VALUE:
- *(lcData_param+2) = Property_Value ;
- *(lcData_param+3) = Property_Value >> 8;
- *(lcData_param+4) = Property_Value >> 16;
- *plength = 5;
- break;
-
- 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;
+ /* Application callback */
+ if(pLcParams->p_cb->LightLCs_OmGet_cb != NULL)
+ {
+ (pLcParams->p_cb->LightLCs_OmGet_cb)(pmsgParam);
+ }
- default:
- break;
+ result = Light_LC_OmStatus(pmsgParam,
+ occupancyMode,
+ STATUS_SEND_REPLY);
}
-
- return MOBLE_RESULT_SUCCESS;
+
+ return result;
}
/**
-* @brief Light_LC_GetPropertyID_value: This function is call-back
-* from the library to send Model Opcode Table info to library
-* @param Prop_Value:value belongs to property id
-* @param prop_ID: Property id of the parameter.
-* @retval MOBLEUINT32
-*/
-MOBLE_RESULT Light_LC_SetPropertyID_value(MOBLEUINT32 Prop_Value,
- MOBLEUINT16 prop_ID)
+ * @brief Light_LC_OmSet callback
+ * response to be sent to client node and publish to pulish group
+ * @param Reference to LC parameters
+ * @param Parameters as set by client
+ * @param Parameters length
+ * @param Reference to message parameters
+ * @retval As set by unack function
+ */
+static
+MOBLE_RESULT Light_LC_OmSet(lc_param_t* pLcParams,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 length,
+ MODEL_MessageHeader_t *pmsgParam)
{
- MOBLEUINT8 length = sizeof(Light_Property_Table.LC_PropertyTable8b)/sizeof(Light_Property_Table.LC_PropertyTable8b[0]);
- MOBLEUINT8 valid_flag = 0;
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+
+ TRACE_M(TF_LIGHT_LC_M, "length %ld, peer %.4x, dst %.4x, element index %d \r\n",
+ length, pmsgParam->peer_addr, pmsgParam->dst_peer, pmsgParam->elementIndex);
- for(int i=0;i < length;i++)
+ result = Light_LC_OmSetUnack(pLcParams, pRxData, length, pmsgParam, 1);
+
+ if (MOBLE_SUCCEEDED(result))
{
- if(prop_ID == Light_Property_Table.LC_PropertyTable8b[i].Property_ID)
+ /* Application callback */
+ if(pLcParams->p_cb->LightLCs_OmSet_cb != NULL)
{
- Light_Property_Table.LC_PropertyTable8b[i].Property_Value_8b = Prop_Value;
- valid_flag = 1;
- return MOBLE_RESULT_SUCCESS;
-
+ (pLcParams->p_cb->LightLCs_OmSet_cb)(pRxData, pmsgParam);
}
}
- length = sizeof(Light_Property_Table.LC_PropertyTable16b)/sizeof(Light_Property_Table.LC_PropertyTable16b[0]);
+ return result;
+}
+
+
+/**
+ * @brief Light_LC_OmSetUnack callback
+ * Publish to pulish group if called by process message
+ * Reply to client as well if called by set function
+ * @param Reference to LC parameters
+ * @param Parameters as set by client
+ * @param Parameters length
+ * @param Reference to message parameters
+ * @param reply to client flag
+ * @retval Fail if length is inappropriate else as set by or status function
+ */
+static
+MOBLE_RESULT Light_LC_OmSetUnack(lc_param_t* pLcParams,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 length,
+ MODEL_MessageHeader_t *pmsgParam,
+ MOBLEUINT8 reply)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+
+ if(reply == 0)
+ {
+ TRACE_M(TF_LIGHT_LC_M, "length %ld, peer %.4x, dst %.4x, element index %d \r\n",
+ length, pmsgParam->peer_addr, pmsgParam->dst_peer, pmsgParam->elementIndex);
+ }
- for(int i=0;i < length;i++)
+ if(length == 1)
{
- if(prop_ID == Light_Property_Table.LC_PropertyTable16b[i].Property_ID)
+ TRACE_I(TF_LIGHT_LC_M, "LC occupancy mode %d\r\n", pRxData[0]);
+
+ if(pRxData[0] == 0 ||
+ pRxData[0] == 1)
{
- Light_Property_Table.LC_PropertyTable16b[i].Property_Value_16= Prop_Value;
- valid_flag = 1;
- return MOBLE_RESULT_SUCCESS;
-
+ pLcParams->occupancyMode = pRxData[0];
+ result = MOBLE_RESULT_SUCCESS;
}
+ else
+ {
+ TRACE_I(TF_LIGHT_LC_M,"Invalid occupancy mode value\r\n");
+ }
+
+ NvmStatePowerFlag_Set(LIGHT_LC_NVM_FLAG, pLcParams->elementIndex);
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_I(TF_LIGHT_LC_M, "Invalid message length %ld\r\n", length);
}
- length = sizeof(Light_Property_Table.LC_PropertyTable24b)/sizeof(Light_Property_Table.LC_PropertyTable24b[0]);
-
- for(int i=0;i < length;i++)
+ if (MOBLE_SUCCEEDED(result))
{
- if(prop_ID == Light_Property_Table.LC_PropertyTable24b[i].Property_ID)
+ /* Application callback */
+ if(pLcParams->p_cb->LightLCs_OmSetUnack_cb != NULL)
+ {
+ (pLcParams->p_cb->LightLCs_OmSetUnack_cb)(pRxData, pmsgParam);
+ }
+
+ if(reply == 0)
{
- Light_Property_Table.LC_PropertyTable24b[i].Property_Value_24b= Prop_Value;
- valid_flag = 1;
- return MOBLE_RESULT_SUCCESS;
-
+ result = Light_LC_OmStatus(pmsgParam,
+ pLcParams->occupancyMode,
+ STATUS_SEND_PUBLISH);
+ }
+ else
+ {
+ result = Light_LC_OmStatus(pmsgParam,
+ pLcParams->occupancyMode,
+ STATUS_SEND_REPLY_PUBLISH);
}
}
-
- length = sizeof(Light_Property_Table.LC_PropertyTableFloat)/sizeof(Light_Property_Table.LC_PropertyTableFloat[0]);
- for(int i=0;i < length;i++)
+ return result;
+}
+
+
+/**
+ * @brief Light_LC_OnOffGet callback
+ * response to be sent only to client node and not to pulish group
+ * @param Reference to LC parameters
+ * @param Parameters as set by client
+ * @param Parameters length
+ * @param Reference to message parameters
+ * @retval Invalid if length is not appropriate, else as set by status function
+ */
+static
+MOBLE_RESULT Light_LC_OnOffGet(lc_param_t* pLcParams,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 length,
+ MODEL_MessageHeader_t *pmsgParam)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+
+ TRACE_M(TF_LIGHT_LC_M, "length %ld, peer %.4x, dst %.4x, element index %d \r\n",
+ length, pmsgParam->peer_addr, pmsgParam->dst_peer, pmsgParam->elementIndex);
+
+ if(length == 0)
+ {
+ result = MOBLE_RESULT_SUCCESS;
+ }
+ else
{
- if(prop_ID == Light_Property_Table.LC_PropertyTableFloat[i].Property_ID)
+ TRACE_M(TF_LIGHT_LC_M, "Invalid message length %ld\r\n", length);
+ }
+
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ /* Application callback */
+ if(pLcParams->p_cb->LightLCs_OnOffGet_cb != NULL)
{
- Light_Property_Table.LC_PropertyTableFloat[i].Property_Value_float = Prop_Value;
- valid_flag = 1;
- return MOBLE_RESULT_SUCCESS;
-
+ (pLcParams->p_cb->LightLCs_OnOffGet_cb)(pmsgParam);
}
+
+ result = Light_LC_OnOffStatus(pLcParams,
+ pmsgParam,
+ STATUS_SEND_REPLY);
}
- if(valid_flag == 0)
+ return result;
+}
+
+
+/**
+ * @brief Light_LC_OnOffSet callback
+ * response to be sent to client node and publish to pulish group
+ * @param Reference to LC parameters
+ * @param Parameters as set by client
+ * @param Parameters length
+ * @param Reference to message parameters
+ * @retval As set by unack function
+ */
+static
+MOBLE_RESULT Light_LC_OnOffSet(lc_param_t* pLcParams,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 length,
+ MODEL_MessageHeader_t *pmsgParam)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+
+ TRACE_M(TF_LIGHT_LC_M, "length %ld, peer %.4x, dst %.4x, element index %d \r\n",
+ length, pmsgParam->peer_addr, pmsgParam->dst_peer, pmsgParam->elementIndex);
+
+ result = Light_LC_OnOffSetUnack(pLcParams, pRxData, length, pmsgParam, 1);
+
+ if (MOBLE_SUCCEEDED(result))
{
- TRACE_I(TF_LIGHT_LC_M,"Wrong Property ID \r\n");
+ /* Application callback */
+ if(pLcParams->p_cb->LightLC_OnOffSet_cb != NULL)
+ {
+ (pLcParams->p_cb->LightLC_OnOffSet_cb)(pRxData, pmsgParam);
+ }
}
- return MOBLE_RESULT_SUCCESS;
+
+ return result;
}
+
/**
-* @brief Light_LC_GetPropertyID_value: This function is call-back
-* from the library to send Model Opcode Table info to library
-* @param property_ID: Property id of the parameter.
-* @retval MOBLEUINT32
-*/
-MOBLEUINT32 Light_LC_GetPropertyID_value(MOBLEUINT16 property_ID,MOBLEUINT16 *value_length)
+ * @brief Light_LC_ModeSetUnack callback
+ * Publish to pulish group if called by process message
+ * Reply to client as well if called by set function
+ * @param Reference to LC parameters
+ * @param Parameters as set by client
+ * @param Parameters length
+ * @param Reference to message parameters
+ * @param reply to client flag
+ * @retval Fail if length is inappropriate, TID check fail, step resolution 0,
+ * else as set by fsm or status function
+ */
+static
+MOBLE_RESULT Light_LC_OnOffSetUnack(lc_param_t* pLcParams,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 length,
+ MODEL_MessageHeader_t *pmsgParam,
+ MOBLEUINT8 reply)
{
- MOBLEUINT8 length;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 optionalParams;
+ MOBLEUINT32 delayMsOnOffMsg = 0;
+ MOBLEUINT8 noOfSteps = 0; /* temporary */
+ MOBLEUINT32 stepResMsOnOffMsg = 0;
+ MOBLEUINT32 trTimeMsOnOffMsg = 0;
- length = sizeof(Light_Property_Table.LC_PropertyTable8b)/sizeof(Light_Property_Table.LC_PropertyTable8b[0]);
+ MOBLEUINT8 onOff = pRxData[0];
+ MOBLEUINT8 tid = pRxData[1];
+
+ if(reply == 0)
+ {
+ TRACE_M(TF_LIGHT_LC_M, "length %ld, peer %.4x, dst %.4x, element index %d \r\n",
+ length, pmsgParam->peer_addr, pmsgParam->dst_peer, pmsgParam->elementIndex);
+ }
- for(int i=0;i < length;i++)
+ if(length == 2)
+ {
+ TRACE_I(TF_LIGHT_LC_M, "Target %d tid %d\r\n", onOff, tid);
+
+ optionalParams = 0;
+ }
+ else if(length == 4)
{
- if(property_ID == Light_Property_Table.LC_PropertyTable8b[i].Property_ID)
+ TRACE_I(TF_LIGHT_LC_M, "Target %d tid %d transition time %x delay %d \r\n",
+ onOff, tid, pRxData[2], pRxData[3]);
+
+ optionalParams = 1;
+ noOfSteps = pRxData[2] & 0x3F;
+ stepResMsOnOffMsg = Get_StepResolutionValue((pRxData[2] & 0xC0) >> 6);
+ delayMsOnOffMsg = pRxData[3]*5; /* 5 milliseconds step */
+ trTimeMsOnOffMsg = noOfSteps*stepResMsOnOffMsg;
+
+ if(stepResMsOnOffMsg == 0)
{
- *value_length = ONE_BYTE_VALUE;
- return Light_Property_Table.LC_PropertyTable8b[i].Property_Value_8b;
+ result = MOBLE_RESULT_FAIL;
+ TRACE_I(TF_LIGHT_LC_M, "Invalid step resolution %d\r\n", (pRxData[2] & 0xC0) >> 6);
}
}
-
- length = sizeof(Light_Property_Table.LC_PropertyTable16b)/sizeof(Light_Property_Table.LC_PropertyTable16b[0]);
- for(int i=0;i < length;i++)
+ else
{
- if(property_ID == Light_Property_Table.LC_PropertyTable16b[i].Property_ID)
+ result = MOBLE_RESULT_FAIL;
+ TRACE_I(TF_LIGHT_LC_M, "Invalid message length %ld\r\n", length);
+ }
+
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ /* TID check and update */
+ if(Tid_CheckAndUpdate(tid, pmsgParam->peer_addr, pmsgParam->dst_peer, &pLcParams->lastMsgTidParams) == 0)
{
- *value_length = TWO_BYTE_VALUE;
- return Light_Property_Table.LC_PropertyTable16b[i].Property_Value_16;
+ result = MOBLE_RESULT_FAIL;
+ TRACE_I(TF_LIGHT_LC_M, "Old message dropped\r\n");
}
}
-
- length = sizeof(Light_Property_Table.LC_PropertyTable24b)/sizeof(Light_Property_Table.LC_PropertyTable24b[0]);
- for(int i=0;i < length;i++)
+
+ if(result == MOBLE_RESULT_SUCCESS)
{
- if(property_ID == Light_Property_Table.LC_PropertyTable24b[i].Property_ID)
+ if(onOff == 0)
+ {
+ result = Light_LC_Fsm(LIGHT_OFF,
+ pLcParams,
+ optionalParams,
+ delayMsOnOffMsg,
+ stepResMsOnOffMsg,
+ trTimeMsOnOffMsg);
+ }
+ else if(onOff == 1)
+ {
+ result = Light_LC_Fsm(LIGHT_ON,
+ pLcParams,
+ optionalParams,
+ delayMsOnOffMsg,
+ stepResMsOnOffMsg,
+ trTimeMsOnOffMsg);
+ }
+ else /* invalid value */
{
- *value_length = THREE_BYTE_VALUE;
- return Light_Property_Table.LC_PropertyTable24b[i].Property_Value_24b;
+ result = MOBLE_RESULT_FAIL;
+ TRACE_I(TF_LIGHT_LC_M, "Invalid on off field %d\r\n", pRxData[0]);
+ }
+
+ /* Application callback */
+ if(pLcParams->p_cb->LightLCs_OnOffSetUnack_cb != NULL)
+ {
+ (pLcParams->p_cb->LightLCs_OnOffSetUnack_cb)(pRxData, pmsgParam);
+ }
+
+ if(MOBLE_SUCCEEDED(result))
+ {
+ if(reply == 0)
+ {
+ result = Light_LC_OnOffStatus(pLcParams,
+ pmsgParam,
+ STATUS_SEND_PUBLISH);
+ }
+ else
+ {
+ result = Light_LC_OnOffStatus(pLcParams,
+ pmsgParam,
+ STATUS_SEND_REPLY_PUBLISH);
+ }
}
}
- length = sizeof(Light_Property_Table.LC_PropertyTableFloat)/sizeof(Light_Property_Table.LC_PropertyTableFloat[0]);
- for(int i=0;i < length;i++)
+ return result;
+}
+
+
+/**
+ * @brief Light_LC_PropertyGet callback
+ * response to be sent only to client node and not to pulish group
+ * @param Reference to LC parameters
+ * @param Parameters as set by client
+ * @param Parameters length
+ * @param Reference to message parameters
+ * @retval Fail if length is not appropriate or inconsistency with property id,
+ * else as set by status function
+ */
+static
+MOBLE_RESULT Light_LC_PropertyGet(lc_param_t* pLcParams,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 length,
+ MODEL_MessageHeader_t *pmsgParam)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+ MOBLEUINT16 rcvdPropertyId = 0x0000;
+ MOBLEUINT32 propertyValue = 0;
+ MOBLEUINT8 propertySize = 0;
+
+ TRACE_M(TF_LIGHT_LC_M, "length %ld, peer %.4x, dst %.4x, element index %d \r\n",
+ length, pmsgParam->peer_addr, pmsgParam->dst_peer, pmsgParam->elementIndex);
+
+ if(length == 2)
{
- if(property_ID == Light_Property_Table.LC_PropertyTableFloat[i].Property_ID)
+ result = ExtractPropertyId(pRxData, &rcvdPropertyId);
+
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ for(MOBLEUINT8 count=0; count<LC_PROPERTY_TABLE_COUNT; count++)
+ {
+ /* extract property index */
+ if(pLcParams->pPropertyId[count].id == rcvdPropertyId)
+ {
+ propertySize = pLcParams->pPropertyId[count].size;
+
+ result = Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ rcvdPropertyId,
+ count,
+ &propertyValue);
+
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Rcvd property id %x property size %d property value %lx\r\n",
+ rcvdPropertyId, propertySize, propertyValue);
+ break;
+ }
+ }
+ }
+ }
+ else
{
- *value_length = FOUR_BYTE_VALUE;
- return (MOBLEUINT32)Light_Property_Table.LC_PropertyTableFloat[i].Property_Value_float;
+ TRACE_M(TF_LIGHT_LC_M, "Prohibited property id\r\n");
}
}
-
- TRACE_I(TF_LIGHT_LC_M,"Wrong Property ID \r\n");
- return 0xFFFF;
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Invalid message length %ld\r\n", length);
+ }
+
+ if (MOBLE_SUCCEEDED(result))
+ {
+ /* Application callback */
+ if(pLcParams->p_cb->LightLCs_PropertyGet_cb != NULL)
+ {
+ (pLcParams->p_cb->LightLCs_PropertyGet_cb)(pRxData, pmsgParam);
+ }
+ result = Light_LC_PropertyStatus(pmsgParam,
+ rcvdPropertyId,
+ propertySize,
+ propertyValue,
+ STATUS_SEND_REPLY);
+ }
+
+ return result;
}
/**
-* @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)
+ * @brief Light_LC_PropertySet callback
+ * response to be sent to client node and publish to pulish group
+ * @param Reference to LC parameters
+ * @param Parameters as set by client
+ * @param Parameters length
+ * @param Reference to message parameters
+ * @retval As set by unack function
+ */
+static
+MOBLE_RESULT Light_LC_PropertySet(lc_param_t* pLcParams,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 length,
+ MODEL_MessageHeader_t *pmsgParam)
{
- MOBLEUINT16 prop_value_length = 0;
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+
+ TRACE_M(TF_LIGHT_LC_M, "length %ld, peer %.4x, dst %.4x, element index %d \r\n",
+ length, pmsgParam->peer_addr, pmsgParam->dst_peer, pmsgParam->elementIndex);
+
+ result = Light_LC_PropertySetUnack(pLcParams, pRxData, length, pmsgParam, 1);
- Light_LC_GetPropertyID_value(property_ID,&prop_value_length);
- return prop_value_length;
+ if (MOBLE_SUCCEEDED(result))
+ {
+ /* Application callback */
+ if(pLcParams->p_cb->LightLCs_PropertySet_cb != NULL)
+ {
+ (pLcParams->p_cb->LightLCs_PropertySet_cb)(pRxData, pmsgParam);
+ }
+ }
+ return result;
}
-#endif
+
/**
-* @brief Light_LC_ModelServer_GetOpcodeTableCb: This function is call-back
-* from the library to send Model Opcode Table info to library
-* @param MODEL_OpcodeTableParam_t: Pointer to the Generic Model opcode array
-* @param length: Pointer to the Length of Generic Model opcode array
-* @retval MOBLE_RESULT
-*/
-MOBLE_RESULT Light_LC_ModelServer_GetOpcodeTableCb(const MODEL_OpcodeTableParam_t **data,
- MOBLEUINT16 *length)
+ * @brief Light_LC_PropertySetUnack callback
+ * Publish to pulish group if called by process message
+ * Reply to client as well if called by set function
+ * Limitation: No call to LC state machine
+ * Effects caused by changes in LC properties would be visible in next call
+ * @param Reference to LC parameters
+ * @param Parameters as set by client
+ * @param Parameters length
+ * @param Reference to message parameters
+ * @param reply to client flag
+ * @retval Fail if length mismatch or property id inappropriate else as set by
+ * status function
+ */
+static
+MOBLE_RESULT Light_LC_PropertySetUnack(lc_param_t* pLcParams,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 length,
+ MODEL_MessageHeader_t *pmsgParam,
+ MOBLEUINT8 reply)
{
- *data = Light_LC_Opcodes_Table;
- *length = sizeof(Light_LC_Opcodes_Table)/sizeof(Light_LC_Opcodes_Table[0]);
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+ MOBLEUINT16 rcvdPropertyId = 0x0000;
+ MOBLEUINT8 rcvdPropertySize = 0;
+ MOBLEUINT32 rcvdPropertyValue = 0;
- return MOBLE_RESULT_SUCCESS;
+ if(reply == 0)
+ {
+ TRACE_M(TF_LIGHT_LC_M, "length %ld, peer %.4x, dst %.4x, element index %d \r\n",
+ length, pmsgParam->peer_addr, pmsgParam->dst_peer, pmsgParam->elementIndex);
+ }
+
+ if(length > 2 &&
+ length <= 6)
+ {
+ result = ExtractPropertyId(pRxData, &rcvdPropertyId);
+
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ rcvdPropertySize = length - PROPERTY_ID_LENGTH;
+
+ GetLittleEndian(pRxData+2, rcvdPropertySize, &rcvdPropertyValue);
+
+ TRACE_I(TF_LIGHT_LC_M, "Rcvd property id %x property size %d property value %lx\r\n",
+ rcvdPropertyId, rcvdPropertySize, rcvdPropertyValue);
+
+ result = Light_LC_PropertyValueSet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ rcvdPropertyId,
+ rcvdPropertySize,
+ rcvdPropertyValue);
+ }
+ else
+ {
+ TRACE_I(TF_LIGHT_LC_M, "Prohibited property id\r\n");
+ }
+ }
+ else
+ {
+ TRACE_I(TF_LIGHT_LC_M, "Invalid message length %ld\r\n", length);
+ }
+
+ if (MOBLE_SUCCEEDED(result))
+ {
+ /* Application callback */
+ if(pLcParams->p_cb->LightLCs_PropertySetUnack_cb != NULL)
+ {
+ (pLcParams->p_cb->LightLCs_PropertySetUnack_cb)(pRxData, pmsgParam);
+ }
+
+ if(reply == 0)
+ {
+ result = Light_LC_PropertyStatus(pmsgParam,
+ rcvdPropertyId,
+ rcvdPropertySize,
+ rcvdPropertyValue,
+ STATUS_SEND_PUBLISH);
+ }
+ else
+ {
+ result = Light_LC_PropertyStatus(pmsgParam,
+ rcvdPropertyId,
+ rcvdPropertySize,
+ rcvdPropertyValue,
+ STATUS_SEND_REPLY_PUBLISH);
+ }
+ }
+
+ return result;
}
-#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
-* @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
-* @param opcode: Received opcode of the Status message callback
-* @param pResponsedata: Pointer to the buffer to be updated with status
-* @param plength: Pointer to the Length of the data, to be updated by application
-* @param pRxData: Pointer to the data received in packet.
-* @param dataLength: length of the data in packet.
-* @param response: Value to indicate wheather message is acknowledged meassage or not.
-* @retval MOBLE_RESULT
-*/
-MOBLE_RESULT Light_LC_ModelServer_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
- MOBLEUINT16 opcode,
- MOBLEUINT8 *pResponsedata,
- MOBLEUINT32 *plength,
- MOBLEUINT8 const *pRxData,
- MOBLEUINT32 dataLength,
- MOBLEBOOL response)
+/**
+ * @brief Get property id value given the size of property from property value table
+ * Extra care required to pass parameters as parameters may seem redundant
+ * @param Reference to property ID table
+ * @param Reference to property Value table
+ * @param Property id
+ * @param Property Index (in property table) for above property id
+ * @retval Fail if property id doesn't match with table property id else success
+ */
+static
+MOBLE_RESULT Light_LC_PropertyValueGet(const light_lc_propertyId_t* pPropertyIdTable,
+ MOBLEUINT32* pPropertyValueTable,
+ MOBLEUINT16 propertyId,
+ MOBLEUINT8 propertyIndex,
+ MOBLEUINT32* value)
{
- switch(opcode)
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ if(pPropertyIdTable[propertyIndex].id == propertyId)
{
-#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
-
- case LIGHT_LC_MODE_STATUS:
- {
- Light_LC_ModeStatus(pResponsedata,plength);
- break;
- }
- case LIGHT_LC_OM_STATUS:
- {
- Light_LC_OMStatus(pResponsedata,plength);
- break;
- }
- case LIGHT_LC_ON_OFF_STATUS:
- {
- Light_LC_OnOffStatus(pResponsedata,plength);
- break;
- }
-#endif
+ *value = pPropertyValueTable[propertyIndex];
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
-#ifdef ENABLE_LIGHT_MODEL_SERVER_LC_SETUP
-
- case LIGHT_LC_PROPERTY_STATUS:
- {
- Light_LC_PropertyStatus(pResponsedata ,plength,pRxData,dataLength);
- break;
- }
-#endif
- default:
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ /* TRACE_M(TF_LIGHT_LC_M, "Property id %x value %x\r\n",
+ pPropertyIdTable[propertyIndex].id, pPropertyValueTable[propertyIndex]); */
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Property id %x not found at index %d", propertyId, propertyIndex);
+ }
+
+ return result;
+}
+
+
+/**
+ * @brief Set property id value in property value table
+ * @param Reference to property value table
+ * @param Reference to property id table
+ * @param Property id
+ * @param Property size
+ * @retval Fail if property id does not match with any property id in table
+ */
+static
+MOBLE_RESULT Light_LC_PropertyValueSet(const light_lc_propertyId_t* pPropertyIdTable,
+ MOBLEUINT32* pPropertyValueTable,
+ MOBLEUINT16 propertyId,
+ MOBLEUINT8 propertySize,
+ MOBLEUINT32 value)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+ MOBLEUINT8 count = 0;
+
+ for(count=0; count<LC_PROPERTY_TABLE_COUNT; count++)
+ {
+ if(propertyId == pPropertyIdTable[count].id)
+ {
+ if(propertySize == pPropertyIdTable[count].size)
{
+ result = MOBLE_RESULT_SUCCESS;
+ pPropertyValueTable[count] = value;
+
+ if(propertyId == LIGHT_CONTROL_TIME_RUN_ON_PID &&
+ pPropertyValueTable[count] != 0)
+ {
+ /* 600ms added in RUN to pass round 9 of MMDL/SR/LLC/BV-11-C
+ To confirm with PTS Errata team */
+ pPropertyValueTable[count] += 600;
+ }
+
break;
}
}
- return MOBLE_RESULT_SUCCESS;
+ }
+
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ /* TRACE_M(TF_LIGHT_LC_M, "id %x index %d value %x\r\n",
+ pPropertyIdTable[count].id,
+ pPropertyIdTable[count].valueIndex,
+ pPropertyValueTable[count]); */
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Not able to set id %x index %d value %lx\r\n",
+ propertyId, count, value);
+ }
+
+ return result;
}
/**
-* @brief Light_LC_ModelServer_ProcessMessageCb: This is a callback function from
-* 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
-* @param opcode: Received opcode of the Status message callback
-* @param pData: Pointer to the buffer to be updated with status
-* @param length: Length of the parameters received
-* @param response: if TRUE, the message is an acknowledged message
-* @param pRxData: Pointer to the data received in packet.
-* @param dataLength: length of the data in packet.
-* @param response: Value to indicate wheather message is acknowledged meassage or not.
-* @retval MOBLE_RESULT
-*/
-MOBLE_RESULT Light_LC_ModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
- MOBLEUINT16 opcode,
- MOBLEUINT8 const *pRxData,
- MOBLEUINT32 dataLength,
- MOBLEBOOL response
- )
+ * @brief Light LC transition stop or start
+ * @param Reference to LC parameters
+ * @param Stop transition flag
+ * @param Start transition flag
+ * @param Delay in milliseconds
+ * @param Transition time in milliseconds
+ * @param Transition step resolution in milliseconds
+ * @retval Transition event as returned by transition state machine
+ */
+static
+transition_event_e Light_LC_TransitionUpdate(lc_param_t* pLcParams,
+ MOBLEUINT8 stopTransitionFlag,
+ MOBLEUINT8 startTransitionFlag,
+ MOBLEUINT32 delayMs,
+ MOBLEUINT32 transitionTimeMs,
+ MOBLEUINT32 stepResolutionMs)
{
+ transition_event_e transitionEvent = TRANSITION_EVENT_NO;
+ transition_params_t* pTrParams = &pLcParams->transitionParams;
+
+ if(stopTransitionFlag == 1)
+ {
+ transitionEvent = Transition_Stop(&pTrParams->trStatus);
+ }
+
+ if(startTransitionFlag == 1)
+ {
+ pTrParams->trTimeMs = transitionTimeMs;
+ pTrParams->stepResolutionMs = stepResolutionMs;
+ transitionEvent = Transition_Sm(pTrParams, delayMs);
+ }
+ return transitionEvent;
+}
+
+
+/**
+ * @brief Set initial and final lightness level and light level given the PIDs
+ * @param Reference to LC parameters
+ * @param Initial level update flag
+ * @param Initial lightness level property id
+ * @param Initial lightness level property index in property table
+ * @param Initial light level property id
+ * @param Initial light level property index in property table
+ * @param Final level update flag
+ * @param Final lightness level property id
+ * @param Final lightness level property index in property table
+ * @param Final light level property id
+ * @param Final light level property index in property table
+ * @retval Success if property id and property index are appropriate else fail
+ */
+static
+MOBLE_RESULT Light_LC_InitialTargetValueUpdatePid(lc_param_t* pLcParams,
+ MOBLEUINT8 initialLevelUpdateFlag,
+ MOBLEUINT16 initialLightnessPid,
+ MOBLEUINT8 initialLightnessIndex,
+ MOBLEUINT16 initialLightPid,
+ MOBLEUINT8 initialLightIndex,
+ MOBLEUINT8 finalLevelUpdateFlag,
+ MOBLEUINT16 finalLightnessPid,
+ MOBLEUINT8 finalLightnessIndex,
+ MOBLEUINT16 finalLightPid,
+ MOBLEUINT8 finalLightIndex)
+{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
- MOBLEUINT16 property_ID;
- MOBLEUINT16 prop_length;
- MOBLE_ADDRESS publishAddress;
- MOBLEUINT8 elementNumber;
- MOBLEUINT8 modelStateChangeFlag = MOBLE_FALSE;
- MOBLEUINT16 model_ID = 0;
- MOBLE_ADDRESS my_Address;
-
- Dst_Peer = dst_peer;
- my_Address = BLEMesh_GetAddress();
-
- TRACE_M(TF_LIGHT_LC_M,"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
+ MOBLEUINT32 tempVal = 0;
- case LIGHT_LC_MODE_SET:
- case LIGHT_LC_MODE_SET_UNACK:
- {
- Light_LC_ModeSet(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:
+ if(initialLevelUpdateFlag == 1)
+ {
+ if(initialLightnessPid != PROPERTY_ID_PROHIBITED)
+ {
+ result = Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ initialLightnessPid,
+ initialLightnessIndex,
+ &tempVal);
+ if(result == MOBLE_RESULT_SUCCESS)
{
- Light_LC_OMSet(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:
+ pLcParams->initialLightnessOut = (MOBLEUINT16)tempVal;
+ }
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Prohibited property id to extract initial lightness\r\n");
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ if(initialLightPid != PROPERTY_ID_PROHIBITED)
+ {
+ result = Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ initialLightPid,
+ initialLightIndex,
+ &tempVal);
+ if(result == MOBLE_RESULT_SUCCESS)
{
- 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;
+ pLcParams->initialLightLuxOut = tempVal;
}
-#endif
-
-#ifdef ENABLE_LIGHT_MODEL_SERVER_LC_SETUP
-
- case LIGHT_LC_PROPERTY_SET:
- case LIGHT_LC_PROPERTY_SET_UNACK:
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Prohibited property id to extract initial light\r\n");
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ if(finalLevelUpdateFlag == 1)
+ {
+ if(finalLightnessPid != PROPERTY_ID_PROHIBITED)
{
- property_ID = (pRxData[0] | pRxData[1] << 8);
- prop_length = dataLength -2;
- if((property_ID != 0x00) && (prop_length == Get_LengthInByteProprtyValue(property_ID)))
+ result = Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ finalLightnessPid,
+ finalLightnessIndex,
+ &tempVal);
+ if(result == MOBLE_RESULT_SUCCESS)
{
- Light_LC_PropertySet(pRxData,dataLength);
- modelStateChangeFlag = MOBLE_TRUE;
- model_ID =(MOBLEUINT16)LIGHT_MODEL_SERVER_LC_SETUP_MODEL_ID;
- result = MOBLE_RESULT_SUCCESS;
+ pLcParams->targetLightnessOut = (MOBLEUINT16)tempVal;
}
- else
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Prohibited property id to extract final lightness\r\n");
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ if(finalLightPid != PROPERTY_ID_PROHIBITED)
+ {
+ result = Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ finalLightPid,
+ finalLightIndex,
+ &tempVal);
+ if(result == MOBLE_RESULT_SUCCESS)
{
- result = MOBLE_RESULT_FAIL;
+ pLcParams->targetLightLuxOut = tempVal;
}
- break;
}
- case LIGHT_LC_PROPERTY_GET:
- {
- property_ID = (pRxData[0] | pRxData[1] << 8);
- if(property_ID == 0x00)
+ else
{
+ TRACE_M(TF_LIGHT_LC_M, "Prohibited property id to extract final light\r\n");
result = MOBLE_RESULT_FAIL;
}
- break;
- }
-#endif
- default:
- {
- break;
- }
- } /* Switch ends */
+ }
+ }
- if((result == MOBLE_RESULT_SUCCESS) && (response == MOBLE_TRUE) && (ADDRESS_IS_UNICAST(dst_peer)))
+ if(result == MOBLE_RESULT_SUCCESS)
{
- Model_SendResponse(peer_addr,my_Address,opcode,pRxData,dataLength);
+ /* TRACE_M(TF_LIGHT_LC_M, "Lightness level initial %x and final %x Light level initial %x and final %x\r\n",
+ pLcParams->initialLightnessOut, pLcParams->targetLightnessOut,
+ pLcParams->initialLightLuxOut, pLcParams->targetLightLuxOut); */
}
- /*
- 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)))
+ return result;
+}
+
+
+/**
+ * @brief PI regulator to adjust ambient level
+ * Magnified values are used for optimizing case when regulator input is 0
+ * @param Reference to LC parameters
+ * @retval PI regulator output
+ */
+static
+MOBLEUINT16 Light_LC_PIregulator(lc_param_t* pLcParams)
+{
+ MOBLEUINT32 tempU32i = 0;
+ MOBLEUINT32 tempU32p = 0;
+ MOBLEUINT32* pU32temp = 0;
+ float* pFtemp;
+ float tempFloat = 0;
+ MOBLEUINT16 regulatorOutput = 0;
+ MOBLEINT32 error = 0;
+ MOBLEINT32 accuracy = 0;
+ MOBLEINT32 regulatorInput = 0;
+ MOBLEUINT32 summationIntervalMs = 0; /* actual value in seconds */
+
+ /* Lux level out magnified 100 times to match resolution of ambient lux level */
+ error = (pLcParams->luxLevelOut)*100 - pLcParams->ambientLuxLevel;
+
+ Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_REGULATOR_ACCURACY_PID,
+ LC_REGULATOR_ACCURACY_PID_INDEX,
+ &tempU32i);
+ /* accuracy is 2 times actual value, accuracy multiplied by 50 to match error scale */
+ accuracy = (MOBLEUINT8)tempU32i * pLcParams->luxLevelOut * 50;
+
+ /* calculate regulator input (100x) */
+ if(error > accuracy)
+ {
+ regulatorInput = error - accuracy;
+ }
+ else if(error < (-1)*accuracy)
+ {
+ regulatorInput = error + accuracy;
+ }
+ else
+ {
+ regulatorInput = 0;
+ }
+
+ if(regulatorInput != 0)
{
- Model_SendResponse(publishAddress,my_Address,opcode,pRxData,dataLength);
+ /* calculate summation interval */
+ if(Clock_Time() >= pLcParams->piLightnessUpdateTick)
+ {
+ summationIntervalMs = Clock_Time() - pLcParams->piLightnessUpdateTick;
+ }
+ else
+ {
+ summationIntervalMs = Clock_Time() + (0xFFFFFFFF - pLcParams->piLightnessUpdateTick);
+ }
+
+ if(summationIntervalMs > 100)
+ {
+ summationIntervalMs = 100;
+ }
+ else if(summationIntervalMs < 10)
+ {
+ summationIntervalMs = 0;
+ }
+
+ pLcParams->piLightnessUpdateTick = Clock_Time();
+
- modelStateChangeFlag = MOBLE_FALSE;
- TRACE_I(TF_LIGHT_LC_M,"Publishing state to the address %.2X \r\n",publishAddress);
+ /* calculate regulator output */
+ if(regulatorInput >= 0) /* Coefficients for UP case */
+ {
+ Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_REGULATOR_KIU_PID,
+ LC_REGULATOR_KIU_PID_INDEX,
+ &tempU32i);
+
+ Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_REGULATOR_KPU_PID,
+ LC_REGULATOR_KPU_PID_INDEX,
+ &tempU32p);
+ }
+ else /* Coefficients for DOWN case */
+ {
+ Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_REGULATOR_KID_PID,
+ LC_REGULATOR_KID_PID_INDEX,
+ &tempU32i);
+
+ Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_REGULATOR_KPD_PID,
+ LC_REGULATOR_KPD_PID_INDEX,
+ &tempU32p);
+ }
+
+ /* Regulator input is 100x
+ Time is 1000x */
+ pU32temp = &tempU32i;
+ pFtemp = (float*)pU32temp;
+ tempFloat = (MOBLEINT32)pLcParams->piLastInternalSum + \
+ (regulatorInput * summationIntervalMs * (*pFtemp))/100000;
+
+ if(tempFloat < 0) /* summation interval range is 0 - 65535 */
+ {
+ pLcParams->piLastInternalSum = 0;
+ }
+ else if(tempFloat > 65535)
+ {
+ pLcParams->piLastInternalSum = 65535;
+ }
+ else
+ {
+ pLcParams->piLastInternalSum = (MOBLEUINT16)tempFloat;
+ }
+
+ /* Regulator input is 100x */
+ pU32temp = &tempU32p;
+ pFtemp = (float*)pU32temp;
+ tempFloat = (pLcParams->piLastInternalSum + regulatorInput * (*pFtemp))/100;
+
+ if(tempFloat < 0)
+ {
+ regulatorOutput = 0;
+ }
+ else if(tempFloat > 65535)
+ {
+ regulatorOutput = 65535;
+ }
+ else
+ {
+ regulatorOutput = (MOBLEUINT16)tempFloat;
+ }
+ }
+ else /* regulator input is 0, no change in output */
+ {
+ regulatorOutput = pLcParams->piLastInternalSum;
}
- return MOBLE_RESULT_SUCCESS;
+ return regulatorOutput;
}
-
+
+
/**
-* @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
- will publsih the light linear set command for the nodes, values will be decided
- according to the controller state.
-* @param void:
-* @retval void:
-**/
-void Light_LC_Fsm(void)
+ * @brief Lighting control state machine
+ * Sources of events
+ * Solicited change in binded Light Lightness - mode off
+ * Light LC messages - mode off, light on, light off
+ * Occupancy sensor - occupancy on
+ * Transition state machine - timer on, timer triggered, timer off
+ * Execution may result in events from transition state machine
+ * Such events are handled in same function call via recursion for
+ * immediate processing of pending events
+ * In case of light on or light off, delay and transition parameters
+ * can come from either on off message or from corresponding properties
+ * @param LC event
+ * Is optional parameters present in on off message or not
+ * Delay in milliseconds received in on off message else 0
+ * Step resolution in milliseconds in on off message else 0
+ * Transition time in milliseconds calculated from parameters in on off message
+ * @retval Success if all property ids and property indexes are appropriate else fail
+ */
+static
+MOBLE_RESULT Light_LC_Fsm(lc_event_e event,
+ lc_param_t* pLcParams,
+ MOBLEUINT8 optionalParamsOnOffMsg,
+ MOBLEUINT32 delayMsOOnOD,
+ MOBLEUINT32 stepResMsOnOffMsg,
+ MOBLEUINT32 transitionTimeMsOnOffMsg)
{
- MOBLEUINT32 resetTime = Clock_Time();
- MOBLEUINT32 delta = resetTime - Timer_value;
- MOBLEUINT16 state_Value = 0;
- MOBLEUINT16 LightnessValue;
- MOBLEUINT16 luxLightnessvalue = 0;
- MOBLEUINT16 prop_value_length;
-
- static MOBLEUINT32 wait_time;
+ MOBLE_RESULT result = MOBLE_RESULT_FALSE;
+// MOBLEUINT32 currentTick = Clock_Time();
+ transition_event_e transitionEvent = TRANSITION_EVENT_NO;
+ transition_params_t* pTrParams = &pLcParams->transitionParams;
+ MOBLEUINT32 tempVal = 0;
+ MOBLEUINT32 timerMs = 0;
+
+ /* TRACE_M(TF_LIGHT_LC_M, "Current state %d LC event %d\r\n",
+ pLcParams->state, event); */
+
+ /* Event specific changes, events which are common in many states are handled in event specific changes
+ Transition may not be running and stop transition results in no action
+ occupancy event is not relevant in fade standby manual */
+
+ if (event == MODE_OFF && pLcParams->state != OFF)
+ {
+ /* Stop transition if in delay or running */
+ Light_LC_TransitionUpdate(pLcParams, 1, 0, 0, 0, 0); /* transition event not updated */
+ pLcParams->publish = 1;
+ Binding_LightLcLightOnOff_GenericOnOff(pLcParams->elementIndex, 0);
+ /* Unidirectional binding between LC Linear out and Lightness Linear breaks
+ Lightness not to be updated */
- switch(LightLC_States.Lc_States)
+ NvmStatePowerFlag_Set(LIGHT_LC_NVM_FLAG, pLcParams->elementIndex);
+ TRACE_M(TF_LIGHT_LC_M, "Any state -> OFF\r\n");
+ pLcParams->state = OFF;
+ }
+ else if(event == AMBIENT_LUX_MODIFIED && pLcParams->state != OFF)
+ {
+ pLcParams->lcLinearOut = MAX(pLcParams->lightnessLinearUnreg, Light_LC_PIregulator(pLcParams));
+ Binding_LcLinearOut_LightLightnessLinear(pLcParams->elementIndex, pLcParams->lcLinearOut);
+ }
+ else
{
- case LC_STANDBY:
+ /* State specific changes */
+ switch(pLcParams->state)
+ {
+ case OFF:
+ if(event == MODE_ON)
+ {
+ result = Light_LC_InitialTargetValueUpdatePid
+ (pLcParams,
+ 0, 0, 0, 0, 0,
+ 1,
+ LIGHT_CONTROL_LIGHTNESS_STANDBY_PID,
+ LC_LIGHTNESS_STANDBY_PID_INDEX,
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_ON_PID,
+ LC_AMBIENT_LUXLEVEL_ON_PID_INDEX);
+
+ /* current lightness value */
+ pLcParams->lcActualSmOut = pLcParams->targetLightnessOut;
+ pLcParams->luxLevelOut = pLcParams->targetLightLuxOut;
+ pLcParams->updateLcLinearOut = 1;
+ pLcParams->publish = 1;
+
+ NvmStatePowerFlag_Set(LIGHT_LC_NVM_FLAG, pLcParams->elementIndex);
+ pLcParams->state = STANDBY;
+ TRACE_M(TF_LIGHT_LC_M, "OFF -> STANDBY\r\n");
+ }
+ else
{
- if(Lc_Event == LC_LIGHT_ON)
+ TRACE_M(TF_LIGHT_LC_M, "No action in OFF, event %d\r\n", event);
+ }
+ break;
+ case STANDBY:
+ if(event == LIGHT_ON)
+ {
+ result = Light_LC_InitialTargetValueUpdatePid
+ (pLcParams,
+ 1,
+ LIGHT_CONTROL_LIGHTNESS_STANDBY_PID,
+ LC_LIGHTNESS_STANDBY_PID_INDEX,
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_STANDBY_PID,
+ LC_AMBIENT_LUXLEVEL_STANDBY_PID_INDEX,
+ 1,
+ LIGHT_CONTROL_LIGHTNESS_ON_PID,
+ LC_LIGHTNESS_ON_PID_INDEX,
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_ON_PID,
+ LC_AMBIENT_LUXLEVEL_ON_PID_INDEX);
+
+ if(optionalParamsOnOffMsg == 1)
{
- /* when controller get the event Light on , changes state from standby to
- fade on state. controller publish the light on value to the node,
- transition time for the light node.
- */
- LightLC_States.Lc_States = LC_FADE_ON;
-
- /* getting the Lightness on value from the table.*/
- 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);
- /* Select the maximum value of lightness on value between Lightness on from
- table and Lux Level Output.
- */
- state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
- Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
- wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_ON_ID);
- Timer_value = resetTime;
- Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
- TRACE_I(TF_LIGHT_LC_M,"STANDBY STATE --> FADE ON STATE , LIGHT ON EVENT \r\n\n");
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, delayMsOOnOD, transitionTimeMsOnOffMsg, stepResMsOnOffMsg);
}
- else if(Lc_Event == LC_OCCUPANCY_ON)
- {
- /* when controller get the event Occupancy on , changes state from standby to
- fade on state. controller publish the light on value to the node,
- transition time for the light node.
- */
- LightLC_States.Lc_States = LC_FADE_ON;
+ else /* optional parameters not present, delay = 0 */
+ {
+ Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_FADE_ON_PID,
+ LC_TIME_FADE_ON_PID_INDEX,
+ &tempVal);
- /* getting the Lightness on value from the table.*/
- 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);
- /* Select the maximum value of lightness on value between Lightness on from
- table and Lux Level Output.
- */
- state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
- Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
- wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_ON_ID);
- Timer_value = resetTime;
- TRACE_I(TF_LIGHT_LC_M,"STANDBY STATE --> FADE ON STATE , OCCUPANCY ON EVENT \r\n\n");
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, 0, tempVal, LIGHT_LC_DEFAULT_TRANSITION_RES_MS);
+ }
+
+ NvmStatePowerFlag_Set(LIGHT_LC_NVM_FLAG, pLcParams->elementIndex);
+ pLcParams->state = POST_STANDBY;
+ TRACE_M(TF_LIGHT_LC_M, "STANDBY -> POST STANDBY light on\r\n");
+ }
+ else if(event == OCCUPANCY_ON)
+ {
+ result = Light_LC_InitialTargetValueUpdatePid
+ (pLcParams,
+ 1,
+ LIGHT_CONTROL_LIGHTNESS_STANDBY_PID,
+ LC_LIGHTNESS_STANDBY_PID_INDEX,
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_STANDBY_PID,
+ LC_AMBIENT_LUXLEVEL_STANDBY_PID_INDEX,
+ 1,
+ LIGHT_CONTROL_LIGHTNESS_ON_PID,
+ LC_LIGHTNESS_ON_PID_INDEX,
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_ON_PID,
+ LC_AMBIENT_LUXLEVEL_ON_PID_INDEX);
+
+ Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_RUN_ON_PID,
+ LC_TIME_RUN_ON_PID_INDEX,
+ &tempVal);
+
+ /* step resolution = run time to avoid intermediate triggers */
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, delayMsOOnOD, tempVal, tempVal);
+
+ NvmStatePowerFlag_Set(LIGHT_LC_NVM_FLAG, pLcParams->elementIndex);
+ pLcParams->state = POST_STANDBY;
+ TRACE_M(TF_LIGHT_LC_M, "STANDBY -> POST STANDBY oocupancy on\r\n");
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "No action in STANDBY, event %d\r\n", event);
+ }
+ break;
+ case POST_STANDBY: /* No break */
+ case PRE_FADE_ON:
+ if(event == TIMER_ON)
+ {
+ pLcParams->publish = 1;
+ Binding_LightLcLightOnOff_GenericOnOff(pLcParams->elementIndex, 1);
+ pLcParams->state = FADE_ON;
+ if(pLcParams->state == POST_STANDBY)
+ {
+ TRACE_M(TF_LIGHT_LC_M, "POST STANDBY -> FADE ON\r\n");
}
else
{
- /* No Comment */
+ TRACE_M(TF_LIGHT_LC_M, "PRE FADE ON -> FADE ON\r\n");
}
- break;
}
- case LC_FADE_ON:
+ else if(event == TIMER_OFF)
{
- Light_LC_Param.Present_Light_OnOff = Light_LC_Param.Target_Light_OnOff;
- if(Lc_Event == LC_LIGHT_OFF)
+ pLcParams->lcActualSmOut = pLcParams->targetLightnessOut;
+ pLcParams->luxLevelOut = pLcParams->targetLightLuxOut;
+ pLcParams->updateLcLinearOut = 1;
+
+ result = Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_RUN_ON_PID,
+ LC_TIME_RUN_ON_PID_INDEX,
+ &tempVal);
+ /* step resoultion = transition time to avoid intermediate trigger in run */
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 0, 1, 0, tempVal, tempVal);
+
+ if(pLcParams->state == POST_STANDBY)
{
- /* set the light 0x00 with transition time already by the light LC on off set */
- LightLC_States.Lc_States = LC_FADE_STANDBY_MANUAL;
-
- /* getting the Lightness on value from the table.*/
- 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);
- /* Select the maximum value of lightness on value between Lightness on from
- table and Lux Level Output.
- */
- state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
- Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
-
- /* Getting the wait time for the timer on the state */
- wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL_ID);
- Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
- TRACE_I(TF_LIGHT_LC_M,"FADE ON STATE --> RUN STATE, LIGHT OFF EVENT \r\n\n");
+ Binding_LightLcLightOnOff_GenericOnOff(pLcParams->elementIndex, 1);
+ TRACE_M(TF_LIGHT_LC_M, "POST STANDBY -> RUN\r\n");
}
- else
- {
- /* Controller wait here till the transition of light node is not completed
- so the wait time will be equal to the transition time sent by the controller
- then controller will change state to run state.
- */
- if(delta > wait_time)
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "PRE FADE ON -> RUN\r\n");
+ }
+ pLcParams->publish = 1;
+ pLcParams->state = RUN;
+ }
+ else if(event == LIGHT_OFF)
+ {
+ if(pLcParams->state == PRE_FADE_ON)
+ {
+ result = Light_LC_InitialTargetValueUpdatePid
+ (pLcParams,
+ 0, 0, 0, 0, 0,
+ 1,
+ LIGHT_CONTROL_LIGHTNESS_STANDBY_PID,
+ LC_LIGHTNESS_STANDBY_PID_INDEX,
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_STANDBY_PID,
+ LC_AMBIENT_LUXLEVEL_STANDBY_PID_INDEX);
+
+ if(optionalParamsOnOffMsg == 1)
{
- LightLC_States.Lc_States = LC_RUN;
- 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_M,"FADE ON STATE --> RUN STATE , wait time = %ld \r\n",wait_time);
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, delayMsOOnOD, transitionTimeMsOnOffMsg, stepResMsOnOffMsg);
}
- }
- break;
+ else /* optional parameters not present, delay = 0 */
+ {
+ Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL_PID,
+ LC_TIME_FADE_STANDBY_MANUAL_PID_INDEX,
+ &tempVal);
+
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, 0, tempVal, LIGHT_LC_DEFAULT_TRANSITION_RES_MS);
+ }
+
+ NvmStatePowerFlag_Set(LIGHT_LC_NVM_FLAG, pLcParams->elementIndex);
+ TRACE_M(TF_LIGHT_LC_M, "PRE FADE ON -> PRE FADE STANDBY MANUAL\r\n");
+ pLcParams->state = PRE_FADE_STANDBY_MANUAL;
+ }
+ else /* POST STANDBY */
+ {
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 0, 0, 0, 0);
+ NvmStatePowerFlag_Set(LIGHT_LC_NVM_FLAG, pLcParams->elementIndex);
+ TRACE_M(TF_LIGHT_LC_M, "POST STANDBY -> STANDBY\r\n");
+ pLcParams->state = STANDBY;
+ }
}
- case LC_RUN:
+ else if(event == LIGHT_ON)
{
- if(Lc_Event == LC_LIGHT_OFF)
+ /*
+ if(optionalParamsOnOffMsg == 1)
{
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, delayMsOOnOD, transitionTimeMsOnOffMsg, stepResMsOnOffMsg);
+ }
+ else
+ {
+ Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_FADE_ON_PID,
+ LC_TIME_FADE_ON_PID_INDEX,
+ &tempVal);
- LightLC_States.Lc_States = LC_FADE_STANDBY_MANUAL;
-
- /* getting the Lightness on value from the table*/
- 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);
- /* Select the maximum value of lightness on value between Lightness on from
- table and Lux Level Output.
- */
- state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
- Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
-
- wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL_ID);
- Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
- TRACE_I(TF_LIGHT_LC_M,"RUN STATE --> STANDBY MANUAL STATE , LIGHT OFF EVENT \r\n");
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, 0, tempVal, LIGHT_LC_DEFAULT_TRANSITION_RES_MS);
}
- else if(Lc_Event == LC_OCCUPANCY_ON)
+
+ if(pLcParams->state == POST_STANDBY)
{
- /*
- when controller is in run state already and it gets the Occupancy on event,
- then the next state is run state.
- */
- LightLC_States.Lc_States = LC_RUN;
- Timer_value = resetTime;
- Lc_Event = LC_TIMER_OFF;
- TRACE_I(TF_LIGHT_LC_M,"RUN STATE --> RUN STATE , OCCUPANCY EVENT \r\n");
+ TRACE_M(TF_LIGHT_LC_M, "POST STANDBY -> POST STANDBY light on\r\n");
}
- else if(Lc_Event == LC_LIGHT_ON)
+ else
{
- /*
- when controller is in run state already and it gets the light on event,
- then the next state is run state.
- */
- LightLC_States.Lc_States = LC_RUN;
- Timer_value = resetTime;
- Lc_Event = LC_TIMER_OFF;
- TRACE_I(TF_LIGHT_LC_M,"RUN STATE --> RUN STATE , LIGHT ON EVENT \r\n\n");
- }
- else if(Lc_Event == LC_TIMER_OFF)
+ TRACE_M(TF_LIGHT_LC_M, "PRE FADE ON -> PRE FADE ON light on\r\n");
+ }
+ */
+ }
+ else
+ {
+ if(pLcParams->state == POST_STANDBY)
{
- /*
- when controller is not getting any event and it has completed its wait
- time of run state then it will change the state to the fade state by
- send the new light node value and transtion time .
- */
- if(delta > wait_time)
- {
- LightLC_States.Lc_States = LC_FADE;
-
- 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);
- /* Select the maximum value of lightness on value between Lightness on from
- table and Lux Level Output.
- */
- state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
- Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
-
- wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_ID);
- Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
- Timer_value = resetTime;
- Lc_Event = LC_TIMER_OFF;
- TRACE_I(TF_LIGHT_LC_M,"RUN STATE --> FADE STATE , wait time = %ld \r\n",wait_time);
- }
+ TRACE_M(TF_LIGHT_LC_M, "No action in POST STANDBY, event %d\r\n", event);
}
else
{
- /* No Comment */
+ TRACE_M(TF_LIGHT_LC_M, "No action in PRE FADE ON, event %d\r\n", event);
}
- break;
}
- case LC_FADE:
+ break;
+ case FADE_ON:
+ if(event == TIMER_TRIGGER) /* Transition step */
+ {
+ timerMs = Transition_TimerGet(pTrParams);
+ /* update current lightness value in transition */
+ pLcParams->lcActualSmOut = (MOBLEUINT16)Transition_StateValueGet
+ (pLcParams->targetLightnessOut,
+ pLcParams->initialLightnessOut,
+ timerMs,
+ pTrParams->trTimeMs);
+ pLcParams->luxLevelOut = Transition_StateValueGet
+ (pLcParams->targetLightLuxOut,
+ pLcParams->initialLightLuxOut,
+ timerMs,
+ pTrParams->trTimeMs);
+ pLcParams->updateLcLinearOut = 1;
+
+ /* continue in fade on */
+ }
+ else if(event == TIMER_OFF)
{
- if(Lc_Event == LC_LIGHT_OFF)
+ result = Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_RUN_ON_PID,
+ LC_TIME_RUN_ON_PID_INDEX,
+ &tempVal);
+
+ /* step resolution = run time to avoid intermediate triggers in run state */
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 0, 1, 0, tempVal, tempVal);
+
+ pLcParams->lcActualSmOut = pLcParams->targetLightnessOut;
+ pLcParams->luxLevelOut = pLcParams->targetLightLuxOut;
+ pLcParams->updateLcLinearOut = 1;
+ pLcParams->publish = 1;
+ pLcParams->state = RUN;
+ TRACE_M(TF_LIGHT_LC_M, "FADE ON -> RUN\r\n");
+ }
+ else if(event == LIGHT_OFF)
+ {
+ /* update initial with current lightness level during transition */
+ pLcParams->initialLightnessOut = (MOBLEUINT16)Transition_StateValueGet
+ (pLcParams->targetLightnessOut,
+ pLcParams->initialLightnessOut,
+ Transition_TimerGet(pTrParams),
+ pTrParams->trTimeMs);
+
+ /* Update target lightness value */
+ result = Light_LC_InitialTargetValueUpdatePid
+ (pLcParams,
+ 0, 0, 0, 0, 0,
+ 1,
+ LIGHT_CONTROL_LIGHTNESS_STANDBY_PID,
+ LC_LIGHTNESS_STANDBY_PID_INDEX,
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_STANDBY_PID,
+ LC_AMBIENT_LUXLEVEL_STANDBY_PID_INDEX);
+
+ if(optionalParamsOnOffMsg == 1)
{
- /* set the light 0x00 with transition time already by the light LC on off set */
- LightLC_States.Lc_States = LC_FADE_STANDBY_MANUAL;
-
- 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);
- /* Select the maximum value of lightness on value between Lightness on from
- table and Lux Level Output.
- */
- state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
- Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
-
- wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL_ID);
- Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
- TRACE_I(TF_LIGHT_LC_M,"FADE STATE --> STANDBY MANUAL , LIGHT OFF EVENT \r\n");
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, delayMsOOnOD, transitionTimeMsOnOffMsg, stepResMsOnOffMsg);
}
- else if(Lc_Event == LC_OCCUPANCY_ON)
+ else /* optional parameters not present, delay = 0 */
{
- /*
- when controller is in fade state and it gets the Occupancy on event,
- then the next state is fade on state.
- */
- LightLC_States.Lc_States = LC_FADE_ON;
-
- 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);
- /* Select the maximum value of lightness on value between Lightness on from
- table and Lux Level Output.
- */
- state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
- Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
+ Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL_PID,
+ LC_TIME_FADE_STANDBY_MANUAL_PID_INDEX,
+ &tempVal);
- wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_ON_ID);
- Lc_Event = LC_TIMER_OFF;
- Timer_value = resetTime;
- Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
- TRACE_I(TF_LIGHT_LC_M,"FADE STATE --> FADE ON STATE , OCCUPANCY ON EVENT \r\n");
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, 0, tempVal, LIGHT_LC_DEFAULT_TRANSITION_RES_MS);
}
- else if(Lc_Event == LC_LIGHT_ON)
+
+ NvmStatePowerFlag_Set(LIGHT_LC_NVM_FLAG, pLcParams->elementIndex);
+ TRACE_M(TF_LIGHT_LC_M, "FADE ON -> PRE FADE STANDBY MANUAL\r\n");
+ pLcParams->state = PRE_FADE_STANDBY_MANUAL;
+ }
+ else if(event == LIGHT_ON)
+ {
+ /*
+ pLcParams->initialLightnessOut = (MOBLEUINT16)Transition_StateValueGet
+ (pLcParams->targetLightnessOut,
+ pLcParams->initialLightnessOut,
+ Transition_TimerGet(pTrParams),
+ pTrParams->trTimeMs);
+
+ if(optionalParamsOnOffMsg == 1)
{
- /*
- when controller is in fade state and it gets the Light on event,
- then the next state is fade on state.
- */
- LightLC_States.Lc_States = LC_FADE_ON;
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, delayMsOOnOD, transitionTimeMsOnOffMsg, stepResMsOnOffMsg);
+ }
+ else
+ {
+ Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_FADE_ON_PID,
+ LC_TIME_FADE_ON_PID_INDEX,
+ &tempVal);
- 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);
- /* Select the maximum value of lightness on value between Lightness on from
- table and Lux Level Output.
- */
- state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
- Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, 0, tempVal, LIGHT_LC_DEFAULT_TRANSITION_RES_MS);
+ }
+
+ TRACE_M(TF_LIGHT_LC_M, "FADE ON -> PRE FADE ON\r\n");
+ pLcParams->state = PRE_FADE_ON;
+ */
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "No action in FADE ON, event %d\r\n", event);
+ }
+ break;
+ case RUN:
+ if (event == TIMER_OFF)
+ {
+ result = Light_LC_InitialTargetValueUpdatePid
+ (pLcParams,
+ 1,
+ LIGHT_CONTROL_LIGHTNESS_ON_PID,
+ LC_LIGHTNESS_ON_PID_INDEX,
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_ON_PID,
+ LC_AMBIENT_LUXLEVEL_ON_PID_INDEX,
+ 1,
+ LIGHT_CONTROL_LIGHTNESS_PROLONG_PID,
+ LC_LIGHTNESS_PROLONG_PID_INDEX,
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_PROLONG_PID,
+ LC_AMBIENT_LUXLEVEL_PROLONG_PID_INDEX);
+
+ Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_FADE_PID,
+ LC_TIME_FADE_PID_INDEX,
+ &tempVal);
+
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 0, 1, 0, tempVal, LIGHT_LC_DEFAULT_TRANSITION_RES_MS);
+ pLcParams->publish = 1;
+
+ TRACE_M(TF_LIGHT_LC_M, "RUN -> FADE\r\n");
+ pLcParams->state = FADE;
+ }
+ else if(event == LIGHT_OFF)
+ {
+ if(optionalParamsOnOffMsg == 1)
+ {
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, delayMsOOnOD, transitionTimeMsOnOffMsg, stepResMsOnOffMsg);
+ }
+ else /* optional parameters not present, delay = 0 */
+ {
+ Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL_PID,
+ LC_TIME_FADE_STANDBY_MANUAL_PID_INDEX,
+ &tempVal);
- wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_ON_ID);
- Timer_value = resetTime;
- Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
- Lc_Event = LC_TIMER_OFF;
- TRACE_I(TF_LIGHT_LC_M,"FADE STATE --> FADE ON STATE , LIGHT ON EVENT \r\n");
- }
- else if(Lc_Event == LC_TIMER_OFF)
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, 0, tempVal, LIGHT_LC_DEFAULT_TRANSITION_RES_MS);
+ }
+
+ result = Light_LC_InitialTargetValueUpdatePid
+ (pLcParams,
+ 1,
+ LIGHT_CONTROL_LIGHTNESS_ON_PID,
+ LC_LIGHTNESS_ON_PID_INDEX,
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_ON_PID,
+ LC_AMBIENT_LUXLEVEL_ON_PID_INDEX,
+ 1,
+ LIGHT_CONTROL_LIGHTNESS_STANDBY_PID,
+ LC_LIGHTNESS_STANDBY_PID_INDEX,
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_STANDBY_PID,
+ LC_AMBIENT_LUXLEVEL_STANDBY_PID_INDEX);
+
+ NvmStatePowerFlag_Set(LIGHT_LC_NVM_FLAG, pLcParams->elementIndex);
+ TRACE_M(TF_LIGHT_LC_M, "RUN -> PRE FADE STANDBY MANUAL\r\n");
+ pLcParams->state = PRE_FADE_STANDBY_MANUAL;
+ }
+ else if(event == LIGHT_ON)
+ {
+ Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_RUN_ON_PID,
+ LC_TIME_RUN_ON_PID_INDEX,
+ &tempVal);
+
+ if(optionalParamsOnOffMsg == 1)
{
- /* Controller wait here till the transition of light node is not completed
- so the wait time will be equal to the transition time sent by the controller
- then controller will change state to prolong state.
- */
- if(delta > wait_time)
- {
- LightLC_States.Lc_States = LC_PROLONG;
- 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_M,"FADE STATE --> PROLONG STATE , wait time = %ld \r\n",wait_time);
- }
+ /* step resolution = run time to avoid intermediate triggers */
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, delayMsOOnOD, transitionTimeMsOnOffMsg, transitionTimeMsOnOffMsg);
}
- else
+ else /* optional parameters not present, delay = 0 */
{
- /* no comments */
- }
- break;
+ /* step resolution = run time to avoid intermediate triggers */
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, 0, tempVal, tempVal);
+ }
+
+ TRACE_M(TF_LIGHT_LC_M, "RUN -> RUN light on\r\n");
+ }
+ else if(event == OCCUPANCY_ON)
+ {
+ Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_RUN_ON_PID,
+ LC_TIME_RUN_ON_PID_INDEX,
+ &tempVal);
+
+ /* step resolution = run time to avoid intermediate triggers */
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, delayMsOOnOD, tempVal, tempVal);
+
+ TRACE_M(TF_LIGHT_LC_M, "RUN -> RUN occupancy on\r\n");
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "No action in RUN, event %d\r\n", event);
}
- case LC_PROLONG:
+ break;
+ case FADE:
+ if(event == TIMER_TRIGGER) /* Transition step */
{
- if(Lc_Event == LC_LIGHT_OFF)
+ timerMs = Transition_TimerGet(pTrParams);
+ /* update current lightness value in transition */
+ pLcParams->lcActualSmOut = (MOBLEUINT16)Transition_StateValueGet
+ (pLcParams->targetLightnessOut,
+ pLcParams->initialLightnessOut,
+ timerMs,
+ pTrParams->trTimeMs);
+ pLcParams->luxLevelOut = Transition_StateValueGet
+ (pLcParams->targetLightLuxOut,
+ pLcParams->initialLightLuxOut,
+ timerMs,
+ pTrParams->trTimeMs);
+ pLcParams->updateLcLinearOut = 1;
+ }
+ else if (event == TIMER_OFF)
+ {
+ result = Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_PROLONG_PID,
+ LC_TIME_PROLONG_PID_INDEX,
+ &tempVal);
+
+ /* step resolution = run time to avoid intermediate triggers in prolong state */
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 0, 1, 0, tempVal, tempVal);
+
+ pLcParams->lcActualSmOut = (MOBLEUINT16)pLcParams->targetLightnessOut;
+ pLcParams->luxLevelOut = pLcParams->targetLightLuxOut;
+ pLcParams->updateLcLinearOut = 1;
+ pLcParams->publish = 1;
+
+ TRACE_M(TF_LIGHT_LC_M, "FADE -> PROLONG\r\n");
+ pLcParams->state = PROLONG;
+ }
+ else if (event == LIGHT_OFF)
+ {
+ result = Light_LC_InitialTargetValueUpdatePid
+ (pLcParams,
+ 0, 0, 0, 0, 0,
+ 1,
+ LIGHT_CONTROL_LIGHTNESS_STANDBY_PID,
+ LC_LIGHTNESS_STANDBY_PID_INDEX,
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_STANDBY_PID,
+ LC_AMBIENT_LUXLEVEL_STANDBY_PID_INDEX);
+
+ /* update initial with current value of transition parameters */
+ pLcParams->initialLightnessOut = (MOBLEUINT16)Transition_StateValueGet
+ (pLcParams->targetLightnessOut,
+ pLcParams->initialLightnessOut,
+ Transition_TimerGet(pTrParams),
+ pTrParams->trTimeMs);
+
+ if(optionalParamsOnOffMsg == 1)
{
- /* set the light 0x00 with transition time already by the light LC on off set */
- LightLC_States.Lc_States = LC_FADE_STANDBY_MANUAL;
-
- 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);
- /* Select the maximum value of lightness on value between Lightness on from
- table and Lux Level Output.
- */
- state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
- Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, delayMsOOnOD, transitionTimeMsOnOffMsg, stepResMsOnOffMsg);
+ }
+ else /* optional parameters not present, delay = 0 */
+ {
+ Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL_PID,
+ LC_TIME_FADE_STANDBY_MANUAL_PID_INDEX,
+ &tempVal);
- wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL_ID);
- Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
- TRACE_I(TF_LIGHT_LC_M,"PROLONG STATE --> STANDBY MANUAL , LIGHT OFF EVENT \r\n");
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, 0, tempVal, LIGHT_LC_DEFAULT_TRANSITION_RES_MS);
}
- else if(Lc_Event == LC_OCCUPANCY_ON)
+
+ NvmStatePowerFlag_Set(LIGHT_LC_NVM_FLAG, pLcParams->elementIndex);
+ TRACE_M(TF_LIGHT_LC_M, "FADE -> PRE FADE STANDBY MANUAL\r\n");
+ pLcParams->state = PRE_FADE_STANDBY_MANUAL;
+ }
+ else if(event == LIGHT_ON)
+ {
+ if(optionalParamsOnOffMsg == 1)
{
- /*
- when controller is in prolong state and it gets the Occupancy on event,
- then the next state is fade on state.
- */
- LightLC_States.Lc_States = LC_FADE_ON;
-
- 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);
- /* Select the maximum value of lightness on value between Lightness on from
- table and Lux Level Output.
- */
- state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
- Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
-
- wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_ON_ID);
- Timer_value = resetTime;
- Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
- TRACE_I(TF_LIGHT_LC_M,"STANDBY AUTO --> FADE ON STATE , OCCUPANCY ON EVENT \r\n");
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, delayMsOOnOD, transitionTimeMsOnOffMsg, stepResMsOnOffMsg);
}
- else if(Lc_Event == LC_LIGHT_ON)
+ else /* optional parameters not present, delay = 0 */
{
- /*
- when controller is in prolong state and it gets the Light on event,
- then the next state is fade on state.
- */
- LightLC_States.Lc_States = LC_FADE_ON;
+ Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_FADE_ON_PID,
+ LC_TIME_FADE_ON_PID_INDEX,
+ &tempVal);
- 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);
- /* Select the maximum value of lightness on value between Lightness on from
- table and Lux Level Output.
- */
- state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
- Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
-
- wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_ON_ID);
- Timer_value = resetTime;
- Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
- TRACE_I(TF_LIGHT_LC_M,"PROLONG STATE --> FADE ON STATE , LIGHT ON EVENT \r\n");
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, 0, tempVal, LIGHT_LC_DEFAULT_TRANSITION_RES_MS);
}
- else if(Lc_Event == LC_TIMER_OFF)
+
+ result = Light_LC_InitialTargetValueUpdatePid
+ (pLcParams,
+ 0, 0, 0, 0, 0,
+ 1,
+ LIGHT_CONTROL_LIGHTNESS_ON_PID,
+ LC_LIGHTNESS_ON_PID_INDEX,
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_ON_PID,
+ LC_AMBIENT_LUXLEVEL_ON_PID_INDEX);
+
+ /* update initial with current value of transition parameters */
+ pLcParams->initialLightnessOut = (MOBLEUINT16)Transition_StateValueGet
+ (pLcParams->targetLightnessOut,
+ pLcParams->initialLightnessOut,
+ Transition_TimerGet(pTrParams),
+ pTrParams->trTimeMs);
+
+ TRACE_M(TF_LIGHT_LC_M, "FADE -> PRE FADE ON light on\r\n");
+ pLcParams->state = PRE_FADE_ON;
+ }
+ else if(event == OCCUPANCY_ON)
+ {
+ result = Light_LC_InitialTargetValueUpdatePid
+ (pLcParams,
+ 0, 0, 0, 0, 0,
+ 1,
+ LIGHT_CONTROL_LIGHTNESS_ON_PID,
+ LC_LIGHTNESS_ON_PID_INDEX,
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_ON_PID,
+ LC_AMBIENT_LUXLEVEL_ON_PID_INDEX);
+
+ /* update initial with current value of transition parameters */
+ pLcParams->initialLightnessOut = (MOBLEUINT16)Transition_StateValueGet
+ (pLcParams->targetLightnessOut,
+ pLcParams->initialLightnessOut,
+ Transition_TimerGet(pTrParams),
+ pTrParams->trTimeMs);
+
+ Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_FADE_ON_PID,
+ LC_TIME_FADE_ON_PID_INDEX,
+ &tempVal);
+
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, delayMsOOnOD, tempVal, LIGHT_LC_DEFAULT_TRANSITION_RES_MS);
+
+ TRACE_M(TF_LIGHT_LC_M, "FADE -> PRE FADE ON occupancy on\r\n");
+ pLcParams->state = PRE_FADE_ON;
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "No action in FADE, event %d\r\n", event);
+ }
+ break;
+ case PROLONG:
+ if (event == TIMER_OFF)
+ {
+ result = Light_LC_InitialTargetValueUpdatePid
+ (pLcParams,
+ 1,
+ LIGHT_CONTROL_LIGHTNESS_PROLONG_PID,
+ LC_LIGHTNESS_PROLONG_PID_INDEX,
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_PROLONG_PID,
+ LC_AMBIENT_LUXLEVEL_PROLONG_PID_INDEX,
+ 1,
+ LIGHT_CONTROL_LIGHTNESS_STANDBY_PID,
+ LC_LIGHTNESS_STANDBY_PID_INDEX,
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_STANDBY_PID,
+ LC_AMBIENT_LUXLEVEL_STANDBY_PID_INDEX);
+
+ Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_FADE_STANDBY_AUTO_PID,
+ LC_TIME_FADE_STANDBY_AUTO_PID_INDEX,
+ &tempVal);
+
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 0, 1, 0, tempVal, LIGHT_LC_DEFAULT_TRANSITION_RES_MS);
+ pLcParams->publish = 1;
+
+ NvmStatePowerFlag_Set(LIGHT_LC_NVM_FLAG, pLcParams->elementIndex);
+ TRACE_M(TF_LIGHT_LC_M, "PROLONG -> FADE STANDBY AUTO\r\n");
+ pLcParams->state = FADE_STANDBY_AUTO;
+ }
+ else if (event == LIGHT_OFF)
+ {
+ result = Light_LC_InitialTargetValueUpdatePid
+ (pLcParams,
+ 1,
+ LIGHT_CONTROL_LIGHTNESS_PROLONG_PID,
+ LC_LIGHTNESS_PROLONG_PID_INDEX,
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_PROLONG_PID,
+ LC_AMBIENT_LUXLEVEL_PROLONG_PID_INDEX,
+ 1,
+ LIGHT_CONTROL_LIGHTNESS_STANDBY_PID,
+ LC_LIGHTNESS_STANDBY_PID_INDEX,
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_STANDBY_PID,
+ LC_AMBIENT_LUXLEVEL_STANDBY_PID_INDEX);
+
+ if(optionalParamsOnOffMsg == 1)
{
- /*
- when controller is not getting any event and it has completed its wait
- time of prolong state then it will change the state to the fade standby
- and send the new light node value and transtion time .
- */
- if(delta > wait_time)
- {
- LightLC_States.Lc_States = LC_FADE_STANDBY_AUTO;
-
- 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);
- /* Select the maximum value of lightness on value between Lightness on from
- table and Lux Level Output.
- */
- state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
- Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
-
- wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_STANDBY_AUTO_ID);
- Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
- Timer_value = resetTime;
- TRACE_I(TF_LIGHT_LC_M,"PROLONG STATE --> STANDBY AUTO STATE , wait time = %ld \r\n",wait_time);
- }
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, delayMsOOnOD, transitionTimeMsOnOffMsg, stepResMsOnOffMsg);
}
- else
+ else /* optional parameters not present, delay = 0 */
{
- /* no comments */
+ Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL_PID,
+ LC_TIME_FADE_STANDBY_MANUAL_PID_INDEX,
+ &tempVal);
+
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, 0, tempVal, LIGHT_LC_DEFAULT_TRANSITION_RES_MS);
}
- break;
+
+ NvmStatePowerFlag_Set(LIGHT_LC_NVM_FLAG, pLcParams->elementIndex);
+ TRACE_M(TF_LIGHT_LC_M, "PROLONG -> PRE FADE STANDBY MANUAL\r\n");
+ pLcParams->state = PRE_FADE_STANDBY_MANUAL;
}
- case LC_FADE_STANDBY_AUTO:
+ else if(event == LIGHT_ON)
{
- if(Lc_Event == LC_LIGHT_OFF)
+ if(optionalParamsOnOffMsg == 1)
+ {
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, delayMsOOnOD, transitionTimeMsOnOffMsg, stepResMsOnOffMsg);
+ }
+ else /* optional parameters not present, delay = 0 */
{
- /* set the light 0x00 with transition time already by the light LC on off set */
- LightLC_States.Lc_States = LC_FADE_STANDBY_MANUAL;
+ Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_FADE_ON_PID,
+ LC_TIME_FADE_ON_PID_INDEX,
+ &tempVal);
- 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);
- /* Select the maximum value of lightness on value between Lightness on from
- table and Lux Level Output.
- */
- state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
- Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
-
- wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL_ID);
- Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
- TRACE_I(TF_LIGHT_LC_M,"STANDBY AUTO STATE --> STANDBY MANUAL , LIGHT OFF EVENT \r\n");
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, 0, tempVal, LIGHT_LC_DEFAULT_TRANSITION_RES_MS);
}
- else if(Lc_Event == LC_OCCUPANCY_ON)
+
+ result = Light_LC_InitialTargetValueUpdatePid
+ (pLcParams,
+ 1,
+ LIGHT_CONTROL_LIGHTNESS_PROLONG_PID,
+ LC_LIGHTNESS_PROLONG_PID_INDEX,
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_PROLONG_PID,
+ LC_AMBIENT_LUXLEVEL_PROLONG_PID_INDEX,
+ 1,
+ LIGHT_CONTROL_LIGHTNESS_ON_PID,
+ LC_LIGHTNESS_ON_PID_INDEX,
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_STANDBY_PID,
+ LC_AMBIENT_LUXLEVEL_STANDBY_PID_INDEX);
+
+ TRACE_M(TF_LIGHT_LC_M, "PROLONG -> PRE FADE ON light on\r\n");
+ pLcParams->state = PRE_FADE_ON;
+ }
+ else if(event == OCCUPANCY_ON)
+ {
+ Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_FADE_ON_PID,
+ LC_TIME_FADE_ON_PID_INDEX,
+ &tempVal);
+
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, delayMsOOnOD, tempVal, LIGHT_LC_DEFAULT_TRANSITION_RES_MS);
+
+ result = Light_LC_InitialTargetValueUpdatePid
+ (pLcParams,
+ 1,
+ LIGHT_CONTROL_LIGHTNESS_PROLONG_PID,
+ LC_LIGHTNESS_PROLONG_PID_INDEX,
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_PROLONG_PID,
+ LC_AMBIENT_LUXLEVEL_PROLONG_PID_INDEX,
+ 1,
+ LIGHT_CONTROL_LIGHTNESS_ON_PID,
+ LC_LIGHTNESS_ON_PID_INDEX,
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_ON_PID,
+ LC_AMBIENT_LUXLEVEL_ON_PID_INDEX);
+
+ TRACE_M(TF_LIGHT_LC_M, "PROLONG -> PRE FADE ON occupancy on\r\n");
+ pLcParams->state = PRE_FADE_ON;
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "No action in PROLONG, event %d\r\n", event);
+ }
+ break;
+ case FADE_STANDBY_AUTO:
+ if(event == TIMER_TRIGGER)
+ {
+ timerMs = Transition_TimerGet(pTrParams);
+ pLcParams->lcActualSmOut = (MOBLEUINT16)Transition_StateValueGet
+ (pLcParams->targetLightnessOut,
+ pLcParams->initialLightnessOut,
+ timerMs,
+ pTrParams->trTimeMs);
+ pLcParams->luxLevelOut = Transition_StateValueGet
+ (pLcParams->targetLightLuxOut,
+ pLcParams->initialLightLuxOut,
+ timerMs,
+ pTrParams->trTimeMs);
+ pLcParams->updateLcLinearOut = 1;
+ }
+ else if(event == TIMER_OFF)
+ {
+ pLcParams->lcActualSmOut = pLcParams->targetLightnessOut;
+ pLcParams->luxLevelOut = pLcParams->targetLightLuxOut;
+ pLcParams->updateLcLinearOut = 1;
+ pLcParams->publish = 1;
+ Binding_LightLcLightOnOff_GenericOnOff(pLcParams->elementIndex, 0);
+ pLcParams->state = STANDBY;
+
+ TRACE_M(TF_LIGHT_LC_M, "FADE STANDBY AUTO -> STANDBY\r\n");
+ }
+ else if (event == LIGHT_OFF)
+ {
+ result = Light_LC_InitialTargetValueUpdatePid
+ (pLcParams,
+ 0, 0, 0, 0, 0,
+ 1,
+ LIGHT_CONTROL_LIGHTNESS_STANDBY_PID,
+ LC_LIGHTNESS_STANDBY_PID_INDEX,
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_STANDBY_PID,
+ LC_AMBIENT_LUXLEVEL_STANDBY_PID_INDEX);
+
+ /* update initial with current value of transition parameters */
+ pLcParams->initialLightnessOut = (MOBLEUINT16)Transition_StateValueGet
+ (pLcParams->targetLightnessOut,
+ pLcParams->initialLightnessOut,
+ Transition_TimerGet(pTrParams),
+ pTrParams->trTimeMs);
+
+ if(optionalParamsOnOffMsg == 1)
{
- /*
- when controller is in standby auto state and it gets the occupancy on event,
- then the next state is fade on state.
- */
- LightLC_States.Lc_States = LC_FADE_ON;
-
- 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);
- /* Select the maximum value of lightness on value between Lightness on from
- table and Lux Level Output.
- */
- state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
- Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
-
- wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_ON_ID);
- Timer_value = resetTime;
- Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
- TRACE_I(TF_LIGHT_LC_M,"STANDBY AUTO --> FADE ON STATE , OCCUPANCY ON EVENT \r\n");
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, delayMsOOnOD, transitionTimeMsOnOffMsg, stepResMsOnOffMsg);
}
- else if(Lc_Event == LC_LIGHT_ON)
+ else /* optional parameters not present, delay = 0 */
{
- /*
- when controller is in standby auto state and it gets the Light on event,
- then the next state is fade on state.
- */
- LightLC_States.Lc_States = LC_FADE_ON;
+ Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL_PID,
+ LC_TIME_FADE_STANDBY_MANUAL_PID_INDEX,
+ &tempVal);
- 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);
- /* Select the maximum value of lightness on value between Lightness on from
- table and Lux Level Output.
- */
- state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
- Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, 0, tempVal, LIGHT_LC_DEFAULT_TRANSITION_RES_MS);
+ }
+
+ TRACE_M(TF_LIGHT_LC_M, "FADE STANDBY AUTO ->PRE FADE STANDBY MANUAL\r\n");
+ pLcParams->state = PRE_FADE_STANDBY_MANUAL;
+ }
+ else if(event == LIGHT_ON)
+ {
+ result = Light_LC_InitialTargetValueUpdatePid
+ (pLcParams,
+ 0, 0, 0, 0, 0,
+ 1,
+ LIGHT_CONTROL_LIGHTNESS_ON_PID,
+ LC_LIGHTNESS_ON_PID_INDEX,
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_ON_PID,
+ LC_AMBIENT_LUXLEVEL_ON_PID_INDEX);
+
+ /* update initial with current value of transition parameters */
+ pLcParams->initialLightnessOut = (MOBLEUINT16)Transition_StateValueGet
+ (pLcParams->targetLightnessOut,
+ pLcParams->initialLightnessOut,
+ Transition_TimerGet(pTrParams),
+ pTrParams->trTimeMs);
+
+ if(optionalParamsOnOffMsg == 1)
+ {
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, delayMsOOnOD, transitionTimeMsOnOffMsg, stepResMsOnOffMsg);
+ }
+ else /* optional parameters not present, delay = 0 */
+ {
+ Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_FADE_ON_PID,
+ LC_TIME_FADE_ON_PID_INDEX,
+ &tempVal);
- wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_ON_ID);
- Timer_value = resetTime;
- Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
- TRACE_I(TF_LIGHT_LC_M,"STANDBY AUTO --> FADE ON STATE , LIGHT ON EVENT \r\n");
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, 0, tempVal, LIGHT_LC_DEFAULT_TRANSITION_RES_MS);
}
- else if(Lc_Event == LC_TIMER_OFF)
+
+ NvmStatePowerFlag_Set(LIGHT_LC_NVM_FLAG, pLcParams->elementIndex);
+ TRACE_M(TF_LIGHT_LC_M, "FADE STANDBY AUTO -> PRE FADE ON light on\r\n");
+ pLcParams->state = PRE_FADE_ON;
+ }
+ else if(event == OCCUPANCY_ON)
+ {
+ result = Light_LC_InitialTargetValueUpdatePid
+ (pLcParams,
+ 0, 0, 0, 0, 0,
+ 1,
+ LIGHT_CONTROL_LIGHTNESS_ON_PID,
+ LC_LIGHTNESS_ON_PID_INDEX,
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_ON_PID,
+ LC_AMBIENT_LUXLEVEL_ON_PID_INDEX);
+
+ /* update initial with current value of transition parameters */
+ pLcParams->initialLightnessOut = (MOBLEUINT16)Transition_StateValueGet
+ (pLcParams->targetLightnessOut,
+ pLcParams->initialLightnessOut,
+ Transition_TimerGet(pTrParams),
+ pTrParams->trTimeMs);
+
+ Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_FADE_ON_PID,
+ LC_TIME_FADE_ON_PID_INDEX,
+ &tempVal);
+
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, delayMsOOnOD, tempVal, LIGHT_LC_DEFAULT_TRANSITION_RES_MS);
+
+ NvmStatePowerFlag_Set(LIGHT_LC_NVM_FLAG, pLcParams->elementIndex);
+ TRACE_M(TF_LIGHT_LC_M, "FADE STANDBY AUTO -> PRE FADE ON occupancy on\r\n");
+ pLcParams->state = PRE_FADE_ON;
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "No action in FADE STANDBY AUTO, event %d\r\n", event);
+ }
+ break;
+ case PRE_FADE_STANDBY_MANUAL:
+ if(event == TIMER_ON)
+ {
+ pLcParams->publish = 1;
+ TRACE_M(TF_LIGHT_LC_M, "PRE FADE STANDBY MANUAL -> FADE STANDBY MANUAL\r\n");
+ pLcParams->state = FADE_STANDBY_MANUAL;
+ }
+ else if(event == TIMER_OFF)
+ {
+ pLcParams->publish = 1;
+ Binding_LightLcLightOnOff_GenericOnOff(pLcParams->elementIndex, 0);
+
+ TRACE_M(TF_LIGHT_LC_M, "PRE FADE STANDBY MANUAL -> STANDBY\r\n");
+ pLcParams->state = STANDBY;
+ }
+ else if(event == LIGHT_ON)
+ {
+ result = Light_LC_InitialTargetValueUpdatePid
+ (pLcParams, 0, 0, 0, 0, 0,
+ 1,
+ LIGHT_CONTROL_LIGHTNESS_ON_PID,
+ LC_LIGHTNESS_ON_PID_INDEX,
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_ON_PID,
+ LC_AMBIENT_LUXLEVEL_ON_PID_INDEX);
+
+ if(optionalParamsOnOffMsg == 1)
{
- /* Controller wait here till the transition of light node is not completed
- so the wait time will be equal to the transition time sent by the controller
- then controller will change state to standby state.
- */
- if(delta > wait_time)
- {
- LightLC_States.Lc_States = LC_STANDBY;
- Lc_Event = LC_NO_EVENT;
- Timer_value = resetTime;
- TRACE_I(TF_LIGHT_LC_M,"STANDBY AUTO --> STANDBY STATE , wait time = %ld \r\n",wait_time);
- }
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, delayMsOOnOD, transitionTimeMsOnOffMsg, stepResMsOnOffMsg);
}
- else
+ else /* optional parameters not present, delay = 0 */
{
- /* no comments */
+ Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_FADE_ON_PID,
+ LC_TIME_FADE_ON_PID_INDEX,
+ &tempVal);
+
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, 0, tempVal, LIGHT_LC_DEFAULT_TRANSITION_RES_MS);
}
- break;
+
+ NvmStatePowerFlag_Set(LIGHT_LC_NVM_FLAG, pLcParams->elementIndex);
+ TRACE_M(TF_LIGHT_LC_M, "PRE FADE STANDBY MANUAL -> PRE FADE ON\r\n");
+ pLcParams->state = PRE_FADE_ON;
}
- case LC_FADE_STANDBY_MANUAL:
+ else
{
- /*
- when controller is in run state already and it gets the Light on event,
- then the next state is fade on state.
- */
- if(Lc_Event == LC_LIGHT_ON)
- {
- LightLC_States.Lc_States = LC_FADE_ON;
-
- 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);
- /* Select the maximum value of lightness on value between Lightness on from
- table and Lux Level Output.
- */
- state_Value = Light_LC_MaxLightnessValue(LightnessValue,luxLightnessvalue);
- Light_LC_TemporaryStatus.TargetParam_1 = state_Value;
-
- wait_time = Get_TimeToWait(LIGHT_CONTROL_TIME_FADE_ON_ID);
- Timer_value = resetTime;
- Light_LC_ModelFlag.Light_LC_Transition_Flag = LIGHT_LC_TRANSITION_START;
- TRACE_I(TF_LIGHT_LC_M,"STANDBY MANUAL STATE --> FADE ON STATE , LIGHT ON EVENT \r\n");
+ TRACE_M(TF_LIGHT_LC_M, "No action in PRE FADE STANDBY MANUAL, event %d\r\n", event);
+ }
+ break;
+ case FADE_STANDBY_MANUAL:
+ if(event == TIMER_TRIGGER) /* Transition step */
+ {
+ timerMs = Transition_TimerGet(pTrParams);
+ /* update current lightness value in transition */
+ pLcParams->lcActualSmOut = (MOBLEUINT16)Transition_StateValueGet
+ (pLcParams->targetLightnessOut,
+ pLcParams->initialLightnessOut,
+ timerMs,
+ pTrParams->trTimeMs);
+ pLcParams->luxLevelOut = Transition_StateValueGet
+ (pLcParams->targetLightLuxOut,
+ pLcParams->initialLightLuxOut,
+ timerMs,
+ pTrParams->trTimeMs);
+ pLcParams->updateLcLinearOut = 1;
+ }
+ else if (event == TIMER_OFF)
+ {
+ pLcParams->lcActualSmOut = pLcParams->targetLightnessOut;
+ pLcParams->luxLevelOut = pLcParams->targetLightLuxOut;
+ pLcParams->updateLcLinearOut = 1;
+ pLcParams->publish = 1;
+ Binding_LightLcLightOnOff_GenericOnOff(pLcParams->elementIndex, 0);
+
+ TRACE_M(TF_LIGHT_LC_M, "FADE STANDBY MANUAL -> STANDBY\r\n");
+ pLcParams->state = STANDBY;
+ }
+ else if(event == LIGHT_ON)
+ {
+ /* update initial with current value of transition parameters */
+ pLcParams->initialLightnessOut = (MOBLEUINT16)Transition_StateValueGet
+ (pLcParams->targetLightnessOut,
+ pLcParams->initialLightnessOut,
+ Transition_TimerGet(pTrParams),
+ pTrParams->trTimeMs);
+
+ result = Light_LC_InitialTargetValueUpdatePid
+ (pLcParams,
+ 0, 0, 0, 0, 0,
+ 1,
+ LIGHT_CONTROL_LIGHTNESS_ON_PID,
+ LC_LIGHTNESS_ON_PID_INDEX,
+ LIGHT_CONTROL_AMBIENT_LUXLEVEL_ON_PID,
+ LC_AMBIENT_LUXLEVEL_ON_PID_INDEX);
+
+ if(optionalParamsOnOffMsg == 1)
+ {
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, delayMsOOnOD, transitionTimeMsOnOffMsg, stepResMsOnOffMsg);
}
- else
- {
- /* Controller wait here till the transition of light node is not completed
- so the wait time will be equal to the transition time sent by the controller
- then controller will change state to standby state.
- */
- if(delta > wait_time)
- {
- LightLC_States.Lc_States = LC_STANDBY;
- Lc_Event = LC_NO_EVENT;
- Timer_value = resetTime;
- TRACE_I(TF_LIGHT_LC_M,"STANDBY MANUAL STATE --> STANDBY STATE , wait time = %ld \r\n",wait_time);
- }
+ else /* optional parameters not present, delay = 0 */
+ {
+ Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_FADE_ON_PID,
+ LC_TIME_FADE_ON_PID_INDEX,
+ &tempVal);
+
+ transitionEvent = Light_LC_TransitionUpdate
+ (pLcParams, 1, 1, 0, tempVal, LIGHT_LC_DEFAULT_TRANSITION_RES_MS);
}
- break;
+
+ NvmStatePowerFlag_Set(LIGHT_LC_NVM_FLAG, pLcParams->elementIndex);
+ TRACE_M(TF_LIGHT_LC_M, "FADE STANDBY MANUAL -> PRE FADE ON\r\n");
+ pLcParams->state = PRE_FADE_ON;
}
- default:
+ else
{
- break;
+ TRACE_M(TF_LIGHT_LC_M, "No action in FADE STANDBY MANUAL, event %d\r\n", event);
}
+ break;
+ default:
+ break;
+ }
}
+
+ /* TRACE_M(TF_LIGHT_LC_M, "Updated state %d transition event %d publish status %d\r\n",
+ pLcParams->state, transitionEvent, pLcParams->publish); */
+
+ /* Possibility of recursion
+ Changes, if any pending, would happen except TRANSITION_EVENT_PUBLISH */
+ if (transitionEvent == TRANSITION_EVENT_TIMER_START)
+ {
+ Light_LC_Fsm(TIMER_ON, pLcParams, 0, 0, 0, 0);
+ }
+ else if(transitionEvent == TRANSITION_EVENT_TIMER_TRIG)
+ {
+ Light_LC_Fsm(TIMER_TRIGGER, pLcParams, 0, 0, 0, 0);
+ }
+ else if(transitionEvent == TRANSITION_EVENT_TIMER_STOP)
+ {
+ Light_LC_Fsm(TIMER_OFF, pLcParams, 0, 0, 0, 0);
+ }
+ else if(transitionEvent == TRANSITION_EVENT_PUBLISH)
+ {
+ LcServerP->publish = 1;
+ }
+ else
+ {
+ /* time to exit */
+ }
+
+ if(pLcParams->updateLcLinearOut == 1)
+ {
+ pLcParams->updateLcLinearOut = 0;
+
+ /* Lightness Linear = Ceiling (65535*(Light Lightness Actual/65535)^2) */
+ pLcParams->lightnessLinearUnreg = ((pLcParams->lcActualSmOut*pLcParams->lcActualSmOut)+65534)/65535;
+ pLcParams->lcLinearOut = MAX(pLcParams->lightnessLinearUnreg, Light_LC_PIregulator(pLcParams));
+ Binding_LcLinearOut_LightLightnessLinear(pLcParams->elementIndex, pLcParams->lcLinearOut);
+ }
+
+ return result;
}
+
/**
-* @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)
- {
+ * @brief Light LC property table initialization
+ * @param Reference to LC parameters
+ * @retval Fail if proeprty id or index inappropriate, else success
+ */
+static
+MOBLE_RESULT Light_LC_PropertyTableInit(lc_param_t* pLcParams)
+{
+ float temp = 0;
+ float* pFtemp;
+ MOBLEUINT32* pU32temp;
- static MOBLEUINT8 Clockflag = 0;
- static MOBLEUINT32 Check_time;
- MOBLEUINT16 targetRange;
- MOBLEUINT16 targetSlot;
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
- if(Clockflag == 0)
+ result = Light_LC_PropertyValueSet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_REGULATOR_ACCURACY_PID,
+ LC_REGULATOR_ACCURACY_PID_SIZE,
+ 4); /* Default value 2.0, resolution 0.5 */
+ if(result == MOBLE_RESULT_SUCCESS)
{
- Check_time = Clock_Time();
- Clockflag = 1;
+ temp = 25.0; /* Default value */
+ pFtemp = &temp;
+ pU32temp = (MOBLEUINT32*)pFtemp;
+ result = Light_LC_PropertyValueSet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_REGULATOR_KID_PID,
+ LC_REGULATOR_KID_PID_SIZE,
+ *pU32temp);
}
- /* 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)
+
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ temp = 250.0; /* Default value */
+ pFtemp = &temp;
+ pU32temp = (MOBLEUINT32*)pFtemp;
+ result = Light_LC_PropertyValueSet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_REGULATOR_KIU_PID,
+ LC_REGULATOR_KIU_PID_SIZE,
+ *pU32temp);
+ }
+
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ temp = 80.0; /* Default value */
+ pFtemp = &temp;
+ pU32temp = (MOBLEUINT32*)pFtemp;
+ result = Light_LC_PropertyValueSet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_REGULATOR_KPD_PID,
+ LC_REGULATOR_KPD_PID_SIZE,
+ *pU32temp);
+ }
+
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ temp = 80.0; /* Default value */
+ pFtemp = &temp;
+ pU32temp = (MOBLEUINT32*)pFtemp;
+ result = Light_LC_PropertyValueSet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_REGULATOR_KPU_PID,
+ LC_REGULATOR_KPU_PID_SIZE,
+ *pU32temp);
+ }
+
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ /* Lightnes On non-zero value required by PTS */
+ result = Light_LC_PropertyValueSet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_LIGHTNESS_ON_PID,
+ LC_LIGHTNESS_ON_PID_SIZE,
+ 0xFFFF);
+ }
+
+ return result;
+}
+
+
+/**
+ * @brief Get LC parameters to be stored in nvm
+ * @param element index
+ * @param buffer for parameters
+ * @param size of buffer as set
+ * @retval None
+ */
+__weak
+void Light_LC_NvmParams_Get(MOBLEUINT8 elementIndex,
+ MOBLEUINT8* lightLcNvmParamsBuff,
+ MOBLEUINT8* lcNvmParamsSize)
+{
+ MOBLEUINT8 mode = 0;
+ MOBLEUINT8 onOff = 0;
+ lc_param_t* pLcParams = NULL;
+
+ if(LcServerP != NULL)
+ {
+// if(elementIndex == LcServerP->elementIndex)
+// {
+ pLcParams = LcServerP;
+
+ if(pLcParams->state == OFF)
{
- 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.
+ mode = 0;
+ }
+ else
+ {
+ mode = 1;
+ }
+
+ if(pLcParams->state == OFF ||
+ pLcParams->state == STANDBY ||
+ pLcParams->state == FADE_STANDBY_AUTO ||
+ pLcParams->state == PRE_FADE_STANDBY_MANUAL ||
+ pLcParams->state == FADE_STANDBY_MANUAL)
+ {
+ onOff = 0; /* off */
+ }
+ else
+ {
+ onOff = 1;
+ }
+
+ lightLcNvmParamsBuff[0] = mode;
+ lightLcNvmParamsBuff[1] = pLcParams->occupancyMode;
+ lightLcNvmParamsBuff[2] = onOff;
+
+ /*
+ lc mode 1 byte
+ lc occupancy mode 1 byte
+ lc on off 1 byte
+ reserved 1 byte
*/
- 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;
+ *lcNvmParamsSize = 4;
+
+ TRACE_M(TF_LIGHT_LC_M, "mode %d occupancy mode %d light onOff %d\r\n",
+ lightLcNvmParamsBuff[0], lightLcNvmParamsBuff[1], lightLcNvmParamsBuff[2]);
+// }
+// else
+// {
+// TRACE_M(TF_LIGHT_LC_M, "Element index %d not supported by LC Server\r\n", elementIndex);
+// }
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "LC Server not initialized\r\n");
+ }
+}
+
+
+/**
+ * @brief Function used to restore the light LC with respect to Power on off
+ * value
+ * @param Element index
+ * @param Array of saved data
+ * @param Binded Generic onPowerUp
+ * @param Binded Light Lightness Default
+ * @param Binded Light Lightness Last
+ * @param Binded Light Lightness Acutal last known value
+ * @retval None
+ */
+__weak
+void Light_LC_OnPowerUp(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 const *pModelValue_Load,
+ MOBLEUINT8 genericOnPowerUp,
+ MOBLEUINT16 lightDefault,
+ MOBLEUINT16 lightLast,
+ MOBLEUINT16 lightActualLKV)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 onOff = 0; /* target */
+ MOBLEUINT16 lightActual = 0;
+ MOBLEUINT8 updateLightActual = 0;
+ MOBLEUINT8 lcModeLKV = pModelValue_Load[0]; /* last known value */
+ MOBLEUINT8 lcOmLKV = pModelValue_Load[1]; /* last known value */
+ MOBLEUINT8 lcOnOffLKV = pModelValue_Load[2]; /* last known value */
+ MOBLEUINT8 mode = 0;
+ lc_param_t* pLcParams = NULL;
+
+ if(LcServerP != NULL)
+ {
+// if(elementIndex == LcServerP->elementIndex)
+// {
+ TRACE_M(TF_LIGHT_LC_M, "OnPowerUp %d Mode lkv %d OM lkv %d OnOff lkv %d\r\n",
+ genericOnPowerUp, lcModeLKV, lcOmLKV, lcOnOffLKV);
+
+ pLcParams = LcServerP;
+
+ /*
+ 6.5.1.2 PowerUp sequence behavior
+ */
+
+ if(genericOnPowerUp == GENERIC_POWER_OFF_STATE)
+ {
+ /* Set Light Lightness Actual to 0 */
+ lightActual = 0;
+ updateLightActual = 1;
+
+ /* Assuming LC SM is off by default
+ Mode off
+ Occupancy mode as last known value
+ OnOff 0 */
+ mode = 0;
+ pLcParams->occupancyMode = lcOmLKV;
+ onOff = 0;
+ }
+ else if(genericOnPowerUp == GENERIC_POWER_ON_STATE)
+ {
+ if(lightDefault == 0)
+ {
+ /* If light lightness default is 0, set Light Lightness Actual to Light Lightness Last */
+ lightActual = lightLast;
+ }
+ else
+ {
+ /* else Set Light Lightness Actual to Light Lightness Default */
+ lightActual = lightDefault;
+ }
+
+ updateLightActual = 1;
+
+ /* LC SM off
+ Mode off
+ Occupancy mode as last known value
+ OnOff 0 */
+ mode = 0;
+ pLcParams->occupancyMode = lcOmLKV;
+ onOff = 0;
+ }
+ else if(genericOnPowerUp == GENERIC_POWER_RESTORE_STATE)
+ {
+ if(lcModeLKV == 0)
+ {
+ lightActual = lightActualLKV;
+ updateLightActual = 1;
+
+ /* LC SM off
+ Mode off */
+ mode = 0;
+ }
+ else
+ {
+ /* LC SM off
+ Mode on
+ equivalent to standby */
+ mode = 1;
+
+ /*
+ Workaround for not saving property values in nvm
+ Inserts lag in state machine after reset
+ */
+ Light_LC_PropertyValueSet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_RUN_ON_PID,
+ LC_TIME_RUN_ON_PID_SIZE,
+ 20000);
+ }
+
+ /* Occupancy mode as last known value
+ OnOff 0 */
+ pLcParams->occupancyMode = lcOmLKV;
+ onOff = lcOnOffLKV;
}
+ else
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ TRACE_M(TF_LIGHT_LC_M, "Generic OnPowerUp invalid %d\r\n", genericOnPowerUp);
+ }
+// }
+// else
+// {
+// result = MOBLE_RESULT_INVALIDARG;
+// TRACE_M(TF_LIGHT_LC_M, "Element index %d not supported by LC Server\r\n", elementIndex);
+// }
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_LIGHT_LC_M, "LC Server not initialized\r\n");
+ }
+
+ TRACE_M(TF_LIGHT_LC_M, "Updated Mode %d OM %d OnOff %d light actual %d\r\n",
+ mode, pLcParams->occupancyMode, onOff, lightActual);
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ if(updateLightActual == 1)
+ {
+ /* Set Light Actual value */
+ //todo update actual light lightness
+ //dummy call
+ Light_LC_PropertyValueSet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ 0,
+ 0,
+ lightActual);
+ }
+
+ if(mode == 0)
+ {
+ /* LC initialized in OFF */
+ }
else
- {
- /* 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;
- }
+ {
+ Light_LC_Fsm(MODE_ON, pLcParams, 0, 0, 0, 0);
- 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;
-
- /* when transition is completed, disable the transition by disabling
- transition flag
- */
- if(Light_LC_TimeParam.StepValue == 0)
- {
- 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;
- }
-
- TRACE_M(TF_LIGHT_M,"Inside light lightness transmition time at %ld, 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.
-* retval MOBLEUINT32
-*/
-MOBLEUINT32 Light_LC_GetStepValue(MOBLEUINT8 stepParam)
-{
- /*
- Two MSB bit of transition time is dedicated to resolution.
- 00 = resolution is 100 ms.
- 01 = resolution is 1000 ms.
- 10 = resolution is 10000 ms.
- 11 = resolution is 600000 ms.
- Last bits from 0 to 5th index is step number.
+ if(onOff == 0)
+ {
+ Light_LC_Fsm(LIGHT_OFF, pLcParams, 0, 0, 0, 0);
+ }
+ else
+ {
+ Light_LC_Fsm(LIGHT_ON, pLcParams, 0, 0, 0, 0);
+ }
+ }
+ }
+ else
+ {
+ /* */
+ }
+}
+
+
+/**
+ * @brief Set LC Light OnOff Transition Time to 0
+ * Transitions are immediate and run time set to 20 seconds (PTS requirement)
+ * Used for PTS test requirements
+ * @param Element index
+ * @retval result as set by Light_LC_PropertySet
*/
- Light_LC_TimeParam.ResBitValue = stepParam >> 6 ;
- Light_LC_TimeParam.Res_Value = Get_StepResolutionValue(Light_LC_TimeParam.ResBitValue);
- Light_LC_TimeParam.StepValue = stepParam & 0x3F ;
+__weak
+MOBLE_RESULT Light_LC_SetTransitionTimeZero(MOBLEUINT8 elementIndex)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 lcsElementIndex = 1;
+ lc_param_t* pLcParams = LcServerP;
- if(Light_LC_TimeParam.Res_Value >= 100)
+ if(LcServerP != NULL &&
+ lcsElementIndex == elementIndex)
{
- Light_LC_TimeParam.Res_Value = Light_LC_TimeParam.Res_Value/TRANSITION_SCALER;
- Light_LC_TimeParam.StepValue = (Light_LC_TimeParam.StepValue * TRANSITION_SCALER);
+ result = Light_LC_PropertyValueSet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_FADE_ON_PID,
+ LC_TIME_FADE_ON_PID_SIZE,
+ 0);
+ result = Light_LC_PropertyValueSet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_FADE_PID,
+ LC_TIME_FADE_PID_SIZE,
+ 0);
+ result = Light_LC_PropertyValueSet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_FADE_STANDBY_AUTO_PID,
+ LC_TIME_FADE_STANDBY_AUTO_PID_SIZE,
+ 0);
+ result = Light_LC_PropertyValueSet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_FADE_STANDBY_MANUAL_PID,
+ LC_TIME_FADE_STANDBY_MANUAL_PID_SIZE,
+ 0);
+ result = Light_LC_PropertyValueSet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_PROLONG_PID,
+ LC_TIME_PROLONG_PID_SIZE,
+ 0);
+ result = Light_LC_PropertyValueSet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_RUN_ON_PID,
+ LC_TIME_RUN_ON_PID_SIZE,
+ 20000);
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "LC server not initialized or wrong element index %d\r\n", elementIndex);
+ result = MOBLE_RESULT_FAIL;
}
- Light_LC_TimeParam.TotalTime = Light_LC_TimeParam.Res_Value * Light_LC_TimeParam.StepValue;
- return Light_LC_TimeParam.TotalTime;
+ return result;
}
-/**
-* @brief Get_TimeToWait: This function calculates the time to wait foe any condition
-* @param Proprety_ID: property id of the parameter
-* retval MOBLEUINT32
-*/
-MOBLEUINT32 Get_TimeToWait(MOBLEUINT16 Proprety_ID)
+
+/**
+ * @brief Light LC Server also support Sensor Client processing of properties
+ * MOTION_SENSED_PID, PEOPLE_COUNT_PID, PRESENCE_DETECTED_PID,
+ * TIME_SINCE_MOTION_SENSED_PID and PRESENT_AMBIENT_LIGHT_LEVEL_PID
+ * Used for reporting occupancy sensing
+ * Mandatory requirement for LC Server to process sensor client with these porperty IDs
+ * @param Targeted LC Server lement index
+ * @param Property id
+ * @param Property value
+ * @retval Success if property id and reported values are appropriate
+ */
+__weak
+MOBLE_RESULT Light_LC_SensorPropertyUpdate(MOBLEUINT8 lcsElementIndex,
+ MOBLEUINT16 sensorPropertyId,
+ MOBLEUINT32 value)
{
- MOBLEUINT32 total_time;
- MOBLEUINT16 length;
- if(Light_LC_Param.Transition_Time > 0x00)
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 occupancyState = 0;
+ MOBLEUINT32 tempVal = 0;
+ lc_param_t* pLcParams = NULL;
+ MOBLEUINT32 delayMotionSenseMs = 0;
+
+ if(LcServerP != NULL &&
+ LcServerP->elementIndex == lcsElementIndex)
{
- total_time = (MOBLEUINT32)Light_LC_GetStepValue((MOBLEUINT8)Light_LC_Param.Transition_Time);
+ pLcParams = LcServerP;
}
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;
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_LIGHT_LC_M, "LC server not initialized or wrong element index %d\r\n", lcsElementIndex);
+ }
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ switch(sensorPropertyId)
+ {
+ case MOTION_SENSED_PID:
+ if(value <= 100 || value == 0xFF)
+ {
+ if(value > 0)
+ {
+ occupancyState = 1;
+ }
+ else
+ {
+ result = MOBLE_RESULT_FALSE;
+ }
+ }
+ else /* Prohibited values */
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+ break;
+ case PEOPLE_COUNT_PID:
+ if(value > 0)
+ {
+ occupancyState = 1;
+ }
+ else
+ {
+ result = MOBLE_RESULT_FALSE;
+ }
+ break;
+ case PRESENCE_DETECTED_PID:
+ if(value < 2)
+ {
+ if(value == 1)
+ {
+ occupancyState = 1;
+ }
+ else
+ {
+ result = MOBLE_RESULT_FALSE;
+ }
+ }
+ else /* Prohibited values */
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+ break;
+ case TIME_SINCE_MOTION_SENSED_PID:
+ if(value < 65535)
+ {
+ delayMotionSenseMs = value*1000;/* seconds to milliseconds */
+ occupancyState = 1;
+ }
+ break;
+ case PRESENT_AMBIENT_LIGHT_LEVEL_PID:
+ if(value < 0xFFFFFF)
+ {
+ pLcParams->ambientLuxLevel = value;
+ result = Light_LC_Fsm(AMBIENT_LUX_MODIFIED,
+ pLcParams,
+ 0, 0, 0, 0);
+ }
+ break;
+ default:
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_LIGHT_LC_M, "Property (%x) not relevant for LC server model\r\n", sensorPropertyId);
+ break;
+ }
}
- TRACE_I(TF_LIGHT_LC_M,"TOTAL WAIT TIME %lu \r\n",total_time);
-
- return total_time;
+ if(occupancyState == 1)
+ {
+ if(pLcParams->occupancyMode == 1)
+ {
+ /* Get time occupancy delay property value */
+ Light_LC_PropertyValueGet(pLcParams->pPropertyId,
+ pLcParams->propertyValue,
+ LIGHT_CONTROL_TIME_OCCUPANCY_DELAY_PID,
+ LC_TIME_OCCUPANCY_DELAY_PID_INDEX,
+ &tempVal);
+
+ /* Adjust delay for occupancy detect event */
+ if(delayMotionSenseMs < tempVal)
+ {
+ tempVal = tempVal - delayMotionSenseMs;
+ }
+
+ result = Light_LC_Fsm(OCCUPANCY_ON,
+ pLcParams,
+ tempVal,/* delay in milliseconds for processing of occupancy on */
+ 0, 0, 0);
+
+ TRACE_M(TF_LIGHT_LC_M, "Occupancy detected\r\n");
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Occupancy rejected\r\n");
+ }
+ }
+
+ return result;
}
+
/**
-* @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)
+ * @brief Unsolicited change in Light Lightness Linear disables binding
+ * between LC Linear Out and Light Lightness Linear and
+ * LC state machine mode = 0b0
+ * @param element index
+ * @retval None
+ */
+__weak
+void Light_LC_LigtnessLinearUnsolicitedChange(MOBLEUINT8 elementIndex)
{
- Light_LC_GenericOnOffBinding(&Light_LC_Param);
+ if(LcServerP != NULL)
+ {
+ if(elementIndex == LcServerP->elementIndex)
+ {
+ TRACE_M(TF_LIGHT_LC_M, ">>>\r\n");
+ Light_LC_Fsm(MODE_OFF, LcServerP, 0, 0, 0, 0);
+ }
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "LC server not initialized");
+ }
+}
+
+
+/**
+ * @brief Light_LC_SleepDurationMs_Get
+ * returns max time after which call to process Light_LC_Process is required
+ * to adjust internal states or to adjust Light Lightness or to publish status
+ * @param None
+ * @retval sleep time in miliseconds
+ */
+__weak
+MOBLEUINT32 Light_LC_SleepDurationMs_Get(void)
+{
+ MOBLEUINT32 sleepDuration = 0xFFFFFFFF;
+ lc_param_t* pLcParams = NULL;
+
+ if(LcServerP != NULL)
+ {
+ pLcParams = LcServerP;
+ sleepDuration = Transition_TimeToNextActionGet(&pLcParams->transitionParams);
+ }
- Light_Publish_Add(GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
- GENERIC_ON_OFF_SET_UNACK);
-// 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++;
+ return sleepDuration;
}
+
+
/**
-* @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)
+ * @brief Publish Light LC status
+ * @param element index for which Light LC status to be published
+ * @retval Fail if LC server not supported on element else as set by status
+ */
+__weak
+MOBLE_RESULT Light_LC_Send(MOBLEUINT8 elementIndex)
{
- if(onOff_param->Present_OnOff_State == 0x00)
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MODEL_MessageHeader_t pmsgParam;
+
+ if(LcServerP != NULL)
{
- Light_LC_Param.Present_Light_OnOff = 0x00;
+ if(LcServerP->elementIndex == elementIndex)
+ {
+ pmsgParam.elementIndex = elementIndex;
+ TRACE_M(TF_LIGHT_LC_M, "Publish status for element index %d\r\n", pmsgParam.elementIndex);
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Publish status element index %d not supported\r\n", elementIndex);
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ if(MOBLE_SUCCEEDED(result))
+ {
+ result = Light_LC_OnOffStatus(LcServerP,
+ &pmsgParam,
+ STATUS_SEND_PUBLISH);
+ }
}
else
{
- Light_LC_Param.Present_Light_OnOff = 0x01;
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_LIGHT_LC_M, "LC server not initialized");
}
- Light_Publish_Add(LIGHT_MODEL_SERVER_LC_MODEL_ID,
- LIGHT_LC_ON_OFF_SET_UNACK);
-// 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++;
+ return result;
}
+
+
/**
-* @brief Light_control_Process: Function to execute the transition state machine for
-* particular Light LC model and state machine Light LC application
-* @param void
-* @retval void
-*/
-void Light_control_Process(void)
+ * @brief To update LC on off state
+ * Can be used for updating binded LC on off with Generic on off
+ * @param Element index
+ * @param On off state
+ * @param Optional parameters flag
+ * @param Delay from on off message
+ * @param Step resolution from on off message
+ * @param Transition time from on off message
+ */
+__weak
+MOBLE_RESULT Light_LC_LcOnOffUpdate(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 onOff,
+ MOBLEUINT8 optionalParams,
+ MOBLEUINT32 delayMsOnOffMsg,
+ MOBLEUINT32 stepResMsOnOffMsg,
+ MOBLEUINT32 trTimeMsOnOffMsg)
{
- 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)
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+
+ if(LcServerP != NULL)
+ {
+ if(elementIndex == LcServerP->elementIndex)
+ {
+ if(onOff == 0)
{
- Light_LC_LightnessStateUpdate_Process(&Light_LC_TemporaryStatus);
- Light_LC_ModelFlag.LightLCUpdateFlag = VALUE_UPDATE_RESET;
+ result = Light_LC_Fsm(LIGHT_OFF,
+ LcServerP,
+ optionalParams,
+ delayMsOnOffMsg,
+ stepResMsOnOffMsg,
+ trTimeMsOnOffMsg);
}
- }
-
- 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)
+ else if(onOff == 1)
{
- Model_SendResponse(publishAddress,my_Address,LIGHT_LC_ON_OFF_SET_UNACK,pRxData,dataLength);
+ result = Light_LC_Fsm(LIGHT_ON,
+ LcServerP,
+ optionalParams,
+ delayMsOnOffMsg,
+ stepResMsOnOffMsg,
+ trTimeMsOnOffMsg);
}
- TRACE_I(TF_LIGHT_LC_M,"PUBLISHING OF LIGHT LC AT END OF TRANSITION \r\n");
- Light_LC_ModelFlag.Transition_Cmplt = MOBLE_FALSE;
}
- }
- else
+ else
{
- /* Light LC on off set to off */
- Light_LC_Param.Present_Light_OnOff = 0x0;
- LightLC_States.Lc_States = LC_STANDBY;
- }
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_LIGHT_LC_M, "LC server not initialized");
+ }
+
+ return result;
}
+
+
+/**
+ * @brief Execute transition and update publish status
+ * @param None
+ * @retval None
+ */
+__weak
+void Light_LC_Process(void)
+{
+ transition_event_e transitionEvent = TRANSITION_EVENT_NO;
+
+ if(LcServerP != NULL)
+ {
+ /* One instance of LC server is supported */
+ if(LcServerP->transitionParams.trStatus != TRANSITION_STATUS_STOP)
+ {
+ transitionEvent = Transition_Sm(&LcServerP->transitionParams, 0);
+ if (transitionEvent == TRANSITION_EVENT_TIMER_START)
+ {
+ Light_LC_Fsm(TIMER_ON, LcServerP, 0, 0, 0, 0);
+ }
+ else if(transitionEvent == TRANSITION_EVENT_TIMER_TRIG)
+ {
+ Light_LC_Fsm(TIMER_TRIGGER, LcServerP, 0, 0, 0, 0);
+ }
+ else if(transitionEvent == TRANSITION_EVENT_TIMER_STOP)
+ {
+ Light_LC_Fsm(TIMER_OFF, LcServerP, 0, 0, 0, 0);
+ }
+ else if(transitionEvent == TRANSITION_EVENT_PUBLISH)
+ {
+ LcServerP->publish = 1;
+ }
+ else
+ {
+ /* time to exit */
+ }
+ }
+ else
+ {
+ /* Timer is stopped */
+ }
+
+ /* LC Publish */
+ if(LcServerP->publish == 1)
+ {
+ Light_LC_Send(LcServerP->elementIndex);
+ LcServerP->publish = 0;
+ }
+ }
+}
+
+
/**
-* @brief Light_LC_LuxLevelOutputValue: This function will return the lightness value
- from the lux sensors.
-* @param property_ID:property id of the parameter
-* @retval MOBLEUINT16:
-**/
-MOBLEUINT16 Light_LC_LuxLevelOutputValue(MOBLEUINT16 property_ID)
+ * @brief Initialize Light LC server model
+ * @param Reference to LC Server buffer
+ * @param LC server element index
+ * @param Reference to application callbacks of LC server
+ * @param Buffer size allocated to LC Server
+ * @retval success if initialization successful
+ * else fail
+ */
+__weak
+MOBLE_RESULT Light_LCs_Init(void* lcsBuff,
+ MOBLEUINT8 lcsElementIndex,
+ const light_lc_cb_t* lcs_cb,
+ MOBLEUINT16 sizeBuff)
{
- MOBLEUINT16 availableLuxValue;
- MOBLEUINT16 ambientLuxValue;
- MOBLEUINT16 lightnessOutput;
- MOBLEUINT16 length;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 requiredBuffSize = sizeof(lc_param_t);
+
+ TRACE_M(TF_LIGHT_LC_M, "Element index %d Required buffer size %d\r\n", lcsElementIndex, requiredBuffSize);
- availableLuxValue = Light_LC_GetPropertyID_value(property_ID,&length);
- ambientLuxValue = Appli_LightLC_GetStatus_cb.GetLightLC_AmbientLuxLevel_cb();
+ if(sizeBuff < requiredBuffSize)
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_LIGHT_LC_M, "Buffer size %d not sufficient\r\n", sizeBuff);
+ }
- lightnessOutput = Appli_LightLC_GetStatus_cb.GetLightLC_PIregulatorOut_cb(availableLuxValue,ambientLuxValue);
-
- return lightnessOutput;
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ LcServerP = lcsBuff;
+
+ if(LC_PropertyId != NULL)
+ {
+ LcServerP->pPropertyId = LC_PropertyId;
}
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_LIGHT_LC_M, "Property Id table not found\r\n");
+ }
+
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ if(lcs_cb != NULL)
+ {
+ LcServerP->p_cb = lcs_cb;
+ }
+
+ LcServerP = (lc_param_t*)lcsBuff;
+ LcServerP->elementIndex = lcsElementIndex;
+
+ /* Initialize property IDs */
+ result = Light_LC_PropertyTableInit(LcServerP);
+
+ /* Set default values of properties */
+ LcServerP->occupancyMode = 1;
+
+ LcServerP->ambientLuxLevel = 0xFFFFFF; /* corresponds to value not known */
+
+ /* Retreiving property values from NVM pending */
+ }
+ }
+
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Light LC Server initialized on element index %d\r\n", LcServerP->elementIndex);
+
+ for(MOBLEUINT8 count=0; count<LC_PROPERTY_TABLE_COUNT; count++)
+ {
+ TRACE_M(TF_LIGHT_LC_M, "LC property id %x size %d value index %d value %lx\r\n",
+ LcServerP->pPropertyId[count].id,
+ LcServerP->pPropertyId[count].size,
+ LcServerP->pPropertyId[count].valueIndex,
+ LcServerP->propertyValue[count]);
+ }
+ }
+
+ return result;
+}
/**
-* @brief Light_LC_MaxLightnessValue: This function will return the maximum value
- after comparision.
-* @param Param1:paramter to the function
-* @param Param2:paramter to the function
-* @retval MOBLEUINT16:
-**/
-MOBLEUINT16 Light_LC_MaxLightnessValue(MOBLEUINT16 Param1,MOBLEUINT16 Param2)
+ * @brief Dependent on user configuration
+ * To check avaialability and consistency of supported model required for LC Server
+ * Limitation: Check for sensor client to process sensor status
+ * @param Reference to LC Server element index, LC Server would be initialized on this element
+ * @param No of elements
+ * @param LC Server elements as defined by user
+ * @param LC Setup Server elements as defined by user
+ * @param Generic On Off Server elements as defined by user
+ * @param Generic On Off Setup Server elements as defined by user
+ * @param Light Lightness Server elements as defined by user
+ * @retval Success if dependcies are appropriate
+ */
+__weak
+MOBLE_RESULT ExtractLcServerElementIndex(MOBLEUINT8* pLcsElementIndex,
+ MOBLEUINT8 noOfElements,
+ MOBLEUINT8 lcServer,
+ MOBLEUINT8 lcSetupServer,
+ MOBLEUINT8 genericOnOffServer,
+ MOBLEUINT8 genericPowerOnOffServer,
+ MOBLEUINT8 lightLightnessServer)
{
- if(Param1 > Param2)
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+ MOBLEUINT8 lcServerCount = 0;
+
+ if(noOfElements < 2)
{
- return Param1;
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_LIGHT_LC_M, "Atleast 2 elements are required for LC server\r\n");
}
- else if(Param2 > Param1)
+ else
{
- return Param2;
+ for(uint8_t count = 0; count < noOfElements; count++)
+ {
+ /* Extract LC server element index */
+ if((lcServer & (1 << count)) == (1 << count))
+ {
+ lcServerCount++;
+
+ if(lcServerCount == 1)
+ {
+ *pLcsElementIndex = count; /* First element index supporting LC server */
+
+ /* LC Setup Server may be supported on same element as of LC Server */
+ if((lcSetupServer & (1 << count)) == (1 << count))
+ {
+ result = MOBLE_RESULT_SUCCESS;
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "LC Setup Server not found, element index %d\r\n", count);
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ /* Generic OnOff Server should be supported on same element as of LC Server */
+ if(result == MOBLE_RESULT_SUCCESS )
+ {
+ if((genericOnOffServer & (1 << count)) == (1 << count))
+ {
+ result = MOBLE_RESULT_SUCCESS;
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Generic OnOff Server not found, element index %d\r\n", count);
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+
+ /* Generic Power OnOff Server should be supported on same element as of LC Server */
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ if((genericPowerOnOffServer & (1 << count)) == (1 << count))
+ {
+ result = MOBLE_RESULT_SUCCESS;
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Generic Power OnOff Server not found, element index %d\r\n", count);
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+
+ /* Light Lightness should be supported on different element as of LC Server */
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ if((lightLightnessServer & (1 << count)) == (1 << count))
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Light Lightness Server found on same element, element index %d\r\n", count);
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+ }
+ }
+ else
+ {
+ /* check for Light Lightness Server on different element */
+ }
+ }
+ }
+
+ /* LC server and LC Server setup are available on same element */
+ if(MOBLE_SUCCEEDED(result))
+ {
+ if(lcServerCount > 1)
+ {
+ result = MOBLE_RESULT_FALSE;
+ /*
+ LC Server is supported on more than one element
+ Only one instance of LC server is supported by module
+ First element with LC server is used for initialiazing LC server
+ */
+ }
}
else
{
- return Param1;
- }
+ /* */
+ }
+
+ return result;
+}
+
+/******************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_LC
+/******************************************************************************/
+/**
+* @brief LightLC_Client_Mode_Status: Function called when status of the model
+* received on the client.
+* @param pLCMode_status: pointer to the parameters received for message
+* @param plength: Length of the parameters received for message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
+* return MOBLE_RESULT_SUCCESS.
+*/
+MOBLE_RESULT LightLC_Client_Mode_Status(MOBLEUINT8 const *pLCMode_status, MOBLEUINT32 plength, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT32 i;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightLC_Client_Mode_Status received \r\n");
+ AppliLightLc_cb.LightLCs_ModeStatus_cb(pLCMode_status, plength, dstPeer, elementIndex);
+
+ for(i = 0; i < plength; i++)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightLC_Client_Mode_Status: 0x%x\r\n",
+ pLCMode_status[i]);
+ }
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief LightLC_Client_OM_Status: Function called when status of the model
+* received on the client.
+* @param pLCOccupancyMode_status: pointer to the parameters received for message
+* @param plength: Length of the parameters received for message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
+* return MOBLE_RESULT_SUCCESS.
+*/
+MOBLE_RESULT LightLC_Client_OM_Status(MOBLEUINT8 const *pLCOccupancyMode_status, MOBLEUINT32 plength, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT32 i;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightLC_Client_OM_Status received \r\n");
+ AppliLightLc_cb.LightLCs_OmStatus_cb(pLCOccupancyMode_status, plength, dstPeer, elementIndex);
+
+ for(i = 0; i < plength; i++)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightLC_Client_OM_Status: 0x%x\r\n",
+ pLCOccupancyMode_status[i]);
+ }
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief LightLC_Client_OnOff_Status: Function called when status of the model
+* received on the client.
+* @param pLCOnOff_status: pointer to the parameters received for message
+* @param plength: Length of the parameters received for message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
+* return MOBLE_RESULT_SUCCESS.
+*/
+MOBLE_RESULT LightLC_Client_OnOff_Status(MOBLEUINT8 const *pLCOnOff_status, MOBLEUINT32 plength, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT32 i;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightLC_Client_OnOff_Status received \r\n");
+ AppliLightLc_cb.LightLCs_OnOffStatus_cb(pLCOnOff_status, plength, dstPeer, elementIndex);
+
+ for(i = 0; i < plength; i++)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightLC_Client_OnOff_Status: 0x%x\r\n",
+ pLCOnOff_status[i]);
+ }
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief LightLC_Client_Property_Status: Function called when status of the model
+* received on the client.
+* @param pLCOnOff_status: pointer to the parameters received for message
+* @param plength: Length of the parameters received for message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
+* return MOBLE_RESULT_SUCCESS.
+*/
+MOBLE_RESULT LightLC_Client_Property_Status(MOBLEUINT8 const *pLCProperty_status, MOBLEUINT32 plength, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT32 i;
+
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightLC_Client_Property_Status received \r\n");
+ AppliLightLc_cb.LightLCs_PropertyStatus_cb(pLCProperty_status, plength, dstPeer, elementIndex);
+
+ for(i = 0; i < plength; i++)
+ {
+ TRACE_M(TF_LIGHT_CLIENT_M,"LightLC_Client_Property_Status: 0x%x\r\n",
+ pLCProperty_status[i]);
+ }
+
+ return MOBLE_RESULT_SUCCESS;
}
+/******************************************************************************/
+#endif /* #ifdef ENABLE_LIGHT_MODEL_CLIENT_LC */
+/******************************************************************************/
-#endif
/**
* @}
*/
@@ -1595,5 +4232,5 @@ MOBLEUINT16 Light_LC_MaxLightnessValue(MOBLEUINT16 Param1,MOBLEUINT16 Param2)
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
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 dd7277bae..dbd1fb7d3 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors.c
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors.c
@@ -16,16 +16,16 @@
*
******************************************************************************
*/
+
/* Includes ------------------------------------------------------------------*/
#include "hal_common.h"
+#include "sensor_cfg_usr.h"
#include "mesh_cfg.h"
#include "sensors.h"
+#include "models_if.h"
#include "common.h"
-#include "light_lc.h"
#include <string.h>
#include "compiler.h"
-//#include "math.h"
-#include "mesh_cfg_usr.h"
/** @addtogroup MODEL_SENSOR
* @{
@@ -35,32 +35,207 @@
* @{
*/
-/* Private define ------------------------------------------------------------*/
-/* Private macro -------------------------------------------------------------*/
-
-/* Private variables ---------------------------------------------------------*/
+/* Private typedefs ----------------------------------------------------------*/
+typedef enum
+{
+ TIMER_STOPPED = 0,
+ TIMER_RUNNING
+}timer_status_e;
+/**
+* This structure represents sensor settings parameters
+*/
+typedef struct
+{
+ MOBLEUINT32 settingRaw;
+ MOBLEUINT16 settingPropertyId;
+ MOBLEUINT8 settingAccess;
+ MOBLEUINT8 res;
+}sensor_settings_params_t;
-Sensor_SettingParam_t Sensor_SettingParam[NUMBER_OF_SENSOR];
-/* */
-//Sensor_ColumnParam_t Sensor_ColumnParam[NUMBER_OF_SENSOR];
+/**
+* This structure represents sensor series parameters
+*/
+typedef struct
+{
+ MOBLEUINT32 rawX;
+}sensor_series_column_params_t;
-//Sensor_Series_Param_t Sensor_SeriesParam;
+/**
+* This structure represents sensor parameters
+*/
+typedef struct
+{
+ sensor_settings_params_t* pSettings; /* sensor settings */
+ sensor_series_column_params_t* pSeriesColumn; /* sensor series column */
+ MOBLEUINT32 statusTriggerDeltaDown; /* sensor cadence */
+ MOBLEUINT32 statusTriggerDeltaUp; /* sensor cadence */
+ MOBLEUINT32 fastCadenceLow; /* sensor cadence */
+ MOBLEUINT32 fastCadenceHigh; /* sensor cadence */
+ MOBLEUINT32 modelPublishPeriodMs; /* sensor server model publish period */
+ MOBLEUINT32 publishPeriodMs; /* sensor publish period */
+ MOBLEUINT32 timerBegin; /* sensor timer */
+ MOBLEUINT32 timerEnd; /* sensor timer */
+ MOBLEUINT16 propertyId; /* sensor property ID */
+ MOBLEUINT16 seriesCount; /* sensor series column */
+ MOBLEUINT8 elementIdx; /* sensor element index */
+ MOBLEUINT8 dataLength; /* raw data length in bytes */
+ MOBLEUINT8 cadenceState; /* cadence state of sensor */
+ MOBLEUINT8 settingsCount; /* sensor settings */
+ MOBLEUINT8 fastCadencePeriodDiv; /* sensor cadence */
+ MOBLEUINT8 statusTriggerType; /* sensor cadence */
+ MOBLEUINT8 statusMinInterval; /* sensor cadence */
+ timer_status_e timerStatus; /* sensor timer */
+}sensor_params_t;
-Sensor_SettingParam_t Sensor_SettingParameter;
-Sensor_SeriesParam_t Sensor_SeriesParam;
-/* */
-Sensor_CadenceParam_t Sensor_CadenceParam[NUMBER_OF_SENSOR];
-/*
-=
+/**
+* This structure represensts sensor server model
+*/
+typedef struct
{
- {0x0071 , 0x2 , 2 , 2 ,2 ,1 ,0X05 , 0x64},
- {0x2A6D , 0x2 , 1 , 1 , 1, 1, 0X258 , 0x3ED},
- {0X2A7F ,0x2,1,1,1,0,0x10, 0x20}
-};*/
+ const sensor_server_cb_t* p_cb; /* sensor server model callbacks */
+ sensor_params_t* pSensorParams; /* sensors parameters */
+ MOBLEUINT8 sensorsCount; /* sensors count */
+ MOBLEUINT8 res[3];
+}sensor_server_t;
+
+
+MOBLE_RESULT Sensor_UpdatePublishParameters(MOBLEUINT8 sensorOffset);
+__weak MOBLE_RESULT Sensor_ExtractPropertyId(const MOBLEUINT8* data,
+ MOBLEUINT16* pPropertyId);
+__weak MOBLE_RESULT Sensor_ExtractSettingPropertyId(const MOBLEUINT8* data,
+ MOBLEUINT16* pSettingPropertyId);
+__weak MOBLE_RESULT Sensor_FillDescriptor(MOBLEUINT8 sensorOffset,
+ sensor_params_t* pParams,
+ MOBLEUINT8* pData,
+ MOBLEUINT8* pLengthInc);
+__weak MOBLE_RESULT Sensor_MarshalPid(MOBLEUINT8 sensorOffset,
+ sensor_params_t* pParams,
+ MOBLEUINT8* pData,
+ MOBLEUINT8* pLengthInc,
+ MOBLEUINT8 pidMatch,
+ MOBLEUINT16 pidNotFound);
+__weak MOBLE_RESULT Sensor_CadenceStatus(MOBLEUINT8 pidMatch,
+ sensor_params_t* pParams,
+ MOBLEUINT16 pidNotFound,
+ MOBLE_ADDRESS dstAddr,
+ MOBLEUINT8 elementIdx,
+ status_send_e statusSend);
+__weak MOBLE_RESULT Sensor_CadenceStatus(MOBLEUINT8 pidMatch,
+ sensor_params_t* pParams,
+ MOBLEUINT16 pidNotFound,
+ MOBLE_ADDRESS dstAddr,
+ MOBLEUINT8 elementIdx,
+ status_send_e statusSend);
+__weak MOBLE_RESULT Sensor_SettingsStatus(MOBLEUINT8* offsetBuff,
+ MOBLEUINT8 sensorCount,
+ MOBLE_ADDRESS dstAddr,
+ MOBLEUINT16 pidNotFound);
+__weak MOBLE_RESULT Sensor_SettingStatus(MOBLEUINT8 pidMatch,
+ MOBLEUINT8 readViolation,
+ sensor_params_t* pParams,
+ sensor_settings_params_t* pSettingsParam,
+ MOBLEUINT16 pidNotFound,
+ MOBLEUINT16 rcvdSettingId,
+ MOBLE_ADDRESS dstAddr,
+ MOBLEUINT8 elementIdx,
+ status_send_e statusSend);
+__weak MOBLE_RESULT Sensor_DescriptorStatus(MOBLEUINT8* offsetBuff,
+ MOBLEUINT8 sensorCount,
+ MOBLE_ADDRESS dstAddr,
+ MOBLEUINT16 pidNotFound);
+__weak MOBLE_RESULT Sensor_Status(MOBLEUINT8* offsetBuff,
+ MOBLEUINT8 sensorCount,
+ MOBLE_ADDRESS dstAddr,
+ MOBLEUINT16 pidNotFound,
+ status_send_e statusSend);
+__weak MOBLE_RESULT Sensor_ColumnStatus(MOBLEUINT8* offsetBuff,
+ MOBLEUINT8 sensorCount,
+ MOBLE_ADDRESS dstAddr,
+ MOBLEUINT32 rawValueX,
+ MOBLEUINT8 rcvdRawXLength,
+ MOBLEUINT16 pidNotFound,
+ MOBLEUINT8 elementIndex,
+ status_send_e statusSend);
+__weak MOBLE_RESULT Sensor_SeriesStatus(MOBLEUINT8* offsetBuff,
+ MOBLEUINT8 sensorCount,
+ MOBLE_ADDRESS dstAddr,
+ MOBLEUINT32 rcvdX1,
+ MOBLEUINT32 rcvdX2,
+ MOBLEUINT8 isX1X2Present,
+ MOBLEUINT8 rcvdRawXLength,
+ MOBLEUINT16 pidNotFound,
+ MOBLEUINT8 elementIndex,
+ status_send_e statusSend);
+__weak MOBLE_RESULT Sensor_DescriptorGet(const MOBLEUINT8* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+__weak MOBLE_RESULT Sensor_CadenceGet(const MOBLEUINT8* pCadenceParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+__weak MOBLE_RESULT Sensor_CadenceSet(const MOBLEUINT8* pCadenceParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+__weak MOBLE_RESULT Sensor_CadenceSetUnack(const MOBLEUINT8* pCadenceParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+__weak MOBLE_RESULT Sensor_SettingsGet(const MOBLEUINT8* pSettingsParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+__weak MOBLE_RESULT Sensor_SettingGet(const MOBLEUINT8* pRcvdParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+__weak MOBLE_RESULT Sensor_SettingSet(const MOBLEUINT8* pRcvdParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+__weak MOBLE_RESULT Sensor_SettingSetUnack(const MOBLEUINT8* pRcvdParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+__weak MOBLE_RESULT Sensor_Get(const MOBLEUINT8* pGetParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+__weak MOBLE_RESULT Sensor_ColumnGet(const MOBLEUINT8* pColumnParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+__weak MOBLE_RESULT Sensor_SeriesGet(const MOBLEUINT8* pSeriesParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+__weak MOBLE_RESULT Sensor_CheckStatusTrigger(MOBLEUINT8 sensorOffset);
+__weak MOBLE_RESULT Sensor_ExtractSensorOffset(MOBLEUINT8 elementIdx,
+ MOBLEUINT8* pSensorOffsetBuff,
+ MOBLEUINT8* pSensorCount,
+ MOBLEUINT32 length,
+ const MOBLEUINT8* pData,
+ MOBLEUINT16* pidNotFound);
+
+/* ALIGN(4) */
+__attribute__((aligned(4)))sensor_server_t* SensorServer = NULL; /* Sensor server context */
-const MODEL_OpcodeTableParam_t Sensor_Opcodes_Table[] = {
+const MODEL_OpcodeTableParam_t Sensor_Opcodes_Table[] =
+{
/* model_id opcode reliable min_payload_size max_payload_size response_opcode min_response_size max_response_size */
#ifdef ENABLE_SENSOR_MODEL_SERVER
@@ -72,15 +247,6 @@ const MODEL_OpcodeTableParam_t Sensor_Opcodes_Table[] = {
{SENSOR_SERVER_MODEL_ID, SENSOR_COLUMN_STATUS, MOBLE_FALSE, 2, 14, 0, 1, 1},
#endif
-#ifdef ENABLE_SENSOR_MODEL_CLIENT
- {SENSOR_CLIENT_MODEL_ID, SENSOR_DESCRIPTOR_GET, MOBLE_FALSE, 0, 2, SENSOR_DESCRIPTOR_STATUS, 2, 75},
- {SENSOR_CLIENT_MODEL_ID, SENSOR_DESCRIPTOR_STATUS, MOBLE_FALSE, 2, 75, 0, 1, 1},
- {SENSOR_CLIENT_MODEL_ID, SENSOR_GET, MOBLE_FALSE, 0, 2, SENSOR_STATUS, 0, 65},
- {SENSOR_CLIENT_MODEL_ID, SENSOR_STATUS, MOBLE_FALSE, 0, 65, 0, 1, 1},
- {SENSOR_CLIENT_MODEL_ID, SENSOR_COLUMN_GET, MOBLE_FALSE, 3, 6, SENSOR_COLUMN_STATUS, 2, 14},
- {SENSOR_CLIENT_MODEL_ID, SENSOR_COLUMN_STATUS, MOBLE_FALSE, 2, 14, 0, 1, 1},
-#endif
-
#ifdef ENABLE_SENSOR_MODEL_SERVER_SETUP
{SENSOR_SETUP_SERVER_MODEL_ID, SENSOR_CADENCE_GET, MOBLE_FALSE, 2, 2, SENSOR_CADENCE_STATUS, 2, 2},
{SENSOR_SETUP_SERVER_MODEL_ID, SENSOR_CADENCE_SET, MOBLE_FALSE, 8, 20, 0, 2, 2},
@@ -98,67 +264,326 @@ const MODEL_OpcodeTableParam_t Sensor_Opcodes_Table[] = {
{0}
};
-int Property_ID_TableSet[NUMBER_OF_SENSOR] =
-{
- TEMPERATURE_PID,PRESSURE_PID,TIME_OF_FLIGHT_PID
-};
/* Private function prototypes -----------------------------------------------*/
-WEAK_FUNCTION (MOBLE_RESULT Appli_Sensor_Descriptor_Status(MOBLEUINT8* sensor_Descriptor , MOBLEUINT32* pLength));
-WEAK_FUNCTION (MOBLE_RESULT Appli_Sensor_Data_Status(MOBLEUINT8* sensor_Data , MOBLEUINT32* pLength));
-WEAK_FUNCTION (void SensorDataPublish(MOBLEUINT32 *pSensor_Value , MOBLEUINT16* pProp_ID));
-WEAK_FUNCTION (void Sensor_Publication_Process(float* pSensorData, MODEL_Property_IDTableParam_t* pProp_ID));
-WEAK_FUNCTION (MOBLE_RESULT Appli_Sensor_Cadence_Set(Sensor_CadenceParam_t* pCadence_param,
- MOBLEUINT16 property_ID, MOBLEUINT32 length) );
-WEAK_FUNCTION (MOBLE_RESULT Appli_Sensor_Setting_Set(Sensor_SettingParam_t* pSensor_SettingParam,
- MOBLEUINT8 OptionalValid));
-WEAK_FUNCTION (MOBLE_RESULT Appli_Sensor_GetSettingStatus(MOBLEUINT8* pSetting_Status));
-WEAK_FUNCTION (MOBLE_RESULT Appli_Sensor_GetSetting_IDStatus(MOBLEUINT8* pSetting_Status));
-MOBLE_RESULT Sensor_Cadence_Status(MOBLEUINT8* pCadencestatus_param, MOBLEUINT32 *plength,
- MOBLEUINT8 const *pData, MOBLEUINT32 length);
-MOBLE_RESULT Sensor_Column_Status(MOBLEUINT8* pSensorColumn_param, MOBLEUINT32* plength,
- MOBLEUINT8 const *pData, MOBLEUINT32 length);
-MOBLE_RESULT Sensor_Series_Status(MOBLEUINT8* pSensorSeries_param,
- MOBLEUINT32* plength,
- MOBLEUINT8 const *pData,
- MOBLEUINT32 length);
+MOBLE_RESULT Sensor_UpdatePublishParameters(MOBLEUINT8 sensorOffset);
+
+WEAK_FUNCTION(void Appli_Sensor_CadenceGet(sensor_CadenceCbParam_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex));
+WEAK_FUNCTION(void Appli_Sensor_CadenceSet(sensor_CadenceCbParam_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex));
+WEAK_FUNCTION(void Appli_Sensor_CadenceSetUnack(sensor_CadenceCbParam_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex));
+WEAK_FUNCTION(void Appli_Sensor_SettingsGet(sensor_SettingsCbParams_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex));
+WEAK_FUNCTION(void Appli_Sensor_SettingGet(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex));
+WEAK_FUNCTION(void Appli_Sensor_SettingSet(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex));
+WEAK_FUNCTION(void Appli_Sensor_SettingSetUnack(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex));
+WEAK_FUNCTION(void Appli_Sensor_DescriptorGet(MOBLEUINT8 pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex));
+WEAK_FUNCTION(void Appli_Sensor_Get (MOBLEUINT16 prop_ID,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex));
+WEAK_FUNCTION(void Appli_Sensor_ColumnGet(sensor_ColumnCbParams_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex));
+WEAK_FUNCTION(void Appli_Sensor_SeriesGet(sensor_SeriesCbParams_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Sensor_ReadDescriptor(MOBLEUINT8 sensorOffset,
+ sensor_DescriptorCbParams_t* pDescriptorParams));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Sensor_ReadValue(MOBLEUINT8 sensorOffset,
+ sensor_ValueCbParams_t* pValueParams));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Sensor_ReadColumn(MOBLEUINT8 sensorOffset,
+ MOBLEUINT8 columnOffset,
+ sensor_ColumnCbParams_t* pColumnParams));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Sensor_ReadSeries(MOBLEUINT8 sensorOffset,
+ sensor_SeriesCbParams_t* pSeriesParams));
+WEAK_FUNCTION(MOBLEUINT8 Appli_Sensor_IsFastCadence(MOBLEUINT8 sensorOffset,
+ void* pFastCadenceLow,
+ void* pFastCadenceHigh));
+WEAK_FUNCTION(MOBLEUINT8 Appli_Sensor_IsStatusTrigger(MOBLEUINT8 sensorOffset,
+ status_trigger_type_e triggerType,
+ void* pDeltaDown,
+ void* pDeltaUp));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Sensor_Init(void));
+WEAK_FUNCTION(void Appli_Sensor_SerialCmd(char *rcvdStringBuff, uint16_t rcvdStringSize));
+
+WEAK_FUNCTION(void Appli_Sensor_Descriptor_Status(const MOBLEUINT8 *pDescriptor,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex));
+WEAK_FUNCTION(void Appli_Sensor_Cadence_Status(const MOBLEUINT8 *pCadence,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex));
+WEAK_FUNCTION(void Appli_Sensor_Settings_Status(const MOBLEUINT8 *pSettings,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex));
+WEAK_FUNCTION(void Appli_Sensor_Setting_Status(const MOBLEUINT8 *pSetting,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex));
+WEAK_FUNCTION(void Appli_Sensor_Status(const MOBLEUINT8 *pStatus,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex));
+WEAK_FUNCTION(void Appli_Sensor_Column_Status(const MOBLEUINT8 *pColumn,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex));
+WEAK_FUNCTION(void Appli_Sensor_Series_Status(const MOBLEUINT8 *pSeries,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex));
+WEAK_FUNCTION(MOBLE_RESULT Appli_Sensor_Update(MOBLEUINT8 sensorOffset,
+ MOBLEUINT32 value));
/* Private functions ---------------------------------------------------------*/
+/**
+ * @brief Sensor_ExtractPropertyId
+ * Extract 16 bit Property ID from buffer
+ * @param reference to data to be used for extracting Property ID
+ * @param reference to be updated with Property ID
+ * @retval Success if Property ID is not prohibited
+ * else Invalid
+ */
+__weak MOBLE_RESULT Sensor_ExtractPropertyId(const MOBLEUINT8* data,
+ MOBLEUINT16* pPropertyId)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 propertyId = (*data | (*(data+1)<<8));
+
+ if (propertyId == PROPERTY_ID_PROHIBITED)
+ {
+ TRACE_M(TF_SENSOR_M, "Prohibited Property Id received \r\n");
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else
+ {
+ *pPropertyId = propertyId;
+ }
+
+ return result;
+}
-#ifdef ENABLE_SENSOR_MODEL_SERVER
/**
-* @brief This function is called for both Acknowledged and unacknowledged message
-* //
-* @param pSensorData_param: Pointer to the status message, which needs to be updated
-* @param plength: Pointer to the Length of the Status message.
-* @param pData:Pointer of data coming in packet.
-* @param length: lenth of the data in packet.
-* @retval MOBLE_RESULT
-*/
-MOBLE_RESULT Sensor_Data_Status(MOBLEUINT8* pSensorData_param,
- MOBLEUINT32* plength ,
- MOBLEUINT8 const *pData,
- MOBLEUINT32 length)
+ * @brief Sensor_ExtractSettingPropertyId
+ * Extract 16 bit Setting Property ID from buffer
+ * @param reference to data to be used for extracting Setting Property ID
+ * @param reference to be updated with Setting Property ID
+ * @retval Success if Property ID is not prohibited else Invalid
+ */
+__weak MOBLE_RESULT Sensor_ExtractSettingPropertyId(const MOBLEUINT8* data,
+ MOBLEUINT16* pSettingPropertyId)
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
- MOBLEUINT16 prop_ID = 0x0000;
+ MOBLEUINT16 settingPropertyId = (*data | (*(data+1)<<8));
- TRACE_M(TF_SENSOR_M, "Sensor_Data_Status received \r\n");
+ if (settingPropertyId == SENSOR_SETTING_PROPERTY_ID_PROHIBITED)
+ {
+ TRACE_M(TF_SENSOR_M, "Prohibited Setting Property Id received \r\n");
+ result = MOBLE_RESULT_INVALIDARG;
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Extracted setting Id 0x%.4x\r\n", settingPropertyId);
+ *pSettingPropertyId = settingPropertyId;
+ }
- TRACE_M(TF_SENSOR_M, "Length of Received Data %lu:", length);
+ return result;
+}
+
+
+/**
+ * @brief Sensor_ExtractSensorOffset
+ * Extract offsets of all or one (identified by Property ID) sensor
+ * inside Sensor Server struct on same element index
+ * @param element index
+ * @param reference to buffer to be updated with sensor offsets
+ * @param reference to be updated with count of extracted sensor offsets
+ * @param length of received buffer
+ * If length = 0, extract offsets for all sensors else for single sensor
+ * @param reference to buffer from which property ID is extracted
+ * Used only if length >= 2, else all property IDs to be extracted
+ * @param pidNotFound updated with Property ID in case of single property ID
+ * extraction and Property ID not found,
+ * @retval Fail if no sensor found on given element index
+ * Fail in case of single Property ID case and Property ID is prohibited
+ * False in case of single Property ID but property ID not supported on element
+ * Success if one or more property ID found on element
+ */
+__weak MOBLE_RESULT Sensor_ExtractSensorOffset(MOBLEUINT8 elementIdx,
+ MOBLEUINT8* pSensorOffsetBuff,
+ MOBLEUINT8* pSensorCount,
+ MOBLEUINT32 length,
+ const MOBLEUINT8* pData,
+ MOBLEUINT16* pidNotFound)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ sensor_params_t* pParams = NULL;
+ MOBLEUINT16 propertyId = 0x0000;
+ MOBLEUINT8 sensorCount = 0;
- if(length > 0)
+ /* Extraction of offset for multiple sensors on a given element index */
+ if (length == 0)
+ {
+ for (MOBLEUINT8 count=0; count< SensorServer->sensorsCount; count++)
+ {
+ pParams = SensorServer->pSensorParams + count;
+
+ if (pParams->elementIdx == elementIdx)
+ {
+ *(pSensorOffsetBuff+sensorCount) = count;
+ sensorCount += 1;
+
+ TRACE_M(TF_SENSOR_M, "%d Sensor found at offset %d\r\n", sensorCount, count);
+ }
+ else
+ {
+ /* sensor is on different element index */
+ }
+ }
+
+ if (sensorCount == 0)
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_SENSOR_M, "No sensor found on element index %d for multiple sensors case\r\n", elementIdx);
+ }
+ }
+ /* Extract offset of a sensor given by property ID to be extracted from pData */
+ else if (length >= 2)
{
- /* Extract Property ID */
- prop_ID = pData[1] << 8;
- prop_ID |= pData[0];
+ result = ExtractPropertyId(pData, &propertyId);
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ for (MOBLEUINT8 count=0; count<SensorServer->sensorsCount; count++)
+ {
+ pParams = SensorServer->pSensorParams + count;
+
+ if (pParams->elementIdx == elementIdx &&
+ pParams->propertyId == propertyId)
+ {
+ TRACE_M(TF_SENSOR_M, "Sensor found at offset %d\r\n", count);
+
+ *(pSensorOffsetBuff+sensorCount) = count;
+ sensorCount = 1;
+ break;
+ }
+ else
+ {
+ /* */
+ }
+ }
+
+ if (sensorCount == 0)
+ {
+ TRACE_M(TF_SENSOR_M, "No sensor found on element index %d for single sensor pid 0x(%.4x)\r\n",
+ elementIdx, propertyId);
+ result = MOBLE_RESULT_FALSE;
+ *pidNotFound = propertyId;
+ }
+ }
}
- /* Application Callback */
- if (SensorAppli_cb.Sensor_Data_cb != NULL)
+ if (result == MOBLE_RESULT_SUCCESS)
{
- (SensorAppli_cb.Sensor_Data_cb)(pSensorData_param,plength,prop_ID,length);
+ *pSensorCount = sensorCount;
+ }
+
+ return result;
+}
+
+/**
+ * @brief Sensor_FillDescriptor
+ * Descriptor data is fetched from application and
+ * fill sensor descriptor in buffer as per model specification
+ * @param sensor offset of which descriptor to be packed
+ * @param reference to sensor parameters
+ * @param reference to buffer to be filled
+ * @param reference to length incremented for descriptor parameters
+ * @retval Fail if sensor parameters not intialized
+ * Fail if application not able to locate particular sensor
+ * else Success
+ */
+__weak MOBLE_RESULT Sensor_FillDescriptor(MOBLEUINT8 sensorOffset,
+ sensor_params_t* pParams,
+ MOBLEUINT8* pData,
+ MOBLEUINT8* pLengthInc)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 length = 0;
+ sensor_DescriptorCbParams_t descriptorParams;
+
+ if (pParams != NULL)
+ {
+ /* Get sensor descriptor parameters */
+ descriptorParams.propertyId = pParams->propertyId;
+
+ if (SensorServer->p_cb->Sensor_ReadDescriptor_cb != NULL)
+ {
+ result = SensorServer->p_cb->Sensor_ReadDescriptor_cb(sensorOffset, &descriptorParams);
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ PutLittleEndian(pData, (MOBLEUINT32)pParams->propertyId, PROPERTY_ID_LENGTH);
+ *(pData+2) = (MOBLEUINT8)(descriptorParams.positiveTolerance & 0xFF);
+ *(pData+3) = (MOBLEUINT8)((descriptorParams.positiveTolerance >> 8) & 0x0F);
+ *(pData+3) |= (MOBLEUINT8)((descriptorParams.negativeTolerance & 0x0F) << 4);
+ *(pData+4) = (MOBLEUINT8)(descriptorParams.negativeTolerance >> 4);
+ *(pData+5) = descriptorParams.samplingFunction;
+ *(pData+6) = descriptorParams.measurementPeriod;
+ *(pData+7) = descriptorParams.updateInterval;
+
+ length = 8;
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Descriptor read failed\r\n");
+ }
+
+ *pLengthInc = length;
}
else
{
@@ -170,516 +595,2719 @@ MOBLE_RESULT Sensor_Data_Status(MOBLEUINT8* pSensorData_param,
/**
-* @brief Sensor_Descriptor_Status: This function is called for both Acknowledged and
-* unacknowledged message
-* @param pSensorDescriptor_param: Pointer to the parameters received for message
-* @param plength: Length of the parameters received for message
-* @retval MOBLE_RESULT
-*/
-MOBLE_RESULT Sensor_Descriptor_Status(MOBLEUINT8* pSensorDescriptor_param, MOBLEUINT32* plength,
- MOBLEUINT8 const *pData, MOBLEUINT32 length)
+ * @brief Sensor_MarshalPid
+ * Sensor data is fetched from application and
+ * fill sensor marshalled data in buffer as per model specification
+ * Either Format A or Format B is followed
+ * length - 1 to be justified
+ * @param sensor offset of which sensor state to be packed
+ * @param refeence to sensor parameters
+ * @param reference to buffer to be filled
+ * @param reference to length incremented for sensor state
+ * @param If particular sensor property Id not exists
+ * @param Property ID received which doesn't exist
+ * @retval Fail if sensor parameters not initialized
+ * Fail if application not able to read sensor value from application
+ * else Success
+ */
+__weak MOBLE_RESULT Sensor_MarshalPid(MOBLEUINT8 sensorOffset,
+ sensor_params_t* pParams,
+ MOBLEUINT8* pData,
+ MOBLEUINT8* pLengthInc,
+ MOBLEUINT8 pidMatch,
+ MOBLEUINT16 pidNotFound)
{
- MOBLEUINT16 prop_ID = 0x0000;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 length = 0;
+ MOBLEUINT8 pidNotFoundLength = 0;
+ sensor_ValueCbParams_t valueParams = {0};
- TRACE_M(TF_SENSOR_M,"Sensor_Descriptor_Status received \r\n");
- if(length>0){
- prop_ID = pData[1]<<8;
- prop_ID |= pData[0];
+ if (pidMatch == 1)
+ {
+ if (pParams != NULL)
+ {
+ TRACE_M(TF_SENSOR_M, "Property Id of sensor 0x%.4x\r\n", pParams->propertyId);
+
+ valueParams.propertyId = pParams->propertyId;
+
+ if (SensorServer->p_cb->Sensor_ReadValue_cb != NULL)
+ {
+ result = SensorServer->p_cb->Sensor_ReadValue_cb(sensorOffset, &valueParams);
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ /* Format A */
+ if (pParams->propertyId < 0x0800)
+ {
+ *pData = (MOBLEUINT8)((((pParams->dataLength - 1) & 0x0F) << 1) | \
+ ((pParams->propertyId & 0x0007) << 5)) & 0xFE;
+ *(pData+1) = (MOBLEUINT8)((pParams->propertyId & 0x07F8) >> 3);
+ length = 2;
+
+ memcpy(pData+length, valueParams.data, pParams->dataLength);
+ length += pParams->dataLength;
+ }
+ /* Format B */
+ else
+ {
+ *pData = (MOBLEUINT8)(((pParams->dataLength - 1) & 0x7F) << 1) | 0x01;
+ length = 1;
+ PutLittleEndian(pData+length, (MOBLEUINT32)pParams->propertyId, PROPERTY_ID_LENGTH);
+ length += PROPERTY_ID_LENGTH;
+
+ memcpy(pData+length, valueParams.data, pParams->dataLength);
+ length += pParams->dataLength;
+ }
+
+ *pLengthInc = length;
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Value read failed");
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+ else /* (pidMatch == 0) */
+ {
+ TRACE_M(TF_SENSOR_M, "Marshal only property Id 0x%.4x\r\n", pidNotFound);
+
+ /* Format A */
+ if (pidNotFound < 0x0800)
+ {
+ *pData = (MOBLEUINT8)((((pidNotFoundLength - 1) & 0x0F) << 1) | \
+ ((pidNotFound & 0x0007) << 5)) & 0xFE;
+ *(pData+1) = (MOBLEUINT8)((pidNotFound & 0x07F8) >> 3);
+ length = 2;
+ }
+ /* Format B */
+ else
+ {
+ *pData = (MOBLEUINT8)(((pidNotFoundLength - 1) & 0x7F) << 1) | 0x01;
+ length = 1;
+ PutLittleEndian(pData+length, (MOBLEUINT32)pidNotFound, PROPERTY_ID_LENGTH);
+ length += PROPERTY_ID_LENGTH;
+ }
+
+ *pLengthInc = length;
}
- printf("plength %ld, length %ld, Prop Id 0x%.4x \r\n", *plength, length, prop_ID);
+ return result;
+}
+
+
+/**
+ * @brief Sensor_CadenceStatus message as per model specification v1.0.1
+ * Sent in response of Cadence Set, Cadence Get or Cadence SetUnack to
+ * publish group
+ * @param pidMatch indicates if pid field of incoming message
+ * is present and matched
+ * @param sensor parameters
+ * @param Property ID received which doesn't exist
+ * @param destination address for status message
+ * @param source element index
+ * @param status to be sent only to client or to be published or to do both
+ * @retval Fail if source address is unassigned
+ * Fail if sensor parameters not initialized
+ */
+__weak MOBLE_RESULT Sensor_CadenceStatus(MOBLEUINT8 pidMatch,
+ sensor_params_t* pParams,
+ MOBLEUINT16 pidNotFound,
+ MOBLE_ADDRESS dstAddr,
+ MOBLEUINT8 elementIdx,
+ status_send_e statusSend)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 dataBufLen = 0;
+ MOBLEUINT8 data[100];
+ MOBLE_ADDRESS srcAddr = BLEMesh_GetAddress();
+ MOBLE_ADDRESS srcElementAddr = MOBLE_ADDRESS_UNASSIGNED;
- /* Application Callback */
- (SensorAppli_cb.Sensor_Descriptor_cb)(pSensorDescriptor_param,plength,prop_ID,length);
- /*
+ TRACE_M(TF_SENSOR_M, "pidMatch %d, dst %.4x, not found pid %.4x\r\n",
+ pidMatch, dstAddr, pidNotFound);
+ if (srcAddr != MOBLE_ADDRESS_UNASSIGNED)
+ {
+ if(pidMatch == 0)
+ {
+ PutLittleEndian(data+dataBufLen, (MOBLEUINT32)pidNotFound, PROPERTY_ID_LENGTH);
+ dataBufLen = PROPERTY_ID_LENGTH;
+ }
+ else /* PID matched */
+ {
+ if (pParams != NULL)
+ {
+ TRACE_M(TF_SENSOR_M, "cadence params %.4x %d %d %ld %ld %d %ld %ld\r\n",
+ pParams->propertyId,
+ pParams->fastCadencePeriodDiv,
+ pParams->statusTriggerType,
+ pParams->statusTriggerDeltaDown,
+ pParams->statusTriggerDeltaUp,
+ pParams->statusMinInterval,
+ pParams->fastCadenceLow,
+ pParams->fastCadenceHigh);
+
+ PutLittleEndian(data+dataBufLen, (MOBLEUINT32)pParams->propertyId, PROPERTY_ID_LENGTH);
+ dataBufLen = PROPERTY_ID_LENGTH;
+
+ if (pParams->cadenceState == 1) /* sensor supports cadence */
+ {
+ *(data+dataBufLen) = (pParams->fastCadencePeriodDiv & 0x7F);
+ *(data+dataBufLen) |= (MOBLEUINT8)((pParams->statusTriggerType & 0x01) << 7);
+ dataBufLen += 1;
+
+ /* if trigger type is value, field length would be actual data length */
+ if (pParams->statusTriggerType == 0)
+ {
+ PutLittleEndian(data+dataBufLen, (MOBLEUINT32)pParams->statusTriggerDeltaDown, pParams->dataLength);
+ dataBufLen += pParams->dataLength;
+
+ PutLittleEndian(data+dataBufLen, (MOBLEUINT32)pParams->statusTriggerDeltaUp, pParams->dataLength);
+ dataBufLen += pParams->dataLength;
+ }
+ else /* field length is 2 corresponding to uint16, max value is 10000 */
+ {
+ PutLittleEndian(data+dataBufLen, (MOBLEUINT32)pParams->statusTriggerDeltaDown, 2);
+ dataBufLen += 2;
+
+ PutLittleEndian(data+dataBufLen, (MOBLEUINT32)pParams->statusTriggerDeltaUp, 2);
+ dataBufLen += 2;
+ }
+
+ *(data+dataBufLen) = pParams->statusMinInterval;
+ dataBufLen += 1;
+
+ PutLittleEndian(data+dataBufLen, (MOBLEUINT32)pParams->fastCadenceLow, pParams->dataLength);
+ dataBufLen += pParams->dataLength;
+
+ PutLittleEndian(data+dataBufLen, (MOBLEUINT32)pParams->fastCadenceHigh, pParams->dataLength);
+ dataBufLen += pParams->dataLength;
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Sensor doesn't support cadence \r\n");
+ }
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_SENSOR_M, "Sensor not initialized \r\n");
+ }
+ }
+
+ TRACE_M(TF_SENSOR_M, "result %d, dataBufLen %d\r\n", result, dataBufLen);
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_SENSOR_M, "Address Unassigned. Src (0c%.4x) Dst (0x%.4x)\r\n", srcAddr, dstAddr);
+ }
- if (prop_ID == 0x0000)
+ if (result == MOBLE_RESULT_SUCCESS)
{
- TRACE_M(TF_SENSOR_M, "Property ID Prohibited \r\n");
-}
- else
+ srcElementAddr = srcAddr + elementIdx;
+
+ /* if client address and publish address is same, only one message may need
+ to be sent */
+ if (statusSend == STATUS_SEND_REPLY ||
+ statusSend == STATUS_SEND_REPLY_PUBLISH)
+ {
+ if (dstAddr != MOBLE_ADDRESS_UNASSIGNED)
+ {
+ result = BLEMesh_ModelSendMessage(srcElementAddr,
+ dstAddr,
+ SENSOR_SETUP_SERVER_MODEL_ID,
+ (MOBLEUINT16)SENSOR_CADENCE_STATUS,
+ data,
+ dataBufLen);
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ TRACE_M(TF_SENSOR_M, "Reply sent\r\n");
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Reply failed\r\n");
+ }
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Reply can't be sent. Client destination address is unassigned\r\n");
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+
+ if (statusSend == STATUS_SEND_PUBLISH ||
+ statusSend == STATUS_SEND_REPLY_PUBLISH)
+ {
+ result = BLEMesh_SetRemotePublication(SENSOR_SETUP_SERVER_MODEL_ID,
+ srcElementAddr,
+ (MOBLEUINT16)SENSOR_CADENCE_STATUS,
+ data,
+ dataBufLen,
+ MOBLE_FALSE,
+ MOBLE_FALSE);
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ TRACE_M(TF_SENSOR_M, "Published\r\n");
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Publication failed\r\n");
+ }
+ }
+ }
+ else
{
- (SensorAppli_cb.Sensor_Descriptor_cb)(pSensorDescriptor_param,plength,prop_ID,length);
-}
- */
- return MOBLE_RESULT_SUCCESS;
+ /* */
+ }
+
+ return result;
}
/**
-* @brief This function is called for both Acknowledged and unacknowledged message
-* //
-* @param pSensorData_param: Pointer to the status message, which needs to be updated
-* @param plength: Pointer to the Length of the Status message.
-* @param pData: Pointer of data (parameters) coming in packet.
-* @param length: lenth of the data in packet.
-* @retval MOBLE_RESULT
+ * @brief Sensor_SettingsStatus message as per model specification v1.0.1
+ * Sent in response of Settings Get
+ * @param offsets of sensors whose PIDs to be sent
+ * @param total count of sensors
+ * @param destination address for status message
+ * @param Property ID received which doesn't exist
+ * @retval Fail if source address and destination address is unassigned
+ * Fail if sensor offset not found
+ * Fail if sensor parameters not initialized
+ * Fail if application not able to read sensor value from application
*/
-
-MOBLE_RESULT Sensor_Column_Status(MOBLEUINT8* pSensorColumn_param, MOBLEUINT32* plength,
- MOBLEUINT8 const *pData, MOBLEUINT32 length)
+__weak MOBLE_RESULT Sensor_SettingsStatus(MOBLEUINT8* offsetBuff,
+ MOBLEUINT8 sensorCount,
+ MOBLE_ADDRESS dstAddr,
+ MOBLEUINT16 pidNotFound)
{
- MOBLEUINT16 prop_ID = 0x0000;
- // MOBLEUINT16 rawvaluex=0x0000;
- MOBLEUINT8 getBuff[8];
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ sensor_params_t* pParams = NULL;
+ sensor_settings_params_t* pSettingsParams = NULL;
+ MOBLEUINT8 elementIdx = 0;
+ MOBLEUINT16 dataBufLen = 0;
+ MOBLEUINT8 data[100];
+ MOBLE_ADDRESS srcAddr = BLEMesh_GetAddress();
+ MOBLE_ADDRESS srcElementAddr = MOBLE_ADDRESS_UNASSIGNED;
- TRACE_M(TF_SENSOR_M,"Sensor_Column_Status received \r\n");
+ TRACE_M(TF_SENSOR_M, "Sensor settings status. Sensor count %d, dst %.4x, not found pid %.4x\r\n",
+ sensorCount, dstAddr, pidNotFound);
+ if (dstAddr != MOBLE_ADDRESS_UNASSIGNED
+ && srcAddr != MOBLE_ADDRESS_UNASSIGNED)
+ {
+ if (offsetBuff == NULL)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ TRACE_M(TF_SENSOR_M, "Invalid arguments\r\n");
+ }
+ else if (sensorCount == 0)
+ {
+ if (pidNotFound != PROPERTY_ID_PROHIBITED)
+ {
+ PutLittleEndian(data, (MOBLEUINT32)pidNotFound, PROPERTY_ID_LENGTH);
+ dataBufLen = PROPERTY_ID_LENGTH;
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_SENSOR_M, "sensor count 0 and pid not found prohibited\r\n");
+ }
+ }
+ else /* send all setting property IDs corresponding to received sensor property ID */
+ {
+ pParams = SensorServer->pSensorParams + offsetBuff[0];
+
+ if (pParams != NULL)
+ {
+ PutLittleEndian(data, (MOBLEUINT32)pParams->propertyId, PROPERTY_ID_LENGTH);
+ dataBufLen = PROPERTY_ID_LENGTH;
+
+ for (MOBLEUINT8 count=0; count<pParams->settingsCount; count++)
+ {
+ pSettingsParams = pParams->pSettings + count;
+
+ PutLittleEndian(data+dataBufLen, (MOBLEUINT32)pSettingsParams->settingPropertyId, 2);
+ dataBufLen += 2;
+ }
+
+ elementIdx = pParams->elementIdx;
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_SENSOR_M, "sensor parameters not found at sensor offset %d", offsetBuff[0]);
+ }
+ }
+
+ TRACE_M(TF_SENSOR_M, "sensor offset %d, result %d, dataBufLen %d\r\n",
+ offsetBuff[0], result, dataBufLen);
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_SENSOR_M, "Address Unassigned. Src (0c%.4x) Dst (0x%.4x)\r\n", srcAddr, dstAddr);
+ }
- if(length > 0){
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ srcElementAddr = srcAddr + elementIdx;
+
+ result = BLEMesh_ModelSendMessage(srcElementAddr,
+ dstAddr,
+ SENSOR_SETUP_SERVER_MODEL_ID,
+ (MOBLEUINT16)SENSOR_SETTINGS_STATUS,
+ data,
+ dataBufLen);
- prop_ID = pData[1] << 8;
- prop_ID |= pData[0];
- (SensorAppli_cb.Sensor_Column_cb)(getBuff,plength,prop_ID,length);
+ if (result != MOBLE_RESULT_SUCCESS)
+ {
+ TRACE_M(TF_SENSOR_M, "Sensor Settings Status publication failed\r\n");
+ }
+ else
+ {
+ /* */
+ }
+ }
+ else
+ {
+ /* */
}
+ return result;
+}
+
+
+/**
+ * @brief Sensor_SettingStatus message as per model specification v1.0.1
+ * Sent in response of Setting Get, Setting Set
+ * @param pidMatch indicates if pid field of incoming message
+ * is present and matched
+ * @param if incoming message try to write setting which is read only, read
+ * read violtaion occurrs
+ * @param sensor parameters
+ * @param settings parameter
+ * @param Property ID received which doesn't exist
+ * @param Setting property ID in received message
+ * @param destination address for status message
+ * @param element index handling the current message
+ * @param status to be sent only to client or to be published or to do both
+ * @retval Fail if source address unassigned
+ * Fail if sensor parameters not initialized
+*/
+__weak MOBLE_RESULT Sensor_SettingStatus(MOBLEUINT8 pidMatch,
+ MOBLEUINT8 readViolation,
+ sensor_params_t* pParams,
+ sensor_settings_params_t* pSettingsParam,
+ MOBLEUINT16 pidNotFound,
+ MOBLEUINT16 rcvdSettingId,
+ MOBLE_ADDRESS dstAddr,
+ MOBLEUINT8 elementIdx,
+ status_send_e statusSend)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 dataBufLen = 0;
+ MOBLEUINT8 data[100];
+ MOBLE_ADDRESS srcAddr = BLEMesh_GetAddress();
+ MOBLE_ADDRESS srcElementAddr = MOBLE_ADDRESS_UNASSIGNED;
- // (SensorAppli_cb.Sensor_Column_cb)(getBuff,plength,prop_ID,length);
+ TRACE_M(TF_SENSOR_M, "pidMatch %d, dst %.4x, not found pid %.4x, not found setting id %.4x\r\n",
+ pidMatch, dstAddr, pidNotFound, rcvdSettingId);
- *pSensorColumn_param = pData[0];
- *(pSensorColumn_param+1) = pData[1];
+ if (srcAddr != MOBLE_ADDRESS_UNASSIGNED)
+ {
+ if(pidMatch == 0)
+ {
+ PutLittleEndian(data, (MOBLEUINT32)pidNotFound, PROPERTY_ID_LENGTH);
+ dataBufLen = PROPERTY_ID_LENGTH;
+
+ PutLittleEndian(data+dataBufLen, (MOBLEUINT32)rcvdSettingId, 2);
+ dataBufLen += 2;
+ }
+ else /* PIDs matched */
+ {
+ if (pParams != NULL &&
+ pSettingsParam != NULL)
+ {
+ PutLittleEndian(data, (MOBLEUINT32)pParams->propertyId, PROPERTY_ID_LENGTH);
+ dataBufLen = PROPERTY_ID_LENGTH;
+
+ PutLittleEndian(data+dataBufLen, (MOBLEUINT32)pSettingsParam->settingPropertyId, 2);
+ dataBufLen += 2;
+
+ *(data+dataBufLen) = pSettingsParam->settingAccess;
+ dataBufLen += 1;
+
+ if (readViolation == 0)
+ {
+ PutLittleEndian(data+dataBufLen, (MOBLEUINT32)pSettingsParam->settingRaw, 4);
+ dataBufLen += 4;
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Read violtaion occurred. Omit raw value field\r\n");
+ }
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_SENSOR_M, "Sensor not initialized\r\n");
+ }
+ }
+
+ TRACE_M(TF_SENSOR_M, "result %d, dataBufLen %d\r\n", result, dataBufLen);
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_SENSOR_M, "Src address %.4x\r\n", srcAddr);
+ }
- if(*plength == 4 )
+ if (result == MOBLE_RESULT_SUCCESS)
{
- *pSensorColumn_param = pData[0];
- *(pSensorColumn_param+1) = pData[1];
+ srcElementAddr = srcAddr + elementIdx;
- *(pSensorColumn_param+2)=pData[2];
- *(pSensorColumn_param+3)=pData[3];
- //memcpy(pSensorColumn_param , getBuff,2);
+ /* if client address and publish address is same, only one message may need
+ to be sent */
+ if (statusSend == STATUS_SEND_REPLY ||
+ statusSend == STATUS_SEND_REPLY_PUBLISH)
+ {
+ if (dstAddr != MOBLE_ADDRESS_UNASSIGNED)
+ {
+ result = BLEMesh_ModelSendMessage(srcElementAddr,
+ dstAddr,
+ SENSOR_SETUP_SERVER_MODEL_ID,
+ (MOBLEUINT16)SENSOR_SETTING_STATUS,
+ data,
+ dataBufLen);
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ TRACE_M(TF_SENSOR_M, "Reply sent\r\n");
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Reply failed\r\n");
+ }
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Reply can't be sent. Client destination address is unassigned\r\n");
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
- *plength = 4;
+ if (statusSend == STATUS_SEND_PUBLISH ||
+ statusSend == STATUS_SEND_REPLY_PUBLISH)
+ {
+ result = BLEMesh_SetRemotePublication(SENSOR_SETUP_SERVER_MODEL_ID,
+ srcElementAddr,
+ (MOBLEUINT16)SENSOR_SETTING_STATUS,
+ data,
+ dataBufLen,
+ MOBLE_FALSE,
+ MOBLE_FALSE);
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ TRACE_M(TF_SENSOR_M, "Published\r\n");
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Publication failed\r\n");
+ }
+ }
}
- else
+ else
{
- if( pData[2] == getBuff[2] && pData[3] == getBuff[3])
+ /* */
+ }
+
+ return result;
+}
+
+
+/**
+ * @brief Sensor_DescriptorStatus message as per model specification v1.0.1
+ * Sent in response of Descriptor Get
+ * @param offsets of sensors whose PIDs to be sent
+ * @param total count of sensors
+ * @param destination address for status message
+ * @param Property ID received which doesn't exist
+ * @retval Fail if source address and destination address is unassigned
+ * Fail if sensor offset not found
+ * Fail if sensor parameters not initialized
+ * Fail if application not able to read sensor descriptor from application
+ */
+__weak MOBLE_RESULT Sensor_DescriptorStatus(MOBLEUINT8* offsetBuff,
+ MOBLEUINT8 sensorCount,
+ MOBLE_ADDRESS dstAddr,
+ MOBLEUINT16 pidNotFound)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ sensor_params_t* pParams = NULL;
+ MOBLEUINT8 prevSensorElementIdx = 0;
+ MOBLEUINT16 dataBufLen = 0;
+ MOBLEUINT8 data[379];
+ MOBLEUINT8 lengthIncrease = 0;
+ MOBLE_ADDRESS srcAddr = BLEMesh_GetAddress();
+ MOBLE_ADDRESS srcElementAddr = MOBLE_ADDRESS_UNASSIGNED;
+
+ TRACE_M(TF_SENSOR_M, "Sensor descriptor status. Sensor count %d, dst %.4x, not found pid %.4x\r\n",
+ sensorCount, dstAddr, pidNotFound);
+
+ if (dstAddr != MOBLE_ADDRESS_UNASSIGNED
+ && srcAddr != MOBLE_ADDRESS_UNASSIGNED)
+ {
+ if (offsetBuff == NULL)
{
- memcpy(pSensorColumn_param , getBuff,8);
+ result = MOBLE_RESULT_INVALIDARG;
+ TRACE_M(TF_SENSOR_M, "Invalid arguments\r\n");
}
- else
+ else if (sensorCount == 0)
{
-
+ if (pidNotFound != PROPERTY_ID_PROHIBITED)
+ {
+ PutLittleEndian(data, (MOBLEUINT32)pidNotFound, PROPERTY_ID_LENGTH);
+ dataBufLen = PROPERTY_ID_LENGTH;
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_SENSOR_M, "sensor count 0 and pid not found prohibited\r\n");
+ }
}
+ else
+ {
+ for (MOBLEUINT8 count=0; count<sensorCount; count++)
+ {
+ pParams = SensorServer->pSensorParams + offsetBuff[count];
+
+ /* check if previous iteration element index is same as current one */
+ if (sensorCount != 1 && count > 1)
+ {
+ /* check for element index consistency */
+ if (prevSensorElementIdx != pParams->elementIdx)
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_SENSOR_M, "Sensor offset %d index %d and offset%d index %d mismatch\r\n",
+ offsetBuff[count-1], prevSensorElementIdx, offsetBuff[count], pParams->elementIdx);
+ break;
+ }
+ else
+ {
+ /* */
+ }
+ }
+ else
+ {
+ /* true for first iteration and sensor count = 1 */
+ }
+
+ result = Sensor_FillDescriptor(offsetBuff[count], pParams, data+dataBufLen, &lengthIncrease);
+
+ /* copy of element index for cross-check of element index in next iteration */
+ prevSensorElementIdx = pParams->elementIdx;
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ dataBufLen += lengthIncrease;
+ }
+ else
+ {
+ break;
+ }
+
+ TRACE_M(TF_SENSOR_M, "count %d, sensor offset %d, result %d, lengthIncrease %d, dataBufLen %d\r\n",
+ count, offsetBuff[count], result, lengthIncrease, dataBufLen);
+ }
+ }
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_SENSOR_M, "Address Unassigned. Src (0c%.4x) Dst (0x%.4x)\r\n", srcAddr, dstAddr);
+ }
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ srcElementAddr = srcAddr + prevSensorElementIdx;
+
+ result = BLEMesh_ModelSendMessage(srcElementAddr,
+ dstAddr,
+ SENSOR_SERVER_MODEL_ID,
+ (MOBLEUINT16)SENSOR_DESCRIPTOR_STATUS,
+ data,
+ dataBufLen);
+ if (result != MOBLE_RESULT_SUCCESS)
+ {
+ TRACE_M(TF_SENSOR_M, "Sensor Descriptor Status publication failed\r\n");
+ }
+ else
+ {
+ /* */
+ }
+ }
+ else
+ {
+ /* */
}
- TRACE_M(TF_SENSOR_M,"plength Value: %ld\r\n",*plength);
- return MOBLE_RESULT_SUCCESS;
+ return result;
}
+
/**
-
-* @brief This function is called for both Acknowledged and unacknowledged message
-*
-* @param pSensorData_param: Pointer to the status message, which needs to be updated
-* @param plength: Pointer to the Length of the Status message.
-* @param pData: Pointer of data (parameters) coming in packet.
-* @param length: lenth of the data in packet.
-* @retval MOBLE_RESULT
-*/
-MOBLE_RESULT Sensor_Series_Status(MOBLEUINT8* pSensorSeries_param,
- MOBLEUINT32* plength,
- MOBLEUINT8 const *pData,
- MOBLEUINT32 length)
+ * @brief Sensor_Status message as per model specification v1.0.1
+ * Sent in response of Sensor Get
+ * Marshalled sensor data sent for total no of sensors represented by
+ * sensorCount, offset of all such sensors is represented by offsetBuff
+ * Element index of all these sensors should be same
+ * @param offsets of sensors whose PIDs to be sent
+ * @param total count of sensors
+ * @param destination address for status message
+ * @param Property ID received which doesn't exist
+ * @param status to be sent only to client or to be published or to do both
+ * @retval Fail if source address is unassigned
+ * Fail if sensor parameters not initialized
+ * Fail if application not able to read sensor data from application
+ */
+__weak MOBLE_RESULT Sensor_Status(MOBLEUINT8* offsetBuff,
+ MOBLEUINT8 sensorCount,
+ MOBLE_ADDRESS dstAddr,
+ MOBLEUINT16 pidNotFound,
+ status_send_e statusSend)
{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ sensor_params_t* pParams = NULL;
+ MOBLEUINT8 pidMatch = 0;
+ MOBLEUINT8 prevSensorElementIdx = 0;
+ MOBLEUINT16 dataBufLen = 0;
+ MOBLEUINT8 data[379];
+ MOBLEUINT8 lengthIncrease = 0;
+ MOBLE_ADDRESS srcAddr = BLEMesh_GetAddress();
+ MOBLE_ADDRESS srcElementAddr = MOBLE_ADDRESS_UNASSIGNED;
+ if (srcAddr != MOBLE_ADDRESS_UNASSIGNED)
+ {
+ if (offsetBuff == NULL)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ TRACE_M(TF_SENSOR_M, "Invalid arguments\r\n");
+ }
+ else if (sensorCount == 0) /* received pid doesn't exist */
+ {
+ if (pidNotFound == MOBLE_ADDRESS_UNASSIGNED)
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+ else
+ {
+ pidMatch = 0;
+ result = Sensor_MarshalPid(0, pParams, data+dataBufLen, &lengthIncrease, pidMatch, pidNotFound);
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ dataBufLen += lengthIncrease;
+ }
+ }
+ }
+ else
+ {
+ pidMatch = 1;
+
+ for (MOBLEUINT8 count=0; count<sensorCount; count++)
+ {
+ pParams = SensorServer->pSensorParams + offsetBuff[count];
+
+ /* check if previous iteration element index is same as current one */
+ if (sensorCount != 1
+ && count > 1)
+ {
+ /* check for element index consistency */
+ if (prevSensorElementIdx != pParams->elementIdx)
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_SENSOR_M, "Sensor offset %d index %d and offset%d index %d mismatch\r\n",
+ offsetBuff[count-1], prevSensorElementIdx, offsetBuff[count], pParams->elementIdx);
+ break;
+ }
+ else
+ {
+ /* */
+ }
+ }
+ else
+ {
+ /* true for first iteration and sensor count = 1 */
+ }
+
+ result = Sensor_MarshalPid(offsetBuff[count],
+ pParams,
+ data+dataBufLen,
+ &lengthIncrease,
+ pidMatch,
+ pidNotFound);
+
+ /* copy of element index for cross-check of element index in next iteration */
+ prevSensorElementIdx = pParams->elementIdx;
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ dataBufLen += lengthIncrease;
+ }
+ else
+ {
+ break;
+ }
+
+ TRACE_M(TF_SENSOR_M, "count %d, sensor offset %d, result %d, lengthIncrease %d, dataBufLen %d\r\n",
+ count, offsetBuff[count], result, lengthIncrease, dataBufLen);
+ }
+ }
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_SENSOR_M, "Src unassigned %.4x\r\n", srcAddr);
+ }
- MOBLEUINT8 getBuff[2+6*SENSOR_SERIES_VALUE];
- TRACE_M(TF_SENSOR_M,"Sensor_Series_Get callback received \r\n");
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ srcElementAddr = srcAddr + prevSensorElementIdx;
+
+ /* if client address and publish address is same, only one message may need
+ to be sent */
+ if (statusSend == STATUS_SEND_REPLY ||
+ statusSend == STATUS_SEND_REPLY_PUBLISH)
+ {
+ if (dstAddr != MOBLE_ADDRESS_UNASSIGNED)
+ {
+ result = BLEMesh_ModelSendMessage(srcElementAddr,
+ dstAddr,
+ SENSOR_SERVER_MODEL_ID,
+ (MOBLEUINT16)SENSOR_STATUS,
+ data,
+ dataBufLen);
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ TRACE_M(TF_SENSOR_M, "Reply sent\r\n");
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Reply failed\r\n");
+ }
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Reply can't be sent. Client destination address is unassigned\r\n");
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+
+ if (statusSend == STATUS_SEND_PUBLISH ||
+ statusSend == STATUS_SEND_REPLY_PUBLISH)
+ {
+ result = BLEMesh_SetRemotePublication(SENSOR_SERVER_MODEL_ID,
+ srcElementAddr,
+ (MOBLEUINT16)SENSOR_STATUS,
+ data,
+ dataBufLen,
+ MOBLE_FALSE,
+ MOBLE_FALSE);
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ TRACE_M(TF_SENSOR_M, "Published\r\n");
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Publication failed\r\n");
+ }
+ }
+ }
+ else
+ {
+ /* */
+ }
- MOBLEUINT16 prop_ID=0x0000;
- MOBLEUINT16 RawValueX1=0x0000;
- MOBLEUINT16 RawValueX2=0x0000;
- MOBLEUINT8 z =0;
- MOBLEUINT8 i =0;
+ return result;
+}
+
+
+/**
+ * @brief Sensor_ColumnStatus message as per model specification v1.0.1
+ * Sent in response of Sensor Column Get
+ * @param offsets of sensors whose PIDs to be sent
+ * @param total count of sensors
+ * @param destination address for status message
+ * @param Raw value X corresponding to which column data to be sent
+ * @param Length (in bytes) of received Raw Value X
+ * @param Property ID received which doesn't exist
+ * @param Corresponding element index
+ * @param status to be sent only to client or to be published or to do both
+ * @retval Fail if source address is unassigned
+ * Fail if sensor parameters not initialized
+ * Fail if application not able to read column data from application
+ */
+__weak MOBLE_RESULT Sensor_ColumnStatus(MOBLEUINT8* offsetBuff,
+ MOBLEUINT8 sensorCount,
+ MOBLE_ADDRESS dstAddr,
+ MOBLEUINT32 rawValueX,
+ MOBLEUINT8 rcvdRawXLength,
+ MOBLEUINT16 pidNotFound,
+ MOBLEUINT8 elementIndex,
+ status_send_e statusSend)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ sensor_params_t* pParams = NULL;
+ sensor_series_column_params_t* pSeriesColumn = NULL;
+ MOBLEUINT16 dataBufLen = 0;
+ MOBLEUINT8 data[379];
+ MOBLE_ADDRESS srcAddr = BLEMesh_GetAddress();
+ MOBLE_ADDRESS srcElementAddr = MOBLE_ADDRESS_UNASSIGNED;
+ sensor_ColumnCbParams_t columnParams = {0};
- if(length>0){
- prop_ID = pData[1] << 8;
- prop_ID |= pData[0];
- if(length>2)
+ if (srcAddr != MOBLE_ADDRESS_UNASSIGNED)
+ {
+ if (offsetBuff == NULL)
{
- RawValueX1 = pData[2];
- RawValueX1 |=pData[3]<< 8;
-
- RawValueX2 = pData[4];
- RawValueX2|=pData[5] << 8;
+ result = MOBLE_RESULT_INVALIDARG;
+ TRACE_M(TF_SENSOR_M, "Invalid arguments\r\n");
+ }
+ else if (sensorCount == 0) /* received pid doesn't exist */
+ {
+ if (pidNotFound == MOBLE_ADDRESS_UNASSIGNED)
+ {
+ TRACE_M(TF_SENSOR_M, "pidNotFound prohibited\r\n");
+ result = MOBLE_RESULT_FAIL;
+ }
+ else
+ {
+ PutLittleEndian(data, (MOBLEUINT32)pidNotFound, PROPERTY_ID_LENGTH);
+ dataBufLen = PROPERTY_ID_LENGTH;
+ }
+ }
+ else
+ {
+ pParams = SensorServer->pSensorParams+offsetBuff[0];
+ if (pParams != NULL)
+ {
+ PutLittleEndian(data, pParams->propertyId, PROPERTY_ID_LENGTH);
+ dataBufLen += PROPERTY_ID_LENGTH;
+
+ if (pParams->seriesCount != 0)
+ {
+ PutLittleEndian(data+dataBufLen, rawValueX, rcvdRawXLength);
+ dataBufLen += rcvdRawXLength;
+
+ for (MOBLEUINT8 count=0; count<pParams->seriesCount; count++)
+ {
+ pSeriesColumn = pParams->pSeriesColumn + count;
+
+ if (pSeriesColumn != NULL)
+ {
+ if (pSeriesColumn->rawX == rawValueX)
+ {
+ columnParams.propertyId = pParams->propertyId;
+ columnParams.rawValueX = pSeriesColumn->rawX;
+
+ if (SensorServer->p_cb->Sensor_ReadColumn_cb != NULL)
+ {
+ /* Get sensor column data */
+ result = SensorServer->p_cb->Sensor_ReadColumn_cb(offsetBuff[0],
+ count,
+ &columnParams);
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ if (columnParams.dataLength >= 2 &&
+ columnParams.dataLength <= 8)
+ {
+ memcpy(data+dataBufLen, columnParams.data, dataBufLen);
+ dataBufLen += columnParams.dataLength;
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Wrong length %d set by application\r\n",
+ columnParams.dataLength);
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Fail to read sensor column data\r\n");
+ }
+
+ break;
+ }
+ else
+ {
+ /* raw not matched */
+ }
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Sereis column not intialized\r\n");
+ }
+ }
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Sereis column not supported\r\n");
+ }
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_SENSOR_M, "sensor not initialized\r\n");
+ }
}
+
+ TRACE_M(TF_SENSOR_M, "sensor offset %d, dataBufLen %d\r\n", offsetBuff[0], dataBufLen);
}
- for(i=0;i<NUMBER_OF_SENSOR;i++)
- {
- if(Property_ID_TableSet[i] == prop_ID)
- {
- (SensorAppli_cb.Sensor_Series_cb)(getBuff,plength,prop_ID,length);
- break;
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_SENSOR_M, "Src unassigned %.4x\r\n", srcAddr);
+ }
+
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ srcElementAddr = srcAddr + elementIndex;
+
+ /* no publishing of column status */
+ if (statusSend == STATUS_SEND_REPLY)
+ {
+ if (dstAddr != MOBLE_ADDRESS_UNASSIGNED)
+ {
+ result = BLEMesh_ModelSendMessage(srcElementAddr,
+ dstAddr,
+ SENSOR_SERVER_MODEL_ID,
+ (MOBLEUINT16)SENSOR_COLUMN_STATUS,
+ data,
+ dataBufLen);
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ TRACE_M(TF_SENSOR_M, "Reply sent\r\n");
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Reply failed\r\n");
+ }
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Reply can't be sent. Client destination address is unassigned\r\n");
+ result = MOBLE_RESULT_FAIL;
+ }
}
}
+ else
+ {
+ /* */
+ }
- if(i<NUMBER_OF_SENSOR)
+ return result;
+}
+
+
+/**
+ * @brief Sensor_SeriesStatus message as per model specification v1.0.1
+ * Sent in response of Sensor Series Get
+ * Series data lying between Raw X1 and Raw X2 to be sent
+ * @param offsets of sensors whose PIDs to be sent
+ * @param total count of sensors
+ * @param destination address for status message
+ * @param Raw X1
+ * @param Raw X2
+ * @param Optional fields present or not
+ * If optional field is absent, whole series to be sent in status
+ * @param Length (in bytes) of received Raw Value X
+ * @param Property ID received which doesn't exist
+ * @param Corresponding element index
+ * @param status to be sent only to client or to be published or to do both
+ * @retval Fail if source address is unassigned
+ * Fail if sensor parameters not initialized
+ * Fail if application not able to read column data from application
+ */
+__weak MOBLE_RESULT Sensor_SeriesStatus(MOBLEUINT8* offsetBuff,
+ MOBLEUINT8 sensorCount,
+ MOBLE_ADDRESS dstAddr,
+ MOBLEUINT32 rcvdX1,
+ MOBLEUINT32 rcvdX2,
+ MOBLEUINT8 isX1X2Present,
+ MOBLEUINT8 rcvdRawXLength,
+ MOBLEUINT16 pidNotFound,
+ MOBLEUINT8 elementIndex,
+ status_send_e statusSend)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ sensor_params_t* pParams = NULL;
+ sensor_series_column_params_t* pSeriesColumn = NULL;
+ MOBLEUINT16 dataBufLen = 0;
+ MOBLEUINT8 data[379];
+ MOBLE_ADDRESS srcAddr = BLEMesh_GetAddress();
+ MOBLE_ADDRESS srcElementAddr = MOBLE_ADDRESS_UNASSIGNED;
+ sensor_SeriesCbParams_t seriesParams = {0};
+ MOBLEUINT32 rawX1 = 0;
+ MOBLEUINT32 rawX2 = 0;
+
+ if (srcAddr != MOBLE_ADDRESS_UNASSIGNED)
{
- if(length ==2){
- memcpy(pSensorSeries_param,getBuff,*plength);
+ if (offsetBuff == NULL)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ TRACE_M(TF_SENSOR_M, "Invalid arguments\r\n");
}
- else if(length == 6){
-
- for(int y=0;y<SENSOR_SERIES_VALUE;y++)
+ else if (sensorCount == 0) /* received pid doesn't exist */
+ {
+ if (pidNotFound == MOBLE_ADDRESS_UNASSIGNED)
+ {
+ TRACE_M(TF_SENSOR_M, "pidNotFound prohibited\r\n");
+ result = MOBLE_RESULT_FAIL;
+ }
+ else
{
- MOBLEUINT16 RawpDataX1 = getBuff[2+6*y]<<8 | getBuff[3+6*y];
- if( RawpDataX1 <= RawValueX1 && RawpDataX1 >=RawValueX2)
+ PutLittleEndian(data, (MOBLEUINT32)pidNotFound, PROPERTY_ID_LENGTH);
+ dataBufLen = PROPERTY_ID_LENGTH;
+ }
+ }
+ else
+ {
+ pParams = SensorServer->pSensorParams+offsetBuff[0];
+
+ if (pParams != NULL)
{
+ PutLittleEndian(data, pParams->propertyId, PROPERTY_ID_LENGTH);
+ dataBufLen += PROPERTY_ID_LENGTH;
- *(pSensorSeries_param+2+6*z) = getBuff[2+6*y];
- *(pSensorSeries_param+3+6*z) = getBuff[3+6*y];
- *(pSensorSeries_param+4+6*z) = getBuff[4+6*y];
- *(pSensorSeries_param+5+6*z) = getBuff[5+6*y];
- *(pSensorSeries_param+6+6*z) = getBuff[6+6*y];
- *(pSensorSeries_param+7+6*z) = getBuff[7+6*y];
- z=z+1;
-
+ if (pParams->seriesCount != 0)
+ {
+ /* Send all values between (and including) rawX1 and rawX2 */
+ if (isX1X2Present == 1)
+ {
+ rawX1 = rcvdX1;
+ rawX2 = rcvdX2;
+ }
+ else
+ {
+ pSeriesColumn = pParams->pSeriesColumn; /* first entry of series */
+ if (pSeriesColumn != NULL)
+ {
+ rawX1 = pSeriesColumn->rawX;/* X1 is first raw value in series */
+ pSeriesColumn = pParams->pSeriesColumn + (pParams->seriesCount - 1); /* last entry of series */
+ if (pSeriesColumn != NULL)
+ {
+ rawX2 = pSeriesColumn->rawX; /* X2 is last raw value in series */
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Sereis column not intialized\r\n");
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ seriesParams.propertyId = pParams->propertyId;
+ seriesParams.rawValueX1 = rawX1;
+ seriesParams.rawValueX2 = rawX2;
+
+ if (SensorServer->p_cb->Sensor_ReadSeries_cb != NULL)
+ {
+ /* X1 and X2 extracted application to fill all data */
+ result = SensorServer->p_cb->Sensor_ReadSeries_cb(offsetBuff[0],
+ &seriesParams);
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ if(seriesParams.dataLength >= 3)
+ {
+ memcpy(data+dataBufLen, seriesParams.data, seriesParams.dataLength);
+ dataBufLen += seriesParams.dataLength;
+ }
+ else
+ {
+ /* */
+ }
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Fail to read sensor series");
+ }
+ }
+ else
+ {
+ /* */
+ }
+ }
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Sereis column not supported\r\n");
+ }
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_SENSOR_M, "sensor not initialized\r\n");
}
-
}
+ TRACE_M(TF_SENSOR_M, "sensor offset %d, dataBufLen %d\r\n", offsetBuff[0], dataBufLen);
}
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_SENSOR_M, "Src unassigned %.4x\r\n", srcAddr);
}
- else if( prop_ID != 0x0000)
+
+
+ if (result == MOBLE_RESULT_SUCCESS)
{
- *pSensorSeries_param=prop_ID>>8;
- *(pSensorSeries_param+1) = prop_ID;
- *plength=2;
+ srcElementAddr = srcAddr + elementIndex;
+
+ /* no publishing of series status */
+ if (statusSend == STATUS_SEND_REPLY)
+ {
+ if (dstAddr != MOBLE_ADDRESS_UNASSIGNED)
+ {
+ result = BLEMesh_ModelSendMessage(srcElementAddr,
+ dstAddr,
+ SENSOR_SERVER_MODEL_ID,
+ (MOBLEUINT16)SENSOR_SERIES_STATUS,
+ data,
+ dataBufLen);
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ TRACE_M(TF_SENSOR_M, "Reply sent\r\n");
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Reply failed\r\n");
+ }
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Reply can't be sent. Client destination address is unassigned\r\n");
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
}
else
{
- //*plength =2;
- }
+ /* */
+ }
- TRACE_M(TF_SENSOR_M,"plength Value: %ld",*plength);
- return MOBLE_RESULT_SUCCESS;
+ return result;
}
+
/**
-* @brief Sensor_Cadence_Set
-* @param pCadence_param: Pointer to the parameters received for message
-* @param length: Length of the parameters received for message
-* @retval MOBLE_RESULT
-*/
-MOBLE_RESULT Sensor_Cadence_Set(const MOBLEUINT8* pCadence_param, MOBLEUINT32 length)
+ * @brief Sensor_DescriptorGet callback
+ * response to be sent only to client node and not to pulish group
+ * @param Parameters as set by client
+ * @param Parameters length
+ * @param Client address
+ * @param Destination address set by client (unicast or group)
+ * @param element index corresponding to element which processed the message
+ * @retval Invalid if length is not appropriate
+ * Fail if parameters are prohibited
+*/
+__weak MOBLE_RESULT Sensor_DescriptorGet(const MOBLEUINT8* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
- MOBLEUINT16 prop_ID = 0x0000;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 sensorOffsetBuff[TOTAL_SENSORS_COUNT];
+ MOBLEUINT8 sensorCount = 0;
+ MOBLE_ADDRESS dstClientAddr = peerAddr;
+ MOBLEUINT16 pidNotFound = 0;
+ MOBLEUINT16 propertyId = 0x0000;
- TRACE_M(TF_SENSOR_M,"Sensor_Cadence_Set callback received \r\n");
+ TRACE_M(TF_SENSOR_M, "length %ld, peer %.4x, dst %.4x, element index %d \r\n",
+ length, peerAddr, dstPeer, elementIndex);
- if(length > 0)
+ if (length > 2)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ TRACE_M(TF_SENSOR_M, "Invalid length (%ld)\r\n", length);
+ }
+ else
{
- prop_ID = pCadence_param[1] << 8;
- prop_ID |= pCadence_param[0];
+ /* Extract offsets of sensors */
+ result = Sensor_ExtractSensorOffset(elementIndex,
+ sensorOffsetBuff,
+ &sensorCount,
+ length,
+ pDescriptorParam,
+ &pidNotFound);
}
-for(int i=0;i<NUMBER_OF_SENSOR;i++)
+ if (MOBLE_SUCCEEDED(result))
{
+ if (SensorServer->p_cb->Sensor_DescriptorGet_cb != NULL)
+ {
+ /*Application Callback */
+ if( length == 2)
+ {
+ propertyId = pDescriptorParam[0] | (pDescriptorParam[1] << 8);
+ }
+ (SensorServer->p_cb->Sensor_DescriptorGet_cb)(propertyId,
+ length,
+ peerAddr,
+ dstPeer,
+ elementIndex);
+ }
+
+ result = Sensor_DescriptorStatus(sensorOffsetBuff, sensorCount, dstClientAddr, pidNotFound);
+ }
+
+ return result;
+}
+
+
+/**
+ * @brief Sensor_CadenceGet callback
+ * response to be sent only to client node and not to pulish group
+ * @param Parameters as set by client
+ * @param Parameters length
+ * @param Client address
+ * @param Destination address set by client (unicast or group)
+ * @param element index corresponding to element which processed the message
+ * @retval Invalid if length is not appropriate
+ * Fail if parameters are prohibited
+ */
+__weak MOBLE_RESULT Sensor_CadenceGet(const MOBLEUINT8* pCadenceParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 sensorOffsetBuff[TOTAL_SENSORS_COUNT];
+ MOBLEUINT8 sensorCount = 0;
+ MOBLEUINT16 pidNotFound = 0;
+ MOBLEUINT8 pidMatch = 0;
+ sensor_params_t* pParams = NULL;
+ sensor_CadenceCbParam_t cadenceParams;
- if(prop_ID == Property_ID_TableSet[i])
+ TRACE_M(TF_SENSOR_M, "length %ld, peer %.4x, dst %.4x, element index %d \r\n",
+ length, peerAddr, dstPeer, elementIndex);
+
+ if (length == 2)
{
- Sensor_CadenceParam[i].Property_ID = pCadence_param[1] << 8;
- Sensor_CadenceParam[i].Property_ID |= pCadence_param[0];
- Sensor_CadenceParam[i].FastCadenceDevisor = (pCadence_param[2] && 0xFE) ;
- Sensor_CadenceParam[i].StatusTriggerType = (pCadence_param[2] && 0x01) ;
- Sensor_CadenceParam[i].triggerDeltaDown = pCadence_param[3];
- Sensor_CadenceParam[i].triggerDeltaUp = pCadence_param[4];
- Sensor_CadenceParam[i].StatusMinInterval = pCadence_param[5];
- Sensor_CadenceParam[i].FastCadenceLow = pCadence_param[6];
- Sensor_CadenceParam[i].FastCadenceHigh = pCadence_param[7];
+ /* Extract offsets of sensors */
+ result = Sensor_ExtractSensorOffset(elementIndex,
+ sensorOffsetBuff,
+ &sensorCount,
+ length,
+ pCadenceParam,
+ &pidNotFound);
}
+ else
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ TRACE_M(TF_SENSOR_M, "Invalid length (%ld)\r\n", length);
}
- /* Application Callback */
- (SensorAppli_cb.Sensor_Cadence_Set_cb)(Sensor_CadenceParam,prop_ID,length);
- return MOBLE_RESULT_SUCCESS;
-}
+ if (MOBLE_SUCCEEDED(result))
+ {
+ if (sensorCount == 0)
+ {
+ TRACE_M(TF_SENSOR_M, "pid mismatch %.4x", pidNotFound);
+ pidMatch = 0;
+ }
+ else if (sensorCount == 1)
+ {
+ pParams = SensorServer->pSensorParams+sensorOffsetBuff[0];
+ pidMatch = 1;
+ }
+ else
+ {
+ /* */
+ }
+
+ if (SensorServer->p_cb->Sensor_CadenceGet_cb != NULL)
+ {
+ cadenceParams.property_ID=pParams->propertyId;
+ cadenceParams.fastCadenceDevisor=pParams->fastCadencePeriodDiv;
+ cadenceParams.statusTriggerType=pParams->statusTriggerType;
+ cadenceParams.triggerDeltaDown=pParams->statusTriggerDeltaDown;
+ cadenceParams.triggerDeltaUp=pParams->statusTriggerDeltaUp;
+ cadenceParams.statusMinInterval=pParams->statusMinInterval;
+ cadenceParams.fastCadenceLow=pParams->fastCadenceLow;
+ cadenceParams.fastCadenceHigh=pParams->fastCadenceHigh;
+
+ SensorServer->p_cb->Sensor_CadenceGet_cb(&cadenceParams,
+ length,
+ peerAddr,
+ dstPeer,
+ elementIndex);
+ }
+ result = Sensor_CadenceStatus(pidMatch,
+ pParams,
+ pidNotFound,
+ peerAddr,
+ elementIndex,
+ STATUS_SEND_REPLY);
+
+ }
+ else
+ {
+ /* */
+ }
+
+ return result;
+}
/**
-* @brief Sensor_Cadence_Status
-* @param pCadencestatus_param: Pointer to the status message, which needs to be updated
-* @param plength: Pointer to the Length of the Status message
-* @param pData:Pointer of data coming in packet.
-* @param length: lenth of the data in packet.
-* @retval MOBLE_RESULT
+ * @brief Sensor_CadenceSet callback
+ * response to be sent to both client node and publish group
+ * @param Parameters as set by client
+ * @param Parameters length
+ * @param Client address
+ * @param Destination address set by client (unicast or group)
+ * @param element index corresponding to element which processed the message
+ * @retval Invalid if length is not appropriate
+ * Fail if parameters are prohibited
*/
-MOBLE_RESULT Sensor_Cadence_Status(MOBLEUINT8* pCadencestatus_param, MOBLEUINT32 *plength,
- MOBLEUINT8 const *pData, MOBLEUINT32 length)
+__weak MOBLE_RESULT Sensor_CadenceSet(const MOBLEUINT8* pCadenceParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
- MOBLEUINT16 propery_ID = 0x00;
- TRACE_M(TF_SENSOR_M,"Sensor_Cadence_Get callback received \r\n");
-
- MOBLEUINT8 flag = 0;
-// MOBLEUINT8 Sensor_GetBuff[8];
- // MOBLEUINT16 propery_ID;
+ sensor_params_t* pParams = NULL;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 sensorOffsetBuff[TOTAL_SENSORS_COUNT];
+ MOBLEUINT8 sensorCount = 0;
+ MOBLEUINT16 pidNotFound = 0;
+ MOBLEUINT8 pidMatch = 0;
+ MOBLEUINT8 paramOffset = 0;
+ MOBLEUINT8 fastCadencePeriodDiv;
+ MOBLEUINT8 statusTriggerType;
+ MOBLEUINT32 statusTriggerDeltaDown;
+ MOBLEUINT32 statusTriggerDeltaUp;
+ MOBLEUINT8 statusMinInterval;
+ MOBLEUINT32 fastCadenceLow;
+ MOBLEUINT32 fastCadenceHigh;
+ sensor_CadenceCbParam_t cadenceParams;
- propery_ID = pData[1] << 8;
- propery_ID |= pData[0];
+ TRACE_M(TF_SENSOR_M, "length %ld, peer %.4x, dst %.4x, element index %d \r\n",
+ length, peerAddr, dstPeer, elementIndex);
- // (SensorAppli_cb.Sensor_Cadence_Get_cb)(Sensor_GetBuff,propery_ID,length);
+ /* cadence supported only for data length <= 4
+ max length possible for cadence set = 2+1+4+4+1+4+4 */
+ if (length >= 8 &&
+ length <= 20)
+ {
+ /* Extract offsets of sensors */
+ result = Sensor_ExtractSensorOffset(elementIndex,
+ sensorOffsetBuff,
+ &sensorCount,
+ length,
+ pCadenceParam,
+ &pidNotFound);
+ }
+ else
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ TRACE_M(TF_SENSOR_M, "Invalid length (%ld)\r\n", length);
+ }
- for (int i=0 ;i< NUMBER_OF_SENSOR ; i++){
-
- if(propery_ID == Sensor_CadenceParam[i].Property_ID)
- {
- flag =1;
- *(pCadencestatus_param) = Sensor_CadenceParam[i].Property_ID;
- *(pCadencestatus_param+1) = Sensor_CadenceParam[i].Property_ID >> 8;
- // *(pCadencestatus_param+2) = Sensor_CadenceParam[0].FastCadenceDevisor;
- *(pCadencestatus_param+2) = (Sensor_CadenceParam[i].FastCadenceDevisor << 0x07)|(Sensor_CadenceParam[i].StatusTriggerType & 0x01);
- *(pCadencestatus_param+3) = Sensor_CadenceParam[i].triggerDeltaDown;
- *(pCadencestatus_param+4) = Sensor_CadenceParam[i].triggerDeltaUp;
- *(pCadencestatus_param+5) = Sensor_CadenceParam[i].StatusMinInterval;
- *(pCadencestatus_param+6) = Sensor_CadenceParam[i].FastCadenceLow;
- *(pCadencestatus_param+7) = Sensor_CadenceParam[i].FastCadenceHigh;
- // memcpy(&pCadencestatus_param[6],(void*)&Sensor_CadenceParam[0].FastCadenceLow,4);
- // memcpy(&pCadencestatus_param[10],(MOBLEUINT8*)&Sensor_CadenceParam[i].FastCadenceHigh,4);
- // memcpy(&pCadencestatus_param[10],(void*)&Sensor_CadenceParam[i].FastCadenceHigh,4);
- *plength = 8;
+ if (MOBLE_SUCCEEDED(result))
+ {
+ if (sensorCount == 1)
+ {
+ pParams = SensorServer->pSensorParams+sensorOffsetBuff[0];
+
+ if (pParams != NULL)
+ {
+ pidMatch = 1;
+
+ if (pParams->cadenceState == 1) /* cadence supported */
+ {
+ paramOffset = PROPERTY_ID_LENGTH; /* property id already extracted */
+
+ fastCadencePeriodDiv = (pCadenceParam[paramOffset] & 0x7F);
+ statusTriggerType = (pCadenceParam[paramOffset] & 0x80) >> 7;
+ paramOffset += 1;
+
+ if (statusTriggerType == 0)
+ {
+ GetLittleEndian(pCadenceParam+paramOffset, pParams->dataLength, &statusTriggerDeltaDown);
+ paramOffset += pParams->dataLength;
+
+ GetLittleEndian(pCadenceParam+paramOffset, pParams->dataLength, &statusTriggerDeltaUp);
+ paramOffset += pParams->dataLength;
+ }
+ else
+ {
+ GetLittleEndian(pCadenceParam+paramOffset, 2, &statusTriggerDeltaDown);
+ paramOffset += 2;
+ GetLittleEndian(pCadenceParam+paramOffset, 2, &statusTriggerDeltaUp);
+ paramOffset += 2;
+ }
+
+ statusMinInterval = pCadenceParam[paramOffset];
+ paramOffset += 1;
+
+ GetLittleEndian(pCadenceParam+paramOffset, pParams->dataLength, &fastCadenceLow);
+ paramOffset += pParams->dataLength;
+
+ GetLittleEndian(pCadenceParam+paramOffset, pParams->dataLength, &fastCadenceHigh);
+ paramOffset += pParams->dataLength;
+
+ /* verify received packet length
+ in case length is not correct, cadence values are not correct */
+ if (statusTriggerType == 0)/* status trigger down and up = dataLength */
+ {
+ if (length != 4+4*pParams->dataLength)/* 8, 12, 16 & 20 */
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_SENSOR_M, "Incorrect length %ld (expected %d) status trigger value",
+ length, 4+4*pParams->dataLength);
+ }
+ }
+ else /* status trigger down and up = 2 */
+ {
+ if (length != 8+2*pParams->dataLength)/* 10, 12, 14 & 16 */
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_SENSOR_M, "Incorrect length %ld (expected %d) status trigger pc change",
+ length, 8+2*pParams->dataLength);
+ }
+ }
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ /* some conditions commented as leading to pts test fail, todo verify with sig */
+ if (SENSOR_FAST_CADENCE_PERIOD_DIV_PROHIBITED(fastCadencePeriodDiv) ||
+ SENSOR_STATUS_MIN_INTERVAL_PROHIBITED(statusMinInterval) /* ||
+ (statusTriggerType == 1 && statusTriggerDeltaDown > 10000) ||
+ (statusTriggerType == 1 && statusTriggerDeltaUp > 10000) */)
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_SENSOR_M, "Prohibited values received\r\n");
+ TRACE_M(TF_SENSOR_M, "period div %d, min interval %d, trigger type %d, delta down %4lx, delta up %4lx\r\n",
+ fastCadencePeriodDiv,
+ statusMinInterval,
+ statusTriggerType,
+ statusTriggerDeltaDown,
+ statusTriggerDeltaUp);
+ }
+ else
+ {
+ pParams->fastCadencePeriodDiv = fastCadencePeriodDiv;
+ pParams->statusTriggerType = statusTriggerType;
+ pParams->statusTriggerDeltaDown = statusTriggerDeltaDown;
+ pParams->statusTriggerDeltaUp = statusTriggerDeltaUp;
+ pParams->statusMinInterval = statusMinInterval;
+ pParams->fastCadenceLow = fastCadenceLow;
+ pParams->fastCadenceHigh = fastCadenceHigh;
+
+ TRACE_M(TF_SENSOR_M, "Cadence values in order %2x, %2x, %2lx, %2lx, %2x, %2lx, %2lx\r\n",
+ fastCadencePeriodDiv,
+ statusTriggerType,
+ statusTriggerDeltaDown,
+ statusTriggerDeltaUp,
+ statusMinInterval,
+ fastCadenceLow,
+ fastCadenceHigh);
+ }
+ }
+ else
+ {
+ /* length check failed */
+ }
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Cadence not supported on Sensor %d\r\n", sensorOffsetBuff[0]);
+ }
+ }
+ }
+ else if (sensorCount == 0)
+ {
+ pidMatch = 0;
+ TRACE_M(TF_SENSOR_M, "Unknown property Id %.4x\r\n", pidNotFound);
+ }
+ else
+ {
+ /* */
+ }
+ if (MOBLE_SUCCEEDED(result))
+ {
+ /* Application Callback */
+ if (SensorServer->p_cb->Sensor_CadenceSet_cb != NULL)
+ {
+ cadenceParams.property_ID=pParams->propertyId;
+ cadenceParams.fastCadenceDevisor=pParams->fastCadencePeriodDiv;
+ cadenceParams.statusTriggerType=pParams->statusTriggerType;
+ cadenceParams.triggerDeltaDown=pParams->statusTriggerDeltaDown;
+ cadenceParams.triggerDeltaUp=pParams->statusTriggerDeltaUp;
+ cadenceParams.statusMinInterval=pParams->statusMinInterval;
+ cadenceParams.fastCadenceLow=pParams->fastCadenceLow;
+ cadenceParams.fastCadenceHigh=pParams->fastCadenceHigh;
+
+ SensorServer->p_cb->Sensor_CadenceSet_cb(&cadenceParams,
+ length,
+ peerAddr,
+ dstPeer,
+ elementIndex);
+ }
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ TRACE_M(TF_SENSOR_M, "update status publish parameters based on cadence values\r\n");
+ result = Sensor_UpdatePublishParameters(sensorOffsetBuff[0]);
+
+ if (result != MOBLE_RESULT_SUCCESS)
+ {
+ /* */
+ }
+ }
+
+ result = Sensor_CadenceStatus(pidMatch,
+ pParams,
+ pidNotFound,
+ peerAddr,
+ elementIndex,
+ STATUS_SEND_REPLY_PUBLISH);
+ }
+ else
+ {
+ /* */
+ }
+ }
+ else
+ {
+ /* */
+ }
+
+ return result;
+}
+
+
+/**
+ * @brief Sensor_CadenceSetUnack callback
+ * response to be sent to both client node and publish group
+ * @param Parameters as set by client
+ * @param Parameters length
+ * @param Client address
+ * @param Destination address set by client (unicast or group)
+ * @param element index corresponding to element which processed the message
+ * @retval Invalid if length is not appropriate
+ * Fail if parameters are prohibited
+ */
+__weak MOBLE_RESULT Sensor_CadenceSetUnack(const MOBLEUINT8* pCadenceParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ sensor_params_t* pParams = NULL;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 sensorOffsetBuff[TOTAL_SENSORS_COUNT];
+ MOBLEUINT8 sensorCount = 0;
+ MOBLEUINT16 pidNotFound = 0;
+ MOBLEUINT8 pidMatch = 0;
+ MOBLEUINT8 paramOffset = 0;
+ MOBLEUINT8 fastCadencePeriodDiv;
+ MOBLEUINT8 statusTriggerType;
+ MOBLEUINT32 statusTriggerDeltaDown;
+ MOBLEUINT32 statusTriggerDeltaUp;
+ MOBLEUINT8 statusMinInterval;
+ MOBLEUINT32 fastCadenceLow;
+ MOBLEUINT32 fastCadenceHigh;
+ sensor_CadenceCbParam_t cadenceParams;
- }}
+ TRACE_M(TF_SENSOR_M, "length %ld, peer %.4x, dst %.4x, element index %d \r\n",
+ length, peerAddr, dstPeer, elementIndex);
- if(flag == 0)
+ /* cadence supported only for data length <= 4
+ max length possible for cadence set = 2+1+4+4+1+4+4 */
+ if (length >= 8 &&
+ length <= 20)
{
- * pCadencestatus_param = propery_ID;
- *(pCadencestatus_param+1) = propery_ID >> 8;
- *plength=2;
+ /* Extract offsets of sensors */
+ result = Sensor_ExtractSensorOffset(elementIndex,
+ sensorOffsetBuff,
+ &sensorCount,
+ length,
+ pCadenceParam,
+ &pidNotFound);
}
- return MOBLE_RESULT_SUCCESS;
+ else
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ TRACE_M(TF_SENSOR_M, "Invalid length (%ld)\r\n", length);
+ }
+
+ if (MOBLE_SUCCEEDED(result))
+ {
+ if (sensorCount == 1)
+ {
+ pParams = SensorServer->pSensorParams+sensorOffsetBuff[0];
+
+ if (pParams != NULL)
+ {
+ pidMatch = 1;
+
+ if (pParams->cadenceState == 1) /* cadence supported */
+ {
+ paramOffset = PROPERTY_ID_LENGTH; /* property id already extracted */
+
+ fastCadencePeriodDiv = (pCadenceParam[2] & 0x7F);
+ statusTriggerType = (pCadenceParam[2] & 0x80) >> 7;
+ paramOffset += 1;
+
+ if (statusTriggerType == 0)
+ {
+ GetLittleEndian(pCadenceParam+paramOffset, pParams->dataLength, &statusTriggerDeltaDown);
+ paramOffset += pParams->dataLength;
+
+ GetLittleEndian(pCadenceParam+paramOffset, pParams->dataLength, &statusTriggerDeltaUp);
+ paramOffset += pParams->dataLength;
+ }
+ else
+ {
+ GetLittleEndian(pCadenceParam+paramOffset, 2, &statusTriggerDeltaDown);
+ paramOffset += 2;
+ GetLittleEndian(pCadenceParam+paramOffset, 2, &statusTriggerDeltaUp);
+ paramOffset += 2;
+ }
+
+ statusMinInterval = pCadenceParam[paramOffset];
+ paramOffset += 1;
+
+ GetLittleEndian(pCadenceParam+paramOffset, pParams->dataLength, &fastCadenceLow);
+ paramOffset += pParams->dataLength;
+
+ GetLittleEndian(pCadenceParam+paramOffset, pParams->dataLength, &fastCadenceHigh);
+ paramOffset += pParams->dataLength;
+
+ /* verify received packet length
+ in case length is not correct, cadence values are not correct */
+ if (statusTriggerType == 0)/* status trigger down and up = dataLength */
+ {
+ if (length != 4+4*pParams->dataLength)/* 8, 12, 16 & 20 */
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_SENSOR_M, "Incorrect length %ld (expected %d) status trigger value",
+ length, 4+4*pParams->dataLength);
+ }
+ }
+ else /* status trigger down and up = 2 */
+ {
+ if (length != 8+2*pParams->dataLength)/* 10, 12, 14 & 16 */
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_SENSOR_M, "Incorrect length %ld (expected %d) status trigger pc change",
+ length, 8+2*pParams->dataLength);
+ }
+ }
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ /* some conditions commented as leading to pts test fail, todo verify with sig */
+ if (SENSOR_FAST_CADENCE_PERIOD_DIV_PROHIBITED(fastCadencePeriodDiv) ||
+ SENSOR_STATUS_MIN_INTERVAL_PROHIBITED(statusMinInterval) /*||
+ (statusTriggerType == 1 && statusTriggerDeltaDown > 10000) ||
+ (statusTriggerType == 1 && statusTriggerDeltaUp > 10000)*/)
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_SENSOR_M, "Prohibited values received\r\n");
+ TRACE_M(TF_SENSOR_M, "period div %d, min interval %d, trigger type %d, delta down %4lx, delta up %4lx\r\n",
+ fastCadencePeriodDiv,
+ statusMinInterval,
+ statusTriggerType,
+ statusTriggerDeltaDown,
+ statusTriggerDeltaUp);
+ }
+ else
+ {
+ pParams->fastCadencePeriodDiv = fastCadencePeriodDiv;
+ pParams->statusTriggerType = statusTriggerType;
+ pParams->statusTriggerDeltaDown = statusTriggerDeltaDown;
+ pParams->statusTriggerDeltaUp = statusTriggerDeltaUp;
+ pParams->statusMinInterval = statusMinInterval;
+ pParams->fastCadenceLow = fastCadenceLow;
+ pParams->fastCadenceHigh = fastCadenceHigh;
+
+ TRACE_M(TF_SENSOR_M, "Cadence values in order %2x, %2x, %2lx, %2lx, %2x, %2lx, %2lx\r\n",
+ fastCadencePeriodDiv,
+ statusTriggerType,
+ statusTriggerDeltaDown,
+ statusTriggerDeltaUp,
+ statusMinInterval,
+ fastCadenceLow,
+ fastCadenceHigh);
+ }
+ }
+ else
+ {
+ /* length check failed */
+ }
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Cadence not supported on Sensor %d\r\n", sensorOffsetBuff[0]);
+ }
+ }
+ }
+ else if (sensorCount == 0)
+ {
+ pidMatch = 0;
+ TRACE_M(TF_SENSOR_M, "Unknown property Id %.4x\r\n", pidNotFound);
+ }
+ else
+ {
+ /* */
+ }
+
+ if (MOBLE_SUCCEEDED(result))
+ {
+ /* Application Callback */
+ if (SensorServer->p_cb->Sensor_CadenceSetUnack_cb != NULL)
+ {
+ cadenceParams.property_ID=pParams->propertyId;
+ cadenceParams.fastCadenceDevisor=pParams->fastCadencePeriodDiv;
+ cadenceParams.statusTriggerType=pParams->statusTriggerType;
+ cadenceParams.triggerDeltaDown=pParams->statusTriggerDeltaDown;
+ cadenceParams.triggerDeltaUp=pParams->statusTriggerDeltaUp;
+ cadenceParams.statusMinInterval=pParams->statusMinInterval;
+ cadenceParams.fastCadenceLow=pParams->fastCadenceLow;
+ cadenceParams.fastCadenceHigh=pParams->fastCadenceHigh;
+
+ SensorServer->p_cb->Sensor_CadenceSetUnack_cb(&cadenceParams,
+ length,
+ peerAddr,
+ dstPeer,
+ elementIndex);
+ }
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ TRACE_M(TF_SENSOR_M, "update status publish parameters based on cadence values\r\n");
+ Sensor_UpdatePublishParameters(sensorOffsetBuff[0]);
+ }
+
+ /* status to be sent only to publish group */
+ result = Sensor_CadenceStatus(pidMatch,
+ pParams,
+ pidNotFound,
+ peerAddr,
+ elementIndex,
+ STATUS_SEND_PUBLISH);
+ }
+ else
+ {
+ /* */
+ }
+ }
+ else
+ {
+ /* */
+ }
+
+ return result;
}
/**
-* @brief Sensor_Setting_Set
-* @param pSetting_param: Pointer to the parameters received for message
-* @param length: Length of the parameters received for message
-* @retval MOBLE_RESULT
-*/
-
-MOBLE_RESULT Sensor_Setting_Set(const MOBLEUINT8* pSetting_param, MOBLEUINT32 length)
+ * @brief Sensor_SettingsGet callback
+ * response only to be sent to client node and not to pulish group
+ * @param Parameters as set by client
+ * @param Parameters length
+ * @param Client address
+ * @param Destination address set by client (unicast or group)
+ * @param element index corresponding to element which processed the message
+ * @retval Invalid if length is not appropriate
+ * Fail if parameters are prohibited
+ */
+__weak MOBLE_RESULT Sensor_SettingsGet(const MOBLEUINT8* pSettingsParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 sensorOffsetBuff[TOTAL_SENSORS_COUNT];
+ MOBLEUINT8 sensorCount = 0;
+ MOBLE_ADDRESS dstClientAddr = peerAddr;
+ MOBLEUINT16 pidNotFound = 0;
+ sensor_SettingsCbParams_t sensorSettingsParam;
- TRACE_M(TF_SENSOR_M,"Sensor_Setting_Set callback received \r\n");
- MOBLEUINT8 flag=0;
+ TRACE_M(TF_SENSOR_M, "length %ld, peer %.4x, dst %.4x, element index %d \r\n",
+ length, peerAddr, dstPeer, elementIndex);
+ if (length == 2)
+ {
+ /* Extract offsets of sensors */
+ result = Sensor_ExtractSensorOffset(elementIndex,
+ sensorOffsetBuff,
+ &sensorCount,
+ length,
+ pSettingsParam,
+ &pidNotFound);
+ }
+ else
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ TRACE_M(TF_SENSOR_M, "Invalid length (%ld)\r\n", length);
+ }
- MOBLEUINT16 prop_ID = 0x0000;
+ if (MOBLE_SUCCEEDED(result))
+ {
+ /* Application Callback */
+ if (SensorServer->p_cb->Sensor_SettingsGet_cb != NULL)
+ {
+ sensorSettingsParam.propertyId = pSettingsParam[0] | pSettingsParam[1]<<8;
+ sensorSettingsParam.settingPropertyId = pSettingsParam[2] | pSettingsParam[3];
+ SensorServer->p_cb->Sensor_SettingsGet_cb(&sensorSettingsParam,
+ length,
+ peerAddr,
+ dstPeer,
+ elementIndex);
+ }
+
+ result = Sensor_SettingsStatus(sensorOffsetBuff, sensorCount, dstClientAddr, pidNotFound);
+ }
- if(length > 0)
+ return result;
+}
+
+
+/**
+ * @brief Sensor_SettingGet callback
+ * response only to be sent to client node and not to pulish group
+ * @param Parameters as set by client
+ * @param Parameters length
+ * @param Client address
+ * @param Destination address set by client (unicast or group)
+ * @param element index corresponding to element which processed the message
+ * @retval Invalid if length is not appropriate
+ * Fail if parameters are prohibited
+ */
+__weak MOBLE_RESULT Sensor_SettingGet(const MOBLEUINT8* pRcvdParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 sensorOffsetBuff[TOTAL_SENSORS_COUNT];
+ MOBLEUINT8 sensorCount = 0;
+ MOBLEUINT16 settingPropertyId;
+ MOBLE_ADDRESS dstClientAddr = peerAddr;
+ MOBLEUINT16 pidNotFound = 0;
+ MOBLEUINT8 pidMatch = 0;
+ sensor_params_t* pParams = NULL;
+ sensor_settings_params_t* pSettingsParam = NULL;
+ sensor_SettingCbParams_t sensorSetting;
+
+ TRACE_M(TF_SENSOR_M, "length %ld, peer %.4x, dst %.4x, element index %d \r\n",
+ length, peerAddr, dstPeer, elementIndex);
+
+ if (length == 4)
{
- prop_ID = pSetting_param[1] << 8;
- prop_ID |= pSetting_param[0];
+ /* Extract offsets of sensors given by property ID */
+ result = Sensor_ExtractSensorOffset(elementIndex,
+ sensorOffsetBuff,
+ &sensorCount,
+ length,
+ pRcvdParam,
+ &pidNotFound);
}
+ else
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ TRACE_M(TF_SENSOR_M, "Invalid length (%ld)\r\n", length);
+ }
- for(int i=0 ; i< NUMBER_OF_SENSOR ;i++)
+ if (MOBLE_SUCCEEDED(result))
{
+ result = Sensor_ExtractSettingPropertyId(pRcvdParam+2, &settingPropertyId);
- if(prop_ID == Property_ID_TableSet[i])
- {
- Sensor_SettingParameter.Property_ID = pSetting_param[1]<<8 ;
- Sensor_SettingParameter.Property_ID|= pSetting_param[0];
- Sensor_SettingParameter.Sensor_Setting_ID = pSetting_param[3] << 8;
- Sensor_SettingParameter.Sensor_Setting_ID |= pSetting_param[2];
- Sensor_SettingParameter.Sensor_Setting_Value = pSetting_param[5] << 8;
- Sensor_SettingParameter.Sensor_Setting_Value |= pSetting_param[4];
+ if (sensorCount == 0) /* No PID matched */
+ {
+ /* sensor PID mismatch */
+ pidMatch = 0;
+ result = MOBLE_RESULT_FALSE;
-
- Sensor_SettingParam[i].Property_ID = pSetting_param[1] << 8;
- Sensor_SettingParam[i].Property_ID |= pSetting_param[0];
- Sensor_SettingParam[i].Sensor_Setting_ID = pSetting_param[3] << 8;
- Sensor_SettingParam[i].Sensor_Setting_ID |= pSetting_param[2];
- Sensor_SettingParam[i].Sensor_Setting_Value = pSetting_param[5] << 8;
- Sensor_SettingParam[i].Sensor_Setting_Value |= pSetting_param[4];
- flag=1;
- break;
+ TRACE_M(TF_SENSOR_M, "Sensor PID mismatch %.4x\r\n", pidNotFound);
+ }
+ else
+ {
+ pParams = SensorServer->pSensorParams + sensorOffsetBuff[0];
+
+ if (pParams != NULL
+ && result == MOBLE_RESULT_SUCCESS)
+ {
+ pidMatch = 0;
+
+ for (MOBLEUINT8 count=0; count<pParams->settingsCount; count++)
+ {
+ pSettingsParam = (pParams->pSettings)+count;
+
+ if (settingPropertyId == pSettingsParam->settingPropertyId)
+ {
+ pidMatch = 1;
+ result = MOBLE_RESULT_SUCCESS;
+
+ TRACE_M(TF_SENSOR_M, "setting property id %.4x found, raw value %ld\r\n",
+ settingPropertyId, pSettingsParam->settingRaw);
+ break;
+ }
+ else /* setting Id not found */
+ {
+ pidMatch = 0;
+ }
+ }
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
}
-
}
- /* Application Callback */
- if(flag==1)
+
+ if (MOBLE_SUCCEEDED(result))
{
- (SensorAppli_cb.Sensor_Setting_Set_cb)(&Sensor_SettingParameter,0,prop_ID );
+ /* Application Callback */
+ if (SensorServer->p_cb->Sensor_SettingGet_cb != NULL)
+ {
+ sensorSetting.property_ID =pParams->propertyId;
+ sensorSetting.settingPropertyId = pSettingsParam->settingPropertyId;
+ sensorSetting.settingAccess = pSettingsParam->settingAccess;
+ sensorSetting.settingRaw= pSettingsParam->settingRaw;
+
+ SensorServer->p_cb->Sensor_SettingGet_cb(&sensorSetting,
+ length,
+ peerAddr,
+ dstPeer,
+ elementIndex);
+ }
+
+ result = Sensor_SettingStatus(pidMatch,
+ 0,
+ pParams,
+ pSettingsParam,
+ pidNotFound,
+ settingPropertyId,
+ dstClientAddr,
+ elementIndex,
+ STATUS_SEND_REPLY);
}
- return MOBLE_RESULT_SUCCESS;
+ return result;
}
/**
-* @brief Sensor_Setting_Status_PID
-* @param pSetting_param: Pointer to the status message, which needs to be updated
-* @param plength: Pointer to the Length of the Status message
-* @param pData: Pointer of data coming in packet.
-* @param length: length of the data in packet.
-* @retval MOBLE_RESULT
+ * @brief Sensor_CadenceSetUnack callback
+ * response only to be sent to both client node and pulish group
+ * @param Parameters as set by client
+ * @param Parameters length
+ * @param Client address
+ * @param Destination address set by client (unicast or group)
+ * @param element index corresponding to element which processed the message
+ * @retval Invalid if length is not appropriate
+ * Fail if parameters are prohibited
*/
-MOBLE_RESULT Sensor_Setting_Status_PID(MOBLEUINT8* pSetting_param,
- MOBLEUINT32 *plength,
- const MOBLEUINT8 *pData,
- MOBLEUINT32 length)
+__weak MOBLE_RESULT Sensor_SettingSet(const MOBLEUINT8* pRcvdParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 sensorOffsetBuff[TOTAL_SENSORS_COUNT];
+ MOBLEUINT8 sensorCount = 0;
+ MOBLEUINT16 settingPropertyId;
+ MOBLE_ADDRESS dstClientAddr = peerAddr;
+ MOBLEUINT16 pidNotFound = 0;
+ MOBLEUINT8 pidMatch = 0;
+ MOBLEUINT8 readViolation = 0;
+ sensor_params_t* pParams = NULL;
+ sensor_settings_params_t* pSettingsParam = NULL;
+ MOBLEUINT32 rawValue;
+ MOBLEUINT8 rcvdSettingLengthValue;
+ sensor_SettingCbParams_t sensorSetting;
- MOBLEUINT16 propery_ID = 0x0000;
- MOBLEUINT16 sensor_setting_propertID = 0x0000;
-
-
- MOBLEUINT8 flag =1;
- TRACE_M(TF_SENSOR_M,"Sensor_Setting_Status callback received \r\n");
+ TRACE_M(TF_SENSOR_M, "length %ld, peer %.4x, dst %.4x, element index %d \r\n",
+ length, peerAddr, dstPeer, elementIndex);
- // (Appli_Sensor_GetStatus_cb.GetSettingStatus_cb)(Sensor_GetBuff);
+ if (length > 4)
+ {
+ /* Extract offsets of sensors given by property ID */
+ result = Sensor_ExtractSensorOffset(elementIndex,
+ sensorOffsetBuff,
+ &sensorCount,
+ length,
+ pRcvdParam,
+ &pidNotFound);
+ }
+ else
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ TRACE_M(TF_SENSOR_M, "Invalid length (%ld)\r\n", length);
+ }
- propery_ID = pData[1] << 8;
- propery_ID |= pData[0];
+ if (MOBLE_SUCCEEDED(result))
+ {
+ result = Sensor_ExtractSettingPropertyId(pRcvdParam+2, &settingPropertyId);
+
+ if (sensorCount == 0) /* No PID matched */
+ {
+ /* sensor PID mismatch */
+ pidMatch = 0;
+ result = MOBLE_RESULT_FALSE;
+ TRACE_M(TF_SENSOR_M, "Sensor PID mismatch %.4x", pidNotFound);
+ }
+ else
+ {
+ pParams = SensorServer->pSensorParams + sensorOffsetBuff[0];
+
+ if (pParams != NULL
+ && result == MOBLE_RESULT_SUCCESS)
+ {
+ pidMatch = 0;
+
+ for (MOBLEUINT8 count=0; count<pParams->settingsCount; count++)
+ {
+ pSettingsParam = (pParams->pSettings)+count;
+
+ if (settingPropertyId == pSettingsParam->settingPropertyId)
+ {
+ pidMatch = 1;
+ result = MOBLE_RESULT_SUCCESS;
+ TRACE_M(TF_SENSOR_M, "setting property id %.4x found, raw value %ld\r\n",
+ settingPropertyId, pSettingsParam->settingRaw);
+
+ break;
+ }
+ else /* setting Id not found */
+ {
+ pidMatch = 0;
+ }
+ }
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+ }
- sensor_setting_propertID=pData[3]<<8;
- sensor_setting_propertID=pData[2];
+ if(pidMatch == 1)
+ {
+ if (pSettingsParam->settingAccess == SENSOR_SETTING_ACCESS_READ_WRITE)
+ {
+ rcvdSettingLengthValue = length - 4;
+
+ TRACE_M(TF_SENSOR_M, "Received setting length %d\r\n", rcvdSettingLengthValue);
+
+ if (rcvdSettingLengthValue <= 4)
+ {
+ rawValue = 0;
+
+ GetLittleEndian(pRcvdParam+4, rcvdSettingLengthValue, &rawValue);
+ pSettingsParam->settingRaw = rawValue;
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Received setting length value more than required \r\n");
+ }
+
+ readViolation = 0;
+
+ TRACE_M(TF_SENSOR_M, "Raw value %ld updated\r\n", pSettingsParam->settingRaw);
+ }
+ else
+ {
+ readViolation = 1;
+ TRACE_M(TF_SENSOR_M, "Read violation occurred, can't be written\r\n");
+ }
+ }
- // result = Check_Property_ID(Property_ID_Table , propery_ID);
+ if (MOBLE_SUCCEEDED(result))
+ {
+ /* Application Callback */
+ if (SensorServer->p_cb->Sensor_SettingSet_cb != NULL)
+ {
+ sensorSetting.property_ID =pParams->propertyId;
+ sensorSetting.settingPropertyId = pSettingsParam->settingPropertyId;
+ sensorSetting.settingAccess = pSettingsParam->settingAccess;
+ sensorSetting.settingRaw= pSettingsParam->settingRaw;
+ SensorServer->p_cb->Sensor_SettingSet_cb(&sensorSetting,
+ length,
+ peerAddr,
+ dstPeer,
+ elementIndex);
+ }
+
+ result = Sensor_SettingStatus(pidMatch,
+ readViolation,
+ pParams,
+ pSettingsParam,
+ pidNotFound,
+ settingPropertyId,
+ dstClientAddr,
+ elementIndex,
+ STATUS_SEND_REPLY_PUBLISH);
+ }
+ return result;
+}
+
+
+/**
+ * @brief Sensor_SettingSetUnack callback
+ * response to be sent to both client node and publish group
+ * @param Parameters as set by client
+ * @param Parameters length
+ * @param Client address
+ * @param Destination address set by client (unicast or group)
+ * @param element index corresponding to element which processed the message
+ * @retval Invalid if length is not appropriate
+ * Fail if parameters are prohibited
+ */
+__weak MOBLE_RESULT Sensor_SettingSetUnack(const MOBLEUINT8* pRcvdParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 sensorOffsetBuff[TOTAL_SENSORS_COUNT];
+ MOBLEUINT8 sensorCount = 0;
+ MOBLEUINT16 settingPropertyId;
+ MOBLE_ADDRESS dstClientAddr = peerAddr;
+ MOBLEUINT16 pidNotFound = 0;
+ MOBLEUINT8 pidMatch = 0;
+ MOBLEUINT8 readViolation = 0;
+ sensor_params_t* pParams = NULL;
+ sensor_settings_params_t* pSettingsParam = NULL;
+ MOBLEUINT32 rawValue;
+ MOBLEUINT8 rcvdSettingLengthValue;
+ sensor_SettingCbParams_t sensorSetting;
- // (Appli_Sensor_GetStatus_cb.GetSettingStatus_cb)(Sensor_GetBuff);
+ TRACE_M(TF_SENSOR_M, "length %ld, peer %.4x, dst %.4x, element index %d \r\n",
+ length, peerAddr, dstPeer, elementIndex);
- for(int i=0;i<NUMBER_OF_SENSOR;i++)
+ if (length > 4)
+ {
+ /* Extract offsets of sensors given by property ID */
+ result = Sensor_ExtractSensorOffset(elementIndex,
+ sensorOffsetBuff,
+ &sensorCount,
+ length,
+ pRcvdParam,
+ &pidNotFound);
+ }
+ else
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ TRACE_M(TF_SENSOR_M, "Invalid length (%ld)\r\n", length);
+ }
+ if (MOBLE_SUCCEEDED(result))
{
+ result = Sensor_ExtractSettingPropertyId(pRcvdParam+2, &settingPropertyId);
- if(propery_ID == Sensor_SettingParam[i].Property_ID)
+ if (sensorCount == 0) /* No PID matched */
{
- flag=0;
- *pSetting_param = Sensor_SettingParam[i].Property_ID;
- *(pSetting_param+1) = Sensor_SettingParam[i].Property_ID >> 8;
+ /* sensor PID mismatch */
+ pidMatch = 0;
+ result = MOBLE_RESULT_FALSE;
+ TRACE_M(TF_SENSOR_M, "Sensor PID mismatch %.4x\r\n", pidNotFound);
+ }
+ else
+ {
+ pParams = SensorServer->pSensorParams + sensorOffsetBuff[0];
- /* Comapre received setting property Id with existing value */
- if(sensor_setting_propertID == Sensor_SettingParam[i].Sensor_Setting_ID)
+ if (pParams != NULL
+ && result == MOBLE_RESULT_SUCCESS)
{
- *(pSetting_param+2) = Sensor_SettingParam[i].Sensor_Setting_ID;
- *(pSetting_param+3) = Sensor_SettingParam[i].Sensor_Setting_ID >> 8;
-
- *plength = 4;
+ pidMatch = 0;
+
+ for (MOBLEUINT8 count=0; count<pParams->settingsCount; count++)
+ {
+ pSettingsParam = (pParams->pSettings)+count;
+
+ if (settingPropertyId == pSettingsParam->settingPropertyId)
+ {
+ pidMatch = 1;
+ result = MOBLE_RESULT_SUCCESS;
+
+ TRACE_M(TF_SENSOR_M, "setting property id %.4x found, raw value %ld\r\n",
+ settingPropertyId, pSettingsParam->settingRaw);
+ break;
+ }
+ else /* setting Id not found */
+ {
+ pidMatch = 0;
+ }
+ }
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
}
- else /* setting property id not matched */
+
+ if(pidMatch == 1)
+ {
+ if (pSettingsParam->settingAccess == SENSOR_SETTING_ACCESS_READ_WRITE)
+ {
+ rcvdSettingLengthValue = length - 4;
+
+ TRACE_M(TF_SENSOR_M, "Received setting length %d\r\n", rcvdSettingLengthValue);
+
+ if (rcvdSettingLengthValue <= 4)
{
- *plength = 2;
+ rawValue = 0;
+
+ GetLittleEndian(pRcvdParam+4, rcvdSettingLengthValue, &rawValue);
+ pSettingsParam->settingRaw = rawValue;
}
- break;
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Received setting length value more than required \r\n");
+ }
+
+ readViolation = 0;
+
+ TRACE_M(TF_SENSOR_M, "Raw value %ld updated\r\n", pSettingsParam->settingRaw);
+ }
+ else
+ {
+ readViolation = 1;
+ TRACE_M(TF_SENSOR_M, "Read violation occurred, can't be written\r\n");
}
}
- /* unknown property Id */
- if(flag ==1){
- *pSetting_param = propery_ID>>8;
- *(pSetting_param+1) = propery_ID;
- *plength = 2 ;
+ if (MOBLE_SUCCEEDED(result))
+ {
+ /* Application Callback */
+ if (SensorServer->p_cb->Sensor_SettingSetUnack_cb != NULL)
+ {
+ sensorSetting.property_ID =pParams->propertyId;
+ sensorSetting.settingPropertyId = pSettingsParam->settingPropertyId;
+ sensorSetting.settingAccess = pSettingsParam->settingAccess;
+ sensorSetting.settingRaw= pSettingsParam->settingRaw;
+
+ (SensorServer->p_cb->Sensor_SettingSetUnack_cb)(&sensorSetting,
+ length,
+ peerAddr,
+ dstPeer,
+ elementIndex);
+ }
+
+ result = Sensor_SettingStatus(pidMatch,
+ readViolation,
+ pParams,
+ pSettingsParam,
+ pidNotFound,
+ settingPropertyId,
+ dstClientAddr,
+ elementIndex,
+ STATUS_SEND_PUBLISH);
}
- return MOBLE_RESULT_SUCCESS;
+ return result;
}
/**
-* @brief Sensor_Setting_Status_SettingID with setting id
-* @param pSetting_param: Pointer to the status message, which needs to be updated
-* @param plength: Pointer to the Length of the Status message
-* @param pData: Pointer of data coming in packet.
-* @param length: length of the data in packet.
-* @retval MOBLE_RESULT
-*/
-
-MOBLE_RESULT Sensor_Setting_Status_SettingID(MOBLEUINT8* pSetting_param, MOBLEUINT32 *plength
- ,const MOBLEUINT8 *pData,MOBLEUINT32 length)
-{
- MOBLEUINT8 sensor_GetBuff[7];
- MOBLEUINT16 propery_ID= 0x00;
- MOBLEUINT16 sensor_setting_propertID=0x00;
- MOBLEUINT8 flag=0;
+ * @brief Sensor_Get callback
+ * response only to be sent to client node and not to pulish group
+ * @param Parameters as set by client
+ * @param Parameters length
+ * @param Client address
+ * @param Destination address set by client (unicast or group)
+ * @param element index corresponding to element which processed the message
+ * @retval Invalid if length is not appropriate
+ * Fail if parameters are prohibited
+ */
+__weak MOBLE_RESULT Sensor_Get(const MOBLEUINT8* pGetParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 sensorOffsetBuff[TOTAL_SENSORS_COUNT];
+ MOBLEUINT8 sensorCount = 0;
+ MOBLEUINT16 propertyId = 0x0000;
+ MOBLE_ADDRESS dstClientAddr = peerAddr;
+ MOBLEUINT16 pidNotFound = 0;
- TRACE_M(TF_SENSOR_M,"Sensor_Setting_Status with setting id callback received \r\n");
+ TRACE_M(TF_SENSOR_M, "length %ld, peer %.4x, dst %.4x, element index %d \r\n",
+ length, peerAddr, dstPeer, elementIndex);
- if(length >= 4){
+ if (length > 2)
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ TRACE_M(TF_SENSOR_M, "Invalid length (%ld)\r\n", length);
+ }
+ else
+ {
+ /* Extract offsets of sensors */
+ result = Sensor_ExtractSensorOffset(elementIndex,
+ sensorOffsetBuff,
+ &sensorCount,
+ length,
+ pGetParam,
+ &pidNotFound);
+ }
- propery_ID = pData[1] << 8;
- propery_ID |= pData[0] ;
+ if (MOBLE_SUCCEEDED(result))
+ {
+ /* Application may update sensor data */
+ if (SensorServer->p_cb->Sensor_Get_cb != NULL)
+ {
+ /*Application Callback */
+ if(length == 2){
+ propertyId = pGetParam[0] | pGetParam[1]<<8 ;
+ }
+ (SensorServer->p_cb->Sensor_Get_cb)(propertyId,
+ length,
+ peerAddr,
+ dstPeer,
+ elementIndex);
+ }
+
+ result = Sensor_Status(sensorOffsetBuff,
+ sensorCount,
+ dstClientAddr,
+ pidNotFound,
+ STATUS_SEND_REPLY);
+ }
- sensor_setting_propertID = pData[3]<<8;
- sensor_setting_propertID |= pData[2];
+ return result;
+}
+
+
+/**
+ * @brief Sensor_ColumnGet callback
+ * response only to be sent to client node and not to pulish group
+ * @param Parameters as set by client
+ * @param Parameters length
+ * @param Client address
+ * @param Destination address set by client (unicast or group)
+ * @param element index corresponding to element which processed the message
+ * @retval Invalid if length is not appropriate
+ * Fail if parameters are prohibited
+ */
+__weak MOBLE_RESULT Sensor_ColumnGet(const MOBLEUINT8* pColumnParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT32 rawValueX = 0;
+ MOBLEUINT8 sensorOffsetBuff[TOTAL_SENSORS_COUNT];
+ MOBLEUINT8 sensorCount = 0;
+ MOBLEUINT16 pidNotFound = 0;
+ MOBLEUINT8 rcvdRawXLength = 0;
+ sensor_params_t* pParams = NULL;
+ MOBLE_ADDRESS dstClientAddr = peerAddr;
+ sensor_ColumnCbParams_t pColumnParams;
+ TRACE_M(TF_SENSOR_M, "length %ld, peer %.4x, dst %.4x, element index %d \r\n",
+ length, peerAddr, dstPeer, elementIndex);
- for(int i=0; i< NUMBER_OF_SENSOR ; i++){
+ if (length >= 3)
+ {
+ /* Extract offsets of sensors given by property ID */
+ result = Sensor_ExtractSensorOffset(elementIndex,
+ sensorOffsetBuff,
+ &sensorCount,
+ length,
+ pColumnParam,
+ &pidNotFound);
+ }
+ else
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ TRACE_M(TF_SENSOR_M, "Invalid length (%ld)\r\n", length);
+ }
- if(propery_ID == Sensor_SettingParam[i].Property_ID)
- {
- if(sensor_setting_propertID == Sensor_SettingParam[i].Sensor_Setting_ID)
+ if (MOBLE_SUCCEEDED(result))
{
- flag=1;
- (Appli_Sensor_GetStatus_cb.GetSetting_IDStatus_cb)(sensor_GetBuff , propery_ID);
+ if (sensorCount == 0)
+ {
+ /* sensor PID mismatch */
+ result = MOBLE_RESULT_FALSE;
+ TRACE_M(TF_SENSOR_M, "Sensor PID mismatch %.4x\r\n", pidNotFound);
+ }
+ else
+ {
+ pParams = SensorServer->pSensorParams + sensorOffsetBuff[0];
+
+ if (pParams != NULL
+ && result == MOBLE_RESULT_SUCCESS)
+ {
+ if (pParams->seriesCount == 0)
+ {
+ TRACE_M(TF_SENSOR_M, "Series count not supported on sensor %d\r\n", sensorOffsetBuff[0]);
}
else
{
- *pSetting_param = Sensor_SettingParam[i].Property_ID >>8 ;
- *(pSetting_param+1) =Sensor_SettingParam[i].Property_ID ;
- *(pSetting_param+2) = Sensor_SettingParam[i].Sensor_Setting_ID>>8;
- *(pSetting_param+3) = Sensor_SettingParam[i].Sensor_Setting_ID ;
- *plength=4;
- }
- break;
+ rcvdRawXLength = length - PROPERTY_ID_LENGTH;
+
+ if (rcvdRawXLength <= 4)
+ {
+ GetLittleEndian(pColumnParam+PROPERTY_ID_LENGTH, rcvdRawXLength, &rawValueX);
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_SENSOR_M, "Received length mismatch \r\n");
+ }
+
+ }
}
+ else
+ {
+ /* */
+ }
+ }
+ }
+ else
+ {
+ /* */
+ }
+
+ if (MOBLE_SUCCEEDED(result))
+ {
+ if (SensorServer->p_cb->Sensor_ColumnGet_cb != NULL)
+ {
+ /*Application Callback */
+ pColumnParams.propertyId = pParams->propertyId;
+ pColumnParams.rawValueX = rawValueX;
- }
+ (SensorServer->p_cb->Sensor_ColumnGet_cb)(&pColumnParams,
+ length,
+ peerAddr,
+ dstPeer,
+ elementIndex);
+ }
+ result = Sensor_ColumnStatus(sensorOffsetBuff,
+ sensorCount,
+ dstClientAddr,
+ rawValueX,
+ rcvdRawXLength,
+ pidNotFound,
+ elementIndex,
+ STATUS_SEND_REPLY);
}
- if(flag==1)
+ return result;
+}
+
+
+/**
+ * @brief Sensor_SeriesGet callback
+ * response only to be sent to client node and not to pulish group
+ * @param Parameters as set by client
+ * @param Parameters length
+ * @param Client address
+ * @param Destination address set by client (unicast or group)
+ * @param element index corresponding to element which processed the message
+ * @retval Invalid if length is not appropriate
+ * Fail if parameters are prohibited
+ */
+__weak MOBLE_RESULT Sensor_SeriesGet(const MOBLEUINT8* pSeriesParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT32 rawValueX1 = 0;
+ MOBLEUINT32 rawValueX2 = 0;
+ MOBLEUINT8 isX1X2Present = 0;
+ MOBLEUINT8 sensorOffsetBuff[TOTAL_SENSORS_COUNT];
+ MOBLEUINT8 sensorCount = 0;
+ MOBLEUINT16 pidNotFound = 0;
+ MOBLEUINT8 rcvdRawXLength = 0;
+ sensor_params_t* pParams = NULL;
+ MOBLE_ADDRESS dstClientAddr = peerAddr;
+
+ TRACE_M(TF_SENSOR_M, "length %ld, peer %.4x, dst %.4x, element index %d \r\n",
+ length, peerAddr, dstPeer, elementIndex);
+
+ if (length >= 2)
{
- if(sensor_GetBuff[4] == 0x03){
- memcpy(pSetting_param , sensor_GetBuff,7);
- *plength = 7;
+ /* Extract offsets of sensors given by property ID */
+ result = Sensor_ExtractSensorOffset(elementIndex,
+ sensorOffsetBuff,
+ &sensorCount,
+ length,
+ pSeriesParam,
+ &pidNotFound);
}
- else if(sensor_GetBuff[4] == 0x01)
+ else
+ {
+ result = MOBLE_RESULT_INVALIDARG;
+ TRACE_M(TF_SENSOR_M, "Invalid length (%ld)\r\n", length);
+ }
+
+ if (MOBLE_SUCCEEDED(result))
+ {
+ if (sensorCount == 0)
+ {
+ /* sensor PID mismatch */
+ result = MOBLE_RESULT_FALSE;
+ TRACE_M(TF_SENSOR_M, "Sensor PID mismatch %.4x\r\n", pidNotFound);
+ }
+ else
{
- //memcpy(pSetting_param , sensor_GetBuff,5);
- *pSetting_param = sensor_GetBuff[0];
- *(pSetting_param+1) =sensor_GetBuff[1];
- *(pSetting_param+2) = sensor_GetBuff[2];
- *(pSetting_param+3) = sensor_GetBuff[3];
- *(pSetting_param+4)= sensor_GetBuff[4];
+ pParams = SensorServer->pSensorParams + sensorOffsetBuff[0];
+
+ if (pParams != NULL
+ && result == MOBLE_RESULT_SUCCESS)
+ {
+ if(pParams->seriesCount != 0)
+ {
+ /* check if X1 and X2 are present */
+ if (length > 2)
+ {
+ if (length % 2 == 0)
+ {
+ rcvdRawXLength = (length - 2)/2;
+
+ if (rcvdRawXLength <= 4)
+ {
+ GetLittleEndian(pSeriesParam+PROPERTY_ID_LENGTH, rcvdRawXLength, &rawValueX1);
+ GetLittleEndian(pSeriesParam+PROPERTY_ID_LENGTH+rcvdRawXLength, rcvdRawXLength, &rawValueX2);
+
+ TRACE_M(TF_SENSOR_M, "rawValue X1 %ld and rawValueX2 %ld\r\n", rawValueX1, rawValueX2);
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_SENSOR_M, "received length mismatch \r\n");
+ }
+
+ isX1X2Present = 1;
+ }
+ else
+ {
+ /* odd length */
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+ else
+ {
+ isX1X2Present = 0;
+ TRACE_M(TF_SENSOR_M, "X1 and X2 not present. Send for all columns\r\n");
+ }
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Series count not supported on sensor %d\r\n", sensorOffsetBuff[0]);
+ }
+ }
+ else
+ {
+ /* */
+ }
+ }
+ }
+ else
+ {
+ /* */
+ }
- *plength=5;
+ if (MOBLE_SUCCEEDED(result))
+ {
+ if (SensorServer->p_cb->Sensor_SeriesGet_cb != NULL)
+ {
+ /*Application Callback */
+ sensor_SeriesCbParams_t pSeriesParams;
+ pSeriesParams.propertyId=pParams->propertyId;
+ pSeriesParams.rawValueX1= rawValueX1;
+ pSeriesParams.rawValueX2= rawValueX2;
+
+ (SensorServer->p_cb->Sensor_SeriesGet_cb)(&pSeriesParams,
+ length,
+ peerAddr,
+ dstPeer,
+ elementIndex);
}
+
+ result = Sensor_SeriesStatus(sensorOffsetBuff,
+ sensorCount,
+ dstClientAddr,
+ rawValueX1,
+ rawValueX2,
+ isX1X2Present,
+ rcvdRawXLength,
+ pidNotFound,
+ elementIndex,
+ STATUS_SEND_REPLY);
}
- return MOBLE_RESULT_SUCCESS;
+
+ return result;
}
-
-
/**
-* @brief Sensor_Setting_Status_SettingID with setting id
-* @param pSetting_param: Pointer to the status message, which needs to be updated
-* @param plength: Pointer to the Length of the Status message
-* @param pData: Pointer of data coming in packet.
-* @param length: length of the data in packet.
-* @retval MOBLE_RESULT
-*/
-
-
-#endif
-
-/**
-* @brief SensorModelServer_GetOpcodeTableCb: This function is call-back
-* from the library to send Model Opcode Table info to library
-* @param MODEL_OpcodeTableParam_t: Pointer to the sensor Model opcode array
-* @param length: Pointer to the Length of sensor Model opcode array
-* @retval MOBLE_RESULT
-*/
-MOBLE_RESULT SensorModelServer_GetOpcodeTableCb(const MODEL_OpcodeTableParam_t **data,
- MOBLEUINT16 *length)
+ * @brief SensorModelServer_GetOpcodeTableCb callback
+ * @param Reference to sensor model opcode table
+ * @param size of table to be set
+ * @retval Success
+*/
+__weak MOBLE_RESULT SensorModelServer_GetOpcodeTableCb(const MODEL_OpcodeTableParam_t **data,
+ MOBLEUINT16 *length)
{
*data = Sensor_Opcodes_Table;
*length = sizeof(Sensor_Opcodes_Table)/sizeof(Sensor_Opcodes_Table[0]);
@@ -689,346 +3317,1252 @@ MOBLE_RESULT SensorModelServer_GetOpcodeTableCb(const MODEL_OpcodeTableParam_t *
/**
-* @brief SensorModelServer_GetStatusRequestCb : This function is call-back
-* 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
+ * @brief SensorModelServer_GetStatusRequestCb is callback from
+ * mesh library to send response to the message from peer
+ * NOT USED
+ * @param pmsgParams: message parameters
* @param opcode: Received opcode of the Status message callback
-* @param pResponsedata: Pointer to the buffer to be updated with status
-* @param plength: Pointer to the Length of the data, to be updated by application
-* @param pRxData: Pointer to the data received in packet.
+ * @param pResponsedata: buffer to be updated with status
+ * @param plength: Length of tata, updated by application
+ * @param pRxData: data received in packet.
* @param dataLength: length of the data in packet.
* @param response: Value to indicate wheather message is acknowledged meassage or not.
-* @retval MOBLE_RESULT
+ * @retval Success
+*/
+__weak MOBLE_RESULT SensorModelServer_GetStatusRequestCb(MODEL_MessageHeader_t *pmsgParams,
+ MOBLEUINT16 opcode,
+ MOBLEUINT8 *pResponsedata,
+ MOBLEUINT32 *plength,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 dataLength,
+ MOBLEBOOL response)
+{
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+ * @brief SensorModelServer_ProcessMessageCb callback from access layer
+ * @param pmsgParams: message parameters
+ * @param opcode: message opcode
+ * @param pRxData: data received in packet
+ * @param dataLength: length of the data
+ * @param response: not applicable
+ * @retval MOBLE_RESULT as set by callee
*/
-MOBLE_RESULT SensorModelServer_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
- MOBLEUINT16 opcode,
- MOBLEUINT8 *pResponsedata,
- MOBLEUINT32 *plength,
- MOBLEUINT8 const *pRxData,
- MOBLEUINT32 dataLength,
- MOBLEBOOL response)
+__weak MOBLE_RESULT SensorModelServer_ProcessMessageCb(MODEL_MessageHeader_t *pmsgParams,
+ MOBLEUINT16 opcode,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 dataLength,
+ MOBLEBOOL response)
{
- MOBLEUINT16 property_ID = 0;
- property_ID = pRxData[1] << 8;
- property_ID |= pRxData[0];
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 elementIndex = 0;
+
+ if(SensorServer != NULL)
+ {
+ result = MOBLE_RESULT_SUCCESS;
+ }
+ else
+ {
+ TRACE_M(TF_LIGHT_LC_M, "Sensor server not supported\r\n");
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ if(MOBLE_SUCCEEDED(result))
+ {
+ elementIndex = pmsgParams->elementIndex;
+
switch(opcode)
+ {
+ case SENSOR_DESCRIPTOR_GET:
+ result = Sensor_DescriptorGet(pRxData, dataLength, pmsgParams->peer_addr, pmsgParams->dst_peer, elementIndex);
+ break;
+ case SENSOR_DESCRIPTOR_STATUS:
+ SensorAppli_cb.Sensor_Descriptor_Status_cb(pRxData, dataLength, pmsgParams->dst_peer, elementIndex);
+ break;
+ case SENSOR_GET:
+ result = Sensor_Get(pRxData, dataLength, pmsgParams->peer_addr, pmsgParams->dst_peer, elementIndex);
+ break;
+ case SENSOR_STATUS:
+ SensorAppli_cb.Sensor_Status_cb(pRxData, dataLength, pmsgParams->dst_peer, elementIndex);
+ break;
+ case SENSOR_CADENCE_GET:
+ result = Sensor_CadenceGet(pRxData, dataLength, pmsgParams->peer_addr, pmsgParams->dst_peer, elementIndex);
+ break;
+ case SENSOR_CADENCE_SET:
+ result = Sensor_CadenceSet(pRxData,dataLength, pmsgParams->peer_addr, pmsgParams->dst_peer,elementIndex);
+ break;
+ case SENSOR_CADENCE_SET_UNACK:
+ result = Sensor_CadenceSetUnack(pRxData,dataLength, pmsgParams->peer_addr, pmsgParams->dst_peer,elementIndex);
+ break;
+ case SENSOR_CADENCE_STATUS:
+ SensorAppli_cb.Sensor_Cadence_Status_cb(pRxData, dataLength, pmsgParams->dst_peer, elementIndex);
+ break;
+ case SENSOR_COLUMN_GET:
+ result = Sensor_ColumnGet(pRxData,dataLength, pmsgParams->peer_addr, pmsgParams->dst_peer,elementIndex);
+ break;
+ case SENSOR_COLUMN_STATUS:
+ SensorAppli_cb.Sensor_Column_Status_cb(pRxData, dataLength, pmsgParams->dst_peer, elementIndex);
+ break;
+ case SENSOR_SERIES_GET:
+ result = Sensor_SeriesGet(pRxData,dataLength, pmsgParams->peer_addr, pmsgParams->dst_peer,elementIndex);
+ break;
+ case SENSOR_SERIES_STATUS:
+ SensorAppli_cb.Sensor_Series_Status_cb(pRxData, dataLength, pmsgParams->dst_peer, elementIndex);
+ break;
+ case SENSOR_SETTINGS_GET:
+ result = Sensor_SettingsGet(pRxData,dataLength, pmsgParams->peer_addr, pmsgParams->dst_peer,elementIndex);
+ break;
+ case SENSOR_SETTINGS_STATUS:
+ SensorAppli_cb.Sensor_Settings_Status_cb(pRxData, dataLength, pmsgParams->dst_peer, elementIndex);
+ break;
+ case SENSOR_SETTING_GET:
+ result = Sensor_SettingGet(pRxData,dataLength, pmsgParams->peer_addr, pmsgParams->dst_peer,elementIndex);
+ break;
+ case SENSOR_SETTING_SET:
+ result = Sensor_SettingSet(pRxData,dataLength, pmsgParams->peer_addr, pmsgParams->dst_peer,elementIndex);
+ break;
+ case SENSOR_SETTING_SET_UNACK:
+ result = Sensor_SettingSetUnack(pRxData,dataLength, pmsgParams->peer_addr, pmsgParams->dst_peer,elementIndex);
+ break;
+ case SENSOR_SETTING_STATUS:
+ SensorAppli_cb.Sensor_Setting_Status_cb(pRxData, dataLength, pmsgParams->dst_peer, elementIndex);
+ break;
+ default:
+ {
+ break;
+ }
+ } /* opcode switch ends */
+ }
+
+ return result;
+}
+
+
+/**
+ * @brief Sensor_SleepDurationMs_Get
+ * returns max time after which call to process Sensor_Process is required
+ * to publish appropriate sensor status
+ * @param None
+ * @retval sleep time in miliseconds
+ */
+__weak MOBLEUINT32 Sensor_SleepDurationMs_Get(void)
+{
+ MOBLEUINT32 sleepDuration = 96*60*60*1000; /* 96 hours in miliseconds */
+ MOBLEUINT32 timeRemaining = 0;
+ MOBLEUINT32 current = Clock_Time();
+ sensor_params_t* pParams = NULL;
+
+ for (MOBLEUINT8 count=0; count<SensorServer->sensorsCount; count++)
{
-#ifdef ENABLE_SENSOR_MODEL_SERVER
- case SENSOR_DESCRIPTOR_STATUS:
+ if (SensorServer != NULL)
{
- Sensor_Descriptor_Status(pResponsedata ,plength,pRxData,dataLength);
- break;
+ pParams = SensorServer->pSensorParams+count;
}
- case SENSOR_STATUS:
+ else
{
- Sensor_Data_Status(pResponsedata ,plength,pRxData,dataLength);
- break;
+ /* Sensor not initialized */
}
- case SENSOR_COLUMN_STATUS:
- {
- if((dataLength > 0) && (property_ID == 0x00))
- {
- return MOBLE_RESULT_FALSE;
- }
-
- Sensor_Column_Status(pResponsedata,plength,pRxData,dataLength);
- break;
- }
- case SENSOR_SERIES_STATUS:
+ if (pParams != NULL)
{
- if((dataLength > 0) && (property_ID == 0x00))
- {
- return MOBLE_RESULT_FALSE;
- }
- Sensor_Series_Status(pResponsedata,plength,pRxData,dataLength);
- break;
+ if (pParams->timerStatus == TIMER_RUNNING)
+ {
+ if (pParams->timerBegin < pParams->timerEnd)
+ {
+ /* timer already expired and publication pending */
+ if (current >= pParams->timerEnd ||
+ current < pParams->timerBegin)
+ {
+ timeRemaining = 0;
+ }
+ else /* time to next publicaton */
+ {
+ timeRemaining = pParams->timerEnd - current;
+ }
+ }
+ else /* overflow */
+ {
+ /* timer already expired and publication pending */
+ if (current >= pParams->timerEnd &&
+ current < pParams->timerBegin)
+ {
+ timeRemaining = 0;
+ }
+ else /* time to next publication */
+ {
+ if (current < pParams->timerEnd)
+ {
+ timeRemaining = pParams->timerEnd - current;
+ }
+ else
+ {
+ timeRemaining = (0xFFFFFFFF - current) + pParams->timerEnd;
+ }
+ }
+ }
+
+ if (sleepDuration > timeRemaining)
+ {
+ sleepDuration = timeRemaining;
+ }
+ else
+ {
+ /* sleep time already less than what is required */
+ }
+ }
+ else
+ {
+ /* sleep time update not required for this sensor as timer not running */
+ }
}
- case SENSOR_CADENCE_STATUS:
+ else
{
- Sensor_Cadence_Status(pResponsedata ,plength,pRxData,dataLength);
- break;
+ /* */
}
- case SENSOR_SETTING_STATUS_PID:
+ }
+
+ return sleepDuration;
+}
+
+
+/**
+ * @brief Sensor_UpdatePublishParameters to update fast cadence (if supported)
+ * state
+ * Update is required if sensor value is changed or
+ * Cadence parameters are modified or
+ * Sensor Server publish period is modified
+ * If publish parameter updated, all sensors on same element align
+ * publish time
+ * No change if cadence not supported
+ * @param sensor offset of corresponding sensor whose parameters to be updated
+ * @retval Fail if sensor not initialized
+ * else Success
+ */
+__weak MOBLE_RESULT Sensor_UpdatePublishParameters(MOBLEUINT8 sensorOffset)
+{
+ MOBLEUINT8 fastCadenceStatus = 0;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 sensorOffsetTemp = sensorOffset;
+ sensor_params_t* pParams = SensorServer->pSensorParams + sensorOffsetTemp;
+ MOBLEUINT32 fastCadenceLow;
+ MOBLEUINT32 fastCadenceHigh;
+
+ TRACE_M(TF_SENSOR_M, "SENSOR%d\r\n", sensorOffset+1);
+
+ if (pParams != NULL)
+ {
+ if (pParams->cadenceState == 1)
{
- Sensor_Setting_Status_PID(pResponsedata ,plength,pRxData,dataLength);
- break;
+ if (pParams->modelPublishPeriodMs == 0)
+ {
+ TRACE_M(TF_SENSOR_M, "Publish period set to 0\r\n");
+ }
+ else
+ {
+ if (SensorServer->p_cb->Sensor_IsFastCadence_cb != NULL)
+ {
+ fastCadenceLow = pParams->fastCadenceLow;
+ fastCadenceHigh = pParams->fastCadenceHigh;
+
+ /* check sensor value for fast cadence */
+ fastCadenceStatus =
+ SensorServer->p_cb->Sensor_IsFastCadence_cb(sensorOffset,
+ &fastCadenceLow,
+ &fastCadenceHigh);
+ }
+ else
+ {
+ fastCadenceStatus = 0;
+ }
+
+ /* if fast cadence required, divide publish interval by 2^n, n = fast cadence period divisor */
+ if (fastCadenceStatus == 1)
+ {
+ pParams->publishPeriodMs = pParams->modelPublishPeriodMs / \
+ (1<<pParams->fastCadencePeriodDiv);
+ }
+ else
+ {
+ pParams->publishPeriodMs = pParams->modelPublishPeriodMs;
+ }
+
+ /* if publish period is less than status min interval, adjust to status min value */
+ if (pParams->publishPeriodMs < (1 << pParams->statusMinInterval))
+ {
+ TRACE_M(TF_SENSOR_M, "publish period %ld less than status minimum interval %d\r\n", pParams->publishPeriodMs, 1 << pParams->statusMinInterval);
+ pParams->publishPeriodMs = 1 << pParams->statusMinInterval;
+ }
+
+ TRACE_M(TF_SENSOR_M, "SENSOR%d fast cadence state %d, publish period %ld\r\n",
+ sensorOffset+1, fastCadenceStatus, pParams->publishPeriodMs);
+ }
+
+ /* realign timers of all sensors on same element index
+ this may result in publishing of sensor status even for sensors whose
+ sensor status is not scheduled
+ Doing this benefits to publish sensor data of all elements in one message
+ by data marshalling */
+ for (MOBLEUINT8 count=0; count<SensorServer->sensorsCount; count++)
+ {
+ if(((SensorServer->pSensorParams)+count)->elementIdx == pParams->elementIdx &&
+ ((SensorServer->pSensorParams)+count)->cadenceState == 1)
+ {
+ if(((SensorServer->pSensorParams)+count)->modelPublishPeriodMs == 0)
+ {
+ ((SensorServer->pSensorParams)+count)->timerStatus = TIMER_STOPPED;
+ }
+ else
+ {
+ /* start timer for now to immediately send status on change parameters
+ subsequently status would be sent after every publish period */
+ ((SensorServer->pSensorParams)+count)->timerStatus = TIMER_RUNNING;
+ ((SensorServer->pSensorParams)+count)->timerBegin = Clock_Time();
+ ((SensorServer->pSensorParams)+count)->timerEnd = \
+ ((SensorServer->pSensorParams)+count)->timerBegin;
+ }
+ }
+ else
+ {
+ /* */
+ }
+ }
+
+ result = MOBLE_RESULT_SUCCESS;
}
- case SENSOR_SETTING_STATUS_SETTING_ID:
+ else /* cadence not supported */
{
- Sensor_Setting_Status_SettingID(pResponsedata,plength,pRxData,dataLength);
- break;
+ TRACE_M(TF_SENSOR_M, "Cadence not supported\r\n");
}
-#endif
- default:
- {
-
- }
}
- return MOBLE_RESULT_SUCCESS;
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_SENSOR_M, "Sensor not initialized\r\n");
+ }
+
+ return result;
}
/**
-* @brief SensorModelServer_ProcessMessageCb: This is a callback function from
-* the library whenever a sensor 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
-* @param opcode: Received opcode of the Status message callback
-* @param response: if TRUE, the message is an acknowledged message
-* @param pRxData: Pointer to the data received in packet.
-* @param dataLength: length of the data in packet.
-* @param response: Value to indicate wheather message is acknowledged meassage or not.
-* @retval MOBLE_RESULT
-*/
-MOBLE_RESULT SensorModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
- MOBLEUINT16 opcode,
- MOBLEUINT8 const *pRxData,
- MOBLEUINT32 dataLength,
- MOBLEBOOL response
- )
+ * @brief Sensor_CheckStatusTrigger - trigger sensor status if change in sensor state
+ * is larger than defined trigger down/trigger up
+ * Status trigger is decided by application
+ * @param sensor offset of corresponding sensor
+ * @retval set by application
+ */
+__weak MOBLE_RESULT Sensor_CheckStatusTrigger(MOBLEUINT8 sensorOffset)
{
+ MOBLEUINT8 sensorOffsetTemp = sensorOffset;
+ sensor_params_t* pParams = SensorServer->pSensorParams + sensorOffsetTemp;
+ status_trigger_type_e statusTriggerType = (status_trigger_type_e)pParams->statusTriggerType;
+ MOBLEUINT32 statusTriggerDeltaDown = pParams->statusTriggerDeltaDown;
+ MOBLEUINT32 statusTriggerDeltaUp = pParams->statusTriggerDeltaUp;
+ MOBLEUINT8 statusTrigger = 0;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ if (pParams != NULL &&
+ SensorServer->p_cb->Sensor_IsStatusTrigger_cb != NULL)
+ {
+ statusTrigger = SensorServer->p_cb->Sensor_IsStatusTrigger_cb(sensorOffset,
+ statusTriggerType,
+ &statusTriggerDeltaDown,
+ &statusTriggerDeltaUp);
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ if (statusTrigger == 1)
+ {
+ Sensor_Status(&sensorOffsetTemp, 1, 0x0000, 0x0000, STATUS_SEND_PUBLISH);
+ }
+ else
+ {
+/* status trigger not to be sent, change is within safe limit */
+ }
+ return result;
+}
+
+
+/**
+ * @brief Send sensor status to publish group
+ * @param sensor offset of corresponding sensor
+ * @param element index
+ * @param sensor property ID
+ * @retval fail if sensor not initialized
+ * else set by callee
+ */
+__weak MOBLE_RESULT Sensor_Send(MOBLEUINT8 sensorOffset,
+ MOBLEUINT8 elementIdx,
+ MOBLEUINT16 propertyId)
+{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
-/* tClockTime delay_t = Clock_Time(); */
-#ifdef ENABLE_SENSOR_MODEL_SERVER
- MOBLEUINT16 property_ID = 0;
- property_ID = pRxData[1] << 8;
- property_ID |= pRxData[0];
-#endif
+ sensor_params_t* pParams = NULL;
- TRACE_M(TF_SENSOR_M,"dst_peer = %.2X , peer_add = %.2X \r\n ",dst_peer, peer_addr);
- switch(opcode)
+ if(SensorServer != NULL)
{
-#ifdef ENABLE_SENSOR_MODEL_SERVER
- case SENSOR_DESCRIPTOR_GET:
- {
- if((dataLength > 0) && (property_ID == 0x00))
- {
- return MOBLE_RESULT_FALSE;
- }
- break;
- }
- case SENSOR_GET:
+ pParams = SensorServer->pSensorParams + sensorOffset;
+
+ if (pParams != NULL)
{
- if((dataLength > 0) && (property_ID == 0x00))
+ if (pParams->elementIdx == elementIdx &&
+ pParams->propertyId == propertyId)
+ {
+ result = Sensor_Status(&sensorOffset,
+ 1,
+ MOBLE_ADDRESS_UNASSIGNED,
+ 0x0000,
+ STATUS_SEND_PUBLISH);
+
+ }
+ else
{
- return MOBLE_RESULT_FALSE;
+ TRACE_M(TF_SENSOR_M, "Parameters mismatch \r\n");
+ result = MOBLE_RESULT_FAIL;
}
- break;
}
- case SENSOR_CADENCE_GET:
+ else
{
- if((dataLength > 0) && (property_ID == 0x00))
- {
- return MOBLE_RESULT_FALSE;
- }
- break;
+ result = MOBLE_RESULT_FAIL;
}
-
- case SENSOR_CADENCE_SET:
- case SENSOR_CADENCE_SET_UNACK:
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_SENSOR_M, "Sensor server not initialized\r\n");
+ }
+
+ return result;
+}
+
+
+/**
+ * @brief Sensor_UpdateCadence to update publish period according to cadence state
+ * @param sensor offset of corresponding sensor
+ * @param corresponding element index
+ * @param property ID of sensor
+ * @retval Fail if sensors not initialized or sensor offset doesn't exist
+ * Not implemented if cadence not supported
+ * False if parameters are not consistent
+ * else Success
+ */
+__weak MOBLE_RESULT Sensor_UpdateCadence(MOBLEUINT8 sensorOffset,
+ MOBLEUINT8 elementIdx,
+ MOBLEUINT16 propertyId)
+{
+ sensor_params_t* pParams = NULL;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ if (SensorServer != NULL
+ && sensorOffset < SensorServer->sensorsCount)
+ {
+ pParams = SensorServer->pSensorParams+sensorOffset;
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Sensor parameters not intialized\r\n");
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ if (pParams->elementIdx == elementIdx &&
+ pParams->propertyId == propertyId)
{
- if((dataLength > 0) && (property_ID == 0x00))
+ if (pParams->cadenceState == 1) /* cadence is supported */
+ {
+ /* update sensor publish parameters based on sensor cadence state */
+ if (MOBLE_SUCCEEDED(Sensor_UpdatePublishParameters(sensorOffset)))
{
- return MOBLE_RESULT_FALSE;
+ TRACE_M(TF_SENSOR_M, "Publish parameters updated\r\n");
}
- Sensor_Cadence_Set(pRxData,dataLength);
- break;
+
+ /* check for sensor status trigger state */
+ if (MOBLE_SUCCEEDED(Sensor_CheckStatusTrigger(sensorOffset)))
+ {
+ TRACE_M(TF_SENSOR_M, "Sensor status triggered\r\n");
+ }
+ }
+ else
+ {
+ /* This function does not support update of series column state */
+ result = MOBLE_RESULT_NOTIMPL;
+ }
}
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Arguments mismatch \r\n");
+ result = MOBLE_RESULT_FALSE;
+ }
+ }
+
+ return result;
+}
+
+
+/**
+ * @brief Sensor_UpdatePublishState to enable/disable publishing
+ * @param sensor offset
+ * @param new state
+ * @retval Fail if sensors not initialized or sensor offset doesn't exist
+ * else Success
+ */
+__weak MOBLE_RESULT Sensor_UpdatePublishState(MOBLEUINT8 sensorOffset, MOBLEUINT8 state)
+{
+ sensor_params_t* pParams = NULL;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ if (SensorServer != NULL &&
+ sensorOffset < SensorServer->sensorsCount)
+ {
+ pParams = SensorServer->pSensorParams+sensorOffset;
+ TRACE_M(TF_SENSOR_M, "sensor offset %d new publish state %d\r\n", sensorOffset, state);
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Sensor parameters not intialized\r\n");
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ if (state == 0)
+ {
+ pParams->cadenceState = 0;
+ }
+ else
+ {
+ pParams->cadenceState = 1;
+ }
+ }
+
+ return result;
+}
+
+
+/**
+* @brief Update timers
+ * Status of sensors supported on same element index and have sensor
+ * status publication scheduled within 50ms of each other, are
+ * combined in single sensor status message
+ * At a time only 1 element can publish sensor status even if sensors on
+ * more than 1 element needs to publish. This is done to ensure multiple
+ * calls to Sensor_Process for publishing from multi-element. Issuing
+ * more than one unsegmented/segmented sensor status message in one go
+ * may fail due to limitation in capacity of underlying layers
+* @param void
+* @retval void
+*/
+__weak void Sensor_Process(void)
+{
+ MOBLEUINT8 triggerStatus;
+ sensor_params_t* pParams = NULL;
+ tClockTime currentTick;
+ MOBLEUINT32 advancedTick;
+ MOBLEUINT8 sensorOffset[TOTAL_SENSORS_COUNT];
+ MOBLEUINT8 publishElementIndex = 0;
+ MOBLEUINT8 sensorSeiPublishCount = 0;
+ MOBLEUINT8 tbcPublication = 0;
+
+ if (SensorServer != NULL)
+ {
+ currentTick = Clock_Time();
+ advancedTick = currentTick + 50; /* advance time by 50 ms */
- case SENSOR_COLUMN_GET:
+ /* check for all sensors */
+ for (MOBLEUINT8 count=0; count<SensorServer->sensorsCount; count++)
{
+ pParams = SensorServer->pSensorParams+count;
- if(property_ID == 0x00)
+ if (pParams->timerStatus == TIMER_RUNNING)
{
- result = MOBLE_RESULT_FALSE;
+ /* Publish count (no of sensors whose marshalled data to be published)
+ is 0, publishElementIndex doesn't matter (it is yet to be initialized) */
+ if (publishElementIndex == 0)
+ {
+ tbcPublication = 1;
+ }
+ else
+ {
+ if(pParams->elementIdx != publishElementIndex)
+ {
+ /* if element index not same as publishElementIndex,
+ exit and try next time */
+ break;
+ }
+ else
+ {
+ tbcPublication = 1;
+ }
+ }
+
+ /* check if sensor publication required w.r.t advanced time */
+ if(tbcPublication == 1)
+ {
+ if (pParams->timerBegin <= pParams->timerEnd)
+ {
+ triggerStatus = advancedTick >= pParams->timerEnd ||
+ advancedTick < pParams->timerBegin;
+ }
+ else /* overflow */
+ {
+ triggerStatus = advancedTick >= pParams->timerEnd &&
+ advancedTick < pParams->timerBegin;
+ }
+ }
+
+ if (triggerStatus == 1)
+ {
+ publishElementIndex = pParams->elementIdx;
+
+ sensorOffset[sensorSeiPublishCount] = count;
+ sensorSeiPublishCount++;
+ }
+
+ triggerStatus = 0;
+ }
+ else
+ {
+ /* Timer stopped */
}
- break;
-
}
- case SENSOR_SERIES_GET:
- {
- if(property_ID == 0x00)
+ if(sensorSeiPublishCount != 0)
+ {
+ BLEMesh_GetPublishAddress(publishElementIndex, SENSOR_SERVER_MODEL_ID);
+
+ if (MOBLE_SUCCEEDED(Sensor_Status(sensorOffset, sensorSeiPublishCount, 0x0000, 0, STATUS_SEND_PUBLISH)))
{
- result = MOBLE_RESULT_FALSE;
+ TRACE_M(TF_SENSOR_M, "Element index %d sensor count %d status published\r\n",
+ publishElementIndex, sensorSeiPublishCount);
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Sensor publish failed, sensor count %d\r\n", sensorSeiPublishCount);
+ }
+
+ for (MOBLEUINT8 count=0; count<sensorSeiPublishCount; count++)
+ {
+ pParams = SensorServer->pSensorParams+sensorOffset[count];
+
+ /* update timer parameters for next publication */
+ pParams->timerBegin = currentTick;
+ pParams->timerEnd = pParams->timerBegin + pParams->publishPeriodMs;
}
- break;
- }
- case SENSOR_SETTING_SET:
- case SENSOR_SETTING_SET_UNACK:
+ TRACE_M(TF_SENSOR_M, "publish element index %d, publish sensors count %d\r\n",
+ publishElementIndex, sensorSeiPublishCount);
+ }
+ }
+ else
+ {
+ /* Sensor server not initalized */
+ }
+}
+
+
+/**
+ * @brief Sensor server initialization
+ * @param sensor buffer to be allocated to sensor server model structure
+ * @param application callbacks used by sensor server
+ * @param buffer size
+ * @param initialization parameters
+ * @retval success if initialization successful
+ * else fail
+ */
+__weak MOBLE_RESULT SensorServer_Init(void* sensorBuff,
+ const sensor_server_cb_t* sensor_cb,
+ MOBLEUINT16 sizeBuff,
+ const void* initParams)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 currentElementIdx;
+ MOBLEUINT8 nextElementIdx;
+ MOBLEUINT16 currentPid;
+ MOBLEUINT16 nextPid;
+ MOBLEUINT16 requiredBufferSize = 0;
+ MOBLEUINT16 totalSettingsCount = 0;
+ MOBLEUINT16 totalSeriesColumnCount = 0;
+
+ MOBLEUINT32 buffStartTempIndex = 0;
+ sensor_params_t* pParams = NULL;
+ sensor_settings_params_t* pSettingsParams;
+ sensor_series_column_params_t* pSeriesColumnParams;
+ const sensor_server_init_params_t* pServerInitParams = (sensor_server_init_params_t*) initParams;
+ const sensor_init_params_t* pInitParams;
+ const sensor_settings_init_params_t* pSettingsInitParams;
+ const sensor_series_column_init_params_t* pSeriesColumnInitParams;
+
+ /* Sensor server count should be > 0 */
+ if (pServerInitParams == NULL ||
+ pServerInitParams->sensorsCount == 0)
+ {
+ TRACE_M(TF_SENSOR_M, "Init params NULL or Sensor count can't be 0\r\n");
+ result = MOBLE_RESULT_FAIL;
+ }
+ else
+ {
+ result = MOBLE_RESULT_SUCCESS;
+ }
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ for (MOBLEUINT8 count=0; count<pServerInitParams->sensorsCount; count++)
{
- if((dataLength > 0) && (property_ID == 0x00))
+ /* element index should be < N, N is total number of elements supported by device */
+ if (pServerInitParams->sensorInitParams[count].elementIdx < APPLICATION_NUMBER_OF_ELEMENTS)
{
- return MOBLE_RESULT_FALSE;
- }
- Sensor_Setting_Set(pRxData,dataLength);
- break;
- }
- case SENSOR_DESCRIPTOR_STATUS:
+ /* result = MOBLE_RESULT_SUCCESS; */
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_SENSOR_M, "Element index %d for SENSOR%d not supported\r\n",
+ pServerInitParams->sensorInitParams[count].elementIdx, count+1);
+ break;
+ }
+ }
+ }
+ else
+ {
+ /* */
+ }
+
+ if (result == MOBLE_RESULT_SUCCESS &&
+ pServerInitParams->sensorsCount > 1)
+ {
+ for (MOBLEUINT8 count=0; count<pServerInitParams->sensorsCount-1; count++)
{
- MOBLEUINT8 index;
+ currentElementIdx = pServerInitParams->sensorInitParams[count].elementIdx;
+ nextElementIdx = pServerInitParams->sensorInitParams[count+1].elementIdx;
- TRACE_M(TF_SENSOR,"Sensor Descritpor Status:\r\n");
- for(index = 0; index < dataLength; index++)
+ /* Element index in initialization sensors table should be in ascending order */
+ if (nextElementIdx < currentElementIdx)
{
- TRACE_M(TF_SENSOR,"Value: %d\r\n", pRxData[index]);
+ TRACE_M(TF_SENSOR_M, "Element index for SENSOR%d and SENSOR%d are not in ascending order\r\n",
+ count, count+1);
+ result = MOBLE_RESULT_FAIL;
+ break;
+ }
+ else
+ {
+ result = MOBLE_RESULT_SUCCESS;
}
- break;
}
- case SENSOR_STATUS:
+ }
+ else
+ {
+ /* */
+ }
+
+ if (result == MOBLE_RESULT_SUCCESS &&
+ pServerInitParams->sensorsCount > 1)
+ {
+ for (MOBLEUINT8 count=0; count<pServerInitParams->sensorsCount-1; count++)
{
- MOBLEUINT8 index;
-
- if((dataLength > 0) && (property_ID == 0x00))
+ currentElementIdx = pServerInitParams->sensorInitParams[count].elementIdx;
+ nextElementIdx = pServerInitParams->sensorInitParams[count+1].elementIdx;
+ currentPid = pServerInitParams->sensorInitParams[count].propertyId;
+ nextPid = pServerInitParams->sensorInitParams[count+1].propertyId;
+
+ if (nextElementIdx != currentElementIdx)
{
- return MOBLE_RESULT_FALSE;
+ /* Pid check not required */
}
else
{
- TRACE_M(TF_SENSOR,"Sensor Status:\r\n");
- for(index = 0; index < dataLength; index++)
+ /* PIDs should be in ascending order
+ Also PID can't be replicated on same element */
+ if (currentPid < nextPid)
{
- TRACE_M(TF_SENSOR,"Value: %d\r\n", pRxData[index]);
+ result = MOBLE_RESULT_SUCCESS;
}
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+
+ if (currentPid == nextPid)
+ {
+ TRACE_M(TF_SENSOR_M, "PID replicated on same element\r\n");
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "PIDs not in ascending order on SENSOR%d\r\n", count+1);
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ /* */
+ }
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ for (MOBLEUINT8 count=0; count<pServerInitParams->sensorsCount; count++)
+ {
+ if(pServerInitParams->sensorInitParams[count].cadenceState == 1 &&
+ pServerInitParams->sensorInitParams[count].seriesCount != 0)
+ {
+ TRACE_M(TF_SENSOR_M, "SENSOR%d with series column support can't support cadence", count+1);
+
+ result = MOBLE_RESULT_FAIL;
+ break;
}
-
- 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
+ else
+ {
+ result = MOBLE_RESULT_SUCCESS;
}
- break;
}
- case SENSOR_COLUMN_STATUS:
+ }
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ for (MOBLEUINT8 count=0; count<pServerInitParams->sensorsCount; count++)
{
- break;
+ totalSettingsCount += pServerInitParams->sensorInitParams[count].settingsCount;
+ totalSeriesColumnCount += pServerInitParams->sensorInitParams[count].seriesCount;
}
- case SENSOR_SERIES_STATUS:
+
+ TRACE_M(TF_SENSOR_M, "Total settings count %d, total series column count %d\r\n",
+ totalSettingsCount, totalSeriesColumnCount);
+
+ requiredBufferSize = sizeof(sensor_server_t) + \
+ sizeof(sensor_params_t)*(pServerInitParams->sensorsCount) + \
+ sizeof(sensor_settings_params_t)*totalSettingsCount + \
+ sizeof(sensor_series_column_params_t)*totalSeriesColumnCount;
+
+ TRACE_M(TF_SENSOR_M, "Required buffer size %d\r\n", requiredBufferSize);
+ TRACE_M(TF_SENSOR_M, "sensor_server_t %d = %d\r\n",
+ sizeof(sensor_server_t),
+ SIZE_OF_SENSOR_SERVER_T);
+ TRACE_M(TF_SENSOR_M, "sensor_params_t %d * pServerInitParams->sensorsCount %d = %d * %d\r\n",
+ sizeof(sensor_params_t),
+ pServerInitParams->sensorsCount,
+ SIZE_OF_SENSOR_PARAMS_T, TOTAL_SENSORS_COUNT);
+ TRACE_M(TF_SENSOR_M, "timer_status_e %d \r\n",
+ sizeof(timer_status_e));
+ TRACE_M(TF_SENSOR_M, "sensor_settings_params_t %d * totalSettingsCount %d = %d * %d\r\n",
+ sizeof(sensor_settings_params_t),
+ totalSettingsCount,
+ SIZE_OF_SENSOR_SETTINGS_T, TOTAL_SENSOR_SETTINGS_COUNT);
+ TRACE_M(TF_SENSOR_M, "sensor_series_column_params_t %d * totalSeriesColumnCount %d = %d * %d\r\n",
+ sizeof(sensor_series_column_params_t),
+ totalSeriesColumnCount,
+ SIZE_OF_SENSOR_SERIES_COLUMN_T, TOTAL_SENSOR_SERIES_COLUMN_COUNT);
+
+ if (sizeBuff < requiredBufferSize)
+ {
+ result = MOBLE_RESULT_FAIL;
+ TRACE_M(TF_SENSOR_M, "Buffer size %d not sufficient compare to required %d\r\n",
+ sizeBuff,
+ requiredBufferSize);
+ }
+ else
{
- MOBLEUINT8 index;
+ /* */
+ }
+ }
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ /* initialize sensor server structure */
+ SensorServer = (sensor_server_t*)sensorBuff;
+ buffStartTempIndex += sizeof(sensor_server_t);
+
+ memset(SensorServer, 0, sizeof(sizeBuff));
+
+ /* copy init values into sensor server model structure */
+ if (SensorServer != NULL)
+ {
+ SensorServer->sensorsCount = pServerInitParams->sensorsCount;
+
+ /* initialize sensor params structure */
+ SensorServer->pSensorParams = (sensor_params_t*)(((MOBLEUINT8*)SensorServer)+buffStartTempIndex);
+ buffStartTempIndex += SensorServer->sensorsCount*sizeof(sensor_params_t);
+
+ /* intialize sensor structure with init values */
+ for (MOBLEUINT8 count=0; count<SensorServer->sensorsCount; count++)
+ {
+ pParams = SensorServer->pSensorParams + count;
+ pInitParams = &(pServerInitParams->sensorInitParams[count]);
- 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;
+ pParams->elementIdx = pInitParams->elementIdx;
+ pParams->propertyId = pInitParams->propertyId;
+ pParams->dataLength = pInitParams->dataLength;
+ pParams->cadenceState = pInitParams->cadenceState;
+ pParams->settingsCount = pInitParams->settingsCount;
+ pParams->seriesCount = pInitParams->seriesCount;
}
- case SENSOR_CADENCE_STATUS:
+
+ /* initialize ptr and values for sensor settings */
+ for (MOBLEUINT8 count=0; count<SensorServer->sensorsCount; count++)
{
- MOBLEUINT8 index;
+ pParams = SensorServer->pSensorParams + count;
+ pInitParams = &(pServerInitParams->sensorInitParams[count]);
- TRACE_M(TF_SENSOR,"Sensor Cadence Status:\r\n");
- for(index = 0; index < dataLength; index++)
+ pParams->pSettings = (sensor_settings_params_t*)(((MOBLEUINT8*)SensorServer)+buffStartTempIndex);
+ buffStartTempIndex += pParams->settingsCount*sizeof(sensor_settings_params_t);
+
+ for (MOBLEUINT8 count1=0; count1<pParams->settingsCount; count1++)
{
- TRACE_M(TF_SENSOR,"Value: %d\r\n", pRxData[index]);
+ pSettingsParams = pParams->pSettings + count1;
+ pSettingsInitParams = &(pInitParams->settings[count1]);
+
+ pSettingsParams->settingPropertyId = pSettingsInitParams->settingPropertyId;
+ pSettingsParams->settingAccess = pSettingsInitParams->settingAccess;
+ pSettingsParams->settingRaw = pSettingsInitParams->settingRaw;
}
- break;
}
- case SENSOR_SETTING_STATUS_PID:
+
+ /* initialize ptr and values for sensor series settings */
+ for (MOBLEUINT8 count=0; count<SensorServer->sensorsCount; count++)
{
- MOBLEUINT8 index;
+ pParams = SensorServer->pSensorParams + count;
+ pInitParams = &(pServerInitParams->sensorInitParams[count]);
+
+ pParams->pSeriesColumn = (sensor_series_column_params_t*)(((MOBLEUINT8*)SensorServer)+buffStartTempIndex);
+ buffStartTempIndex += pParams->seriesCount*sizeof(sensor_series_column_params_t);
- TRACE_M(TF_SENSOR,"Sensor Settings Status:\r\n");
- for(index = 0; index < dataLength; index++)
+ if (pParams->seriesCount != 0)
{
- TRACE_M(TF_SENSOR,"Value: %d\r\n", pRxData[index]);
+ for (MOBLEUINT16 count1=0; count1<pParams->seriesCount; count1++)
+ {
+ pSeriesColumnParams = pParams->pSeriesColumn + count1;
+ pSeriesColumnInitParams = &(pInitParams->seriesColumn[count1]);
+ pSeriesColumnParams->rawX = pSeriesColumnInitParams->rawX;
+ }
+ }
+ else
+ {
+ /* do nothing */
}
- break;
}
- case SENSOR_SETTING_STATUS_SETTING_ID:
+
+ /* Init timer params and sensor publish */
+ for (MOBLEUINT8 count=0; count<SensorServer->sensorsCount; count++)
+ {
+ pParams = SensorServer->pSensorParams+count;
+
+ pParams->timerStatus = TIMER_STOPPED;
+
+ if (pParams->cadenceState == 1)
{
- 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]);
+ if (BLEMesh_IsUnprovisioned() == MOBLE_FALSE)
+ {
+ /* publication parameters not available yet */
}
- break;
- }
-#endif
- default:
+ else
+ {
+ /* --- */
+ }
+ }
+ else
{
- break;
+ /* periodic publishing not supported */
}
-
- } /* Switch ends */
+ }
+
+ /* callback initialization */
+ if (sensor_cb != NULL)
+ {
+ SensorServer->p_cb = sensor_cb;
+ }
+ else
+ {
+ SensorServer->p_cb = NULL;
+ TRACE_M(TF_SENSOR_M, "Unable to initialize sensor server callback ptr\r\n");
+ }
+ /* Print initialized parameters */
+ TRACE_I(TF_SENSOR_M, "No of sensors %d\r\n", SensorServer->sensorsCount);
+
+ for (MOBLEUINT8 count=0; count<SensorServer->sensorsCount; count++)
+ {
+ pParams = SensorServer->pSensorParams+count;
+
+ TRACE_I(TF_SENSOR_M, "Sensor %d elementIdx %d\r\n", count+1, pParams->elementIdx);
+ TRACE_I(TF_SENSOR_M, "Sensor %d propertyId 0x%.4x\r\n", count+1, pParams->propertyId);
+ TRACE_I(TF_SENSOR_M, "Sensor %d settingsCount %d\r\n", count+1, pParams->settingsCount);
+ TRACE_I(TF_SENSOR_M, "Sensor %d seriesCount %d\r\n", count+1, pParams->seriesCount);
+
+ for(MOBLEUINT8 count1=0; count1<pParams->settingsCount; count1++)
+ {
+ TRACE_I(TF_SENSOR_M, "Sensor %d setting %d settingPropertyId 0x%.4x\r\n", count+1, count1+1, pParams->pSettings[count1].settingPropertyId);
+ TRACE_I(TF_SENSOR_M, "Sensor %d setting %d settingAccess %d\r\n", count+1, count1+1, pParams->pSettings[count1].settingAccess);
+ TRACE_I(TF_SENSOR_M, "Sensor %d setting %d settingRaw %ld\r\n", count+1, count1+1, pParams->pSettings[count1].settingRaw);
+ }
+
+ for(MOBLEUINT16 count1=0; count1<pParams->seriesCount; count1++)
+ {
+ TRACE_I(TF_SENSOR_M, "Sensor %d series column %d rawX %ld\r\n", count+1, count1+1, pParams->pSeriesColumn[count1].rawX);
+ }
+ }
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Unable to init sensor server\r\n");
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
- if((result == MOBLE_RESULT_SUCCESS) && (response == MOBLE_TRUE) && (ADDRESS_IS_UNICAST(dst_peer)))
+ if(MOBLE_FAILED(result))
{
- Model_SendResponse(peer_addr, dst_peer,opcode,pRxData,dataLength);
+ SensorServer = NULL;
}
- return MOBLE_RESULT_SUCCESS;
+
+ return result;
}
-#if 0
/**
-* @brief floatToInt: This function is used to convert the float to integer
-* @param in: sensor data value
-* @param out_value: pointer to the structure
-* @param dec_prec: decimal point resolution
-* @retval void
-*/
-void floatToInt(float in, displayFloatToInt_t *out_value, MOBLEINT32 dec_prec)
+ * @brief Update sensor model publication parameters
+ * @param Model publish parameters
+ * @retval Fail if model id is not sensor server
+ * Fail if sensor not initialized
+ * else Success
+ */
+__weak MOBLE_RESULT Sensor_ModelPublishSet(model_publicationparams_t* pPublishParams)
{
- if(in >= 0.0f)
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 elementIdx;
+ MOBLEUINT32 rcvdPublishPeriod;
+ sensor_params_t* pParams = NULL;
+
+ if(SensorServer != NULL)
{
- out_value->sign = 0;
- }else
+ if (pPublishParams != NULL &&
+ pPublishParams->modelID == SENSOR_SERVER_MODEL_ID)
+ {
+ /* extract element index */
+ elementIdx = pPublishParams->elementAddress - BLEMesh_GetAddress();
+ rcvdPublishPeriod = pPublishParams->publishPeriod;
+
+ rcvdPublishPeriod = (rcvdPublishPeriod & 0x3F)*\
+ Get_StepResolutionValue(rcvdPublishPeriod>>6);
+
+ TRACE_M(TF_SENSOR_M, "Element index %d publish period %ld ms\r\n",
+ elementIdx, rcvdPublishPeriod);
+
+ /* update publish period of all sensors on element given by publish parameters */
+ for (MOBLEUINT8 count=0; count<SensorServer->sensorsCount; count++)
+ {
+ pParams = SensorServer->pSensorParams + count;
+
+ if (pParams != NULL)
+ {
+ if (pParams->elementIdx == elementIdx)
+ {
+ pParams->modelPublishPeriodMs = rcvdPublishPeriod;
+ Sensor_UpdatePublishParameters(count);
+ }
+ else
+ {
+ /* */
+ }
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Sensor not initialized\r\n");
+ break;
+ }
+ }
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR_M, "Not for sensor server model\r\n");
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+ else
{
- out_value->sign = 1;
- in = -in;
+ TRACE_M(TF_SENSOR_M, "Sensor server not initialized\r\n");
}
- out_value->out_int = (int32_t)in;
- in = in - (float)(out_value->out_int);
- out_value->out_dec = (int32_t)trunc(in * pow(10, dec_prec));
+
+ return result;
}
-#endif
+#ifndef ENABLE_SENSOR_MODEL_SERVER
/**
-Weak function are defined to support the original function if they are not
-included in firmware.
-There is no use of this function for application development purpose.
+* Weak function are defined to support the original function if they are not
+ included in firmware.
+ There is no use of this function for application development purpose.
*/
-
-WEAK_FUNCTION (MOBLE_RESULT Appli_Sensor_Descriptor_Status(MOBLEUINT8* sensor_Descriptor , MOBLEUINT32* pLength))
-{
- return MOBLE_RESULT_SUCCESS;
+WEAK_FUNCTION(void Appli_Sensor_CadenceGet(sensor_CadenceCbParam_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex))
+{
+;
+}
+WEAK_FUNCTION(void Appli_Sensor_CadenceSet(sensor_CadenceCbParam_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex))
+{
+;
+}
+WEAK_FUNCTION(void Appli_Sensor_CadenceSetUnack(sensor_CadenceCbParam_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex))
+{
+;
+}
+WEAK_FUNCTION(void Appli_Sensor_SettingsGet(sensor_SettingsCbParams_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex))
+{
+;
+}
+WEAK_FUNCTION(void Appli_Sensor_SettingGet(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex))
+{
+;
+}
+WEAK_FUNCTION(void Appli_Sensor_SettingSet(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex))
+{
+;
+}
+WEAK_FUNCTION(void Appli_Sensor_SettingSetUnack(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex))
+{
+;
+}
+WEAK_FUNCTION(void Appli_Sensor_DescriptorGet(MOBLEUINT8 pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex))
+{
+;
+}
+WEAK_FUNCTION(void Appli_Sensor_Get (MOBLEUINT16 prop_ID,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex))
+{
+;
+}
+WEAK_FUNCTION(void Appli_Sensor_ColumnGet(sensor_ColumnCbParams_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex))
+{
+;
+}
+WEAK_FUNCTION(void Appli_Sensor_SeriesGet(sensor_SeriesCbParams_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex))
+{
+;
+}
+WEAK_FUNCTION(MOBLE_RESULT Appli_Sensor_ReadDescriptor(MOBLEUINT8 sensorOffset,
+ sensor_DescriptorCbParams_t* pDescriptorParams))
+{ return MOBLE_RESULT_SUCCESS;}
+WEAK_FUNCTION(MOBLE_RESULT Appli_Sensor_ReadValue(MOBLEUINT8 sensorOffset,
+ sensor_ValueCbParams_t* pValueParams))
+{ return MOBLE_RESULT_SUCCESS;}
+WEAK_FUNCTION(MOBLE_RESULT Appli_Sensor_ReadColumn(MOBLEUINT8 sensorOffset,
+ MOBLEUINT8 columnOffset,
+ sensor_ColumnCbParams_t* pColumnParams))
+{ return MOBLE_RESULT_SUCCESS;}
+WEAK_FUNCTION(MOBLE_RESULT Appli_Sensor_ReadSeries(MOBLEUINT8 sensorOffset,
+ sensor_SeriesCbParams_t* pSeriesParams))
+{ return MOBLE_RESULT_SUCCESS;}
+WEAK_FUNCTION(MOBLEUINT8 Appli_Sensor_IsFastCadence(MOBLEUINT8 sensorOffset,
+ void* pFastCadenceLow,
+ void* pFastCadenceHigh))
+{ return MOBLE_RESULT_SUCCESS;}
+WEAK_FUNCTION(MOBLEUINT8 Appli_Sensor_IsStatusTrigger(MOBLEUINT8 sensorOffset,
+ status_trigger_type_e triggerType,
+ void* pDeltaDown,
+ void* pDeltaUp))
+{ return MOBLE_RESULT_SUCCESS;}
+WEAK_FUNCTION(MOBLE_RESULT Appli_Sensor_Init(void))
+{ return MOBLE_RESULT_SUCCESS;}
+WEAK_FUNCTION(void Appli_Sensor_SerialCmd(char *rcvdStringBuff, uint16_t rcvdStringSize))
+{
+;
}
-WEAK_FUNCTION (MOBLE_RESULT Appli_Sensor_Data_Status(MOBLEUINT8* sensor_Data , MOBLEUINT32* pLength))
-{
- return MOBLE_RESULT_SUCCESS;
-}
-
-WEAK_FUNCTION (void SensorDataPublish(MOBLEUINT32 *pSensor_Value , MOBLEUINT16* pProp_ID));
-WEAK_FUNCTION (void Sensor_Publication_Process(float* pSensorData, MODEL_Property_IDTableParam_t* pProp_ID))
+WEAK_FUNCTION(void Appli_Sensor_Descriptor_Status(const MOBLEUINT8 *pDescriptor,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex))
{
+;
}
-WEAK_FUNCTION (MOBLE_RESULT Appli_Sensor_Cadence_Set(Sensor_CadenceParam_t* pCadence_param,
- MOBLEUINT16 property_ID, MOBLEUINT32 length) );
-WEAK_FUNCTION (MOBLE_RESULT Appli_Sensor_Cadence_Get(MOBLEUINT8* sensor_DataCadence,
- MOBLEUINT16 property_ID, MOBLEUINT32 length) );
-//WEAK_FUNCTION (MOBLE_RESULT Appli_Sensor_Setting_Set(Sensor_SettingParam_t* pSensor_SettingParam,
-// MOBLEUINT8 OptionalValid,MOBLEUINT16 prop_ID));
-
-WEAK_FUNCTION (MOBLE_RESULT Appli_Sensor_Setting_Set(Sensor_SettingParam_t* pSensor_SettingParam,
- MOBLEUINT8 OptionalValid)); //,MOBLEUINT16 prop_ID));
-WEAK_FUNCTION (MOBLE_RESULT Appli_Sensor_GetSettingStatus(MOBLEUINT8* pSetting_Status));
-//WEAK_FUNCTION (MOBLE_RESULT Appli_Sensor_GetSetting_IDStatus(MOBLEUINT8* pSetting_Status, MOBLEUINT16 prop_ID, MOBLEUINT16 Sensor_PropertyID , MOBLEUINT8* plength));
-WEAK_FUNCTION (MOBLE_RESULT Appli_Sensor_GetSetting_IDStatus(MOBLEUINT8* pSetting_Status));
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+WEAK_FUNCTION(void Appli_Sensor_Cadence_Status(const MOBLEUINT8 *pCadence,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex))
+{
+;
+}
+WEAK_FUNCTION(void Appli_Sensor_Settings_Status(const MOBLEUINT8 *pSettings,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex))
+{
+;
+}
+WEAK_FUNCTION(void Appli_Sensor_Setting_Status(const MOBLEUINT8 *pSetting,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex))
+{
+;
+}
+WEAK_FUNCTION(void Appli_Sensor_Status(const MOBLEUINT8 *pStatus,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex))
+{
+;
+}
+WEAK_FUNCTION(void Appli_Sensor_Column_Status(const MOBLEUINT8 *pColumn,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex))
+{
+;
+}
+WEAK_FUNCTION(void Appli_Sensor_Series_Status(const MOBLEUINT8 *pSeries,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex))
+{
+;
+}
+WEAK_FUNCTION(MOBLE_RESULT Appli_Sensor_Update(MOBLEUINT8 sensorOffset,
+ MOBLEUINT32 value))
+{ return MOBLE_RESULT_SUCCESS;}
+#endif
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors_client.c b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors_client.c
new file mode 100644
index 000000000..670a259ca
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors_client.c
@@ -0,0 +1,680 @@
+/**
+******************************************************************************
+* @file sensors_client.c
+* @author BLE Mesh Team
+* @brief Sensors model client middleware file
+******************************************************************************
+* @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 "hal_common.h"
+#include "mesh_cfg.h"
+#include "sensors.h"
+#include "sensors_client.h"
+#include "common.h"
+#include "models_if.h"
+#include <string.h>
+#include "compiler.h"
+
+
+/** @addtogroup MODEL_CLIENT_SENSORS
+* @{
+*/
+
+/** @addtogroup Sensors_Model_Client_Callbacks
+* @{
+*/
+
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+
+/* Private variables ---------------------------------------------------------*/
+extern Model_Tid_t Model_Tid;;
+const MODEL_OpcodeTableParam_t Sensors_Client_Opcodes_Table[] = {
+ /* Sensors Client */
+/* model_id opcode, reliable, min_payload_size, max_payload_size, response_opcode, min_response_size, max_response_size
+ Here in this array, Handler is not defined; */
+#ifdef ENABLE_SENSOR_MODEL_CLIENT
+ {SENSOR_CLIENT_MODEL_ID, SENSOR_DESCRIPTOR_GET, MOBLE_FALSE, 0, 2, SENSOR_DESCRIPTOR_STATUS, 2, 75},
+ {SENSOR_CLIENT_MODEL_ID, SENSOR_DESCRIPTOR_STATUS, MOBLE_FALSE, 2, 75, 0, 1, 1},
+ {SENSOR_CLIENT_MODEL_ID, SENSOR_CADENCE_GET, MOBLE_FALSE, 2, 2, SENSOR_CADENCE_STATUS, 2, 2},
+ {SENSOR_CLIENT_MODEL_ID, SENSOR_CADENCE_SET, MOBLE_FALSE, 8, 20, 0, 2, 2},
+ {SENSOR_CLIENT_MODEL_ID, SENSOR_CADENCE_SET_UNACK, MOBLE_FALSE, 8, 20, 0, 2, 2},
+ {SENSOR_CLIENT_MODEL_ID, SENSOR_CADENCE_STATUS, MOBLE_FALSE, 2, 2, 0, 1, 1},
+ {SENSOR_CLIENT_MODEL_ID, SENSOR_SETTINGS_GET, MOBLE_FALSE, 2, 2, SENSOR_SETTINGS_STATUS, 2, 2},
+ {SENSOR_CLIENT_MODEL_ID, SENSOR_SETTINGS_STATUS, MOBLE_FALSE, 2, 2, 0, 1, 1},
+ {SENSOR_CLIENT_MODEL_ID, SENSOR_SETTING_GET, MOBLE_FALSE, 4, 4, SENSOR_SETTING_STATUS, 2, 2},
+ {SENSOR_CLIENT_MODEL_ID, SENSOR_SETTING_SET, MOBLE_FALSE, 5, 8, 0, 2, 2},
+ {SENSOR_CLIENT_MODEL_ID, SENSOR_SETTING_SET_UNACK, MOBLE_FALSE, 5, 8, 0, 2, 2},
+ {SENSOR_CLIENT_MODEL_ID, SENSOR_SETTING_STATUS, MOBLE_FALSE, 2, 2, 0, 1, 1},
+ {SENSOR_CLIENT_MODEL_ID, SENSOR_GET, MOBLE_FALSE, 0, 2, SENSOR_STATUS, 0, 65},
+ {SENSOR_CLIENT_MODEL_ID, SENSOR_STATUS, MOBLE_FALSE, 0, 65, 0, 1, 1},
+ {SENSOR_CLIENT_MODEL_ID, SENSOR_COLUMN_GET, MOBLE_FALSE, 3, 6, SENSOR_COLUMN_STATUS, 2, 14},
+ {SENSOR_CLIENT_MODEL_ID, SENSOR_COLUMN_STATUS, MOBLE_FALSE, 2, 14, 0, 1, 1},
+ {SENSOR_CLIENT_MODEL_ID, SENSOR_SERIES_GET, MOBLE_TRUE, 2, 10, SENSOR_SERIES_STATUS, 2, 2},
+ {SENSOR_CLIENT_MODEL_ID, SENSOR_SERIES_STATUS, MOBLE_FALSE, 2, 2, 0, 1, 1},
+#endif
+ {0}
+};
+
+/* Private function prototypes -----------------------------------------------*/
+//WEAK_FUNCTION (MOBLE_RESULT Appli_Sensors_OnOff_Set(Sensors_OnOffStatus_t* pSensors_OnOffParam,
+// MOBLEUINT8 OptionalValid));
+//WEAK_FUNCTION (MOBLE_RESULT Appli_Sensors_Level_Set(Sensors_LevelStatus_t* plevelParam,
+// MOBLEUINT8 OptionalValid));
+//WEAK_FUNCTION (MOBLE_RESULT Appli_Sensors_LevelDelta_Set(Sensors_LevelStatus_t* pdeltalevelParam,
+// MOBLEUINT8 OptionalValid));
+//WEAK_FUNCTION (MOBLE_RESULT Appli_Sensors_LevelMove_Set(Sensors_LevelStatus_t* pdeltaMoveParam,
+// MOBLEUINT8 OptionalValid));
+//WEAK_FUNCTION (MOBLE_RESULT Appli_Sensors_PowerOnOff_Set(Sensors_PowerOnOffParam_t* pPowerOnOffParam,
+// MOBLEUINT8 OptionalValid));
+//WEAK_FUNCTION (MOBLE_RESULT Appli_Sensors_DefaultTransitionTime_Set(Sensors_DefaultTransitionParam_t* pDefaultTimeParam,
+// MOBLEUINT8 OptionalValid));
+//WEAK_FUNCTION (void Appli_Sensors_Restore_PowerOn_Value(MOBLEUINT8 restoreValue));
+
+/* Private functions ---------------------------------------------------------*/
+
+/**
+* @brief SensorsClient_Descriptor_Get: This function is called for Descriptor Get message
+* @param elementIndex : Index of the element
+* @param ppropertyId : pointer on property ID, if not present NULL
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT SensorsClient_Descriptor_Get(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 * ppropertyId)
+{
+
+ /* 4.2.1 Sensor Descriptor Get
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 msg_opcode;
+ MOBLEUINT8 const *msg_buff = NULL;
+ MOBLEBOOL ack_flag = MOBLE_FALSE;
+ MOBLEUINT8 length = 0;
+
+ TRACE_M(TF_SENSOR_CLIENT_M, "SensorsClient_Descriptor_Get Client Message \r\n");
+
+ msg_opcode = SENSOR_DESCRIPTOR_GET;
+ if(ppropertyId != NULL)
+ {
+ msg_buff = ppropertyId;
+ length = 2;
+ }
+
+ /*
+ Manage the TID Here....
+ */
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) SENSOR_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+ Model_Tid.TidSend++;
+ if(Model_Tid.TidSend >= MAX_TID_VALUE)
+ {
+ Model_Tid.TidSend = 0;
+ }
+
+ if(result)
+ {
+ TRACE_M(TF_SENSOR_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief SensorsClient_Cadence_Get: This function is called for Descriptor Get message
+* @param elementIndex : Index of the element
+* @param ppropertyId : pointer on property ID
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT SensorsClient_Cadence_Get(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 * ppropertyId)
+{
+
+ /* 4.2.3 Sensor Cadence Get
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 msg_opcode;
+ MOBLEUINT8 const *msg_buff = NULL;
+ MOBLEBOOL ack_flag = MOBLE_FALSE;
+ MOBLEUINT8 length = 0;
+
+ TRACE_M(TF_SENSOR_CLIENT_M, "SensorsClient_Cadence_Get Client Message \r\n");
+
+ msg_opcode = SENSOR_CADENCE_GET;
+ if(ppropertyId != NULL)
+ {
+ msg_buff = ppropertyId;
+ length = 2;
+ }
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) SENSOR_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_SENSOR_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief SensorsClient_Cadence_Set: This function is called for Cadence Set message
+* @param elementIndex : Index of the element
+* @param pCadence_param: Pointer to the parameters received for message
+* @param length: Length of the parameters received for message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT SensorsClient_Cadence_Set(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pCadence_param,
+ MOBLEUINT32 length)
+
+{
+
+ /* 4.2.4 Sensor Cadence Set
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_SENSOR_CLIENT_M, "SensorsClient_Cadence_Set Client Message \r\n");
+
+ msg_buff = pCadence_param;
+ ack_flag = MOBLE_TRUE;
+ msg_opcode = SENSOR_CADENCE_SET;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) SENSOR_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+ if(result)
+ {
+ TRACE_M(TF_SENSOR_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief SensorsClient_Cadence_Set: This function is called for Cadence Set message
+* @param elementIndex : Index of the element
+* @param pCadence_param: Pointer to the parameters received for message
+* @param length: Length of the parameters received for message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT SensorsClient_Cadence_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pCadence_param,
+ MOBLEUINT32 length)
+
+{
+
+ /* 4.2.5 Sensor Cadence Set Unacknowledged
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_SENSOR_CLIENT_M, "SensorsClient_Cadence_Set_Unack Client Message \r\n");
+
+ msg_buff = pCadence_param;
+ ack_flag = MOBLE_FALSE;
+ msg_opcode = SENSOR_CADENCE_SET_UNACK;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) SENSOR_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+ if(result)
+ {
+ TRACE_M(TF_SENSOR_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief SensorsClient_Settings_Get: This function is called for Settings Get message
+* @param elementIndex : Index of the element
+* @param ppropertyId : pointer on property ID
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT SensorsClient_Settings_Get(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 * ppropertyId)
+{
+
+ /* 4.2.7 Sensor Settings Get
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 msg_opcode;
+ MOBLEUINT8 const *msg_buff = NULL;
+ MOBLEBOOL ack_flag = MOBLE_FALSE;
+
+ TRACE_M(TF_SENSOR_CLIENT_M, "SensorsClient_Settings_Get Client Message \r\n");
+
+ msg_opcode = SENSOR_SETTINGS_GET;
+ msg_buff = ppropertyId;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) SENSOR_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, 2,
+ ack_flag,
+ MOBLE_FALSE);
+ if(result)
+ {
+ TRACE_M(TF_SENSOR_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief SensorsClient_Setting_Get: This function is called for Setting Get message
+* @param elementIndex : Index of the element
+* @param ppropertyId : pointer on property ID
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT SensorsClient_Setting_Get(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 * pparam,
+ MOBLEUINT8 length)
+{
+
+ /* 4.2.9 Sensor Setting Get
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 msg_opcode;
+ MOBLEUINT8 const *msg_buff = NULL;
+ MOBLEBOOL ack_flag = MOBLE_FALSE;
+
+ TRACE_M(TF_SENSOR_CLIENT_M, "SensorsClient_Setting_Get Client Message \r\n");
+
+ msg_opcode = SENSOR_SETTING_GET;
+ msg_buff = pparam;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) SENSOR_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+ if(result)
+ {
+ TRACE_M(TF_SENSOR_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief SensorsClient_Setting_Set: This function is called for Setting Set message
+* @param elementIndex : Index of the element
+* @param pSetting_param: Pointer to the parameters received for message
+* @param length: Length of the parameters received for message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT SensorsClient_Setting_Set(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pSetting_param,
+ MOBLEUINT32 length)
+
+{
+
+ /* 4.2.4 Sensor Cadence Set
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_SENSOR_CLIENT_M, "SensorsClient_Setting_Set Client Message \r\n");
+
+ msg_buff = pSetting_param;
+ ack_flag = MOBLE_TRUE;
+ msg_opcode = SENSOR_SETTING_SET;
+
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) SENSOR_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+ if(result)
+ {
+ TRACE_M(TF_SENSOR_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief SensorsClient_Setting_Set_Unack: This function is called for Setting Set message
+* @param elementIndex : Index of the element
+* @param pSetting_param: Pointer to the parameters received for message
+* @param length: Length of the parameters received for message
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT SensorsClient_Setting_Set_Unack(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 *pSetting_param,
+ MOBLEUINT32 length)
+
+{
+
+ /* 4.2.11 Sensor Setting Set Unacknowledged
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 const *msg_buff;
+ MOBLEUINT16 msg_opcode;
+ MOBLEBOOL ack_flag;
+
+ TRACE_M(TF_SENSOR_CLIENT_M, "SensorsClient_Setting_Set_Unack Client Message \r\n");
+
+ msg_buff = pSetting_param;
+ ack_flag = MOBLE_FALSE;
+ msg_opcode = SENSOR_SETTING_SET_UNACK;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) SENSOR_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+ if(result)
+ {
+ TRACE_M(TF_SENSOR_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief SensorsClient_Get: This function is called for Get message
+* @param elementIndex : Index of the element
+* @param ppropertyId : pointer on property ID, if not present NULL
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT SensorsClient_Get(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 * ppropertyId)
+{
+
+ /* 4.2.13 Sensor Get
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 msg_opcode;
+ MOBLEUINT8 const *msg_buff = NULL;
+ MOBLEBOOL ack_flag = MOBLE_FALSE;
+ MOBLEUINT8 length = 0;
+
+ TRACE_M(TF_SENSOR_CLIENT_M, "SensorsClient_Get Client Message \r\n");
+
+ msg_opcode = SENSOR_GET;
+ if(ppropertyId != NULL)
+ {
+ msg_buff = ppropertyId;
+ length = 2;
+ }
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) SENSOR_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_SENSOR_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief SensorsClient_Column_Get: This function is called for Column Get message
+* @param elementIndex : Index of the element
+* @param pparam : pointer on parameters, Property ID and Raw Value X
+* @param length : length of the parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT SensorsClient_Column_Get(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 * pparam,
+ MOBLEUINT8 length)
+{
+
+ /* 4.2.15 Sensor Column Get
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 msg_opcode;
+ MOBLEUINT8 const *msg_buff = NULL;
+ MOBLEBOOL ack_flag = MOBLE_FALSE;
+
+ TRACE_M(TF_SENSOR_CLIENT_M, "SensorsClient_Column_Get Client Message \r\n");
+
+ msg_opcode = SENSOR_COLUMN_GET;
+ msg_buff = pparam;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) SENSOR_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_SENSOR_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief SensorsClient_Series_Get: This function is called for Series Get message
+* @param elementIndex : Index of the element
+* @param pparam : pointer on parameters, Property ID, Raw Values X1 and X2
+* @param length : length of the parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT SensorsClient_Series_Get(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 * pparam,
+ MOBLEUINT8 length)
+{
+
+ /* 4.2.15 Sensor Column Get
+ */
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT16 msg_opcode;
+ MOBLEUINT8 const *msg_buff = NULL;
+ MOBLEBOOL ack_flag = MOBLE_FALSE;
+
+ TRACE_M(TF_SENSOR_CLIENT_M, "SensorsClient_Series_Get Client Message \r\n");
+
+ msg_opcode = SENSOR_SERIES_GET;
+ msg_buff = pparam;
+
+ result = MeshClient_SetRemotePublication((MOBLEUINT32) SENSOR_CLIENT_MODEL_ID,
+ elementIndex ,
+ msg_opcode ,
+ msg_buff, length,
+ ack_flag,
+ MOBLE_FALSE);
+
+ if(result)
+ {
+ TRACE_M(TF_SENSOR_CLIENT_M, "Publication Error \r\n");
+ }
+
+ return result;
+}
+
+
+/**
+* @brief SensorsModelServer_GetOpcodeTableCb: This function is call-back
+* from the library to send Model Opcode Table info to library
+* @param MODEL_OpcodeTableParam_t: Pointer to the Sensors Model opcode array
+* @param length: Pointer to the Length of Sensors Model opcode array
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT SensorsModelClient_GetOpcodeTableCb(const MODEL_OpcodeTableParam_t **data,
+ MOBLEUINT16 *length)
+{
+ *data = Sensors_Client_Opcodes_Table;
+ *length = sizeof(Sensors_Client_Opcodes_Table)/sizeof(Sensors_Client_Opcodes_Table[0]);
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
+/**
+* @brief SensorsModelClient_GetStatusRequestCb : This function is call-back
+* from the library to send response to the message from peer
+* @param *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
+* @param opcode: Received opcode of the Status message callback
+* @param pResponsedata: Pointer to the buffer to be updated with status
+* @param plength: Pointer to the Length of the data, to be updated by application
+* @param pRxData: Pointer to the data received in packet.
+* @param dataLength: length of the data in packet.
+* @param response: Value to indicate wheather message is acknowledged meassage or not.
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT SensorsModelClient_GetStatusRequestCb(MODEL_MessageHeader_t *pmsgParam,
+ MOBLEUINT16 opcode,
+ MOBLEUINT8 *pResponsedata,
+ MOBLEUINT32 *plength,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 dataLength,
+ MOBLEBOOL response)
+
+{
+ TRACE_M(TF_SENSOR_CLIENT_M, "response status enable \n\r");
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @brief SensorsModelClient_ProcessMessageCb: This is a callback function from
+* the library whenever a Sensors Model message is received
+* @param *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
+* @param opcode: Received opcode of the Status message callback
+* @param pData: Pointer to the buffer to be updated with status
+* @param length: Length of the parameters received
+* @param response: if TRUE, the message is an acknowledged message
+* @param pRxData: Pointer to the data received in packet.
+* @param dataLength: length of the data in packet.
+* @param response: Value to indicate wheather message is acknowledged meassage or not.
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT SensorsModelClient_ProcessMessageCb(MODEL_MessageHeader_t *pmsgParam,
+ MOBLEUINT16 opcode,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 dataLength,
+ MOBLEBOOL response)
+{
+
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ TRACE_M(TF_SENSOR_CLIENT_M,
+ "elementIndex = %.2x, dst_peer = %.2X, peer_add = %.2X, opcode= %.2X ,response= %.2X\r\n",
+ pmsgParam->elementIndex,
+ pmsgParam->dst_peer,
+ pmsgParam->peer_addr,
+ opcode,
+ response);
+
+ switch(opcode)
+ {
+ case SENSOR_DESCRIPTOR_STATUS:
+ {
+ SensorAppli_cb.Sensor_Descriptor_Status_cb(pRxData , dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
+ break;
+ }
+ case SENSOR_CADENCE_STATUS:
+ {
+ SensorAppli_cb.Sensor_Cadence_Status_cb(pRxData , dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
+ break;
+ }
+ case SENSOR_SETTINGS_STATUS:
+ {
+ SensorAppli_cb.Sensor_Settings_Status_cb(pRxData , dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
+ break;
+ }
+ case SENSOR_SETTING_STATUS:
+ {
+ SensorAppli_cb.Sensor_Setting_Status_cb(pRxData , dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
+ break;
+ }
+ case SENSOR_STATUS:
+ {
+ SensorAppli_cb.Sensor_Status_cb(pRxData , dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
+ break;
+ }
+ case SENSOR_COLUMN_STATUS:
+ {
+ SensorAppli_cb.Sensor_Column_Status_cb(pRxData , dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
+ break;
+ }
+ case SENSOR_SERIES_STATUS:
+ {
+ SensorAppli_cb.Sensor_Series_Status_cb(pRxData , dataLength, pmsgParam->dst_peer, pmsgParam->elementIndex);
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+
+ if((result == MOBLE_RESULT_SUCCESS) && (response == MOBLE_TRUE))
+ {
+ Model_SendResponse(pmsgParam, opcode, pRxData, dataLength);
+ }
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
+
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 fd6ba7eb2..b8980a62d 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
@@ -215,5 +215,5 @@ MOBLE_RESULT Time_SceneModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
}
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
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 764d8a577..9b7b0490c 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/vendor.c
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/vendor.c
@@ -23,7 +23,9 @@
#include "ble_mesh.h"
#include "vendor.h"
#include "appli_test.h"
+#include "appli_vendor.h"
#include "models_if.h"
+#include "common.h"
#include <string.h>
/** @addtogroup MODEL_VENDOR
@@ -43,15 +45,17 @@
/*0x03 = SubCommand for LED Toggle*/
MOBLEUINT8 AppliBuffer[DATA_BUFFER_LENGTH] = {0x01,0x00};
MOBLEUINT16 CommandStatus = 0;
+MOBLEUINT8 Vendor_SendDataFreqState = 0x00;
extern MOBLEUINT8 NumberOfElements;
-extern MOBLEUINT8 ResponseBuffer[VENDOR_DATA_BYTE];
+extern MOBLEUINT8 ResponseBuffer[VENDOR_DATA_BUFFER_SIZE];
extern MOBLEUINT16 BuffLength;
extern MOBLEUINT8 Appli_LedState;
/*
-------------*******************-------------------------
Vendor Model Opcode Table
*/
-MOBLEUINT16 Vendor_Opcodes_Table[] = {
+MOBLEUINT16 Vendor_Opcodes_Table[] =
+{
APPLI_TEST_CMD,
APPLI_DEVICE_INFO_CMD,
APPLI_LED_CONTROL_STATUS_CMD,
@@ -64,7 +68,8 @@ char *Board_Type[] =
{
"BLUENRG1_BRD_TYPE",
"BLUENRG2_BRD_TYPE",
- "BLUENRG_MS_BRD_TYPE"
+ "BLUENRG_MS_BRD_TYPE",
+ "STM32WB55XX"
};
/* Private function prototypes -----------------------------------------------*/
#if ENABLE_APPLI_TEST
@@ -76,17 +81,15 @@ char *Board_Type[] =
/**
* @brief Call back function called when action is required on node itself
-* @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
+* @param *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* @param command: Receiving command code
* @param *data: Pointer to the data received from peer_addr
* @param length: Length of the data
* @param response: 1 if command acknowledgement is expected by peer_addr
* @retval MOBLE_RESULT status of result
*/
-MOBLE_RESULT Vendor_WriteLocalDataCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+MOBLE_RESULT Vendor_WriteLocalDataCb(MODEL_MessageHeader_t *pmsgParams,
MOBLEUINT8 command,
MOBLEUINT8 const *data,
MOBLEUINT32 length,
@@ -97,20 +100,22 @@ MOBLE_RESULT Vendor_WriteLocalDataCb(MOBLE_ADDRESS peer_addr,
/* Traces for the Data */
uint16_t idx = 0;
- TRACE_I(TF_VENDOR_M,"Vendor_WriteLocalDataCb: peer_addr=[%02x], dst_peer=[%02x],\
- command=[%02x], Response=[%02x] \n\r", peer_addr, dst_peer, command, response);
- TRACE_I(TF_VENDOR_M,"DATA_RECEIVED length = %ld\n\r",length);
+ TRACE_I(TF_VENDOR_M,
+ "Vendor_WriteLocalDataCb: elementIndex=[%02x], peer_addr=[%02x], dst_peer=[%02x], command=[%02x], Response=[%02x]\n\r",
+ pmsgParams->elementIndex,
+ pmsgParams->peer_addr,
+ pmsgParams->dst_peer,
+ command,
+ response);
+
+ TRACE_I(TF_VENDOR_M, "DATA_RECEIVED length = %ld\n\r",length);
+
for (idx=0; idx<length; idx++)
{
TRACE_I(TF_VENDOR_M,"data[%d]= %d",idx,data[idx]);
TRACE_I(TF_VENDOR_M,"\n\r");
}
- if(ADDRESS_IS_UNICAST(dst_peer))
- {
- MOBLEUINT8 elementNumber;
- elementNumber=BLEMesh_ModelsGetElementNumber(dst_peer);
-
switch (command)
{
@@ -130,7 +135,8 @@ MOBLE_RESULT Vendor_WriteLocalDataCb(MOBLE_ADDRESS peer_addr,
B0 - Sub-Cmd LED
B1-B7 - Data Bytes
*/
- VendorAppli_cb.LEDControlCommand_Cb(data,length,elementNumber,dst_peer);
+ VendorAppli_cb.LEDControlCommand_Cb(data, length, pmsgParams->elementIndex,\
+ pmsgParams->dst_peer);
break;
}
case APPLI_DATA_CNTRL_CMD:
@@ -148,72 +154,7 @@ MOBLE_RESULT Vendor_WriteLocalDataCb(MOBLE_ADDRESS peer_addr,
break;
}
}
- }
-
- else if(ADDRESS_IS_GROUP(dst_peer))
- {
-
- MOBLEUINT8 elementNumber;
- MOBLE_RESULT status1;
-
- /*Check the Subscription of Group Address for all the Elements.
- In case of Multi Elements, all elements may be subscribed to same Group Address.
- e.g 0xC000 is assigned to all elements
- or different Group addresses. Need to check subscription for each element */
- for (elementNumber=FIRST_ELEMENT;elementNumber<=NumberOfElements; elementNumber++)
- {
- /*If Received Address is Broadcast Address*/
- if(ADDRESS_IS_ALL_NODES(dst_peer))
- {
- status1 = MOBLE_RESULT_SUCCESS;
- }
- else
- {
- status1 = BLEMesh_ModelsCheckSubscription(dst_peer,elementNumber);
- }
-
- if(status1 == MOBLE_RESULT_SUCCESS)
- {
- switch (command)
- {
-
- case APPLI_TEST_CMD:
- {
- /*This is callback when ever command is coming for test of response
- time,command reached count, data byte sent
- */
- VendorAppli_cb.TestCommand_cb(data,length);
- break;
- }
- case APPLI_LED_CONTROL_STATUS_CMD:
- {
- /*
- Message Received B0 B1 B2 B3 B4 B5 B6 B7
- B0 - Sub-Cmd LED
- B1-B7 - Data Bytes
- */
- VendorAppli_cb.LEDControlCommand_Cb(data, length, elementNumber,dst_peer);
- break;
- }
- case APPLI_DATA_CNTRL_CMD:
- {
- /*This is callback when ever command is coming for test of response
- time,command reached count, data byte sent
- */
- VendorAppli_cb.DataControlCommand_cb(data,length);
- break;
- }
- /* Default case - Not valid command */
- default:
- {
- status = STATUS_INVALID_COMMAND;
- break;
- }
- }
- }
- }
- }
/* this expression is used to send the status of data received wheather it
is correct or not , First 3 bits are for status and last 5 bit are for sub commands
*/
@@ -227,16 +168,16 @@ MOBLE_RESULT Vendor_WriteLocalDataCb(MOBLE_ADDRESS peer_addr,
*/
if (response == MOBLE_TRUE)
{
- if (ADDRESS_IS_UNICAST(dst_peer))
+ if (ADDRESS_IS_UNICAST(pmsgParams->dst_peer))
{
- VendorModel_SendResponse(VENDOR_STMICRO_CID, peer_addr, dst_peer, command, ResponseBuffer, BuffLength);
- TRACE_M(TF_VENDOR_M,"Sending Response for Unicast \n\r");
+ VendorModel_SendResponse(VENDOR_STMICRO_CID, pmsgParams, command, ResponseBuffer, BuffLength);
+ TRACE_M(TF_VENDOR,"Sending Response for Unicast \n\r");
}
else
{
/* Randomize responses*/
- BLEMesh_ModelsDelayPacket(peer_addr, dst_peer, command, ResponseBuffer, BuffLength);
- TRACE_M(TF_VENDOR_M,"Sending Response for Multicast \n\r");
+ BLEMesh_ModelsDelayPacket(pmsgParams, command, ResponseBuffer, BuffLength);
+ TRACE_M(TF_VENDOR,"Sending Response for Multicast \n\r");
}
}
@@ -254,16 +195,15 @@ MOBLE_RESULT Vendor_WriteLocalDataCb(MOBLE_ADDRESS peer_addr,
/**
* @brief Call back function called when some data is required from node
-* @param peer_addr: Address of the peer
-* @param dst_peer: destination set by peer
+* *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* @param command: Receiving command code
* @param data: Pointer to the data
* @param length: Length of the data
* @param response: Response Enable. For future use
* @retval MOBLE_RESULT status of result
*/
-MOBLE_RESULT Vendor_ReadLocalDataCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+MOBLE_RESULT Vendor_ReadLocalDataCb(MODEL_MessageHeader_t *pmsgParams,
MOBLEUINT8 command,
MOBLEUINT8 const *data,
MOBLEUINT32 length,
@@ -274,20 +214,22 @@ MOBLE_RESULT Vendor_ReadLocalDataCb(MOBLE_ADDRESS peer_addr,
MOBLEUINT8 getBuff[5];
/* Traces for the Data */
- TRACE_M(TF_VENDOR_M,"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_M,"DATA_RECEIVED length = %ld\n\r",length);
+ TRACE_M(TF_VENDOR_M,
+ "Vendor_ReadLocalDataCb: elementIndex=[%02x], peer_addr=[%02x], dst_peer_addr=[%02x], command=[%02x], Response=[%02x]\n\r",
+ pmsgParams->elementIndex,
+ pmsgParams->peer_addr,
+ pmsgParams->dst_peer,
+ command,
+ response);
+
+ TRACE_I(TF_VENDOR_M,"DATA_RECEIVED length = %ld\n\r",length);
+
for (MOBLEUINT8 idx=0; idx<length; idx++)
{
TRACE_I(TF_VENDOR_M,"data[%d]= %d",idx,data[idx]);
TRACE_I(TF_VENDOR_M,"\n\r");
}
- if(ADDRESS_IS_UNICAST(dst_peer))
- {
- MOBLEUINT8 elementNumber;
- elementNumber=BLEMesh_ModelsGetElementNumber(dst_peer);
-
/* Check which command is in packet */
switch(command)
{
@@ -342,19 +284,10 @@ MOBLE_RESULT Vendor_ReadLocalDataCb(MOBLE_ADDRESS peer_addr,
Message Received with Command APPLI_LED_CONTROL_STATUS_CMD
ResponseBuffer will send the response of selected Element
*/
- if(elementNumber == FIRST_ELEMENT)
- {
+
+ TRACE_M(TF_VENDOR,"Appli_LED_Control_Status callback received for elementIndex %d \r\n", pmsgParams->elementIndex);
+ /*User Need to send the status as per the element selected*/
ResponseBuffer[0] = Appli_LedState;
- }
-
- else if(elementNumber == SECOND_ELEMENT)
- {
- /*Send LED Status*/
- }
- else if(elementNumber == THIRD_ELEMENT)
- {
- /*Sent Button State*/
- }
BuffLength = 1;
break;
@@ -375,7 +308,7 @@ MOBLE_RESULT Vendor_ReadLocalDataCb(MOBLE_ADDRESS peer_addr,
}
}
- }
+
/* this expression is used to send the status of data received wheather it
is correct or not , First 3 bits are for status and last 5 bit are for sub commands
*/
@@ -391,27 +324,27 @@ MOBLE_RESULT Vendor_ReadLocalDataCb(MOBLE_ADDRESS peer_addr,
B0 - Sub-Cmd for which response is needed
B1-B7 - Data Bytes if any
*/
- if (ADDRESS_IS_UNICAST(dst_peer))
+ if (ADDRESS_IS_UNICAST(pmsgParams->dst_peer))
{
- VendorModel_SendResponse(VENDOR_STMICRO_CID, peer_addr, dst_peer, command, ResponseBuffer, BuffLength);
+ VendorModel_SendResponse(VENDOR_STMICRO_CID, pmsgParams, command, ResponseBuffer, BuffLength);
}
else
{
/* Randomize responses*/
- BLEMesh_ModelsDelayPacket(peer_addr, dst_peer, command, ResponseBuffer, BuffLength);
+ BLEMesh_ModelsDelayPacket(pmsgParams, command, ResponseBuffer, BuffLength);
}
}
/* Command not successfully processed */
else
{
- if (ADDRESS_IS_UNICAST(dst_peer))
+ if (ADDRESS_IS_UNICAST(pmsgParams->dst_peer))
{
- VendorModel_SendResponse(VENDOR_STMICRO_CID, peer_addr, dst_peer, command, ResponseBuffer, 1);
+ VendorModel_SendResponse(VENDOR_STMICRO_CID, pmsgParams, command, ResponseBuffer, 1);
}
else
{
/* Randomize responses*/
- BLEMesh_ModelsDelayPacket(peer_addr, dst_peer, command, ResponseBuffer, 1);
+ BLEMesh_ModelsDelayPacket(pmsgParams, command, ResponseBuffer, 1);
}
}
@@ -423,20 +356,18 @@ MOBLE_RESULT Vendor_ReadLocalDataCb(MOBLE_ADDRESS peer_addr,
{
return MOBLE_RESULT_FAIL;
}
-
}
/**
* @brief Call back function called when some data is send by the node to app
-* @param peer_addr: Address of the peer
-* @param elementIndex: Index of the selected element
+* *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* @param data: Pointer to the data
* @param length: Length of the data
* @retval MOBLE_RESULT status of result
*/
-MOBLE_RESULT Vendor_OnResponseDataCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+MOBLE_RESULT Vendor_OnResponseDataCb(MODEL_MessageHeader_t *pmsgParam,
MOBLEUINT8 command,
MOBLEUINT8 const *pRxData,
MOBLEUINT32 dataLength,
@@ -448,11 +379,16 @@ MOBLE_RESULT Vendor_OnResponseDataCb(MOBLE_ADDRESS peer_addr,
MOBLEUINT8 increment = 1;
/* Traces for the Data */
- TRACE_I(TF_VENDOR_M,"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_M,
+ "Vendor_OnResponseDataCb: elementIndex=[%02x], peer_addr=[%02x], dst_peer_addr=[%02x], command=[%02x], Response=[%02x]\n\r",
+ pmsgParam->elementIndex,
+ pmsgParam->peer_addr,
+ pmsgParam->dst_peer,
+ command,
+ response);
TRACE_I(TF_VENDOR_M,"DATA_RECEIVED length = %ld\n\r", dataLength);
-
TRACE_M(TF_VENDOR_M,"#%02hx-%02hx! \n\r",command,pRxData[0]);
+
switch(command)
{
case APPLI_TEST_CMD:
@@ -464,8 +400,6 @@ MOBLE_RESULT Vendor_OnResponseDataCb(MOBLE_ADDRESS peer_addr,
/* this case is responsible for printing of the received back data byte from
receiver node.
*/
- #if ENABLE_APPLI_TEST
-#endif
break;
}
case APPLI_TEST_RANDOMIZATION_RANGE:
@@ -582,6 +516,11 @@ MOBLE_RESULT Vendor_OnResponseDataCb(MOBLE_ADDRESS peer_addr,
void Vendor_Process(void)
{
BLEMesh_ModelsSendDelayedPacket();
+
+ if (Vendor_SendDataFreqState == 0xFF)
+ {
+ Appli_Vendor_SendBigDataPacket();
+ }
}
@@ -668,7 +607,23 @@ void Vendor_TestCounterInc(MOBLE_ADDRESS src ,MOBLE_ADDRESS dst ,MOBLEUINT8 elem
}
}
-
+/**
+* @brief Set the state of the Vendor Data frequency
+* @param State: New state of sending vendor packet frequency
+* @retval void
+*/
+void Vendor_SendDataFreq(MOBLEUINT8 freq)
+{
+ /* Data to be sent continuosly with out any time gap */
+ if ((freq == 0xFF) || (freq == 0x00))
+ {
+ Vendor_SendDataFreqState = freq;
+ }
+ else
+ {
+ TRACE_I(TF_VENDOR_M, "Invalid Data send Freq parameter \r\n");
+ }
+}
/**
* @brief GenericModelServer_GetOpcodeTableCb: This function is call-back
@@ -687,9 +642,8 @@ MOBLE_RESULT VendorModel_PID1_GetOpcodeTableCb(const MODEL_OpcodeTableParam_t **
/**
* @brief GenericModelServer_GetStatusRequestCb : This function is call-back
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
+* @param *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* @param opcode: Received opcode of the Status message callback
* @param pResponsedata: Pointer to the buffer to be updated with status
* @param plength: Pointer to the Length of the data, to be updated by application
@@ -698,8 +652,7 @@ from the library to send response to the message from peer
* @param response: Value to indicate wheather message is acknowledged meassage or not.
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT VendorModel_PID1_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+MOBLE_RESULT VendorModel_PID1_GetStatusRequestCb(MODEL_MessageHeader_t *pmsgParams,
MOBLEUINT16 opcode,
MOBLEUINT8 *pResponsedata,
MOBLEUINT32 *plength,
@@ -714,9 +667,8 @@ MOBLE_RESULT VendorModel_PID1_GetStatusRequestCb(MOBLE_ADDRESS peer_addr,
/**
* @brief VendorModelServer_ProcessMessageCb: This is a callback function from
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
+* @param *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* @param opcode: Received opcode of the Status message callback
* @param pData: Pointer to the buffer to be updated with status
* @param length: Length of the parameters received
@@ -726,8 +678,7 @@ the library whenever a Generic Model message is received
* @param response: Value to indicate wheather message is acknowledged meassage or not.
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT VendorModel_PID1_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
- MOBLE_ADDRESS dst_peer,
+MOBLE_RESULT VendorModel_PID1_ProcessMessageCb(MODEL_MessageHeader_t *pmsgParams,
MOBLEUINT16 opcode,
MOBLEUINT8 const *pRxData,
MOBLEUINT32 dataLength,
@@ -741,8 +692,12 @@ MOBLE_RESULT VendorModel_PID1_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
/*tClockTime delay_t = Clock_Time();*/
- TRACE_I(TF_VENDOR_M,"dst_peer = [0x%02x] , peer_add = [0x%02x], opcode= [0x%02x] \r\n ",
- dst_peer, peer_addr, opcode);
+ TRACE_I(TF_VENDOR_M,
+ "elementIndex=[0x%02x], dst_peer=[0x%02x], peer_add=[0x%02x], opcode=[0x%02x]\r\n",
+ pmsgParams->elementIndex,
+ pmsgParams->dst_peer,
+ pmsgParams->peer_addr,
+ opcode);
/* opcode: response : Read-Write : Command
R/nW : 1 = Read
@@ -774,17 +729,17 @@ MOBLE_RESULT VendorModel_PID1_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
{ /* Response Packet is received */
TRACE_I(TF_VENDOR_M,"Response received from remote node \n\r");
- Vendor_OnResponseDataCb(peer_addr, dst_peer, command, pRxData, dataLength, MOBLE_FALSE);
+ Vendor_OnResponseDataCb(pmsgParams, command, pRxData, dataLength, MOBLE_FALSE);
}
else if ( (cmd_response == MOBLE_TRUE) && (opcode & VENDOR_CMD_READ_nWRITE))
{ /* Read Packet is received */
TRACE_M(TF_VENDOR_M,"Read Command received \n\r");
- result = Vendor_ReadLocalDataCb(peer_addr, dst_peer, command, pRxData, dataLength, MOBLE_TRUE);
+ result = Vendor_ReadLocalDataCb(pmsgParams, command, pRxData, dataLength, MOBLE_TRUE);
}
else
{ /* Write Commands with or without response received */
- TRACE_M(TF_VENDOR_M,"Command Write received, process the command \n\r");
- result = Vendor_WriteLocalDataCb(peer_addr, dst_peer, command, pRxData, dataLength, cmd_response );
+ TRACE_M(TF_VENDOR_M,"Command Write received, process the command\n\r");
+ result = Vendor_WriteLocalDataCb(pmsgParams, command, pRxData, dataLength, cmd_response );
}
return result;
@@ -803,7 +758,7 @@ __weak MOBLE_RESULT Packet_ResponseTimeStamp(MOBLEUINT32 rcvTimeStamp)
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
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 cf9100aaf..34865d419 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/Src/appli_test.c
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Src/appli_test.c
@@ -251,7 +251,7 @@ MOBLE_RESULT Read_CommandCount(MOBLE_ADDRESS src ,MOBLE_ADDRESS dst)
if(processDelay(TEST_READ_PERIOD) == 0x01)
{
TRACE_I(TF_SERIAL_CTRL, " NUMBER OF COMMANDS SEND %d \r\n",Totaltest);
- BLEMesh_ReadRemoteData(dst,elementIndex,APPLI_TEST_CMD,readData,sizeof(readData));
+// BLEMesh_ReadRemoteData(dst,elementIndex,APPLI_TEST_CMD,readData,sizeof(readData));
ReadFlag = 0;
}
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 ab7ed4d54..7cda5612b 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/Src/mesh_cfg.c
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Src/mesh_cfg.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
@@ -20,6 +20,7 @@
/* Includes ------------------------------------------------------------------*/
#include "mesh_cfg.h"
#include "mesh_cfg_usr.h"
+#include "sensor_cfg_usr.h"
#include "types.h"
#include "ble_mesh.h"
#include "compiler.h"
@@ -30,6 +31,7 @@
#include "vendor.h"
#include "config_client.h"
#include "light_lc.h"
+#include "common.h"
#include "appli_mesh.h"
#include <string.h>
#include "time_scene.h"
@@ -40,16 +42,21 @@
#if ((!ENABLE_USART) || (!ENABLE_SERIAL_INTERFACE))
#error "Serial Interface also needed for Serial Control Application."
#else
+
#include "serial_if.c"
+
#if ENABLE_SERIAL_CONTROL
- #include "serial_ctrl.c"
+ #include "serial_ctrl.c" /* This enables Appli_Process to call */
#endif
+
#if ENABLE_UT
#include "serial_ut.c"
#endif
+
#if ENABLE_APPLI_TEST
#include "appli_test.c"
#endif
+
#if ENABLE_SERIAL_PRVN
#include "serial_prvn.c"
#endif
@@ -94,6 +101,180 @@ MOBLE_RESULT MoblePBADVStartProvisioning(void* param);
MOBLE_RESULT MoblePBADVStopProvisioning(void* param);
#endif
+MOBLE_RESULT AppliCheck_EnabledModelsList(void);
+
+#if 0
+#ifndef ENABLE_SENSOR_MODEL_SERVER
+MOBLE_RESULT Appli_Sensor_Init(void);
+MOBLE_RESULT Sensor_ExtractPropertyI(const MOBLEUINT8* data,
+ MOBLEUINT16* pPropertyId);
+MOBLE_RESULT Sensor_ExtractSettingPropertyId(const MOBLEUINT8* data,
+ MOBLEUINT16* pSettingPropertyId);
+MOBLE_RESULT Sensor_ExtractSensorOffset(MOBLEUINT8 elementIdx,
+ MOBLEUINT8* pSensorOffsetBuff,
+ MOBLEUINT8* pSensorCount,
+ MOBLEUINT32 length,
+ const MOBLEUINT8* pData,
+ MOBLEUINT16* pidNotFound);
+MOBLE_RESULT Sensor_FillDescriptor(MOBLEUINT8 sensorOffset,
+ void* pParams,
+ MOBLEUINT8* pData,
+ MOBLEUINT8* pLengthInc);
+MOBLE_RESULT Sensor_MarshalPid(MOBLEUINT8 sensorOffset,
+ void* pParams,
+ MOBLEUINT8* pData,
+ MOBLEUINT8* pLengthInc,
+ MOBLEUINT8 pidMatch,
+ MOBLEUINT16 pidNotFound);
+MOBLE_RESULT Sensor_CadenceStatus(MOBLEUINT8 pidMatch,
+ void* pParams,
+ MOBLEUINT16 pidNotFound,
+ MOBLE_ADDRESS dstAddr,
+ MOBLEUINT8 elementIdx,
+ MOBLEUINT8 statusSend);
+MOBLE_RESULT Sensor_SettingsStatus(MOBLEUINT8* offsetBuff,
+ MOBLEUINT8 sensorCount,
+ MOBLE_ADDRESS dstAddr,
+ MOBLEUINT16 pidNotFound);
+MOBLE_RESULT Sensor_SettingStatus(MOBLEUINT8 pidMatch,
+ MOBLEUINT8 readViolation,
+ void* pParams,void* pSettingsParam,
+ MOBLEUINT16 pidNotFound,
+ MOBLEUINT16 rcvdSettingId,
+ MOBLE_ADDRESS dstAddr,
+ MOBLEUINT8 elementIdx,
+ MOBLEUINT8 statusSend);
+MOBLE_RESULT Sensor_DescriptorStatus(MOBLEUINT8* offsetBuff,
+ MOBLEUINT8 sensorCount,
+ MOBLE_ADDRESS dstAddr,
+ MOBLEUINT16 pidNotFound);
+MOBLE_RESULT Sensor_Status(MOBLEUINT8* offsetBuff,
+ MOBLEUINT8 sensorCount,
+ MOBLE_ADDRESS dstAddr,
+ MOBLEUINT16 pidNotFound,
+ MOBLEUINT8 statusSend);
+MOBLE_RESULT Sensor_ColumnStatus(MOBLEUINT8* offsetBuff,
+ MOBLEUINT8 sensorCount,
+ MOBLE_ADDRESS dstAddr,
+ MOBLEUINT32 rawValueX,
+ MOBLEUINT8 rcvdRawXLength,
+ MOBLEUINT16 pidNotFound,
+ MOBLEUINT8 elementIndex,
+ MOBLEUINT8 statusSend);
+MOBLE_RESULT Sensor_SeriesStatus(MOBLEUINT8* offsetBuff,
+ MOBLEUINT8 sensorCount,
+ MOBLE_ADDRESS dstAddr,
+ MOBLEUINT32 rcvdX1,
+ MOBLEUINT32 rcvdX2,
+ MOBLEUINT8 isX1X2Present,
+ MOBLEUINT8 rcvdRawXLength,
+ MOBLEUINT16 pidNotFound,
+ MOBLEUINT8 elementIndex,
+ MOBLEUINT8 statusSend);
+MOBLE_RESULT Sensor_DescriptorGet(const MOBLEUINT8* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Sensor_CadenceGet(const MOBLEUINT8* pCadenceParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Sensor_CadenceSet(const MOBLEUINT8* pCadenceParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Sensor_CadenceSetUnack(const MOBLEUINT8* pCadenceParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Sensor_SettingsGet(const MOBLEUINT8* pSettingsParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Sensor_SettingGet(const MOBLEUINT8* pRcvdParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Sensor_SettingSet(const MOBLEUINT8* pRcvdParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Sensor_SettingSetUnack(const MOBLEUINT8* pRcvdParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Sensor_Get(const MOBLEUINT8* pGetParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Sensor_ColumnGet(const MOBLEUINT8* pColumnParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Sensor_SeriesGet(const MOBLEUINT8* pSeriesParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT SensorModelServer_GetOpcodeTableCb(const MODEL_OpcodeTableParam_t **data,
+ MOBLEUINT16 *length);
+
+MOBLE_RESULT SensorModelServer_GetStatusRequestCb(MOBLEUINT16 peer_addr,
+ MOBLEUINT16 dst_peer,
+ MOBLEUINT16 opcode,
+ MOBLEUINT8 *pResponsedata,
+ MOBLEUINT32 *plength,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 dataLength,
+ MOBLEBOOL response);
+MOBLE_RESULT SensorModelServer_ProcessMessageCb(MOBLE_ADDRESS peer_addr,
+ MOBLE_ADDRESS dst_peer,
+ MOBLEUINT16 opcode,
+ MOBLEUINT16 modelID,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 dataLength,
+ MOBLEBOOL response);
+
+MOBLEUINT32 Sensor_SleepDurationMs_Get(void);
+MOBLE_RESULT Sensor_UpdatePublishParameters(MOBLEUINT8 sensorOffset);
+MOBLE_RESULT Sensor_CheckStatusTrigger(MOBLEUINT8 sensorOffset);
+MOBLE_RESULT Sensor_Send(MOBLEUINT8 sensorOffset,
+ MOBLEUINT8 elementIdx,
+ MOBLEUINT16 propertyId);
+MOBLE_RESULT Sensor_ValueGet(MOBLEUINT8 sensorOffset,
+ MOBLEUINT8 elementIdx,
+ MOBLEUINT16 propertyId,
+ void* value);
+MOBLE_RESULT Sensor_ValueSet(MOBLEUINT8 sensorOffset,
+ MOBLEUINT8 elementIdx,
+ MOBLEUINT16 propertyId,
+ const void* value);
+MOBLE_RESULT SensorServer_Init(void* sensorBuff,
+ const sensor_server_cb_t* sensor_cb,
+ MOBLEUINT16 sizeBuff,
+ const void* initParams);
+MOBLE_RESULT Sensor_PublicationParams_Get(MOBLEUINT8 sensorOffset,
+ MOBLEUINT8 elementIdx,
+ MOBLEUINT16 propertyId);
+MOBLE_RESULT Sensor_CadenceParams_Get(MOBLEUINT8 elementIdx,
+ MOBLEUINT16 propertyId);
+#endif
+#endif
+//__weak void Appli_Sensor_SerialCmd(char *rcvdStringBuff,
+// uint16_t rcvdStringSize);
+//__weak void Appli_Light_LC_SerialCmd(char *rcvdStringBuff,
+// uint16_t rcvdStringSize);
+MOBLE_RESULT Appli_Light_LCs_Init(void);
/* Private define ------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
@@ -105,7 +286,6 @@ MOBLEUINT8 dyn_buffer_m[DYNAMIC_MEMORY_SIZE + \
SAR_BUFFER_SIZE + \
NEIGHBOR_TABLE_DYNAMIC_MEMORY_SIZE] = {0};
-
#define MODELDATA_SIZE (MAX_APPLICATION_PACKET_SIZE+16)
#define MODELS_BUFFER_SIZE (MODELDATA_SIZE)
@@ -159,9 +339,8 @@ __attribute__((aligned(4)))const DynBufferParam_t DynBufferParam =
(MOBLEUINT16) MODELS_BUFFER_SIZE
};
-const MOBLEUINT8 Device_Name[] = {DEVICE_NAME_SIZE+1, 0x09, DEVICE_NAME};
+const MOBLEUINT8 Device_Name[] = {DEVICE_NAME_SIZE+1, AD_TYPE_NAME, DEVICE_NAME};
const device_name_params_t DeviceNameParams = DEVICE_NAME_PARAMS;
-
const tr_params_t TrParams = TRANSMIT_RECEIVE_PARAMS;
const lpn_params_t LpnParams = LOW_POWER_NODE_PARAMS;
const fn_params_t FnParams = FRIEND_NODE_PARAMS;
@@ -173,46 +352,92 @@ __attribute__((aligned(4))) MOBLEUINT16 Appli_SIG_Models[APPLICATION_NUMBER_OF_E
MOBLEUINT32 Appli_Vendor_Models[APPLICATION_NUMBER_OF_ELEMENTS][APPLICATION_VENDOR_MODELS_MAX_COUNT];
-/* Private functions ---------------------------------------------------------*/
+/**
+* Memory allocation for sensor server model
+*/
+MOBLEUINT8 BufferSensorServer[TOTAL_SENSOR_SERVER_BUFF_SIZE];
+
+/**
+* Memory allocation for light lc server model
+*/
+MOBLEUINT8 BufferLcServer[SIZE_OF_LC_SERVER_T];
/**
-* @brief ApplicationInitVendorModel: This function initialize the list of the
-* Vendor Models.
-* retval Count of the SIG Model Servers enabled in the Application
+* @brief AppliCheck_EnabledModelsList: This function checks whether the Enabled
+* Models in the defined range or exceeding the limit
+* retval MOBLE_RESULT
*/
-MOBLE_RESULT ApplicationInitVendorModelList(void)
-{
- for(uint8_t index = 0; index < APPLICATION_NUMBER_OF_ELEMENTS; index++)
+MOBLE_RESULT AppliCheck_EnabledModelsList(void)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+/* Initialization of the SIG Models list */
+ result = ApplicationInitSigModelList();
{
- if(index == 0)
+ if(result == MOBLE_RESULT_FALSE)
{
- Appli_Vendor_Models[index][0] = VENDORMODEL_STMICRO_ID1;
- Appli_Vendor_Models[index][1] = NO_MODEL_AVLBL;
+ TRACE_I(TF_INIT,"The number of Models enabled in Application exceed the Library limit");
+ result = MOBLE_RESULT_FAIL;
+ return result;
}
- else
+
+ else if(result == MOBLE_RESULT_FAIL)
+ {
+ TRACE_I(TF_INIT,"The number of Models enabled exceed the limit of %d !\r\n",
+ USER_SIG_MODELS_MAX_COUNT);
+ return result;
+ }
+
+ }
+
+ /* Initialization of the VENDOR Models list, if any */
+ result = ApplicationInitVendorModelList();
+ {
+
+ if(result == MOBLE_RESULT_FALSE)
{
- Appli_Vendor_Models[index][0] = NO_MODEL_AVLBL;
+ TRACE_I(TF_INIT,"The number of Models enabled in Application exceed the Library limit");
+ result = MOBLE_RESULT_FAIL;
+ return result;
+ }
+
+ else if(result == MOBLE_RESULT_FAIL)
+ {
+ TRACE_I(TF_INIT,"The number of Vendor Models enabled exceed the limit of %d !\r\n",
+ USER_VENDOR_MODELS_MAX_COUNT);
+ return result;
}
+
}
- return (MOBLE_RESULT_SUCCESS);
+
+ return result;
}
+
/**
* @brief ApplicationInitSigModelList: This function initialize the list of the
* SIG Models.
-* retval Count of the SIG Model Servers enabled in the Application
+* retval MOBLE_RESULT
*/
MOBLE_RESULT ApplicationInitSigModelList(void)
{
- uint8_t modelCount = 0;
+ /*If Models enabled by user are exceeding the library capability*/
+ if(APPLICATION_SIG_MODELS_MAX_COUNT > BLEMesh_GetTotalModelsCount() -
+ APPLICATION_VENDOR_MODELS_MAX_COUNT)
+ {
+ TRACE_I(TF_INIT,"APPLICATION_SIG_MODELS_MAX_COUNT %d > BLEMesh_GetTotalModelsCount() %d - APPLICATION_VENDOR_MODELS_MAX_COUNT %d",
+ APPLICATION_SIG_MODELS_MAX_COUNT,
+ BLEMesh_GetTotalModelsCount(),
+ APPLICATION_VENDOR_MODELS_MAX_COUNT);
+ return(MOBLE_RESULT_FALSE);
+ }
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
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
@@ -220,85 +445,97 @@ MOBLE_RESULT ApplicationInitSigModelList(void)
if(((ENABLE_CONFIG_MODEL_CLIENT & (1 << index)) == (1 << index)))
{
Appli_SIG_Models[index][modelIndex++] = SIG_MODEL_ID_CONFIG_CLIENT;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
if(((ENABLE_GENERIC_MODEL_SERVER_ONOFF & (1 << index)) == (1 << index)))
{
- Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_SERVER_ONOFF_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ Appli_SIG_Models[index][modelIndex++] = GENERIC_ONOFF_SERVER_MODEL_ID;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_LEVEL
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
if(((ENABLE_GENERIC_MODEL_SERVER_LEVEL & (1 << index)) == (1 << index)))
{
- Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_SERVER_LEVEL_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ Appli_SIG_Models[index][modelIndex++] = GENERIC_LEVEL_SERVER_MODEL_ID;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
if(((ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME & (1 << index)) == (1 << index)))
{
- Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ Appli_SIG_Models[index][modelIndex++] = GENERIC_DEFAULT_TRANSITION_TIME_SERVER_MODEL_ID;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
if(((ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF & (1 << index)) == (1 << index)))
{
- Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_SERVER_POWER_ONOFF_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ Appli_SIG_Models[index][modelIndex++] = GENERIC_SERVER_POWER_ONOFF_MODEL_ID;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF_SETUP
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
if(((ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF_SETUP & (1 << index)) == (1 << index)))
{
- Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_SERVER_POWER_ONOFF_SETUP_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ Appli_SIG_Models[index][modelIndex++] = GENERIC_POWER_ONOFF_SETUP_SERVER_MODEL_ID;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
@@ -306,13 +543,15 @@ MOBLE_RESULT ApplicationInitSigModelList(void)
if(((ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL & (1 << index)) == (1 << index)))
{
Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_SERVER_POWER_LEVEL_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL_SETUP
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
@@ -320,13 +559,15 @@ MOBLE_RESULT ApplicationInitSigModelList(void)
if(((ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL_SETUP & (1 << index)) == (1 << index)))
{
Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_SERVER_POWER_LEVEL_SETUP_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_BATTERY
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
@@ -334,13 +575,15 @@ MOBLE_RESULT ApplicationInitSigModelList(void)
if(((ENABLE_GENERIC_MODEL_SERVER_BATTERY & (1 << index)) == (1 << index)))
{
Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_SERVER_BATTERY_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_LOCATION
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
@@ -348,13 +591,15 @@ MOBLE_RESULT ApplicationInitSigModelList(void)
if(((ENABLE_GENERIC_MODEL_SERVER_LOCATION & (1 << index)) == (1 << index)))
{
Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_SERVER_LOCATION_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_LOCATION_SETUP
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
@@ -362,13 +607,15 @@ MOBLE_RESULT ApplicationInitSigModelList(void)
if(((ENABLE_GENERIC_MODEL_SERVER_LOCATION_SETUP & (1 << index)) == (1 << index)))
{
Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_SERVER_LOCATION_SETUP_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_ADMIN_PROPERTY
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
@@ -376,13 +623,15 @@ MOBLE_RESULT ApplicationInitSigModelList(void)
if(((ENABLE_GENERIC_MODEL_SERVER_ADMIN_PROPERTY & (1 << index)) == (1 << index)))
{
Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_SERVER_ADMIN_PROPERTY_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_MANUFACTURER_PROPERTY
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
@@ -390,13 +639,15 @@ MOBLE_RESULT ApplicationInitSigModelList(void)
if(((ENABLE_GENERIC_MODEL_SERVER_MANUFACTURER_PROPERTY & (1 << index)) == (1 << index)))
{
Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_SERVER_MANUFACTURER_PROPERTY_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_USER_PROPERTY
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
@@ -404,13 +655,15 @@ MOBLE_RESULT ApplicationInitSigModelList(void)
if(((ENABLE_GENERIC_MODEL_SERVER_USER_PROPERTY & (1 << index)) == (1 << index)))
{
Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_SERVER_USER_PROPERTY_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_CLIENT_PROPERTY
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
@@ -418,8 +671,10 @@ MOBLE_RESULT ApplicationInitSigModelList(void)
if(((ENABLE_GENERIC_MODEL_SERVER_CLIENT_PROPERTY & (1 << index)) == (1 << index)))
{
Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_SERVER_CLIENT_PROPERTY_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
@@ -428,128 +683,146 @@ MOBLE_RESULT ApplicationInitSigModelList(void)
/**************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
if(((ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS & (1 << index)) == (1 << index)))
{
- Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_SERVER_LIGHTNESS_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ Appli_SIG_Models[index][modelIndex++] = LIGHT_LIGHTNESS_SERVER_MODEL_ID;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
if(((ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP & (1 << index)) == (1 << index)))
{
- Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_SERVER_LIGHTNESS_SETUP_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ Appli_SIG_Models[index][modelIndex++] = LIGHT_LIGHTNESS_SETUP_SERVER_MODEL_ID;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
if(((ENABLE_LIGHT_MODEL_SERVER_CTL & (1 << index)) == (1 << index)))
{
- Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_SERVER_CTL_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ Appli_SIG_Models[index][modelIndex++] = LIGHT_CTL_SERVER_MODEL_ID;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
if(((ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP & (1 << index)) == (1 << index)))
{
- Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_SERVER_CTL_SETUP_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ Appli_SIG_Models[index][modelIndex++] = LIGHT_CTL_SETUP_SERVER_MODEL_ID;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
if(((ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE & (1 << index)) == (1 << index)))
{
- Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_SERVER_CTL_TEMPERATURE_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ Appli_SIG_Models[index][modelIndex++] = LIGHT_CTL_TEMPERATURE_SERVER_MODEL_ID;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
if(((ENABLE_LIGHT_MODEL_SERVER_HSL & (1 << index)) == (1 << index)))
{
- Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_SERVER_HSL_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ Appli_SIG_Models[index][modelIndex++] = LIGHT_HSL_SERVER_MODEL_ID;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
if(((ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP & (1 << index)) == (1 << index)))
{
- Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_SERVER_HSL_SETUP_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ Appli_SIG_Models[index][modelIndex++] = LIGHT_HSL_SETUP_SERVER_MODEL_ID;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_HUE
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
if(((ENABLE_LIGHT_MODEL_SERVER_HSL_HUE & (1 << index)) == (1 << index)))
{
- Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_SERVER_HSL_HUE_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ Appli_SIG_Models[index][modelIndex++] = LIGHT_HSL_HUE_SERVER_MODEL_ID;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
if(((ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION & (1 << index)) == (1 << index)))
{
- Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_SERVER_HSL_SATURATION_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ Appli_SIG_Models[index][modelIndex++] = LIGHT_HSL_SATURATION_SERVER_MODEL_ID;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
@@ -557,7 +830,7 @@ MOBLE_RESULT ApplicationInitSigModelList(void)
/** Following Section places Light XYL MODEL Enabled SERVER IDs *********/
/**************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_XYL
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
@@ -565,13 +838,15 @@ MOBLE_RESULT ApplicationInitSigModelList(void)
if(((ENABLE_LIGHT_MODEL_SERVER_XYL & (1 << index)) == (1 << index)))
{
Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_SERVER_XYL_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_XYL_SETUP
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
@@ -579,8 +854,10 @@ MOBLE_RESULT ApplicationInitSigModelList(void)
if(((ENABLE_LIGHT_MODEL_SERVER_XYL_SETUP & (1 << index)) == (1 << index)))
{
Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_SERVER_XYL_SETUP_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
@@ -588,30 +865,34 @@ MOBLE_RESULT ApplicationInitSigModelList(void)
/** Following Section places Light LC MODEL Enabled SERVER IDs *********/
/**************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
if(((ENABLE_LIGHT_MODEL_SERVER_LC & (1 << index)) == (1 << index)))
{
- Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_SERVER_LC_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ Appli_SIG_Models[index][modelIndex++] = LIGHT_LC_SERVER_MODEL_ID;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_LC_SETUP
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
if(((ENABLE_LIGHT_MODEL_SERVER_LC_SETUP & (1 << index)) == (1 << index)))
{
- Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_SERVER_LC_SETUP_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ Appli_SIG_Models[index][modelIndex++] = LIGHT_LC_SETUP_SERVER_MODEL_ID;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
@@ -619,7 +900,7 @@ MOBLE_RESULT ApplicationInitSigModelList(void)
/** Following Section places SENSOR MODEL Enabled SERVER IDs *********/
/**************************************************************************/
#ifdef ENABLE_SENSOR_MODEL_SERVER
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
@@ -627,13 +908,15 @@ MOBLE_RESULT ApplicationInitSigModelList(void)
if(((ENABLE_SENSOR_MODEL_SERVER & (1 << index)) == (1 << index)))
{
Appli_SIG_Models[index][modelIndex++] = SENSOR_SERVER_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_SENSOR_MODEL_SERVER_SETUP
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
@@ -641,8 +924,10 @@ MOBLE_RESULT ApplicationInitSigModelList(void)
if(((ENABLE_SENSOR_MODEL_SERVER_SETUP & (1 << index)) == (1 << index)))
{
Appli_SIG_Models[index][modelIndex++] = SENSOR_SETUP_SERVER_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
@@ -651,7 +936,7 @@ MOBLE_RESULT ApplicationInitSigModelList(void)
/**************************************************************************/
#ifdef ENABLE_TIME_MODEL_SERVER
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
@@ -659,13 +944,15 @@ MOBLE_RESULT ApplicationInitSigModelList(void)
if(((ENABLE_TIME_MODEL_SERVER & (1 << index)) == (1 << index)))
{
Appli_SIG_Models[index][modelIndex++] = TIME_MODEL_SERVER_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_TIME_MODEL_SERVER_SETUP
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
@@ -673,13 +960,15 @@ MOBLE_RESULT ApplicationInitSigModelList(void)
if(((ENABLE_TIME_MODEL_SERVER_SETUP & (1 << index)) == (1 << index)))
{
Appli_SIG_Models[index][modelIndex++] = TIME_MODEL_SERVER_SETUP_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_SCENE_MODEL_SERVER
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
@@ -687,13 +976,15 @@ MOBLE_RESULT ApplicationInitSigModelList(void)
if(((ENABLE_SCENE_MODEL_SERVER & (1 << index)) == (1 << index)))
{
Appli_SIG_Models[index][modelIndex++] = SCENE_MODEL_SERVER_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_SCENE_MODEL_SERVER_SETUP
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
@@ -701,8 +992,10 @@ MOBLE_RESULT ApplicationInitSigModelList(void)
if(((ENABLE_SCENE_MODEL_SERVER_SETUP & (1 << index)) == (1 << index)))
{
Appli_SIG_Models[index][modelIndex++] = SCENE_MODEL_SERVER_SETUP_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
@@ -710,63 +1003,71 @@ MOBLE_RESULT ApplicationInitSigModelList(void)
/** Following Section places Generic MODEL Enabled Client IDs **********/
/**************************************************************************/
#ifdef ENABLE_GENERIC_MODEL_CLIENT_ONOFF
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
if(((ENABLE_GENERIC_MODEL_CLIENT_ONOFF & (1 << index)) == (1 << index)))
{
- Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_CLIENT_ONOFF_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ Appli_SIG_Models[index][modelIndex++] = GENERIC_ONOFF_CLIENT_MODEL_ID;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_GENERIC_MODEL_CLIENT_LEVEL
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
if(((ENABLE_GENERIC_MODEL_CLIENT_LEVEL & (1 << index)) == (1 << index)))
{
- Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_CLIENT_LEVEL_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ Appli_SIG_Models[index][modelIndex++] = GENERIC_LEVEL_CLIENT_MODEL_ID;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_GENERIC_MODEL_CLIENT_DEFAULT_TRANSITION_TIME
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
if(((ENABLE_GENERIC_MODEL_CLIENT_DEFAULT_TRANSITION_TIME & (1 << index)) == (1 << index)))
{
- Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_CLIENT_DEFAULT_TRANSITION_TIME_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ Appli_SIG_Models[index][modelIndex++] = GENERIC_DEFAULT_TRANSITION_TIME_CLIENT_MODEL_ID;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_GENERIC_MODEL_CLIENT_POWER_ONOFF
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
if(((ENABLE_GENERIC_MODEL_CLIENT_POWER_ONOFF & (1 << index)) == (1 << index)))
{
- Appli_SIG_Models[index][modelIndex++] = GENERIC_MODEL_CLIENT_POWER_ONOFF_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ Appli_SIG_Models[index][modelIndex++] = GENERIC_POWER_ONOFF_CLIENT_MODEL_ID;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_SENSOR_MODEL_CLIENT
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
@@ -774,64 +1075,74 @@ MOBLE_RESULT ApplicationInitSigModelList(void)
if(((ENABLE_SENSOR_MODEL_CLIENT & (1 << index)) == (1 << index)))
{
Appli_SIG_Models[index][modelIndex++] = SENSOR_CLIENT_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
if(((ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS & (1 << index)) == (1 << index)))
{
- Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_CLIENT_LIGHTNESS_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ Appli_SIG_Models[index][modelIndex++] = LIGHT_LIGHTNESS_CLIENT_MODEL_ID;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_LIGHT_MODEL_CLIENT_CTL
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
if(((ENABLE_LIGHT_MODEL_CLIENT_CTL & (1 << index)) == (1 << index)))
{
- Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_CLIENT_CTL_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ Appli_SIG_Models[index][modelIndex++] = LIGHT_CTL_CLIENT_MODEL_ID;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_LIGHT_MODEL_CLIENT_HSL
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
if(((ENABLE_LIGHT_MODEL_CLIENT_HSL & (1 << index)) == (1 << index)))
{
- Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_CLIENT_HSL_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ Appli_SIG_Models[index][modelIndex++] = LIGHT_HSL_CLIENT_MODEL_ID;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
#ifdef ENABLE_LIGHT_MODEL_CLIENT_LC
- if(modelCount >= APPLICATION_SIG_MODELS_MAX_COUNT)
+ if(modelIndex >= APPLICATION_SIG_MODELS_MAX_COUNT)
{
return(MOBLE_RESULT_FAIL);
}
if(((ENABLE_LIGHT_MODEL_CLIENT_LC & (1 << index)) == (1 << index)))
{
- Appli_SIG_Models[index][modelIndex++] = LIGHT_MODEL_CLIENT_LC_MODEL_ID;
- Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
- modelCount++;
+ Appli_SIG_Models[index][modelIndex++] = LIGHT_LC_CLIENT_MODEL_ID;
+ if(modelIndex < APPLICATION_SIG_MODELS_MAX_COUNT)
+ {
+ Appli_SIG_Models[index][modelIndex] = NO_MODEL_AVLBL;
+ }
}
#endif
}
@@ -839,44 +1150,72 @@ MOBLE_RESULT ApplicationInitSigModelList(void)
}
/**
-* @brief ApplicationGetSigModelList: This function provides the list of the
-* SIG Models to the calling function
-* @param pModels_sig_ID: Pointer of the array to be filled with SIG Models list
-* @param elementIndex: Index of the element for Model List
-* retval Count of the SIG Model Servers enabled in the Application
+* @brief ApplicationInitVendorModelList: This function initialize the list of the
+* VENDOR Models.
+* retval MOBLE_RESULT
*/
-MOBLEUINT8 ApplicationGetSigModelList(MOBLEUINT16* pModels_sig_ID, MOBLEUINT8 elementIndex)
+MOBLE_RESULT ApplicationInitVendorModelList(void)
{
- uint8_t count=0;
- /* Since the SIG Models are 2 bytes, copy 2*size for memcpy */
- for(uint8_t index=0; index <= elementIndex; index++)
+#ifdef ENABLE_VENDOR_MODEL_SERVER
+
+ /*If Models enabled by user are exceeding the library capability*/
+ if( APPLICATION_VENDOR_MODELS_MAX_COUNT > BLEMesh_GetTotalModelsCount() -
+ APPLICATION_SIG_MODELS_MAX_COUNT)
{
- if(index == elementIndex)
+ TRACE_I(TF_INIT,"The number of Models enabled in Application exceeding the limit of Library");
+ return(MOBLE_RESULT_FALSE);
+ }
+ for(uint8_t index = 0; index < APPLICATION_NUMBER_OF_ELEMENTS; index++)
+ {
+ uint8_t modelIndex = 0;
+ Appli_Vendor_Models[index][modelIndex] = NO_MODEL_AVLBL;
+
+ if((ENABLE_VENDOR_MODEL_SERVER & (1 << index)) == (1 << index))
{
- for(uint8_t modelCount=0; modelCount < APPLICATION_SIG_MODELS_MAX_COUNT; modelCount++)
+ Appli_Vendor_Models[index][modelIndex++] = VENDORMODEL_STMICRO_ID1;
+ if(modelIndex < APPLICATION_VENDOR_MODELS_MAX_COUNT)
{
- if(Appli_SIG_Models[index][modelCount] == NO_MODEL_AVLBL)
- {
- memcpy(pModels_sig_ID, Appli_SIG_Models+index, count*2);
- break;
- }
-
- else
- {
- count++;
- }
+ Appli_Vendor_Models[index][modelIndex] = NO_MODEL_AVLBL;
}
-
- break;
}
- else
+ if(modelIndex >= APPLICATION_VENDOR_MODELS_MAX_COUNT)
{
- /*do nothing*/
+ return(MOBLE_RESULT_FAIL);
}
}
+#else
+ for(uint8_t index = 0; index < APPLICATION_NUMBER_OF_ELEMENTS; index++)
+ {
+ Appli_Vendor_Models[index][0] = NO_MODEL_AVLBL;
+ }
+#endif
+ return (MOBLE_RESULT_SUCCESS);
+}
- return count;
+/* Private functions ---------------------------------------------------------*/
+
+/**
+* @brief ApplicationGetSigModelList: This function provides the list of the
+* SIG Models to the calling function
+* @param pModels_sig_ID: Pointer of the array to be filled with SIG Models list
+* @param elementIndex: Index of the element for Model List
+* retval Count of the SIG Model Servers enabled in the Application
+*/
+MOBLEUINT8 ApplicationGetSigModelList(MOBLEUINT16* pModels_sig_ID, MOBLEUINT8 elementIndex)
+{
+ uint8_t modelCount = 0;
+
+ while((modelCount < APPLICATION_SIG_MODELS_MAX_COUNT) &&
+ (Appli_SIG_Models[elementIndex][modelCount] != NO_MODEL_AVLBL))
+ {
+ modelCount++;
+ }
+ memcpy(pModels_sig_ID,
+ Appli_SIG_Models + elementIndex,
+ modelCount * 2);
+
+ return modelCount;
}
@@ -932,10 +1271,9 @@ MOBLEUINT8 ApplicationGetCLIENTSigModelList(MOBLEUINT16* pModels_sig_ID, MOBLEUI
*/
MOBLEUINT8 ApplicationSetNodeSigModelList(void)
{
- if (MOBLE_SUCCEEDED(BLEMeshSetSelfModelList(NumberOfElements)))
- return 1; //APPLI_SIG_MODELS_COUNT; TBD
- else
- return 0;
+ /* Since the SIG Models are 2 bytes, copy 2*size for memcpy */
+ BLEMeshSetSelfModelList(NumberOfElements);
+ return 1;
}
@@ -946,10 +1284,13 @@ MOBLEUINT8 ApplicationSetNodeSigModelList(void)
* @param elementIndex: Index of the element for Model List
* retval Count of the Vendor Model Servers enabled in the Application
*/
+
MOBLEUINT8 ApplicationGetVendorModelList(MOBLEUINT32* pModels_vendor_ID, MOBLEUINT8 elementIndex)
{
+#if 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++)
{
@@ -977,8 +1318,18 @@ MOBLEUINT8 ApplicationGetVendorModelList(MOBLEUINT32* pModels_vendor_ID, MOBLEUI
/*do nothing*/
}
}
+#else
+ uint8_t modelCount = 0;
- return count;
+ /* Since the SIG Models are 2 bytes, copy 2*size for memcpy */
+ while((modelCount < APPLICATION_VENDOR_MODELS_MAX_COUNT) &&
+ (Appli_Vendor_Models[elementIndex][modelCount] != NO_MODEL_AVLBL))
+ {
+ modelCount++;
+ }
+ memcpy(pModels_vendor_ID, Appli_Vendor_Models+elementIndex, modelCount*4);
+#endif
+ return modelCount;
}
@@ -1072,7 +1423,6 @@ MOBLEBOOL ApplicationChkVendorModelActive(MOBLEUINT32 modelID, MOBLEUINT8 elemen
* retval void* Pointer to the used buffer
*/
#ifdef STATIC_MEMORY_ALLOCATION_IN_APPLI
-
void* GetMemoryDataBuffer(MOBLEUINT8 buffer_type, MOBLEUINT32 u32length)
{
void* ptr = NULL;
@@ -1150,8 +1500,6 @@ void* GetMemoryDataBuffer(MOBLEUINT8 buffer_type, MOBLEUINT32 u32length)
return ptr;
}
-
-
#endif
#if (FRIEND_FEATURE == 0)
@@ -1295,25 +1643,198 @@ void BLEMesh_UpdateNeighbors(void* param)
}
#endif /* #if (NEIGHBOR_TABLE_SUPPORTED == 0) */
+//__weak void Appli_Light_LC_SerialCmd(char *rcvdStringBuff, uint16_t rcvdStringSize) {}
+
+#if 0
+#ifndef ENABLE_SENSOR_MODEL_SERVER /* Flash optimization corresponding to sensor server */
+MOBLE_RESULT Appli_Sensor_Init(void){return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Sensor_ExtractPropertyI(const MOBLEUINT8* data, MOBLEUINT16* pPropertyId)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Sensor_ExtractSettingPropertyId(const MOBLEUINT8* data, MOBLEUINT16* pSettingPropertyId)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Sensor_ExtractSensorOffset(MOBLEUINT8 elementIdx,MOBLEUINT8* pSensorOffsetBuff,
+ MOBLEUINT8* pSensorCount, MOBLEUINT32 length,
+ const MOBLEUINT8* pData, MOBLEUINT16* pidNotFound)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Sensor_FillDescriptor(MOBLEUINT8 sensorOffset, void* pParams, MOBLEUINT8* pData, MOBLEUINT8* pLengthInc)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Sensor_MarshalPid(MOBLEUINT8 sensorOffset, void* pParams, MOBLEUINT8* pData, MOBLEUINT8* pLengthInc,
+ MOBLEUINT8 pidMatch, MOBLEUINT16 pidNotFound)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Sensor_CadenceStatus(MOBLEUINT8 pidMatch,void* pParams,MOBLEUINT16 pidNotFound,
+ MOBLE_ADDRESS dstAddr,MOBLEUINT8 elementIdx,MOBLEUINT8 statusSend)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Sensor_SettingsStatus(MOBLEUINT8* offsetBuff,MOBLEUINT8 sensorCount,
+ MOBLE_ADDRESS dstAddr,MOBLEUINT16 pidNotFound)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Sensor_SettingStatus(MOBLEUINT8 pidMatch, MOBLEUINT8 readViolation,
+ void* pParams,void* pSettingsParam,MOBLEUINT16 pidNotFound,
+ MOBLEUINT16 rcvdSettingId,MOBLE_ADDRESS dstAddr,
+ MOBLEUINT8 elementIdx,MOBLEUINT8 statusSend)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Sensor_DescriptorStatus(MOBLEUINT8* offsetBuff, MOBLEUINT8 sensorCount,
+ MOBLE_ADDRESS dstAddr, MOBLEUINT16 pidNotFound)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Sensor_Status(MOBLEUINT8* offsetBuff, MOBLEUINT8 sensorCount,MOBLE_ADDRESS dstAddr,
+ MOBLEUINT16 pidNotFound,MOBLEUINT8 statusSend)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Sensor_ColumnStatus(MOBLEUINT8* offsetBuff, MOBLEUINT8 sensorCount,
+ MOBLE_ADDRESS dstAddr,MOBLEUINT32 rawValueX,
+ MOBLEUINT8 rcvdRawXLength,MOBLEUINT16 pidNotFound,
+ MOBLEUINT8 elementIndex,MOBLEUINT8 statusSend)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Sensor_SeriesStatus(MOBLEUINT8* offsetBuff, MOBLEUINT8 sensorCount,
+ MOBLE_ADDRESS dstAddr,MOBLEUINT32 rcvdX1,
+ MOBLEUINT32 rcvdX2,MOBLEUINT8 isX1X2Present,
+ MOBLEUINT8 rcvdRawXLength,MOBLEUINT16 pidNotFound,
+ MOBLEUINT8 elementIndex,MOBLEUINT8 statusSend)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Sensor_DescriptorGet(const MOBLEUINT8* pDescriptorParam, MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,MOBLE_ADDRESS dstPeer,MOBLEUINT8 elementIndex)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Sensor_CadenceGet(const MOBLEUINT8* pCadenceParam,MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,MOBLE_ADDRESS dstPeer,MOBLEUINT8 elementIndex)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Sensor_CadenceSet(const MOBLEUINT8* pCadenceParam,MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,MOBLE_ADDRESS dstPeer,MOBLEUINT8 elementIndex)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Sensor_CadenceSetUnack(const MOBLEUINT8* pCadenceParam, MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr, MOBLE_ADDRESS dstPeer,MOBLEUINT8 elementIndex)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Sensor_SettingsGet(const MOBLEUINT8* pSettingsParam, MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr, MOBLE_ADDRESS dstPeer,MOBLEUINT8 elementIndex)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Sensor_SettingGet(const MOBLEUINT8* pRcvdParam, MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,MOBLE_ADDRESS dstPeer,MOBLEUINT8 elementIndex)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Sensor_SettingSet(const MOBLEUINT8* pRcvdParam,MOBLEUINT32 length,MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,MOBLEUINT8 elementIndex)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Sensor_SettingSetUnack(const MOBLEUINT8* pRcvdParam,MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Sensor_Get(const MOBLEUINT8* pGetParam, MOBLEUINT32 length,MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,MOBLEUINT8 elementIndex)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Sensor_ColumnGet(const MOBLEUINT8* pColumnParam,MOBLEUINT32 length,MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,MOBLEUINT8 elementIndex)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Sensor_SeriesGet(const MOBLEUINT8* pSeriesParam, MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr, MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT SensorModelServer_GetOpcodeTableCb(const MODEL_OpcodeTableParam_t **data,
+ MOBLEUINT16 *length)
+{return MOBLE_RESULT_NOTIMPL;}
+
+MOBLE_RESULT SensorModelServer_GetStatusRequestCb(MODEL_MessageHeader_t *pmsgParams,
+ MOBLEUINT16 opcode, MOBLEUINT8 *pResponsedata,
+ MOBLEUINT32 *plength, MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 dataLength,MOBLEBOOL response)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT SensorModelServer_ProcessMessageCb(MODEL_MessageHeader_t *pmsgParams,
+ MOBLEUINT16 opcode,MOBLEUINT8 const *data,
+ MOBLEUINT32 length,MOBLEBOOL response)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLEUINT32 Sensor_SleepDurationMs_Get(void)
+{return 0;}
+MOBLE_RESULT Sensor_UpdatePublishParameters(MOBLEUINT8 sensorOffset)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Sensor_CheckStatusTrigger(MOBLEUINT8 sensorOffset)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Sensor_Send(MOBLEUINT8 sensorOffset,MOBLEUINT8 elementIdx,MOBLEUINT16 propertyId)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Sensor_UpdateCadence(MOBLEUINT8 sensorOffset, MOBLEUINT8 elementIdx,
+ MOBLEUINT16 propertyId)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Sensor_UpdatePublishState(MOBLEUINT8 sensorOffset, MOBLEUINT8 state)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT SensorServer_Init(void* sensorBuff, const sensor_server_cb_t* sensor_cb,
+ MOBLEUINT16 sizeBuff,const void* initParams)
+{return MOBLE_RESULT_NOTIMPL;}
+void Sensor_Process(void){}
+MOBLE_RESULT Sensor_ModelPublishSet(model_publicationparams_t* pPublishParams)
+{return MOBLE_RESULT_NOTIMPL;}
+#endif
+#endif
+
+//__weak void Appli_Sensor_SerialCmd(char *rcvdStringBuff, uint16_t rcvdStringSize){}
+
+#ifndef ENABLE_LIGHT_MODEL_SERVER_LC
+MOBLE_RESULT LightLcServer_GetOpcodeTableCb(const MODEL_OpcodeTableParam_t **data,
+ MOBLEUINT16 *length)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT LightLcServer_GetStatusRequestCb(MODEL_MessageHeader_t *pmsgParam,
+ MOBLEUINT16 opcode,
+ MOBLEUINT8 *pResponsedata,
+ MOBLEUINT32 *plength,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 dataLength,
+ MOBLEBOOL response)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT LightLcServer_ProcessMessageCb(MODEL_MessageHeader_t *pmsgParam,
+ MOBLEUINT16 opcode,
+ MOBLEUINT8 const *pRxData,
+ MOBLEUINT32 dataLength,
+ MOBLEBOOL response)
+{return MOBLE_RESULT_NOTIMPL;}
+void Light_LC_NvmParams_Get(MOBLEUINT8 elementIndex,
+ MOBLEUINT8* lightLcNvmParamsBuff,
+ MOBLEUINT8* lcNvmParamsSize)
+{}
+void Light_LC_OnPowerUp(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 const *pModelValue_Load,
+ MOBLEUINT8 genericOnPowerUp,
+ MOBLEUINT16 lightDefault,
+ MOBLEUINT16 lightLast,
+ MOBLEUINT16 lightActualLKV)
+{}
+MOBLE_RESULT Light_LC_SetTransitionTimeZero(MOBLEUINT8 elementIndex)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Light_LC_SensorPropertyUpdate(MOBLEUINT8 lcsElementIndex,
+ MOBLEUINT16 sensorPropertyId,
+ MOBLEUINT32 value)
+{return MOBLE_RESULT_NOTIMPL;}
+void Light_LC_LigtnessLinearUnsolicitedChange(MOBLEUINT8 elementIndex)
+{}
+MOBLEUINT32 Light_LC_SleepDurationMs_Get(void)
+{return 0;}
+MOBLE_RESULT Light_LC_Send(MOBLEUINT8 elementIndex)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Light_LC_LcOnOffUpdate(MOBLEUINT8 elementIndex,
+ MOBLEUINT8 onOff,
+ MOBLEUINT8 optionalParams,
+ MOBLEUINT32 delayMsOnOffMsg,
+ MOBLEUINT32 stepResMsOnOffMsg,
+ MOBLEUINT32 trTimeMsOnOffMsg)
+{return MOBLE_RESULT_NOTIMPL;}
+void Light_LC_Process(void)
+{}
+MOBLE_RESULT Light_LCs_Init(void* lcsBuff,
+ MOBLEUINT8 lcsElementIndex,
+ const light_lc_cb_t* lcs_cb,
+ MOBLEUINT16 sizeBuff)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT ExtractLcServerElementIndex(MOBLEUINT8* pLcsElementIndex,
+ MOBLEUINT8 noOfElements,
+ MOBLEUINT8 lcServer,
+ MOBLEUINT8 lcSetupServer,
+ MOBLEUINT8 genericOnOffServer,
+ MOBLEUINT8 genericPowerOnOffServer,
+ MOBLEUINT8 lightLightnessServer)
+{return MOBLE_RESULT_NOTIMPL;}
+MOBLE_RESULT Appli_Light_LCs_Init(void)
+{return MOBLE_RESULT_NOTIMPL;}
+#endif /* #ifndef ENABLE_LIGHT_MODEL_SERVER_LC */
+
/* Empty functions to reduce code size in case of PB-ADV functionality not in use */
#if (PB_ADV_SUPPORTED == 0)
-MOBLE_RESULT MoblePBADVInit(void* param)
-{
- return MOBLE_RESULT_SUCCESS;
-}
-MOBLE_RESULT MoblePBADVProcessData(void* param)
-{
- return MOBLE_RESULT_SUCCESS;
-}
-MOBLE_RESULT MoblePBADVStartProvisioning(void* param)
-{
- return MOBLE_RESULT_SUCCESS;
-}
-MOBLE_RESULT MoblePBADVStopProvisioning(void* param)
-{
- return MOBLE_RESULT_SUCCESS;
-}
+MOBLE_RESULT MoblePBADVInit(void* param){return MOBLE_RESULT_SUCCESS;}
+MOBLE_RESULT MoblePBADVProcessData(void* param){return MOBLE_RESULT_SUCCESS;}
+MOBLE_RESULT MoblePBADVStartProvisioning(void* param){return MOBLE_RESULT_SUCCESS;}
+MOBLE_RESULT MoblePBADVStopProvisioning(void* param){return MOBLE_RESULT_SUCCESS;}
#endif
/* PLEASE REFER TO THE .h file for different settings */
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 5ed1de904..4914bbc73 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_ctrl.c
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_ctrl.c
@@ -26,7 +26,10 @@
#include "light.h"
#include "light_lc.h"
#include "vendor.h"
-
+#include "appli_vendor.h"
+#include "generic_client.h"
+#include "light_client.h"
+#include "sensors_client.h"
/** @addtogroup BlueNRG_Mesh
* @{
*/
@@ -62,14 +65,22 @@ MOBLEUINT8 SerialCtrl_GetData(char *rcvdStringBuff, uint16_t rcvdStringSize, MOB
*/
void SerialCtrlVendorRead_Process(char *rcvdStringBuff, uint16_t rcvdStringSize)
{
- MOBLE_ADDRESS peer = 0; /*node adderess of the destination node*/
MOBLEUINT16 command = 0; /*Opcode command to be executed by the destination node*/
MOBLEUINT8 datalength = 0;
- MOBLEUINT8 elementIndex = 0; /*default element index*/
MOBLEUINT8 data [10] = {0}; /*buffer to output property variables */
MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+ MODEL_MessageHeader_t msgHdr;
- sscanf(rcvdStringBuff+5, "%4hx %hx ", &peer,&command);
+ /*Initializing the parameters*/
+ msgHdr.elementIndex = 0;
+ msgHdr.peer_addr = 0;
+ msgHdr.dst_peer = 0;
+ msgHdr.ttl = 0;
+ msgHdr.rssi = 0;
+ msgHdr.rcvdAppKeyOffset = 0;
+ msgHdr.rcvdNetKeyOffset = 0;
+
+ sscanf(rcvdStringBuff+5, "%4hx %hx ", &msgHdr.peer_addr, &command);
for(int i = 0; i < 6 ; i++)
{
@@ -86,26 +97,26 @@ void SerialCtrlVendorRead_Process(char *rcvdStringBuff, uint16_t rcvdStringSize)
if(result)
{
- TRACE_I(TF_SERIAL_CTRL,"Invalid Command\r\n");
+ TRACE_I(TF_SERIAL_PRINTS,"Invalid Command\r\n");
return;
}
else
{
-
- result = BLEMesh_ReadRemoteData(peer,elementIndex,command,
- data, datalength);
+ result = BLEMesh_ReadRemoteData(&msgHdr,command, data, datalength);
if(result == MOBLE_RESULT_SUCCESS)
{
- TRACE_I(TF_SERIAL_CTRL,"Command Executed Successfully\r\n");
+ TRACE_I(TF_SERIAL_PRINTS,"Command Executed Successfully\r\n");
}
else
{
- TRACE_I(TF_SERIAL_CTRL,"Invalid Opcode Parameter\r\n");
+ TRACE_I(TF_SERIAL_PRINTS,"Invalid Opcode Parameter\r\n");
}
}
}
+
+
void SerialCtrlVendorWrite_Process(char *rcvdStringBuff, uint16_t rcvdStringSize)
{
MOBLE_ADDRESS peer = 0; /*node adderess of the destination node*/
@@ -113,7 +124,7 @@ void SerialCtrlVendorWrite_Process(char *rcvdStringBuff, uint16_t rcvdStringSize
MOBLEUINT8 elementIndex = 0; /*default element index*/
MOBLE_RESULT result = MOBLE_RESULT_FAIL;
MOBLEBOOL response = MOBLE_FALSE;
- MOBLEUINT8 data_buff[VENDOR_DATA_BYTE];
+ MOBLEUINT8 data_buff[VENDOR_DATA_BUFFER_SIZE];
MOBLEUINT16 idx=0;
MOBLEUINT8 length;
MOBLEUINT8 j = 1;
@@ -122,15 +133,42 @@ void SerialCtrlVendorWrite_Process(char *rcvdStringBuff, uint16_t rcvdStringSize
if(command == 0x000E)
{
+ /* Check parameter if data to be send continuously */
+ if (idx == 0xFF)
+ {
+ data_buff[0] = 0x01; /* data write sub command; */
+ length = sizeof(data_buff)-1;
+ for(MOBLEUINT8 i=1;i <sizeof(data_buff);i++)
+ {
+ data_buff[j] = i;
+ j++;
+ }
+ Appli_Vendor_SetBigDataPacket(data_buff, length, 0 , peer);
+ Vendor_SendDataFreq(0xFF);
+ TRACE_I(TF_SERIAL_PRINTS,"Command Executed Successfully\r\n");
+ return;
+ }
+ /* Check parameter if continuously data send operation need to stop */
+ else if (idx == 0x00)
+ {
+ BSP_LED_Off(LED_BLUE);
+ Vendor_SendDataFreq(0x00);
+ TRACE_I(TF_SERIAL_PRINTS,"Command Executed Successfully\r\n");
+ return;
+ }
+ /* Data will be sent only once */
+ else
+ {
data_buff[0] = 0x01; /* data write sub command; */
length = sizeof(data_buff)-idx;
-
+ Vendor_SendDataFreq(0x00); /* To stop sending packets periodically */
for(MOBLEUINT8 i=idx;i <sizeof(data_buff);i++)
{
data_buff[j] = i;
j++;
}
}
+ }
else
{
length = SerialCtrl_GetData(rcvdStringBuff, rcvdStringSize, SERIAL_MODEL_DATA_OFFSET, data_buff);
@@ -146,27 +184,27 @@ void SerialCtrlVendorWrite_Process(char *rcvdStringBuff, uint16_t rcvdStringSize
}
if(result)
{
- TRACE_I(TF_SERIAL_CTRL,"Invalid Command\r\n");
+ TRACE_I(TF_SERIAL_PRINTS,"Invalid Command\r\n");
return;
}
else
{
-
result = BLEMesh_SetRemoteData(peer,elementIndex,command,
data_buff, length,
response, MOBLE_TRUE);
if(result == MOBLE_RESULT_SUCCESS)
{
- TRACE_I(TF_SERIAL_CTRL,"Command Executed Successfully\r\n");
+ TRACE_I(TF_SERIAL_PRINTS,"Command Executed Successfully\r\n");
}
else
{
- TRACE_I(TF_SERIAL_CTRL,"Invalid Opcode Parameter\r\n");
+ TRACE_I(TF_SERIAL_PRINTS,"Invalid Opcode Parameter\r\n");
}
}
}
+
void SerialCtrl_Process(char *rcvdStringBuff, uint16_t rcvdStringSize)
{
MOBLE_ADDRESS peer = 0; /*node adderess of the destination node*/
@@ -180,10 +218,29 @@ void SerialCtrl_Process(char *rcvdStringBuff, uint16_t rcvdStringSize)
sscanf(rcvdStringBuff+5, "%4hx %hx ", &peer,&command);
/* Callback to store a pointer to Opcode table starting sddress and length of the table*/
+#ifdef ENABLE_GENERIC_MODEL_SERVER
GenericModelServer_GetOpcodeTableCb(&Generic_OpcodeTable,&Generic_OpcodeTableLength);
+#else /* Get Generic Client OpCode Table */
+#ifdef ENABLE_GENERIC_MODEL_CLIENT
+ GenericModelClient_GetOpcodeTableCb(&Generic_OpcodeTable,&Generic_OpcodeTableLength);
+#endif
+#endif
+#ifdef ENABLE_LIGHT_MODEL_SERVER
LightModelServer_GetOpcodeTableCb(&Light_OpcodeTable,&Light_OpcodeTableLength);
- Light_LC_ModelServer_GetOpcodeTableCb(&LightLC_OpcodeTable,&LightLC_OpcodeTableLength);
+ LightLcServer_GetOpcodeTableCb(&LightLC_OpcodeTable,&LightLC_OpcodeTableLength);
+#else /* Get Light Client OpCode Table */
+#ifdef ENABLE_LIGHT_MODEL_CLIENT
+ LightModelClient_GetOpcodeTableCb(&Light_OpcodeTable,&Light_OpcodeTableLength);
+ //Note: Light LC is included in Lighting Client Model
+#endif
+#endif
+#ifdef ENABLE_SENSOR_MODEL_SERVER
SensorModelServer_GetOpcodeTableCb(&Sensor_OpcodeTable,&Sensor_OpcodeTableLength);
+#else /* Get Sensor Client OpCode Table */
+#ifdef ENABLE_SENSOR_MODEL_CLIENT
+ SensorsModelClient_GetOpcodeTableCb(&Sensor_OpcodeTable,&Sensor_OpcodeTableLength);
+#endif
+#endif
/* Minimum parameter length required for a valid opcade in Generic opcode table */
minParamLength = SerialCtrl_GetMinParamLength(command,
@@ -215,7 +272,7 @@ void SerialCtrl_Process(char *rcvdStringBuff, uint16_t rcvdStringSize)
Sensor_OpcodeTable,
Sensor_OpcodeTableLength);
- TRACE_I(TF_SERIAL_CTRL, "Min Parameter Length after sensor model check %d\r\n",
+ TRACE_I(TF_SERIAL_PRINTS, "Min Parameter Length after sensor model check %d\r\n",
minParamLength);
}
@@ -235,16 +292,16 @@ void SerialCtrl_Process(char *rcvdStringBuff, uint16_t rcvdStringSize)
MOBLE_FALSE);
if(result == MOBLE_RESULT_SUCCESS)
{
- TRACE_I(TF_SERIAL_CTRL,"Command Executed Successfully\r\n");
+ TRACE_I(TF_SERIAL_PRINTS, "Command Executed Successfully\r\n");
}
else
{
- TRACE_I(TF_SERIAL_CTRL,"Invalid Opcode Parameter\r\n");
+ TRACE_I(TF_SERIAL_PRINTS, "Invalid Opcode Parameter\r\n");
}
}
else
{
- TRACE_I(TF_SERIAL_CTRL,"Unknown Opcode\r\n");
+ TRACE_I(TF_SERIAL_PRINTS, "Unknown Opcode\r\n");
}
}
@@ -269,6 +326,7 @@ MOBLEUINT8 SerialCtrl_GetMinParamLength(MOBLEUINT32 opcode, const MODEL_OpcodeTa
return 0xff;
}
+
/**
* @brief This function extract the function parameter from the string
* @param rcvdStringBuff: array of the string parsed from the serial terminal
@@ -323,4 +381,4 @@ MOBLEUINT8 SerialCtrl_GetData(char *rcvdStringBuff, uint16_t rcvdStringSize, MOB
/**
* @}
*/
-/******************* (C) COPYRIGHT 2018 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
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 908cdaa1d..f9fc13ec8 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_if.c
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_if.c
@@ -6,7 +6,7 @@
******************************************************************************
* @attention
*
-* <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -38,8 +38,15 @@
#if ENABLE_SERIAL_PRVN
#include "serial_prvn.h"
#endif
+#ifdef ENABLE_SENSOR_MODEL_SERVER_SETUP
+#include "appli_sensor.h"
+#endif
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC_SETUP
+#include "appli_light_lc.h"
+#endif
-/** @addtogroup BLE_Mesh
+/** @addtogroup BlueNRG_Mesh
* @{
*/
@@ -309,6 +316,14 @@ void Serial_InterfaceProcess(void)
Rcvd_String[stringSize] = 0; /* Make last char NULL for string comp */
/* Check if correct string has been entered or not */
+
+ if ( 1 != 1 )
+ {
+ /* This will ALWAYS FAIL
+ This statement is put here so, next all statements can enter
+ "else if"
+ */
+ }
#ifdef ENABLE_SERIAL_CONTROL
if (!strncmp(Rcvd_String, "ATCL", 4))
{
@@ -347,9 +362,22 @@ void Serial_InterfaceProcess(void)
SerialPrvn_Process(Rcvd_String, stringSize);
}
#endif
+#ifdef ENABLE_SENSOR_MODEL_SERVER_SETUP
+ else if(!strncmp(Rcvd_String, "ATSNR", 5))
+ {
+ Appli_Sensor_SerialCmd(Rcvd_String, stringSize);
+ }
+#endif
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+ else if(!strncmp(Rcvd_String, "ATLLC", 5))
+ {
+ Appli_Light_LC_SerialCmd(Rcvd_String, stringSize);
+ }
+#endif
+
else
{
- TRACE_I(TF_SERIAL_CTRL,"Not Entered valid test parameters\r\n");
+ TRACE_I(TF_SERIAL_PRINTS,"Not Entered valid test parameters\r\n");
SerialCurrentState = STATE_IDLE;
}
while(stringSize)
@@ -405,7 +433,7 @@ void Serial_Init(void)
*/
void BLEMesh_PrintStringCb(const char *message)
{
- TRACE_I(TF_SERIAL_CTRL,"%s\n\r", (char*)message);
+ TRACE_I(TF_SERIAL_PRINTS,"%s\n\r", (char*)message);
}
/**
* @brief Callback function to print data array on screen LSB first
@@ -417,12 +445,11 @@ void BLEMesh_PrintDataCb(MOBLEUINT8* data, MOBLEUINT16 size)
{
for (int count=0; count<size; ++count)
{
- TRACE_I(TF_SERIAL_CTRL,"%02X", data[count]);
+ TRACE_I(TF_SERIAL_PRINTS,"%02X", data[count]);
}
- TRACE_I(TF_SERIAL_CTRL,"\n\r");
+ TRACE_I(TF_SERIAL_PRINTS,"\n\r");
}
-
/**
* @}
*/
@@ -430,4 +457,4 @@ void BLEMesh_PrintDataCb(MOBLEUINT8* data, MOBLEUINT16 size)
/**
* @}
*/
-/******************* (C) COPYRIGHT 2018 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
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 921cd3e00..f9a56b1d9 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_prvn.c
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_prvn.c
@@ -71,14 +71,14 @@ __weak MOBLE_RESULT BLEMesh_ProvisionDevice(neighbor_params_t *unprovDeviceArray
return MOBLE_RESULT_NOTIMPL;
}
/**
-* @brief This funcrion is used to parse the string given by the user
+* @brief This function is used to parse the string given by the user
* @param rcvdStringBuff: buffer to store input string
* @param rcvdStringSize: length of the input string
* @retval void
*/
void SerialPrvn_Process(char *rcvdStringBuff, uint16_t rcvdStringSize)
{
- MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLE_RESULT result = MOBLE_RESULT_INVALIDARG;
/* Command to make a devices as Root node which creates Mesh network credentials */
if (!strncmp(rcvdStringBuff+COMMAND_OFFSET, "ROOT",4))
@@ -86,6 +86,7 @@ void SerialPrvn_Process(char *rcvdStringBuff, uint16_t rcvdStringSize)
#if defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER)
/* Initializes Mesh network parameters */
Appli_StartProvisionerMode(1);
+ result = MOBLE_RESULT_SUCCESS;
#endif
}
/* Command to scan the unprovisioned devices */
@@ -166,11 +167,12 @@ static MOBLE_RESULT SerialPrvn_ProvisionDevice(char *text)
#if defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER)
MOBLEINT16 index = 0;
- MOBLEINT16 na = 0;
+// MOBLEINT16 na = 0;
- sscanf(text, "PRVN-%hd %hd", &index, &na);
- if(na>1)
+// sscanf(text, "PRVN-%hd %hd", &index, &na);
+ sscanf(text, "PRVN-%hd", &index);
+// if(na>1)
{ /* Address 1 is reserved for the Provisioner */
result = BLEMesh_ProvisionRemote(NeighborTable[index].uuid);
@@ -180,10 +182,10 @@ static MOBLE_RESULT SerialPrvn_ProvisionDevice(char *text)
NeighborTable[index].uuid,
UUID_SIZE);
}
- else
- {
- result = MOBLE_RESULT_INVALIDARG;
- }
+// else
+// {
+// result = MOBLE_RESULT_INVALIDARG;
+// }
#endif
return result;
@@ -254,4 +256,4 @@ void SerialPrvn_ProvisioningStatusUpdateCb(uint8_t flagPrvningInProcess, MOBLEUI
/**
* @}
*/
-/******************* (C) COPYRIGHT 2018 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
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 715bd4d88..ca6215c21 100644
--- a/Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_ut.c
+++ b/Middlewares/ST/STM32_WPAN/ble/mesh/Src/serial_ut.c
@@ -2,39 +2,17 @@
******************************************************************************
* @file serial_ut.c
* @author BLE Mesh Team
-* @version V1.07.000
-* @date 15-June-2018
* @brief Upper Tester file
******************************************************************************
* @attention
*
-* <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
+* <h2><center>&copy; Copyright (c) 2020 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. 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.
+* This software component is licensed by ST under Ultimate Liberty license
+* SLA0044, the "License"; You may not use this file except in compliance with
+* the License. You may obtain a copy of the License at:
+* www.st.com/SLA0044
*
******************************************************************************
*/
@@ -48,6 +26,13 @@
#if (ENABLE_UT)
#include "serial_ctrl.h"
#endif
+#ifdef ENABLE_SENSOR_MODEL_SERVER_SETUP
+#include "appli_sensor.h"
+#endif
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+#include "appli_light_lc.h"
+#endif
+
/** @addtogroup BLE_Mesh
* @{
*/
@@ -76,15 +61,18 @@
#define CMD_INDEX_SET_13 15
#define CMD_INDEX_SET_14 16
#define CMD_INDEX_SET_15 17
-#define CMD_INDEX_PRINT_01 18
+#define CMD_INDEX_SET_16 18 //TR0
+#define CMD_INDEX_SET_17 19 //OCCUPANCY
+#define CMD_INDEX_SET_18 20 //setv
+#define CMD_INDEX_SET_19 21 //PUBLISH
+#define CMD_INDEX_PRINT_01 22
-#define CMD_SET_COUNT 15
+#define CMD_SET_COUNT 19
#define CMD_SEND_COUNT 2
#define CMD_PRINT_COUNT 1
#define CMD_SET_OFFSET 7
#define CMD_SEND_OFFSET 8
-#define CMD_SET_OFFSET 7
#define CMD_PRINT_OFFSET 9
#define CMD_CTRL_OFFSET 5
/* Private variables ---------------------------------------------------------*/
@@ -105,6 +93,10 @@ void SerialUt_Process(char *rcvdStringBuff, uint16_t rcvdStringSize)
MOBLEUINT16 commandIndex = SerialUt_GetFunctionIndex(rcvdStringBuff+5);
MOBLEUINT8 testFunctionParm[6]= {'\0'} ;
MOBLEUINT8 asciiFunctionParameter[7] = {'\0'} ;
+#ifdef ENABLE_SENSOR_MODEL_SERVER
+ MOBLEUINT16 value = 0;
+ MOBLEUINT8 sensorOffset = 0;
+#endif
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
MOBLEBOOL unprovisioned = MOBLE_FALSE;
@@ -149,7 +141,18 @@ void SerialUt_Process(char *rcvdStringBuff, uint16_t rcvdStringSize)
case CMD_INDEX_SET_15:
result = BLEMesh_UpperTesterDataProcess(commandIndex, testFunctionParm);
break;
-
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+ /* Change Light LC property states transitions that are immediate*/
+ case CMD_INDEX_SET_16:
+ result = Light_LC_SetTransitionTimeZero(1);
+ break;
+ /* Change IUT's Light LC Occupancy state to 1*/
+ case CMD_INDEX_SET_17:
+ /* For Light LC on element index 1 */
+ Appli_Light_LC_SensorPropertyUpdate(1, PRESENCE_DETECTED_PID, 1);
+ result = MOBLE_RESULT_SUCCESS;
+ break;
+#endif
/* Updates the 96 hour IV Update limit */
case CMD_INDEX_SET_03:
/* Subscribe/Un-Subscribe to group address */
@@ -161,17 +164,30 @@ void SerialUt_Process(char *rcvdStringBuff, uint16_t rcvdStringSize)
sscanf(rcvdStringBuff + CMD_CTRL_OFFSET + CMD_SET_OFFSET, "%1c", testFunctionParm);
result = BLEMesh_UpperTesterDataProcess( commandIndex, testFunctionParm);
break;
-
/* Sets system faults for Health Model*/
case CMD_INDEX_SET_10:
sscanf(rcvdStringBuff + CMD_CTRL_OFFSET + CMD_SET_OFFSET, "%2s %1c", asciiFunctionParameter, testFunctionParm+1);
SerialUt_doubleHexToHex(asciiFunctionParameter,testFunctionParm,2);
result = BLEMesh_UpperTesterDataProcess( commandIndex, testFunctionParm);
break;
-
+#ifdef ENABLE_SENSOR_MODEL_SERVER
+ /* MMDL/SR/SNRS/BV-09-C, during test */
+ case CMD_INDEX_SET_18:
+ sscanf(rcvdStringBuff + CMD_CTRL_OFFSET + CMD_SET_OFFSET, "%4hx", &value);
+ result = Appli_Sensor_Update(sensorOffset, value);
+ break;
+
+ /* MMDL/SR/SNRS/BV-08-C */
+ case CMD_INDEX_SET_19:
+ scanf(rcvdStringBuff + CMD_CTRL_OFFSET + CMD_SET_OFFSET, "%1hx %1hx", &value);
+ sensorOffset = value;
+ result = Sensor_UpdatePublishState(sensorOffset, value);
+ break;
+#endif
/* Unprovisions the Node */
case CMD_INDEX_SET_02:
{
+ BLEMesh_StopAdvScan();
unprovisioned = BLEMesh_IsUnprovisioned();
result = BLEMesh_UpperTesterDataProcess(commandIndex, testFunctionParm);
}
@@ -287,3 +303,4 @@ __weak MOBLE_RESULT BLEMesh_UpperTesterDataProcess(MOBLEUINT8 testFunctionIndex,
return MOBLE_RESULT_SUCCESS;
}
+
diff --git a/Middlewares/ST/STM32_WPAN/ble/svc/Src/mesh.c b/Middlewares/ST/STM32_WPAN/ble/svc/Src/mesh.c
index 1897e3bc2..53d7e0f38 100644
--- a/Middlewares/ST/STM32_WPAN/ble/svc/Src/mesh.c
+++ b/Middlewares/ST/STM32_WPAN/ble/svc/Src/mesh.c
@@ -43,6 +43,11 @@ const MOBLE_USER_BLE_CB_MAP user_ble_cb =
Appli_BleDisableFilterCb
};
+const MOBLE_CONFIG_MODEL_CB_MAP config_model_cb =
+{
+ Appli_GetPublicationParamsCb
+};
+
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
@@ -101,6 +106,9 @@ void MESH_Init(void)
/* Set BLE configuration function callbacks */
BLEMesh_BleHardwareInitCallBack(&user_ble_cb);
+ /*Set BLE Config Model APIs callback*/
+ BLEMesh_BleConfigModelInitCallBack(&config_model_cb);
+
/* Initializes BLE-Mesh Library */
if (MOBLE_FAILED(BLEMesh_Init(&BLEMeshlib_Init_params)))
{
@@ -112,30 +120,16 @@ void MESH_Init(void)
}
}
- /* Initialization of the SIG Models list */
- if(MOBLE_FAILED(ApplicationInitSigModelList()))
+ /*Check SIG & VENDOR models limit*/
+ if(MOBLE_FAILED(AppliCheck_EnabledModelsList()))
{
- 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();
}
}
-
- /* Initialization of the Vendor Models list */
- if(MOBLE_FAILED(ApplicationInitVendorModelList()))
- {
- 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"
@@ -239,157 +233,322 @@ void MESH_Init(void)
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
+ TRACE_I(TF_MISC,"[Features Supported] \r\n");
#ifdef ENABLE_RELAY_FEATURE
- TRACE_I(TF_MISC,"Feature: Relay Enabled \r\n");
+ TRACE_I(TF_MISC,"Relay = Enabled \r\n");
#endif
#ifdef ENABLE_PROXY_FEATURE
- TRACE_I(TF_MISC,"Feature: Proxy Enabled \r\n");
+ TRACE_I(TF_MISC,"Proxy = Enabled \r\n");
#endif
#ifdef ENABLE_FRIEND_FEATURE
- TRACE_I(TF_MISC,"Feature: Friend Enabled \r\n");
+ TRACE_I(TF_MISC,"Friend = Enabled \r\n");
#endif
-#ifdef ENABLE_PUB_KEY_TYPE_OOB
- TRACE_I(TF_MISC,"Public Key OOB Enabled \r\n");
-#endif
+#ifdef ENABLE_LOW_POWER_FEATURE
+ TRACE_I(TF_MISC,"Low Power = Enabled \r\n");
+#endif
-#ifdef ENABLE_AUTH_TYPE_STATIC_OOB
- TRACE_I(TF_MISC,"Static OOB Enabled \r\n");
+#ifdef ENABLE_PROVISIONER_FEATURE
+ TRACE_I(TF_MISC,"Provisioner = Enabled \r\n");
+#endif
+
+#ifdef DYNAMIC_PROVISIONER
+ TRACE_I(TF_MISC,"Dynamic Provisioner = Enabled \r\n");
+#endif
+
+ TRACE_I(TF_MISC,"\n[Options] \r\n");
+
+#ifdef ENABLE_PB_ADV
+ TRACE_I(TF_MISC,"PB-ADV = Enabled \r\n");
#endif
-#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
- TRACE_I(TF_MISC,"Output OOB Enabled \r\n");
+#ifdef ENABLE_PB_GATT
+ TRACE_I(TF_MISC,"PB-GATT = Enabled \r\n");
#endif
-#ifdef ENABLE_AUTH_TYPE_INPUT_OOB
- TRACE_I(TF_MISC,"Input OOB Enabled \r\n");
+#ifdef ENABLE_PUB_KEY_TYPE_OOB
+ TRACE_I(TF_MISC,"Public Key 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);
+#ifdef ENABLE_AUTH_TYPE_STATIC_OOB
+ TRACE_I(TF_MISC,"Static OOB = Enabled \r\n");
#endif
-#ifdef ENABLE_SAVE_MODEL_STATE_NVM
- TRACE_I(TF_MISC,"Models data will be saved in Flash \r\n");
+#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
+ TRACE_I(TF_MISC,"Output OOB = Enabled \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");
+#ifdef ENABLE_AUTH_TYPE_INPUT_OOB
+ TRACE_I(TF_MISC,"Input OOB = Enabled \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
+ TRACE_I(TF_MISC,"\n[Library Capabilities] \r\n");
-#if SAVE_EMBD_PROVISION_DATA
- TRACE_I(TF_MISC,"Embedded Provisioner data saving enabled \r\n");
-#endif
+ TRACE_I(TF_MISC,"Net Keys = %d \r\n", BLEMesh_GetNetKeysCount());
+ TRACE_I(TF_MISC,"App Keys = %d \r\n", BLEMesh_GetAppKeysCount());
+ TRACE_I(TF_MISC,"Elements per Node = %d \r\n", BLEMesh_GetNumberOfElements());
+ TRACE_I(TF_MISC,"Models per Element = %d \r\n", BLEMesh_GetTotalModelsCount());
+ TRACE_I(TF_MISC,"Subscription per Model = %d \r\n", BLEMesh_GetSubscriptionCount());
-#ifdef APPLICATION_NUMBER_OF_ELEMENTS
- TRACE_I(TF_MISC,"Number of Elements enabled: %d \r\n", APPLICATION_NUMBER_OF_ELEMENTS);
-#endif
+ TRACE_I(TF_MISC,"\n[Enabled Models] \r\n");
-#ifdef ENABLE_NEIGHBOR_TABLE
- TRACE_I(TF_MISC,"Neighbour Table is enabled \r\n");
+ for(uint8_t elementCount=0; elementCount<APPLICATION_NUMBER_OF_ELEMENTS; elementCount++)
+ {
+ TRACE_I(TF_MISC,"For Element Index = %d or Element Number = %d \r\n", elementCount, (elementCount+1));
+#ifdef ENABLE_VENDOR_MODEL_SERVER
+ if ((ENABLE_VENDOR_MODEL_SERVER & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Vendor Server \r\n");
+ }
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF
- TRACE_I(TF_MISC,"Generic On Off Server Model enabled \r\n");
+ if ((ENABLE_GENERIC_MODEL_SERVER_ONOFF & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Generic On Off Server \r\n");
+ }
+#endif
+
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_ONOFF
+ if ((ENABLE_GENERIC_MODEL_CLIENT_ONOFF & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Generic On Off Client \r\n");
+ }
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_LEVEL
- TRACE_I(TF_MISC,"Generic Level Server Model enabled \r\n");
+ if ((ENABLE_GENERIC_MODEL_SERVER_LEVEL & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Generic Level Server \r\n");
+ }
+#endif
+
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_LEVEL
+ if ((ENABLE_GENERIC_MODEL_CLIENT_LEVEL & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Generic Level Client \r\n");
+ }
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME
- TRACE_I(TF_MISC,"Generic Default Transition Server Model enabled \r\n");
+ if ((ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Generic Default Transition Server \r\n");
+ }
+#endif
+
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_DEFAULT_TRANSITION_TIME
+ if ((ENABLE_GENERIC_MODEL_CLIENT_DEFAULT_TRANSITION_TIME & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Generic Default Transition Client \r\n");
+ }
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF
- TRACE_I(TF_MISC,"Generic Power On Off Server Model enabled \r\n");
+ if ((ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Generic Power On Off Server \r\n");
+ }
+#endif
+
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_POWER_ONOFF
+ if ((ENABLE_GENERIC_MODEL_CLIENT_POWER_ONOFF & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Generic Power On Off Client \r\n");
+ }
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL
- TRACE_I(TF_MISC,"Generic Power Level Server Model enabled \r\n");
+ if((ENABLE_GENERIC_MODEL_SERVER_POWER_LEVEL & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Generic Power Level Server \r\n");
+ }
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_BATTERY
- TRACE_I(TF_MISC,"Generic Battery Server Model enabled \r\n");
+ if((ENABLE_GENERIC_MODEL_SERVER_BATTERY & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Generic Battery Server \r\n");
+ }
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_LOCATION
- TRACE_I(TF_MISC,"Generic Location Server Model enabled \r\n");
+ if((ENABLE_GENERIC_MODEL_SERVER_LOCATION & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Generic Location Server \r\n");
+ }
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_ADMIN_PROPERTY
- TRACE_I(TF_MISC,"Generic Admin Property Server Model enabled \r\n");
+ if((ENABLE_GENERIC_MODEL_SERVER_ADMIN_PROPERTY & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Generic Admin Property Server \r\n");
+ }
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_MANUFACTURER_PROPERTY
- TRACE_I(TF_MISC,"Generic Manufacturer Property Server Model enabled \r\n");
+ if((ENABLE_GENERIC_MODEL_SERVER_MANUFACTURER_PROPERTY & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Generic Manufacturer Property Server \r\n");
+ }
#endif
#ifdef ENABLE_GENERIC_MODEL_SERVER_USER_PROPERTY
- TRACE_I(TF_MISC,"Generic User Property Server Model enabled \r\n");
+ if((ENABLE_GENERIC_MODEL_SERVER_USER_PROPERTY & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Generic User Property Server \r\n");
+ }
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
- TRACE_I(TF_MISC,"Light Lightness Server Model enabled \r\n");
+ if((ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Light Lightness Server \r\n");
+ }
+#endif
+
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS
+ if((ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Light Lightness Client \r\n");
+ }
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL
- TRACE_I(TF_MISC,"Light CTL Server Model enabled \r\n");
+ if((ENABLE_LIGHT_MODEL_SERVER_CTL & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Light CTL Server \r\n");
+ }
+#endif
+
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_CTL
+ if((ENABLE_LIGHT_MODEL_CLIENT_CTL & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Light CTL Client \r\n");
+ }
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE
- TRACE_I(TF_MISC,"Light CTL Temperature Server Model enabled \r\n");
+ if((ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Light CTL Temperature Server \r\n");
+ }
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL
- TRACE_I(TF_MISC,"Light HSL Server Model enabled \r\n");
+ if((ENABLE_LIGHT_MODEL_SERVER_HSL & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Light HSL Server \r\n");
+ }
+#endif
+
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_HSL
+ if((ENABLE_LIGHT_MODEL_CLIENT_HSL & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Light HSL Client \r\n");
+ }
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_HUE
- TRACE_I(TF_MISC,"Light HSL Hue Model enabled \r\n");
+ if((ENABLE_LIGHT_MODEL_SERVER_HSL_HUE & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Light HSL Hue \r\n");
+ }
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION
- TRACE_I(TF_MISC,"Light HSL Saturation Server Model enabled \r\n");
+ if((ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Light HSL Saturation Server \r\n");
+ }
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_XYL
- TRACE_I(TF_MISC,"Light XYL Server Model enabled \r\n");
+ if((ENABLE_LIGHT_MODEL_SERVER_XYL & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Light XYL Server \r\n");
+ }
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
- TRACE_I(TF_MISC,"Light LC Server Model enabled \r\n");
+ if((ENABLE_LIGHT_MODEL_SERVER_LC & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Light LC Server \r\n");
+ }
+#endif
+
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_LC
+ if((ENABLE_LIGHT_MODEL_CLIENT_LC & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Light LC Client \r\n");
+ }
#endif
#ifdef ENABLE_SENSOR_MODEL_SERVER
- TRACE_I(TF_MISC,"Sensor Server Model enabled \r\n");
+ if((ENABLE_SENSOR_MODEL_SERVER & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Sensor Server \r\n");
+ }
+#endif
+
+#ifdef ENABLE_SENSOR_MODEL_CLIENT
+ if((ENABLE_SENSOR_MODEL_CLIENT & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Sensor Client \r\n");
+ }
#endif
#ifdef ENABLE_TIME_MODEL_SERVER
- TRACE_I(TF_MISC,"Time Server Model enabled \r\n");
+ if((ENABLE_TIME_MODEL_SERVER & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Time Server \r\n");
+ }
#endif
#ifdef ENABLE_SCENE_MODEL_SERVER
- TRACE_I(TF_MISC,"Scene Model enabled \r\n")
+ if((ENABLE_SCENE_MODEL_SERVER & (1 << elementCount)) == (1 << elementCount))
+ {
+ TRACE_I(TF_MISC,"Scene \r\n");
+ }
+#endif
+ }
+
+TRACE_I(TF_MISC,"\n[Important Information] \r\n");
+
+#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 will 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 in Application: %d \r\n", APPLICATION_NUMBER_OF_ELEMENTS);
+#endif
+
+#ifdef ENABLE_NEIGHBOR_TABLE
+ TRACE_I(TF_MISC,"Neighbour Table is enabled \r\n");
+#endif
+
TRACE_I(TF_MISC,"********************\r\n\r\n");
}
-/************************ (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/************************ (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
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 1edf1feb7..1555933f5 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
@@ -392,6 +392,44 @@ SHCI_CmdStatus_t SHCI_C2_CONCURRENT_SetMode( SHCI_C2_CONCURRENT_Mode_Param_t Mod
return (SHCI_CmdStatus_t)(((TL_CcEvt_t*)(p_rsp->evtserial.evt.payload))->payload[0]);
}
+SHCI_CmdStatus_t SHCI_C2_CONCURRENT_GetNextBleEvtTime( SHCI_C2_CONCURRENT_GetNextBleEvtTime_Param_t *pParam )
+{
+ /**
+ * Buffer is large enough to hold command complete without payload
+ */
+ uint8_t local_buffer[TL_BLEEVT_CS_BUFFER_SIZE+4];
+ TL_EvtPacket_t * p_rsp;
+
+ p_rsp = (TL_EvtPacket_t *)local_buffer;
+
+ shci_send( SHCI_OPCODE_C2_CONCURRENT_GET_NEXT_BLE_EVT_TIME,
+ 0,
+ 0,
+ p_rsp );
+
+ memcpy((void*)&(pParam->relative_time), (void*)&((TL_CcEvt_t*)(p_rsp->evtserial.evt.payload))->payload[1], sizeof(pParam->relative_time));
+
+ return (SHCI_CmdStatus_t)(((TL_CcEvt_t*)(p_rsp->evtserial.evt.payload))->payload[0]);
+}
+
+SHCI_CmdStatus_t SHCI_C2_CONCURRENT_EnableNext_802154_EvtNotification( void )
+{
+ /**
+ * 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_CONCURRENT_ENABLE_NEXT_802154_EVT_NOTIFICATION,
+ 0,
+ 0,
+ p_rsp );
+
+ return (SHCI_CmdStatus_t)(((TL_CcEvt_t*)(p_rsp->evtserial.evt.payload))->payload[0]);
+}
+
SHCI_CmdStatus_t SHCI_C2_FLASH_StoreData( SHCI_C2_FLASH_Ip_t Ip )
{
/**
@@ -562,46 +600,90 @@ SHCI_CmdStatus_t SHCI_GetWirelessFwInfo( WirelessFwInfo_t* pWirelessInfo )
{
uint32_t ipccdba = 0;
MB_RefTable_t * p_RefTable = NULL;
- uint32_t version = 0;
- uint32_t memorySize = 0;
- uint32_t infoStack = 0;
+ uint32_t wireless_firmware_version = 0;
+ uint32_t wireless_firmware_memorySize = 0;
+ uint32_t wireless_firmware_infoStack = 0;
+ MB_FUS_DeviceInfoTable_t * p_fus_device_info_table = NULL;
+ uint32_t fus_version = 0;
+ uint32_t fus_memorySize = 0;
ipccdba = READ_BIT( FLASH->IPCCBR, FLASH_IPCCBR_IPCCDBA );
- p_RefTable = (MB_RefTable_t*)((ipccdba<<2) + SRAM2A_BASE);
+
+ /**
+ * The Device Info Table mapping depends on which firmware is running on CPU2.
+ * If the FUS is running on CPU2, FUS_DEVICE_INFO_TABLE_VALIDITY_KEYWORD shall be written in the table.
+ * Otherwise, it means the Wireless Firmware is running on the CPU2
+ */
+ p_fus_device_info_table = (MB_FUS_DeviceInfoTable_t*)(*(uint32_t*)((ipccdba<<2) + SRAM2A_BASE));
+
+ if(p_fus_device_info_table->DeviceInfoTableState == FUS_DEVICE_INFO_TABLE_VALIDITY_KEYWORD)
+ {
+ /* The FUS is running on CPU2 */
+ /**
+ * Retrieve the WirelessFwInfoTable
+ * This table is stored in RAM at startup during the TL (transport layer) initialization
+ */
+ wireless_firmware_version = p_fus_device_info_table->WirelessStackVersion;
+ wireless_firmware_memorySize = p_fus_device_info_table->WirelessStackMemorySize;
+ wireless_firmware_infoStack = p_fus_device_info_table->WirelessFirmwareBleInfo;
+
+ /**
+ * Retrieve the FusInfoTable
+ * This table is stored in RAM at startup during the TL (transport layer) initialization
+ */
+ fus_version = p_fus_device_info_table->FusVersion;
+ fus_memorySize = p_fus_device_info_table->FusMemorySize;
+ }
+ else
+ {
+ /* The Wireless Firmware is running on CPU2 */
+
+ p_RefTable = (MB_RefTable_t*)((ipccdba<<2) + SRAM2A_BASE);
+
+ /**
+ * Retrieve the WirelessFwInfoTable
+ * This table is stored in RAM at startup during the TL (transport layer) initialization
+ */
+ wireless_firmware_version = p_RefTable->p_device_info_table->WirelessFwInfoTable.Version;
+ wireless_firmware_memorySize = p_RefTable->p_device_info_table->WirelessFwInfoTable.MemorySize;
+ wireless_firmware_infoStack = p_RefTable->p_device_info_table->WirelessFwInfoTable.InfoStack;
+
+ /**
+ * Retrieve the FusInfoTable
+ * This table is stored in RAM at startup during the TL (transport layer) initialization
+ */
+ fus_version = p_RefTable->p_device_info_table->FusInfoTable.Version;
+ fus_memorySize = p_RefTable->p_device_info_table->FusInfoTable.MemorySize;
+ }
/**
* Retrieve the WirelessFwInfoTable
* This table is stored in RAM at startup during the TL (transport layer) initialization
*/
- version = p_RefTable->p_device_info_table->WirelessFwInfoTable.Version;
- pWirelessInfo->VersionMajor = ((version & INFO_VERSION_MAJOR_MASK) >> INFO_VERSION_MAJOR_OFFSET);
- pWirelessInfo->VersionMinor = ((version & INFO_VERSION_MINOR_MASK) >> INFO_VERSION_MINOR_OFFSET);
- pWirelessInfo->VersionSub = ((version & INFO_VERSION_SUB_MASK) >> INFO_VERSION_SUB_OFFSET);
- pWirelessInfo->VersionBranch = ((version & INFO_VERSION_BRANCH_MASK) >> INFO_VERSION_BRANCH_OFFSET);
- pWirelessInfo->VersionReleaseType = ((version & INFO_VERSION_TYPE_MASK) >> INFO_VERSION_TYPE_OFFSET);
-
- memorySize = p_RefTable->p_device_info_table->WirelessFwInfoTable.MemorySize;
- pWirelessInfo->MemorySizeSram2B = ((memorySize & INFO_SIZE_SRAM2B_MASK) >> INFO_SIZE_SRAM2B_OFFSET);
- pWirelessInfo->MemorySizeSram2A = ((memorySize & INFO_SIZE_SRAM2A_MASK) >> INFO_SIZE_SRAM2A_OFFSET);
- pWirelessInfo->MemorySizeSram1 = ((memorySize & INFO_SIZE_SRAM1_MASK) >> INFO_SIZE_SRAM1_OFFSET);
- pWirelessInfo->MemorySizeFlash = ((memorySize & INFO_SIZE_FLASH_MASK) >> INFO_SIZE_FLASH_OFFSET);
-
- infoStack = p_RefTable->p_device_info_table->WirelessFwInfoTable.InfoStack;
- pWirelessInfo->StackType = ((infoStack & INFO_STACK_TYPE_MASK) >> INFO_STACK_TYPE_OFFSET);
+ pWirelessInfo->VersionMajor = ((wireless_firmware_version & INFO_VERSION_MAJOR_MASK) >> INFO_VERSION_MAJOR_OFFSET);
+ pWirelessInfo->VersionMinor = ((wireless_firmware_version & INFO_VERSION_MINOR_MASK) >> INFO_VERSION_MINOR_OFFSET);
+ pWirelessInfo->VersionSub = ((wireless_firmware_version & INFO_VERSION_SUB_MASK) >> INFO_VERSION_SUB_OFFSET);
+ pWirelessInfo->VersionBranch = ((wireless_firmware_version & INFO_VERSION_BRANCH_MASK) >> INFO_VERSION_BRANCH_OFFSET);
+ pWirelessInfo->VersionReleaseType = ((wireless_firmware_version & INFO_VERSION_TYPE_MASK) >> INFO_VERSION_TYPE_OFFSET);
+
+ pWirelessInfo->MemorySizeSram2B = ((wireless_firmware_memorySize & INFO_SIZE_SRAM2B_MASK) >> INFO_SIZE_SRAM2B_OFFSET);
+ pWirelessInfo->MemorySizeSram2A = ((wireless_firmware_memorySize & INFO_SIZE_SRAM2A_MASK) >> INFO_SIZE_SRAM2A_OFFSET);
+ pWirelessInfo->MemorySizeSram1 = ((wireless_firmware_memorySize & INFO_SIZE_SRAM1_MASK) >> INFO_SIZE_SRAM1_OFFSET);
+ pWirelessInfo->MemorySizeFlash = ((wireless_firmware_memorySize & INFO_SIZE_FLASH_MASK) >> INFO_SIZE_FLASH_OFFSET);
+
+ pWirelessInfo->StackType = ((wireless_firmware_infoStack & INFO_STACK_TYPE_MASK) >> INFO_STACK_TYPE_OFFSET);
/**
* Retrieve the FusInfoTable
* This table is stored in RAM at startup during the TL (transport layer) initialization
*/
- version = p_RefTable->p_device_info_table->FusInfoTable.Version;
- pWirelessInfo->FusVersionMajor = ((version & INFO_VERSION_MAJOR_MASK) >> INFO_VERSION_MAJOR_OFFSET);
- pWirelessInfo->FusVersionMinor = ((version & INFO_VERSION_MINOR_MASK) >> INFO_VERSION_MINOR_OFFSET);
- pWirelessInfo->FusVersionSub = ((version & INFO_VERSION_SUB_MASK) >> INFO_VERSION_SUB_OFFSET);
-
- memorySize = p_RefTable->p_device_info_table->FusInfoTable.MemorySize;
- pWirelessInfo->FusMemorySizeSram2B = ((memorySize & INFO_SIZE_SRAM2B_MASK) >> INFO_SIZE_SRAM2B_OFFSET);
- pWirelessInfo->FusMemorySizeSram2A = ((memorySize & INFO_SIZE_SRAM2A_MASK) >> INFO_SIZE_SRAM2A_OFFSET);
- pWirelessInfo->FusMemorySizeFlash = ((memorySize & INFO_SIZE_FLASH_MASK) >> INFO_SIZE_FLASH_OFFSET);
+ pWirelessInfo->FusVersionMajor = ((fus_version & INFO_VERSION_MAJOR_MASK) >> INFO_VERSION_MAJOR_OFFSET);
+ pWirelessInfo->FusVersionMinor = ((fus_version & INFO_VERSION_MINOR_MASK) >> INFO_VERSION_MINOR_OFFSET);
+ pWirelessInfo->FusVersionSub = ((fus_version & INFO_VERSION_SUB_MASK) >> INFO_VERSION_SUB_OFFSET);
+
+ pWirelessInfo->FusMemorySizeSram2B = ((fus_memorySize & INFO_SIZE_SRAM2B_MASK) >> INFO_SIZE_SRAM2B_OFFSET);
+ pWirelessInfo->FusMemorySizeSram2A = ((fus_memorySize & INFO_SIZE_SRAM2A_MASK) >> INFO_SIZE_SRAM2A_OFFSET);
+ pWirelessInfo->FusMemorySizeFlash = ((fus_memorySize & INFO_SIZE_FLASH_MASK) >> INFO_SIZE_FLASH_OFFSET);
return (SHCI_Success);
}
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 e737f4c58..1f05e7dc4 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
@@ -35,22 +35,22 @@ extern "C" {
typedef enum
{
WIRELESS_FW_RUNNING = 0x00,
- RSS_FW_RUNNING = 0x01,
+ FUS_FW_RUNNING = 0x01,
} SHCI_SysEvt_Ready_Rsp_t;
/* ERROR CODES
*
- * These error codes are detected on M0 side and are send back to the M4 via a system
- * notification message. It is up to the application running on M4 to manage these errors
+ * These error codes are detected on CPU2 side and are send back to the CPU1 via a system
+ * notification message. It is up to the application running on CPU1 to manage these errors
*
* These errors can be generated by all layers (low level driver, stack, framework infrastructure, etc..)
*/
typedef enum
{
- ERR_BLE_INIT = 0,
- ERR_THREAD_LLD_FATAL_ERROR = 125, /* The LLD driver used on 802_15_4 detected a fatal error */
- ERR_THREAD_UNKNOWN_CMD = 126, /* The command send by the M4 to control the Thread stack is unknown */
- ERR_ZIGBEE_UNKNOWN_CMD = 200, /* The command send by the M4 to control the Zigbee stack is unknown */
+ ERR_BLE_INIT = 0, /* This event is currently not reported by the CPU2 */
+ ERR_THREAD_LLD_FATAL_ERROR = 125, /* The LLD driver used on 802_15_4 detected a fatal error */
+ ERR_THREAD_UNKNOWN_CMD = 126, /* The command send by the CPU1 to control the Thread stack is unknown */
+ ERR_ZIGBEE_UNKNOWN_CMD = 200, /* The command send by the CPU1 to control the Zigbee stack is unknown */
} SCHI_SystemErrCode_t;
#define SHCI_EVTCODE ( 0xFF )
@@ -64,11 +64,12 @@ extern "C" {
SHCI_SUB_EVT_CODE_READY = SHCI_SUB_EVT_CODE_BASE,
SHCI_SUB_EVT_ERROR_NOTIF,
SHCI_SUB_EVT_BLE_NVM_RAM_UPDATE,
- SHCI_SUB_EVT_OT_NVM_RAM_UPDATE,
+ SHCI_SUB_EVT_THREAD_NVM_RAM_UPDATE,
SHCI_SUB_EVT_NVM_START_WRITE,
SHCI_SUB_EVT_NVM_END_WRITE,
SHCI_SUB_EVT_NVM_START_ERASE,
SHCI_SUB_EVT_NVM_END_ERASE,
+ SHCI_SUB_EVT_CODE_CONCURRENT_802154_EVT,
} SHCI_SUB_EVT_CODE_t;
/**
@@ -101,7 +102,7 @@ extern "C" {
} SHCI_C2_BleNvmRamUpdate_Evt_t;
/**
- * SHCI_SUB_EVT_OT_NVM_RAM_UPDATE
+ * SHCI_SUB_EVT_THREAD_NVM_RAM_UPDATE
* This notifies the CPU1 which part of the OT NVM RAM has been updated so that only the modified
* section could be written in Flash/NVM
* StartAddress : Start address of the section that has been modified
@@ -110,7 +111,7 @@ extern "C" {
typedef PACKED_STRUCT{
uint32_t StartAddress;
uint32_t Size;
- } SHCI_C2_OtNvmRamUpdate_Evt_t;
+ } SHCI_C2_ThreadNvmRamUpdate_Evt_t;
/**
* SHCI_SUB_EVT_NVM_START_WRITE
@@ -160,6 +161,7 @@ extern "C" {
SHCI_UNKNOWN_CMD = 0x01,
SHCI_ERR_UNSUPPORTED_FEATURE = 0x11,
SHCI_ERR_INVALID_HCI_CMD_PARAMS = 0x12,
+ SHCI_ERR_INVALID_PARAMS = 0x42,
SHCI_FUS_CMD_NOT_SUPPORTED = 0xFF,
} SHCI_CmdStatus_t;
@@ -214,8 +216,10 @@ extern "C" {
SHCI_OCF_C2_LLD_TESTS_INIT,
SHCI_OCF_C2_EXTPA_CONFIG,
SHCI_OCF_C2_SET_FLASH_ACTIVITY_CONTROL,
- SHCI_OCF_C2_LLD_BLE_INIT,
- SHCI_OCF_C2_CONFIG,
+ SHCI_OCF_C2_LLD_BLE_INIT,
+ SHCI_OCF_C2_CONFIG,
+ SHCI_OCF_C2_CONCURRENT_GET_NEXT_BLE_EVT_TIME,
+ SHCI_OCF_C2_CONCURRENT_ENABLE_NEXT_802154_EVT_NOTIFICATION,
} SHCI_OCF_t;
#define SHCI_OPCODE_C2_FUS_GET_STATE (( SHCI_OGF << 10) + SHCI_OCF_C2_FUS_GET_STATE)
@@ -422,7 +426,19 @@ extern "C" {
ZIGBEE_ENABLE,
} SHCI_C2_CONCURRENT_Mode_Param_t;
/** No response parameters*/
-
+
+#define SHCI_OPCODE_C2_CONCURRENT_GET_NEXT_BLE_EVT_TIME (( SHCI_OGF << 10) + SHCI_OCF_C2_CONCURRENT_GET_NEXT_BLE_EVT_TIME)
+/** command parameters */
+ typedef PACKED_STRUCT
+ {
+ uint32_t relative_time;
+ } SHCI_C2_CONCURRENT_GetNextBleEvtTime_Param_t;
+ /** No response parameters*/
+
+#define SHCI_OPCODE_C2_CONCURRENT_ENABLE_NEXT_802154_EVT_NOTIFICATION (( SHCI_OGF << 10) + SHCI_OCF_C2_CONCURRENT_ENABLE_NEXT_802154_EVT_NOTIFICATION)
+ /** No command parameters */
+ /** No response parameters*/
+
#define SHCI_OPCODE_C2_FLASH_STORE_DATA (( SHCI_OGF << 10) + SHCI_OCF_C2_FLASH_STORE_DATA)
#define SHCI_OPCODE_C2_FLASH_ERASE_DATA (( SHCI_OGF << 10) + SHCI_OCF_C2_FLASH_ERASE_DATA)
/** command parameters */
@@ -512,7 +528,7 @@ extern "C" {
*/
#define SHCI_C2_CONFIG_EVTMASK1_BIT0_ERROR_NOTIF_ENABLE (1<<0)
#define SHCI_C2_CONFIG_EVTMASK1_BIT1_BLE_NVM_RAM_UPDATE_ENABLE (1<<1)
-#define SHCI_C2_CONFIG_EVTMASK1_BIT2_OT_NVM_RAM_UPDATE_ENABLE (1<<2)
+#define SHCI_C2_CONFIG_EVTMASK1_BIT2_THREAD_NVM_RAM_UPDATE_ENABLE (1<<2)
#define SHCI_C2_CONFIG_EVTMASK1_BIT3_NVM_START_WRITE_ENABLE (1<<3)
#define SHCI_C2_CONFIG_EVTMASK1_BIT4_NVM_END_WRITE_ENABLE (1<<4)
#define SHCI_C2_CONFIG_EVTMASK1_BIT5_NVM_START_ERASE_ENABLE (1<<5)
@@ -536,18 +552,17 @@ extern "C" {
/** No response parameters*/
/* Exported type --------------------------------------------------------*/
-
-typedef MB_WirelessFwInfoTable_t SHCI_WirelessFwInfoTable_t;
+#define FUS_DEVICE_INFO_TABLE_VALIDITY_KEYWORD (0xA94656B9)
/*
* At startup, the informations relative to the wireless binary are stored in RAM trough a structure defined by
- * SHCI_WirelessFwInfoTable_t.This structure contains 4 fields (Version,MemorySize, Stack_info and a reserved part)
+ * MB_WirelessFwInfoTable_t.This structure contains 4 fields (Version,MemorySize, Stack_info and a reserved part)
* each of those coded on 32 bits as shown on the table below:
*
*
* |7 |6 |5 |4 |3 |2 |1 |0 |7 |6 |5 |4 |3 |2 |1 |0 |7 |6 |5 |4 |3 |2 |1 |0 |7 |6 |5 |4 |3 |2 |1 |0 |
* -------------------------------------------------------------------------------------------------
- * Version | Major version | Minor version | Sub version | Branch |Releas Type|
+ * Version | Major version | Minor version | Sub version | Branch |ReleaseType|
* -------------------------------------------------------------------------------------------------
* MemorySize | SRAM2B (kB) | SRAM2A (kB) | SRAM1 (kB) | FLASH (4kb) |
* -------------------------------------------------------------------------------------------------
@@ -590,13 +605,14 @@ typedef MB_WirelessFwInfoTable_t SHCI_WirelessFwInfoTable_t;
#define INFO_STACK_TYPE_BLE_STANDARD 0x01
#define INFO_STACK_TYPE_BLE_HCI 0x02
#define INFO_STACK_TYPE_BLE_LIGHT 0x03
+#define INFO_STACK_TYPE_BLE_BEACON 0x04
#define INFO_STACK_TYPE_THREAD_FTD 0x10
#define INFO_STACK_TYPE_THREAD_MTD 0x11
#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_BLE_THREAD_FTD_DYAMIC 0x51
+#define INFO_STACK_TYPE_BLE_THREAD_FTD_DYAMIC 0x51
#define INFO_STACK_TYPE_802154_LLD_TESTS 0x60
#define INFO_STACK_TYPE_802154_PHY_VALID 0x61
#define INFO_STACK_TYPE_BLE_PHY_VALID 0x62
@@ -604,7 +620,9 @@ typedef MB_WirelessFwInfoTable_t SHCI_WirelessFwInfoTable_t;
#define INFO_STACK_TYPE_BLE_RLV 0x64
#define INFO_STACK_TYPE_802154_RLV 0x65
#define INFO_STACK_TYPE_BLE_ZIGBEE_FFD_STATIC 0x70
+#define INFO_STACK_TYPE_BLE_ZIGBEE_RFD_STATIC 0x71
#define INFO_STACK_TYPE_BLE_ZIGBEE_FFD_DYNAMIC 0x78
+#define INFO_STACK_TYPE_BLE_ZIGBEE_RFD_DYNAMIC 0x79
#define INFO_STACK_TYPE_RLV 0x80
typedef struct {
@@ -800,6 +818,24 @@ typedef struct {
* @retval Status
*/
SHCI_CmdStatus_t SHCI_C2_CONCURRENT_SetMode( SHCI_C2_CONCURRENT_Mode_Param_t Mode );
+
+ /**
+ * SHCI_C2_CONCURRENT_GetNextBleEvtTime
+ * @brief Get the next BLE event date (relative time)
+ *
+ * @param Command Packet
+ * @retval None
+ */
+ SHCI_CmdStatus_t SHCI_C2_CONCURRENT_GetNextBleEvtTime( SHCI_C2_CONCURRENT_GetNextBleEvtTime_Param_t *pParam );
+
+ /**
+ * SHCI_C2_CONCURRENT_EnableNext_802154_EvtNotification
+ * @brief Activate the next 802.15.4 event notification (one shot)
+ *
+ * @param None
+ * @retval None
+ */
+ SHCI_CmdStatus_t SHCI_C2_CONCURRENT_EnableNext_802154_EvtNotification( void );
/**
* SHCI_C2_FLASH_StoreData
@@ -842,7 +878,7 @@ typedef struct {
/**
* SHCI_GetWirelessFwInfo
* @brief This function read back the informations relative to the wireless binary loaded.
- * Refer yourself to SHCI_WirelessFwInfoTable_t structure to get the significance
+ * Refer yourself to MB_WirelessFwInfoTable_t structure to get the significance
* of the different parameters returned.
* @param pWirelessInfo : Pointer to WirelessFwInfo_t.
*
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 78a093abd..d56f9dece 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,31 +26,6 @@
#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
{
@@ -89,9 +64,6 @@ 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)
@@ -130,8 +102,6 @@ void hci_user_evt_proc(void)
{
LST_remove_head ( &HciAsynchEventQueue, (tListNode **)&phcievtbuffer );
- OutputEvtTrace(phcievtbuffer);
-
if (hciContext.UserEvtRx != NULL)
{
UserEvtRxParam.pckt = phcievtbuffer;
@@ -205,8 +175,6 @@ 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;
@@ -278,8 +246,6 @@ 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;
@@ -321,79 +287,6 @@ 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 1741a8c3d..73d1d0e4f 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
@@ -160,6 +160,29 @@ extern "C" {
MB_LldBleTable_t *p_lld_ble_table;
} MB_RefTable_t;
+/**
+ * This table shall be used only in the case the CPU2 runs the FUS.
+ * It is used by the command SHCI_GetWirelessFwInfo()
+ */
+typedef struct
+{
+ uint32_t DeviceInfoTableState;
+ uint8_t Reserved1;
+ uint8_t LastFusActiveState;
+ uint8_t LastWirelessStackState;
+ uint8_t CurrentWirelessStackType;
+ uint32_t SafeBootVersion;
+ uint32_t FusVersion;
+ uint32_t FusMemorySize;
+ uint32_t WirelessStackVersion;
+ uint32_t WirelessStackMemorySize;
+ uint32_t WirelessFirmwareBleInfo;
+ uint32_t WirelessFirmwareThreadInfo;
+ uint32_t Reserved2;
+ uint64_t UID64;
+ uint16_t DeviceId;
+} MB_FUS_DeviceInfoTable_t ;
+
#ifdef __cplusplus
}
#endif
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 736f2793f..f20d7c81f 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,31 +24,6 @@
#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
{
@@ -86,9 +61,6 @@ 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)
@@ -126,8 +98,6 @@ void shci_user_evt_proc(void)
{
LST_remove_head ( &SHciAsynchEventQueue, (tListNode **)&phcievtbuffer );
- OutputEvtTrace(phcievtbuffer);
-
if (shciContext.UserEvtRx != NULL)
{
UserEvtRxParam.pckt = phcievtbuffer;
@@ -184,8 +154,6 @@ 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);
@@ -196,8 +164,6 @@ 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;
@@ -267,67 +233,6 @@ 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_dbg_conf.h b/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_dbg_conf.h
new file mode 100644
index 000000000..b468b2863
--- /dev/null
+++ b/Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl/tl_dbg_conf.h
@@ -0,0 +1,126 @@
+/**
+ ******************************************************************************
+ * File Name : tl_dbg_conf.h
+ * Description : Debug configuration file for stm32wpan transport layer 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
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __TL_DBG_CONF_H
+#define __TL_DBG_CONF_H
+
+/* USER CODE BEGIN Tl_Conf */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_conf.h" /* required as some configuration used in dbg_trace.h are set there */
+#include "dbg_trace.h"
+#include "hw_if.h"
+
+/**
+ * Enable or Disable traces
+ * The raw data output is the hci binary packet format as specified by the BT specification *
+ */
+#define TL_SHCI_CMD_DBG_EN 0 /* Reports System commands sent to CPU2 and the command response */
+#define TL_SHCI_CMD_DBG_RAW_EN 0 /* Reports raw data System commands sent to CPU2 and the command response */
+#define TL_SHCI_EVT_DBG_EN 0 /* Reports System Asynchronous Events received from CPU2 */
+#define TL_SHCI_EVT_DBG_RAW_EN 0 /* Reports raw data System Asynchronous Events received from CPU2 */
+
+#define TL_HCI_CMD_DBG_EN 0 /* Reports BLE command sent to CPU2 and the command response */
+#define TL_HCI_CMD_DBG_RAW_EN 0 /* Reports raw data BLE command sent to CPU2 and the command response */
+#define TL_HCI_EVT_DBG_EN 0 /* Reports BLE Asynchronous Events received from CPU2 */
+#define TL_HCI_EVT_DBG_RAW_EN 0 /* Reports raw data BLE Asynchronous Events received from CPU2 */
+
+#define TL_MM_DBG_EN 0 /* Reports the informations of the buffer released to CPU2 */
+
+/**
+ * Macro definition
+ */
+
+/**
+ * System Transport Layer
+ */
+#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_CMD_DBG_RAW_EN != 0)
+#define TL_SHCI_CMD_DBG_RAW(_PDATA_, _SIZE_) HW_UART_Transmit(hw_uart1, (uint8_t*)_PDATA_, _SIZE_, (~0))
+#else
+#define TL_SHCI_CMD_DBG_RAW(...)
+#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
+
+#if (TL_SHCI_EVT_DBG_RAW_EN != 0)
+#define TL_SHCI_EVT_DBG_RAW(_PDATA_, _SIZE_) HW_UART_Transmit(hw_uart1, (uint8_t*)_PDATA_, _SIZE_, (~0))
+#else
+#define TL_SHCI_EVT_DBG_RAW(...)
+#endif
+
+/**
+ * BLE Transport Layer
+ */
+#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_CMD_DBG_RAW_EN != 0)
+#define TL_HCI_CMD_DBG_RAW(_PDATA_, _SIZE_) HW_UART_Transmit(hw_uart1, (uint8_t*)_PDATA_, _SIZE_, (~0))
+#else
+#define TL_HCI_CMD_DBG_RAW(...)
+#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
+
+#if (TL_HCI_EVT_DBG_RAW_EN != 0)
+#define TL_HCI_EVT_DBG_RAW(_PDATA_, _SIZE_) HW_UART_Transmit(hw_uart1, (uint8_t*)_PDATA_, _SIZE_, (~0))
+#else
+#define TL_HCI_EVT_DBG_RAW(...)
+#endif
+
+/**
+ * Memory Manager - Released buffer tracing
+ */
+#if (TL_MM_DBG_EN != 0)
+#define TL_MM_DBG_MSG PRINT_MESG_DBG
+#else
+#define TL_MM_DBG_MSG(...)
+#endif
+
+/* USER CODE END Tl_Conf */
+
+#endif /*__TL_DBG_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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 507edba29..51b470c15 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
@@ -25,23 +25,20 @@
#include "stm_list.h"
#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
+#include "tl_dbg_conf.h"
/* Private typedef -----------------------------------------------------------*/
+typedef enum
+{
+ TL_MB_MM_RELEASE_BUFFER,
+ TL_MB_BLE_CMD,
+ TL_MB_BLE_CMD_RSP,
+ TL_MB_BLE_ASYNCH_EVT,
+ TL_MB_SYS_CMD,
+ TL_MB_SYS_CMD_RSP,
+ TL_MB_SYS_ASYNCH_EVT,
+} TL_MB_PacketType_t;
+
/* Private defines -----------------------------------------------------------*/
/* Private macros ------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
@@ -77,7 +74,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);
+static void OutputDbgTrace(TL_MB_PacketType_t packet_type, uint8_t* buffer);
/* Public Functions Definition ------------------------------------------------------*/
@@ -142,6 +139,8 @@ int32_t TL_BLE_SendCmd( uint8_t* buffer, uint16_t size )
((TL_CmdPacket_t*)(TL_RefTable.p_ble_table->pcmd_buffer))->cmdserial.type = TL_BLECMD_PKT_TYPE;
+ OutputDbgTrace(TL_MB_BLE_CMD, TL_RefTable.p_ble_table->pcmd_buffer);
+
HW_IPCC_BLE_SendCmd();
return 0;
@@ -155,6 +154,15 @@ void HW_IPCC_BLE_RxEvtNot(void)
{
LST_remove_head (&EvtQueue, (tListNode **)&phcievt);
+ if ( ((phcievt->evtserial.evt.evtcode) == TL_BLEEVT_CS_OPCODE) || ((phcievt->evtserial.evt.evtcode) == TL_BLEEVT_CC_OPCODE ) )
+ {
+ OutputDbgTrace(TL_MB_BLE_CMD_RSP, (uint8_t*)phcievt);
+ }
+ else
+ {
+ OutputDbgTrace(TL_MB_BLE_ASYNCH_EVT, (uint8_t*)phcievt);
+ }
+
BLE_IoBusEvtCallBackFunction(phcievt);
}
@@ -209,6 +217,8 @@ int32_t TL_SYS_SendCmd( uint8_t* buffer, uint16_t size )
((TL_CmdPacket_t *)(TL_RefTable.p_sys_table->pcmd_buffer))->cmdserial.type = TL_SYSCMD_PKT_TYPE;
+ OutputDbgTrace(TL_MB_SYS_CMD, TL_RefTable.p_sys_table->pcmd_buffer);
+
HW_IPCC_SYS_SendCmd();
return 0;
@@ -216,6 +226,8 @@ int32_t TL_SYS_SendCmd( uint8_t* buffer, uint16_t size )
void HW_IPCC_SYS_CmdEvtNot(void)
{
+ OutputDbgTrace(TL_MB_SYS_CMD_RSP, (uint8_t*)(TL_RefTable.p_sys_table->pcmd_buffer) );
+
SYS_CMD_IoBusCallBackFunction( (TL_EvtPacket_t*)(TL_RefTable.p_sys_table->pcmd_buffer) );
return;
@@ -228,6 +240,9 @@ void HW_IPCC_SYS_EvtNot( void )
while(LST_is_empty(&SystemEvtQueue) == FALSE)
{
LST_remove_head (&SystemEvtQueue, (tListNode **)&p_evt);
+
+ OutputDbgTrace(TL_MB_SYS_ASYNCH_EVT, (uint8_t*)p_evt );
+
SYS_EVT_IoBusCallBackFunction( p_evt );
}
@@ -598,7 +613,7 @@ void TL_MM_EvtDone(TL_EvtPacket_t * phcievt)
{
LST_insert_tail(&LocalFreeBufQueue, (tListNode *)phcievt);
- OutputMemReleaseTrace(phcievt);
+ OutputDbgTrace(TL_MB_MM_RELEASE_BUFFER, (uint8_t*)phcievt);
HW_IPCC_MM_SendFreeBuf( SendFreeBuf );
@@ -618,39 +633,6 @@ 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
******************************************************************************/
@@ -683,4 +665,187 @@ __WEAK void TL_TRACES_EvtReceived( TL_EvtPacket_t * hcievt )
(void)(hcievt);
}
+/******************************************************************************
+ * DEBUG INFORMATION
+ ******************************************************************************/
+static void OutputDbgTrace(TL_MB_PacketType_t packet_type, uint8_t* buffer)
+{
+ TL_EvtPacket_t *p_evt_packet;
+ TL_CmdPacket_t *p_cmd_packet;
+
+ switch(packet_type)
+ {
+ case TL_MB_MM_RELEASE_BUFFER:
+ p_evt_packet = (TL_EvtPacket_t*)buffer;
+ switch(p_evt_packet->evtserial.evt.evtcode)
+ {
+ case TL_BLEEVT_CS_OPCODE:
+ TL_MM_DBG_MSG("mm evt released: 0x%02X", p_evt_packet->evtserial.evt.evtcode);
+ TL_MM_DBG_MSG(" cmd opcode: 0x%04X", ((TL_CsEvt_t*)(p_evt_packet->evtserial.evt.payload))->cmdcode);
+ TL_MM_DBG_MSG(" buffer addr: 0x%08X", p_evt_packet);
+ break;
+
+ case TL_BLEEVT_CC_OPCODE:
+ TL_MM_DBG_MSG("mm evt released: 0x%02X", p_evt_packet->evtserial.evt.evtcode);
+ TL_MM_DBG_MSG(" cmd opcode: 0x%04X", ((TL_CcEvt_t*)(p_evt_packet->evtserial.evt.payload))->cmdcode);
+ TL_MM_DBG_MSG(" buffer addr: 0x%08X", p_evt_packet);
+ break;
+
+ case TL_BLEEVT_VS_OPCODE:
+ TL_MM_DBG_MSG("mm evt released: 0x%02X", p_evt_packet->evtserial.evt.evtcode);
+ TL_MM_DBG_MSG(" subevtcode: 0x%04X", ((TL_AsynchEvt_t*)(p_evt_packet->evtserial.evt.payload))->subevtcode);
+ TL_MM_DBG_MSG(" buffer addr: 0x%08X", p_evt_packet);
+ break;
+
+ default:
+ TL_MM_DBG_MSG("mm evt released: 0x%02X", p_evt_packet->evtserial.evt.evtcode);
+ TL_MM_DBG_MSG(" buffer addr: 0x%08X", p_evt_packet);
+ break;
+ }
+
+ TL_MM_DBG_MSG("\r\n");
+ break;
+
+ case TL_MB_BLE_CMD:
+ p_cmd_packet = (TL_CmdPacket_t*)buffer;
+ TL_HCI_CMD_DBG_MSG("ble cmd: 0x%04X", p_cmd_packet->cmdserial.cmd.cmdcode);
+ if(p_cmd_packet->cmdserial.cmd.plen != 0)
+ {
+ TL_HCI_CMD_DBG_MSG(" payload:");
+ TL_HCI_CMD_DBG_BUF(p_cmd_packet->cmdserial.cmd.payload, p_cmd_packet->cmdserial.cmd.plen, "");
+ }
+ TL_HCI_CMD_DBG_MSG("\r\n");
+
+ TL_HCI_CMD_DBG_RAW(&p_cmd_packet->cmdserial, p_cmd_packet->cmdserial.cmd.plen+TL_CMD_HDR_SIZE);
+ break;
+
+ case TL_MB_BLE_CMD_RSP:
+ p_evt_packet = (TL_EvtPacket_t*)buffer;
+ switch(p_evt_packet->evtserial.evt.evtcode)
+ {
+ case TL_BLEEVT_CS_OPCODE:
+ TL_HCI_CMD_DBG_MSG("ble rsp: 0x%02X", p_evt_packet->evtserial.evt.evtcode);
+ TL_HCI_CMD_DBG_MSG(" cmd opcode: 0x%04X", ((TL_CsEvt_t*)(p_evt_packet->evtserial.evt.payload))->cmdcode);
+ TL_HCI_CMD_DBG_MSG(" numhci: 0x%02X", ((TL_CsEvt_t*)(p_evt_packet->evtserial.evt.payload))->numcmd);
+ TL_HCI_CMD_DBG_MSG(" status: 0x%02X", ((TL_CsEvt_t*)(p_evt_packet->evtserial.evt.payload))->status);
+ break;
+
+ case TL_BLEEVT_CC_OPCODE:
+ TL_HCI_CMD_DBG_MSG("ble rsp: 0x%02X", p_evt_packet->evtserial.evt.evtcode);
+ TL_HCI_CMD_DBG_MSG(" cmd opcode: 0x%04X", ((TL_CcEvt_t*)(p_evt_packet->evtserial.evt.payload))->cmdcode);
+ TL_HCI_CMD_DBG_MSG(" numhci: 0x%02X", ((TL_CcEvt_t*)(p_evt_packet->evtserial.evt.payload))->numcmd);
+ TL_HCI_CMD_DBG_MSG(" status: 0x%02X", ((TL_CcEvt_t*)(p_evt_packet->evtserial.evt.payload))->payload[0]);
+ if((p_evt_packet->evtserial.evt.plen-4) != 0)
+ {
+ TL_HCI_CMD_DBG_MSG(" payload:");
+ TL_HCI_CMD_DBG_BUF(&((TL_CcEvt_t*)(p_evt_packet->evtserial.evt.payload))->payload[1], p_evt_packet->evtserial.evt.plen-4, "");
+ }
+ break;
+
+ default:
+ TL_HCI_CMD_DBG_MSG("unknown ble rsp received: %02X", p_evt_packet->evtserial.evt.evtcode);
+ break;
+ }
+
+ TL_HCI_CMD_DBG_MSG("\r\n");
+
+ TL_HCI_CMD_DBG_RAW(&p_evt_packet->evtserial, p_evt_packet->evtserial.evt.plen+TL_EVT_HDR_SIZE);
+ break;
+
+ case TL_MB_BLE_ASYNCH_EVT:
+ p_evt_packet = (TL_EvtPacket_t*)buffer;
+ if(p_evt_packet->evtserial.evt.evtcode != TL_BLEEVT_VS_OPCODE)
+ {
+ TL_HCI_EVT_DBG_MSG("ble evt: 0x%02X", p_evt_packet->evtserial.evt.evtcode);
+ if((p_evt_packet->evtserial.evt.plen) != 0)
+ {
+ TL_HCI_EVT_DBG_MSG(" payload:");
+ TL_HCI_EVT_DBG_BUF(p_evt_packet->evtserial.evt.payload, p_evt_packet->evtserial.evt.plen, "");
+ }
+ }
+ else
+ {
+ TL_HCI_EVT_DBG_MSG("ble evt: 0x%02X", p_evt_packet->evtserial.evt.evtcode);
+ TL_HCI_EVT_DBG_MSG(" subevtcode: 0x%04X", ((TL_AsynchEvt_t*)(p_evt_packet->evtserial.evt.payload))->subevtcode);
+ if((p_evt_packet->evtserial.evt.plen-2) != 0)
+ {
+ TL_HCI_EVT_DBG_MSG(" payload:");
+ TL_HCI_EVT_DBG_BUF(((TL_AsynchEvt_t*)(p_evt_packet->evtserial.evt.payload))->payload, p_evt_packet->evtserial.evt.plen-2, "");
+ }
+ }
+
+ TL_HCI_EVT_DBG_MSG("\r\n");
+
+ TL_HCI_EVT_DBG_RAW(&p_evt_packet->evtserial, p_evt_packet->evtserial.evt.plen+TL_EVT_HDR_SIZE);
+ break;
+
+ case TL_MB_SYS_CMD:
+ p_cmd_packet = (TL_CmdPacket_t*)buffer;
+
+ TL_SHCI_CMD_DBG_MSG("sys cmd: 0x%04X", p_cmd_packet->cmdserial.cmd.cmdcode);
+
+ if(p_cmd_packet->cmdserial.cmd.plen != 0)
+ {
+ TL_SHCI_CMD_DBG_MSG(" payload:");
+ TL_SHCI_CMD_DBG_BUF(p_cmd_packet->cmdserial.cmd.payload, p_cmd_packet->cmdserial.cmd.plen, "");
+ }
+ TL_SHCI_CMD_DBG_MSG("\r\n");
+
+ TL_SHCI_CMD_DBG_RAW(&p_cmd_packet->cmdserial, p_cmd_packet->cmdserial.cmd.plen+TL_CMD_HDR_SIZE);
+ break;
+
+ case TL_MB_SYS_CMD_RSP:
+ p_evt_packet = (TL_EvtPacket_t*)buffer;
+ switch(p_evt_packet->evtserial.evt.evtcode)
+ {
+ case TL_BLEEVT_CC_OPCODE:
+ TL_SHCI_CMD_DBG_MSG("sys rsp: 0x%02X", p_evt_packet->evtserial.evt.evtcode);
+ TL_SHCI_CMD_DBG_MSG(" cmd opcode: 0x%02X", ((TL_CcEvt_t*)(p_evt_packet->evtserial.evt.payload))->cmdcode);
+ TL_SHCI_CMD_DBG_MSG(" status: 0x%02X", ((TL_CcEvt_t*)(p_evt_packet->evtserial.evt.payload))->payload[0]);
+ if((p_evt_packet->evtserial.evt.plen-4) != 0)
+ {
+ TL_SHCI_CMD_DBG_MSG(" payload:");
+ TL_SHCI_CMD_DBG_BUF(&((TL_CcEvt_t*)(p_evt_packet->evtserial.evt.payload))->payload[1], p_evt_packet->evtserial.evt.plen-4, "");
+ }
+ break;
+
+ default:
+ TL_SHCI_CMD_DBG_MSG("unknown sys rsp received: %02X", p_evt_packet->evtserial.evt.evtcode);
+ break;
+ }
+
+ TL_SHCI_CMD_DBG_MSG("\r\n");
+
+ TL_SHCI_CMD_DBG_RAW(&p_evt_packet->evtserial, p_evt_packet->evtserial.evt.plen+TL_EVT_HDR_SIZE);
+ break;
+
+ case TL_MB_SYS_ASYNCH_EVT:
+ p_evt_packet = (TL_EvtPacket_t*)buffer;
+ if(p_evt_packet->evtserial.evt.evtcode != TL_BLEEVT_VS_OPCODE)
+ {
+ TL_SHCI_EVT_DBG_MSG("unknown sys evt received: %02X", p_evt_packet->evtserial.evt.evtcode);
+ }
+ else
+ {
+ TL_SHCI_EVT_DBG_MSG("sys evt: 0x%02X", p_evt_packet->evtserial.evt.evtcode);
+ TL_SHCI_EVT_DBG_MSG(" subevtcode: 0x%04X", ((TL_AsynchEvt_t*)(p_evt_packet->evtserial.evt.payload))->subevtcode);
+ if((p_evt_packet->evtserial.evt.plen-2) != 0)
+ {
+ TL_SHCI_EVT_DBG_MSG(" payload:");
+ TL_SHCI_EVT_DBG_BUF(((TL_AsynchEvt_t*)(p_evt_packet->evtserial.evt.payload))->payload, p_evt_packet->evtserial.evt.plen-2, "");
+ }
+ }
+
+ TL_SHCI_EVT_DBG_MSG("\r\n");
+
+ TL_SHCI_EVT_DBG_RAW(&p_evt_packet->evtserial, p_evt_packet->evtserial.evt.plen+TL_EVT_HDR_SIZE);
+ break;
+
+ default:
+ break;
+ }
+
+ return;
+}
+
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/jam_detection.c b/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/jam_detection.c
index 25d6e1214..9a499f627 100644
--- a/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/jam_detection.c
+++ b/Middlewares/ST/STM32_WPAN/thread/openthread/core/openthread_api/jam_detection.c
@@ -213,6 +213,8 @@ uint64_t otJamDetectionGetHistoryBitmap(otInstance *aInstance)
Ot_Cmd_Transfer();
p_ot_req = THREAD_Get_OTCmdRspPayloadBuffer();
- return (uint64_t)p_ot_req->Data[0];
+
+ /* 64bit word is returned with two 32bits words (MSB are at offset 1 and LSB are offset 0) */
+ return (uint64_t)((p_ot_req->Data[1] << 32) | p_ot_req->Data[0]);
}
#endif /* OPENTHREAD_ENABLE_JAM_DETECTION */
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 c285101df..fcca5a8ac 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
@@ -31,6 +31,7 @@
#include "dbg_trace.h"
#include "shci.h"
+
/* INSTANCE */
otStateChangedCallback otStateChangedCb = NULL;
@@ -78,10 +79,11 @@ typedef void (*CoapRequestHandlerCallback)(otCoapHeader *aHeader, otMessage *aMe
typedef void (*CoapResponseHandlerCallback)(otCoapHeader *aHeader, otMessage *aMessage,
const otMessageInfo *aMessageInfo, otError aResult);
-CoapRequestHandlerCallback coapRequestHandlerCb = NULL;
+otCoapRequestHandler coapRequestHandlerCb = NULL;
otCoapRequestHandler defaultCoapRequestHandlerCb = NULL;
-CoapResponseHandlerCallback coapResponseHandlerCb = NULL;
-
+otCoapResponseHandler coapResponseHandlerCb = NULL;
+STCoapSpecificRequestContextType * mySTCoapContext;
+STCoapSpecificResponseContextType * mySTCoapResponseContext;
#if OPENTHREAD_ENABLE_JAM_DETECTION
/* JAM_DETECTION */
otJamDetectionCallback otJamDetectionCallbackCb = NULL;
@@ -105,6 +107,7 @@ HAL_StatusTypeDef OpenThread_CallBack_Processing(void)
{
HAL_StatusTypeDef status = HAL_OK;
+
/* Get pointer on received event buffer from M0 */
Thread_OT_Cmd_Request_t* p_notification = THREAD_Get_NotificationPayloadBuffer();
@@ -118,13 +121,14 @@ HAL_StatusTypeDef OpenThread_CallBack_Processing(void)
}
break;
case MSG_M0TOM4_COAP_REQUEST_HANDLER:
- coapRequestHandlerCb = (CoapRequestHandlerCallback) p_notification->Data[0];
-
+ mySTCoapContext = (STCoapSpecificRequestContextType * ) p_notification->Data[0];
+ coapRequestHandlerCb = mySTCoapContext->mHandler;
if (coapRequestHandlerCb != NULL)
{
- coapRequestHandlerCb( (otCoapHeader *) p_notification->Data[1],
- (otMessage *) p_notification->Data[2],
- (otMessageInfo *) p_notification->Data[3]);
+ coapRequestHandlerCb(mySTCoapContext->mContext,
+ (otCoapHeader *) p_notification->Data[1],
+ (otMessage *) p_notification->Data[2],
+ (otMessageInfo *) p_notification->Data[3]);
}
break;
case MSG_M0TOM4_DEFAULT_COAP_REQUEST_HANDLER:
@@ -136,11 +140,13 @@ HAL_StatusTypeDef OpenThread_CallBack_Processing(void)
(otMessageInfo *) p_notification->Data[3]);
}
break;
- case MSG_M0TOM4_COAP_RESPONSE_HANDLER:
- coapResponseHandlerCb = (CoapResponseHandlerCallback) p_notification->Data[0];
+ case MSG_M0TOM4_COAP_RESPONSE_HANDLER:
+ mySTCoapResponseContext = (STCoapSpecificResponseContextType * ) p_notification->Data[0];
+ coapResponseHandlerCb = mySTCoapResponseContext->mHandler;
if (coapResponseHandlerCb != NULL)
{
- coapResponseHandlerCb( (otCoapHeader *) p_notification->Data[1],
+ coapResponseHandlerCb(mySTCoapResponseContext->mContext,
+ (otCoapHeader *) p_notification->Data[1],
(otMessage *) p_notification->Data[2],
(otMessageInfo *) p_notification->Data[3],
(otError) p_notification->Data[4]);
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 82eef6856..6c05cf367 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
@@ -27,10 +27,32 @@
#define STM32WBxx_CORE_INTERFACE_DEF_H
#include "stm32_wpan_common.h"
+#include "coap.h"
#ifdef __cplusplus
extern "C" {
#endif
+
+typedef struct {
+ void * mContext;
+ otCoapRequestHandler mHandler;
+ } STCoapSpecificRequestContextType;
+
+typedef struct {
+ void * mContext;
+ otCoapResponseHandler mHandler;
+ } STCoapSpecificResponseContextType;
+
+
+typedef struct {
+ const char * mUriPath; /* The URI Path string */
+ STCoapSpecificRequestContextType mSpecificContext; /* Contains context and handler */
+ } STCoapResourceType;
+
+typedef struct {
+ STCoapSpecificResponseContextType mSpecificContext; /* Contains context and handler */
+ } STCoapRespHandlerType;
+
/* Structure of the messages exchanged between M0 and M4 */
#define OT_CMD_BUFFER_SIZE 20U
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 418c09ddb..510b121ae 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
@@ -613,7 +613,7 @@ ZbTrustCenterRejoin(struct ZigBeeT *zb, void (*callback)(enum ZbStatusCodeT stat
ipcc_req->Size = 1;
ipcc_req->Data[0] = (uint32_t)info;
ZIGBEE_CmdTransfer();
- return zb_ipc_m4_get_retval();
+ return (enum ZbStatusCodeT) zb_ipc_m4_get_retval();
/* Followed up in MSG_M0TOM4_STARTUP_TC_REJOIN_CB handler */
}
@@ -2062,7 +2062,7 @@ ZbZclCommandReq(struct ZigBeeT *zb, struct ZbZclCommandReqT *zclReq,
if (callback != NULL) {
info = zb_ipc_m4_cb_info_alloc((void *)callback, arg);
if (info == NULL) {
- return ZB_STATUS_ALLOC_FAIL;
+ return (enum ZclStatusCodeT) ZB_STATUS_ALLOC_FAIL;
}
if (ZbApsAddrIsBcast(&zclReq->dst)) {
info->zcl_recv_multi_rsp = true; /* callback only freed on ZCL_STATUS_TIMEOUT */
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 e6e89c911..d13510f80 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
index c20c40520..56b47e496 100644
--- 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
Binary files differ
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 25bc01a34..0149dfbc6 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
@@ -47,7 +47,7 @@
*---------------------------------------------------------------
*/
/* Alarms cluster attribute identifiers. */
-enum {
+enum ZbZclAlarmsAttrT {
ZCL_ALARM_ATTR_COUNT = 0x0000
};
@@ -73,12 +73,8 @@ enum {
/*
* Callback on Alarm Client Cluster when an alarm is received
*/
-typedef void (*ZbZclAlarmClientCallbackT)
- (void *arg, /* supplied argument */
- uint16_t nwk_addr, /* address where the alarm originates */
- uint8_t endpoint, /* endpoint from which it originates */
- uint8_t alarm_code, /* code of detected alarm condition */
- uint16_t cluster_id); /* cluster where alarm condition occurred */
+typedef void (*ZbZclAlarmClientCallbackT)(void *arg, uint16_t nwk_addr, uint8_t endpoint,
+ uint8_t alarm_code, uint16_t cluster_id);
/*---------------------------------------------------------------
* Function Declarations
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.ballast.config.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.ballast.config.h
index 4281ee293..33fbcdcca 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.ballast.config.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.ballast.config.h
@@ -42,8 +42,7 @@
* Ballast Configuration Cluster Definitions
*---------------------------------------------------------------
*/
-/* Ballast Configuration Attribute Sets */
-enum {
+enum ZbZclBallastConfigSvrAttrT {
/* Ballast Information Attribute Set */
ZCL_BALLAST_CONFIG_ATTR_PHY_MIN_LEVEL = 0x0000,
ZCL_BALLAST_CONFIG_ATTR_PHY_MAX_LEVEL = 0x0001,
@@ -139,10 +138,8 @@ enum {
* Ballast Configuration Cluster Definitions
*---------------------------------------------------------------
*/
-struct ZbZclClusterT * ZbZclBallastConfigServerAlloc(struct ZigBeeT *zb,
- uint8_t endpoint, uint8_t phyMin, uint8_t phyMax);
+struct ZbZclClusterT * ZbZclBallastConfigClientAlloc(struct ZigBeeT *zb, uint8_t endpoint);
-struct ZbZclClusterT * ZbZclBallastConfigClientAlloc(struct ZigBeeT *zb,
- uint8_t endpoint);
+struct ZbZclClusterT * ZbZclBallastConfigServerAlloc(struct ZigBeeT *zb, uint8_t endpoint, uint8_t phyMin, uint8_t phyMax);
#endif
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.basic.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.basic.h
index a552c3793..e53f10cef 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.basic.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.basic.h
@@ -59,7 +59,7 @@
#include "zcl/zcl.h"
/** Basic Cluster Attribute Ids */
-enum {
+enum ZbZclBasicSvrAttrT {
ZCL_BASIC_ATTR_ZCL_VERSION = 0x0000, /**< ZCLVersion */
ZCL_BASIC_ATTR_APP_VERSION, /**< ApplicationVersion */
ZCL_BASIC_ATTR_STACK_VERSION, /**< StackVersion */
@@ -140,6 +140,6 @@ struct ZbZclClusterT * ZbZclBasicClientAlloc(struct ZigBeeT *zb, uint8_t endpoin
* @param dst the destination address to the server to which the command is sent
* @return ZCL_STATUS_SUCEESS if successful or other ZclStatusCodeT value on error
*/
-enum ZclStatusCodeT ZbZclBasicClientResetReq(struct ZbZclClusterT *clusterPtr, const struct ZbApsAddrT *dst);
+enum ZclStatusCodeT ZbZclBasicClientResetReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst);
#endif /* __ZCL_BASIC_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
index 3053ba3e4..d037872e4 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.commission.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.commission.h
@@ -90,36 +90,36 @@ enum ZbZclCommissionClientCommandsT {
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,
+ ZCL_COMMISSION_SVR_ATTR_SHORT_ADDR = 0x0000, /**< ShortAddress */
+ ZCL_COMMISSION_SVR_ATTR_EPID = 0x0001, /**< ExtendedPANId */
+ ZCL_COMMISSION_SVR_ATTR_PANID = 0x0002, /**< PANId */
+ ZCL_COMMISSION_SVR_ATTR_CHANNELMASK = 0x0003, /**< Channelmask */
+ ZCL_COMMISSION_SVR_ATTR_PROTOCOLVER = 0x0004, /**< ProtocolVersion */
+ ZCL_COMMISSION_SVR_ATTR_STACKPROFILE = 0x0005, /**< StackProfile */
+ ZCL_COMMISSION_SVR_ATTR_STARTUPCONTROL = 0x0006, /**< StartupControl */
+ ZCL_COMMISSION_SVR_ATTR_TCADDR = 0x0010, /**< TrustCenterAddress */
+ ZCL_COMMISSION_SVR_ATTR_TCMASTER = 0x0011, /**< TrustCenterMasterKey (Optional) */
+ ZCL_COMMISSION_SVR_ATTR_NWKKEY = 0x0012, /**< NetworkKey */
+ ZCL_COMMISSION_SVR_ATTR_USEINSECJOIN = 0x0013, /**< UseInsecureJoin */
+ ZCL_COMMISSION_SVR_ATTR_PRECONFLINKKEY = 0x0014, /**< PreconfiguredLinkKey */
+ ZCL_COMMISSION_SVR_ATTR_NWKKEYSEQNUM = 0x0015, /**< NetworkKeySeqNum */
+ ZCL_COMMISSION_SVR_ATTR_NWKKEYTYPE = 0x0016, /**< NetworkKeyType */
+ ZCL_COMMISSION_SVR_ATTR_NWKMGRADDR = 0x0017, /**< NetworkManagerAddress */
/* 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,
+ ZCL_COMMISSION_SVR_ATTR_SCANATTEMPTS = 0x0020, /**< ScanAttempts (Optional) */
+ ZCL_COMMISSION_SVR_ATTR_TIMEBTWSCANS = 0x0021, /**< TimeBetweenScans (Optional) */
+ ZCL_COMMISSION_SVR_ATTR_REJOININTERVAL = 0x0022, /**< RejoinInterval (Optional) */
+ ZCL_COMMISSION_SVR_ATTR_MAXREJOININTERVAL = 0x0023, /**< MaxRejoinInterval (Optional) */
/* End Device Parameters */
- ZCL_COMMISSION_CLI_ATTR_POLLRATE = 0x0030,
- ZCL_COMMISSION_CLI_ATTR_PARENTRETRYTHRESH = 0x0031,
+ ZCL_COMMISSION_SVR_ATTR_POLLRATE = 0x0030, /**< IndirectPollRate (Optional) */
+ ZCL_COMMISSION_SVR_ATTR_PARENTRETRYTHRESH = 0x0031, /**< ParentRetryThreshold (Optional) */
/* Concentrator Parameters */
- ZCL_COMMISSION_CLI_ATTR_CONCFLAG = 0x0040,
- ZCL_COMMISSION_CLI_ATTR_CONCRADIUS = 0x0041,
- ZCL_COMMISSION_CLI_ATTR_CONCDISCTIME = 0x0042
+ ZCL_COMMISSION_SVR_ATTR_CONCFLAG = 0x0040, /**< ConcentratorFlag (Optional) */
+ ZCL_COMMISSION_SVR_ATTR_CONCRADIUS = 0x0041, /**< ConcentratorRadius (Optional) */
+ ZCL_COMMISSION_SVR_ATTR_CONCDISCTIME = 0x0042 /**< ConcentratorDiscoveryTime (Optional) */
};
/*** Client Commands (Requests) */
@@ -188,78 +188,174 @@ struct ZbZclCommissionClientEnableInfoT {
/*** Server API ***/
-/**
- * Commissioning Server Cluster Callbacks
- */
+/** Commissioning Server callbacks configuration */
struct ZbZclCommissionServerCallbacksT {
- enum ZclStatusCodeT (*restart_device)(struct ZbZclClusterT *clusterPtr,
+ enum ZclStatusCodeT (*restart_device)(struct ZbZclClusterT *cluster,
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
+ /**< Callback to application, invoked on receipt of Restart Device command.
+ * 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). */
+ * is called. 100 milliseconds should be sufficient (ZCL_COMMISSION_RESTART_DEVICE_DELAY_MS).
+ */
- enum ZclStatusCodeT (*save_startup)(struct ZbZclClusterT *clusterPtr,
+ enum ZclStatusCodeT (*save_startup)(struct ZbZclClusterT *cluster,
struct ZbZclCommissionClientSaveStartup *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
- /**< Save Startup Request callback */
+ /**< Callback to application, invoked on receipt of Save Startup Parameters command. */
- enum ZclStatusCodeT (*restore_startup)(struct ZbZclClusterT *clusterPtr,
+ enum ZclStatusCodeT (*restore_startup)(struct ZbZclClusterT *cluster,
struct ZbZclCommissionClientRestoreStartup *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
- /**< Restore Startup Request callback */
+ /**< Callback to application, invoked on receipt of Restore Startup Parameters command. */
- enum ZclStatusCodeT (*reset_startup)(struct ZbZclClusterT *clusterPtr,
+ enum ZclStatusCodeT (*reset_startup)(struct ZbZclClusterT *cluster,
struct ZbZclCommissionClientResetStartup *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
- /**< Reset Startup Request callback */
+ /**< Callback to application, invoked on receipt of Reset Startup Parameters command. */
};
+/**
+ * Create a new instance of the Commissioning Server cluster
+ * @param zb Zigbee stack instance
+ * @param profile Profile ID
+ * @param aps_secured APS Security - true if APS Security enabled, else false
+ * @param callbacks Structure containing any callback function pointers for this cluster
+ * @param arg Pointer to application data that will later be provided back to the callback functions when invoked
+ * @return Cluster pointer, or NULL if there is an error
+ */
struct ZbZclClusterT * ZbZclCommissionServerAlloc(struct ZigBeeT *zb, uint16_t profile, bool aps_secured,
struct ZbZclCommissionServerCallbacksT *callbacks, void *arg);
-/* Helper function to reset the startup configuration cluster attributes back to defaults. */
-enum ZclStatusCodeT ZbZclCommissionServerResetStartup(struct ZbZclClusterT *clusterPtr);
+/**
+ * Reset startup configurations cluster attributes back to defaults
+ * @param cluster Cluster instance from which to send this command
+ * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
+ */
+enum ZclStatusCodeT ZbZclCommissionServerResetStartup(struct ZbZclClusterT *cluster);
-/* 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);
+/**
+ * Load startup configuration from Cluster Server's attributes to the stack's ZbStartupT structure
+ * @param cluster Cluster instance from which to send this command
+ * @param config Zigbee Stack Startup Configuration structure
+ * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
+ */
+enum ZclStatusCodeT ZbZclCommissionServerGetStartup(struct ZbZclClusterT *cluster, 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);
+/**
+ * Enable the Commissioning Server by configuring the MAC layer to listen for packets
+ * If info = NULL, then Commissioning Server will stop processing any received Commissioning packets.
+ * @param cluster Cluster instance from which to send this command
+ * @param info Commissioning Server Enable Information structure
+ * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
+ */
+enum ZclStatusCodeT ZbZclCommissionServerEnable(struct ZbZclClusterT *cluster, struct ZbZclCommissionServerEnableInfoT *info);
-enum ZclStatusCodeT ZbZclCommissionServerSendRestartRsp(struct ZbZclClusterT *clusterPtr,
- struct ZbZclAddrInfoT *dstInfo, struct ZbZclCommissionServerRestartDevRsp *rsp);
+/**
+ * Send a Restart Device Response command
+ * @param cluster Cluster instance from which to send this command
+ * @param dst Destination address for response, including sequence number and tx options
+ * @param rsp Restart Device Response command structure
+ * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
+ */
+enum ZclStatusCodeT ZbZclCommissionServerSendRestartRsp(struct ZbZclClusterT *cluster,
+ struct ZbZclAddrInfoT *dst, struct ZbZclCommissionServerRestartDevRsp *rsp);
-enum ZclStatusCodeT ZbZclCommissionServerSendSaveStartupRsp(struct ZbZclClusterT *clusterPtr,
- struct ZbZclAddrInfoT *dstInfo, struct ZbZclCommissionServerSaveStartupRsp *rsp);
+/**
+ * Send a Save Startup Parameters Response command
+ * @param cluster Cluster instance from which to send this command
+ * @param dst Destination address for response, including sequence number and tx options
+ * @param rsp Save Startup Parameters Response command structure
+ * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
+ */
+enum ZclStatusCodeT ZbZclCommissionServerSendSaveStartupRsp(struct ZbZclClusterT *cluster,
+ struct ZbZclAddrInfoT *dst, struct ZbZclCommissionServerSaveStartupRsp *rsp);
-enum ZclStatusCodeT ZbZclCommissionServerSendRestoreStartupRsp(struct ZbZclClusterT *clusterPtr,
- struct ZbZclAddrInfoT *dstInfo, struct ZbZclCommissionServerRestoreStartupRsp *rsp);
+/**
+ * Send a Restore Startup Parameters Response command
+ * @param cluster Cluster instance from which to send this command
+ * @param dst Destination address for response, including sequence number and tx options
+ * @param rsp Restore Startup Parameters Response command structure
+ * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
+ */
+enum ZclStatusCodeT ZbZclCommissionServerSendRestoreStartupRsp(struct ZbZclClusterT *cluster,
+ struct ZbZclAddrInfoT *dst, struct ZbZclCommissionServerRestoreStartupRsp *rsp);
-enum ZclStatusCodeT ZbZclCommissionServerSendResetStartupRsp(struct ZbZclClusterT *clusterPtr,
- struct ZbZclAddrInfoT *dstInfo, struct ZbZclCommissionServerResetStartupRsp *rsp);
+/**
+ * Send a Reset Startup Parameters Response command
+ * @param cluster Cluster instance from which to send this command
+ * @param dst Destination address for response, including sequence number and tx options
+ * @param rsp Reset Startup Parameters Response command structure
+ * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
+ */
+enum ZclStatusCodeT ZbZclCommissionServerSendResetStartupRsp(struct ZbZclClusterT *cluster,
+ struct ZbZclAddrInfoT *dst, struct ZbZclCommissionServerResetStartupRsp *rsp);
-/*** Client API */
+/* Commissioning Client */
+
+/**
+ * Create a new instance of the Commissioning Client cluster
+ * @param zb Zigbee stack instance
+ * @param profile Profile ID
+ * @param aps_secured APS Security - true if APS Security enabled, else false
+ * @return Cluster pointer, or NULL if there is an error
+ */
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);
+/**
+ * Enable Commissioning Client by configuring MAC layer to listen for packets.
+ * @param cluster Cluster instance from which to send this command
+ * @param info Commissioning Client Enable Information structure
+ * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
+ */
+enum ZclStatusCodeT ZbZclCommissionClientEnable(struct ZbZclClusterT *cluster, struct ZbZclCommissionClientEnableInfoT *info);
-enum ZclStatusCodeT ZbZclCommissionClientSendRestart(struct ZbZclClusterT *clusterPtr, uint64_t ext_addr,
+/**
+ * Send a Restart Device command
+ * @param cluster Cluster instance from which to send this command
+ * @param ext_addr Extended address of the device to send this command
+ * @param req Restart Device command structure
+ * @param callback Callback function that will be invoked later when the response is received
+ * @param arg Pointer to application data that will later be provided back to the callback function when invoked
+ * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
+ */
+enum ZclStatusCodeT ZbZclCommissionClientSendRestart(struct ZbZclClusterT *cluster, 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,
+/**
+ * Send a Save Startup Parameters command
+ * @param cluster Cluster instance from which to send this command
+ * @param ext_addr Extended address of the device to send this command
+ * @param req Save Startup Parameters command structure
+ * @param callback Callback function that will be invoked later when the response is received
+ * @param arg Pointer to application data that will later be provided back to the callback function when invoked
+ * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
+ */
+enum ZclStatusCodeT ZbZclCommissionClientSendSaveStartup(struct ZbZclClusterT *cluster, 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,
+/**
+ * Send a Restore Startup Parameters command
+ * @param cluster Cluster instance from which to send this command
+ * @param ext_addr Extended address of the device to send this command
+ * @param req Restore Startup Parameters command structure
+ * @param callback Callback function that will be invoked later when the response is received
+ * @param arg Pointer to application data that will later be provided back to the callback function when invoked
+ * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
+ */
+enum ZclStatusCodeT ZbZclCommissionClientSendRestoreStartup(struct ZbZclClusterT *cluster, 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,
+/**
+ * Send a Reset Startup Parameters command
+ * @param cluster Cluster instance from which to send this command
+ * @param ext_addr Address including sequence number and tx options
+ * @param req Reset Startup Parameters command structure
+ * @param callback Callback function that will be invoked later when the response is received
+ * @param arg Pointer to application data that will later be provided back to the callback function when invoked
+ * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
+ */
+enum ZclStatusCodeT ZbZclCommissionClientSendResetStartup(struct ZbZclClusterT *cluster, uint64_t ext_addr,
struct ZbZclCommissionClientResetStartup *req,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.device.temp.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.device.temp.h
index 29418631c..5e6a840ec 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.device.temp.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.device.temp.h
@@ -46,7 +46,7 @@
*/
/** Device Temp Cluster Attribute Ids */
-enum {
+enum ZbZclDeviceTempSvrAttrT {
ZCL_DEV_TEMP_CURRENT = 0x0000, /**< CurrentTemperature */
ZCL_DEV_TEMP_MIN_TEMP = 0x0001, /**< MinTempExperienced */
ZCL_DEV_TEMP_MAX_TEMP = 0x0002, /**< MaxTempExperienced */
@@ -66,14 +66,14 @@ enum {
#define ZCL_DEVICE_TEMP_INVALID ((int16_t)0x8000)
/* Alarm Mask */
-enum {
+enum ZbZclDeviceTempAlarmMask {
ZCL_DEV_TEMP_ALARM_MASK_CLEAR = 0x00,
ZCL_DEV_TEMP_ALARM_MASK_LOW = 0x01,
ZCL_DEV_TEMP_ALARM_MASK_HIGH = 0x02,
};
/* Alarms */
-enum {
+enum ZbZclDeviceTempAlarmCode {
ZCL_DEV_TEMP_ALARM_CODE_LOW = 0x00,
ZCL_DEV_TEMP_ALARM_CODE_HIGH = 0x01,
};
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
index 76e2c48c4..2816d37a9 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.diagnostics.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.diagnostics.h
@@ -52,8 +52,8 @@
* DIAG.S.Afffe | False
*
* Client Attributes
- * ILLVL.C.Afffd | True
- * ILLVL.C.Afffe | False
+ * DIAG.C.Afffd | True
+ * DIAG.C.Afffe | False
*/
/** Diagnostics Server Attribute IDs */
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
index fb54fd6ed..5b17b6eb9 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.doorlock.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.doorlock.h
@@ -1,16 +1,10 @@
/* Copyright [2009 - 2020] Exegin Technologies Limited. All rights reserved. */
-#ifndef ZCL_DOORLOCK_H
-#define ZCL_DOORLOCK_H
+#ifndef ZCL_DRLK_H
+#define ZCL_DRLK_H
#include "zcl/zcl.h"
-/*--------------------------------------------------------------------------
- * DESCRIPTION
- * Interface definition for the ZCL OnOff cluster.
- *--------------------------------------------------------------------------
- */
-
/* PICS.ZCL.Doorlock
* DRLK.S | True
* DRLK.C | True
@@ -184,275 +178,326 @@
* DRLK.C.C19.Tx | False
*/
-/* DoorLock Cluster Attributes */
+/** Door Lock Server Attribute IDs */
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 */
+ ZCL_DRLK_ATTR_LOCKSTATE = 0x0000, /**< LockState */
+ ZCL_DRLK_ATTR_LOCKTYPE = 0x0001, /**< LockType */
+ ZCL_DRLK_ATTR_ACT_ENABLED = 0x0002, /**< ActuatorEnabled */
+ ZCL_DRLK_ATTR_DOORSTATE = 0x0003, /**< DoorState (Optional) */
+ ZCL_DRLK_ATTR_OPENEVENTS = 0x0004, /**< DoorOpenEvents (Optional) */
+ ZCL_DRLK_ATTR_CLOSEDEVENTS = 0x0005, /**< DoorClosedEvents (Optional) */
+ ZCL_DRLK_ATTR_OPENPERIOD = 0x0006, /**< OpenPeriod (Optional) */
+ /* User/PIN/Schedule/Log attributes */
+ ZCL_DRLK_ATTR_NUM_LOGRECORDS = 0x0010, /**< NumberOfLogRecordsSupported (Optional) */
+ ZCL_DRLK_ATTR_NUM_TOTALUSERS = 0x0011, /**< NumberOfTotalUsersSupported (Optional) */
+ ZCL_DRLK_ATTR_NUM_PINUSERS = 0x0012, /**< NumberOfPINUsersSupported (Optional) */
+ ZCL_DRLK_ATTR_NUM_RFIDUSERS = 0x0013, /**< NumberOfRFIDUsersSupported (Optional) */
+ ZCL_DRLK_ATTR_NUM_WD_SCHEDULES = 0x0014, /**< NumberOfWeekDaySchedulesSupportedPerUser (Optional) */
+ ZCL_DRLK_ATTR_NUM_YD_SCHEDULES = 0x0015, /**< NumberOfYearDaySchedulesSupportedPerUser (Optional) */
+ ZCL_DRLK_ATTR_NUM_HD_SCHEDULES = 0x0016, /**< NumberOfHolidaySchedulesSupported (Optional) */
+ ZCL_DRLK_ATTR_MAX_PIN_LEN = 0x0017, /**< MaxPINCodeLength (Optional) */
+ ZCL_DRLK_ATTR_MIN_PIN_LEN = 0x0018, /**< MinPINCodeLength (Optional) */
+ ZCL_DRLK_ATTR_MAX_RFID_LEN = 0x0019, /**< MaxRFIDCodeLength (Optional) */
+ ZCL_DRLK_ATTR_MIN_RFID_LEN = 0x001A, /**< MinRFIDCodeLength (Optional) */
+ /* Operational Settings */
+ ZCL_DRLK_ATTR_LOGGING = 0x0020, /**< EnableLogging (Optional) */
+ ZCL_DRLK_ATTR_LANGUAGE = 0x0021, /**< Language (Optional) */
+ ZCL_DRLK_ATTR_LED_SETTINGS = 0x0022, /**< LEDSettings (Optional) */
+ ZCL_DRLK_ATTR_AUTO_RELOCK = 0x0023, /**< AutoRelockTime (Optional) */
+ ZCL_DRLK_ATTR_VOLUME = 0x0024, /**< SoundVolume (Optional) */
+ ZCL_DRLK_ATTR_MODE = 0x0025, /**< OperatingMode (Optional) */
+ ZCL_DRLK_ATTR_SUPPORTED_MODES = 0x0026, /**< SupportedOperatingModes (Optional) */
+ ZCL_DRLK_ATTR_DEF_CFG = 0x0027, /**< DefaultConfigurationRegister (Optional) */
+ ZCL_DRLK_ATTR_LOCAL_PROG = 0x0028, /**< EnableLocalProgramming (Optional) */
+ ZCL_DRLK_ATTR_ONETOUCH_LOCK = 0x0029, /**< EnableOneTouchLocking (Optional) */
+ ZCL_DRLK_ATTR_INSIDE_STATUS = 0x002A, /**< EnableInsideStatusLED (Optional) */
+ ZCL_DRLK_ATTR_PRIV_BUTTON = 0x002B, /**< EnablePrivacyModeButton (Optional) */
+ /* Security Settings */
+ ZCL_DRLK_ATTR_WRONGCODE_LIMIT = 0x0030, /**< WrongCodeEntryLimit (Optional) */
+ ZCL_DRLK_ATTR_TEMP_DISABLE = 0x0031, /**< UserCodeTemporaryDisableTime (Optional) */
+ ZCL_DRLK_ATTR_PIN_OTA = 0x0032, /**< SendPINOverTheAir (Optional) */
+ ZCL_DRLK_ATTR_PIN_FOR_RF = 0x0033, /**< RequirePINforRFOperation (Optional) */
+ ZCL_DRLK_ATTR_SEC_LEVEL = 0x0034, /**< SecurityLevel (Optional) */
+ /* Alarms and Event masks */
+ ZCL_DRLK_ATTR_ALARM_MASK = 0x0040, /**< AlarmMask (Optional) */
+ ZCL_DRLK_ATTR_KEYPAD_OP_EVENT_MASK = 0x0041, /**< KeypadOperationEventMask (Optional) */
+ ZCL_DRLK_ATTR_RF_OP_EVENT_MASK = 0x0042, /**< RFOperationEventMask (Optional) */
+ ZCL_DRLK_ATTR_MANUAL_OP_EVENT_MASK = 0x0043, /**< ManualOperationEventMask (Optional) */
+ ZCL_DRLK_ATTR_RFID_EVENT_MASK = 0x0044, /**< RFIDOperationEventMask (Optional) */
+ ZCL_DRLK_ATTR_KEYPAD_EVENT_MASK = 0x0045, /**< KeypadProgrammingEventMask (Optional) */
+ ZCL_DRLK_ATTR_RF_PROG_EVENT_MASK = 0x0046, /**< RFProgrammingEventMask (Optional) */
+ ZCL_DRLK_ATTR_RFID_PROG_EVENT_MASK = 0x0047 /**< RFIDProgrammingEventMask (Optional) */
};
/* 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
+#define ZCL_DRLK_LOGRECORDS_DEFAULT 0
+#define ZCL_DRLK_TOTALUSERS_DEFAULT 0
+#define ZCL_DRLK_PINUSERS_DEFAULT 0
+#define ZCL_DRLK_RFIDUSERS_DEFAULT 0
+#define ZCL_DRLK_WD_SCHEDULES_DEFAULT 0
+#define ZCL_DRLK_YD_SCHEDULES_DEFAULT 0
+#define ZCL_DRLK_HD_SCHEDULES_DEFAULT 0
+#define ZCL_DRLK_AUTO_RELOCK_DEFAULT 0
+#define ZCL_DRLK_MODE_DEFAULT 0
+#define ZCL_DRLK_BADCODE_LIMIT_DEFAULT 0
+#define ZCL_DRLK_TEMP_DISABLE_DEFAULT 0
+#define ZCL_DRLK_PIN_FOR_RF_DEFAULT 0
+#define ZCL_DRLK_SEC_LEVEL_DEFAULT 0
+#define ZCL_DRLK_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
+#define ZCL_DRLK_LOCKSTATE_NOTFULLYLOCKED 0
+#define ZCL_DRLK_LOCKSTATE_LOCKED 1
+#define ZCL_DRLK_LOCKSTATE_UNLOCKED 2
+#define ZCL_DRLK_LOCKSTATE_UNDEFINED 0xFF
/* LOCKTYPE attributes... many of these set yours accordingly. */
-#define DOORLOCK_LOCKTYPE 0x00
+#define ZCL_DRLK_LOCKTYPE 0x00
/* ACT_ENABLED attribute values */
-#define DOORLOCK_ACT_ENABLED_DISABLED 0
-#define DOORLOCK_ACT_ENABLED_ENABLED 1
+#define ZCL_DRLK_ACT_ENABLED_DISABLED 0
+#define ZCL_DRLK_ACT_ENABLED_ENABLED 1
+
+/* ZCL_DRLK_ATTR_DOORSTATE */
+#define ZCL_DRLK_DOORSTATE_OPEN 0x00U
+#define ZCL_DRLK_DOORSTATE_CLOSED 0x01U
+#define ZCL_DRLK_DOORSTATE_ERROR_JAMMED 0x02U
+#define ZCL_DRLK_DOORSTATE_ERROR_FORCED 0x03U
+#define ZCL_DRLK_DOORSTATE_ERROR_UNKNOWN 0x04U
+
+/* ZCL_DRLK_ATTR_MODE */
+#define ZCL_DRLK_MODE_NORMAL 0x00U
+#define ZCL_DRLK_MODE_VACATION 0x01U
+#define ZCL_DRLK_MODE_PRIVACY 0x02U
+#define ZCL_DRLK_MODE_NO_RF_LOCK 0x03U
+#define ZCL_DRLK_MODE_PASSAGE 0x04U
+
+/* ZCL_DRLK_ATTR_ALARM_MASK */
+#define ZCL_DRLK_ALARM_CODE_DEADBOLT_JAMMED 0x0001U
+#define ZCL_DRLK_ALARM_CODE_LOCK_RESET 0x0002U
+#define ZCL_DRLK_ALARM_CODE_RF_POWER_CYCLED 0x0008U
+#define ZCL_DRLK_ALARM_CODE_TAMPER_WRONG 0x0010U
+#define ZCL_DRLK_ALARM_CODE_TAMPER_REMOVED 0x0020U
+#define ZCL_DRLK_ALARM_CODE_FORCED_DOOR 0x0040U
+#define ZCL_DRLK_ALARM_CODE_MASK 0x007bU
/* 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
+#define ZCL_DRLK_MAX_PIN_LEN 0x08
+#define ZCL_DRLK_MIN_PIN_LEN 0x04
+#define ZCL_DRLK_MAX_RFID_LEN 0x14
+#define ZCL_DRLK_MIN_RFID_LEN 0x08
/* User Status Values */
-#define DOORLOCK_USER_STATUS_AVAILABLE 0x00U
-#define DOORLOCK_USER_STATUS_OCC_ENABLED 0x01U
-#define DOORLOCK_USER_STATUS_OCC_DISABLED 0x03U
-#define DOORLOCK_USER_STATUS_NOT_SUPP 0xffU
+#define ZCL_DRLK_USER_STATUS_AVAILABLE 0x00U
+#define ZCL_DRLK_USER_STATUS_OCC_ENABLED 0x01U
+#define ZCL_DRLK_USER_STATUS_OCC_DISABLED 0x03U
+#define ZCL_DRLK_USER_STATUS_NOT_SUPP 0xffU
/* User Type Values */
-#define DOORLOCK_USER_TYPE_UNRESTRICTED 0x00U
-#define DOORLOCK_USER_TYPE_YD_SCHEDULE 0x01U
-#define DOORLOCK_USER_TYPE_WD_SCHEDULE 0x02U
-#define DOORLOCK_USER_TYPE_MASTER 0x03U
-#define DOORLOCK_USER_TYPE_NON_ACCESS 0x04U
-#define DOORLOCK_USER_TYPE_NOT_SUPPORTED 0xffU
+#define ZCL_DRLK_USER_TYPE_UNRESTRICTED 0x00U
+#define ZCL_DRLK_USER_TYPE_YD_SCHEDULE 0x01U
+#define ZCL_DRLK_USER_TYPE_WD_SCHEDULE 0x02U
+#define ZCL_DRLK_USER_TYPE_MASTER 0x03U
+#define ZCL_DRLK_USER_TYPE_NON_ACCESS 0x04U
+#define ZCL_DRLK_USER_TYPE_NOT_SUPPORTED 0xffU
/* Response Status Values */
-#define DOORLOCK_STATUS_SUCCESS 0U
-#define DOORLOCK_STATUS_FAIL 1U
-#define DOORLOCK_STATUS_MEM_FULL 2U /* Only used with Set PIN/RFID Code Response Commands */
-#define DOORLOCK_STATUS_DUPLICATE 3U /* Only used with Set PIN/RFID Code Response Commands */
+#define ZCL_DRLK_STATUS_SUCCESS 0U
+#define ZCL_DRLK_STATUS_FAIL 1U
+#define ZCL_DRLK_STATUS_MEM_FULL 2U /* Only used with Set PIN/RFID Code Response Commands */
+#define ZCL_DRLK_STATUS_DUPLICATE 3U /* Only used with Set PIN/RFID Code Response Commands */
/* Schedule Values */
-#define DOORLOCK_HOURS_LIMIT 0x17U
-#define DOORLOCK_MINUTES_LIMIT 0x3BU
+#define ZCL_DRLK_HOURS_LIMIT 0x17U
+#define ZCL_DRLK_MINUTES_LIMIT 0x3BU
/* Security Settings */
-#define DOORLOCK_PIN_REQUIRED 1U
-#define DOORLOCK_PIN_NOT_REQUIRED 0U
+#define ZCL_DRLK_PIN_REQUIRED 1U
+#define ZCL_DRLK_PIN_NOT_REQUIRED 0U
-/* Client Generated Commands */
+/* Door Lock 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 */
+ ZCL_DRLK_CLI_LOCK = 0x00, /* Lock Door */
+ ZCL_DRLK_CLI_UNLOCK = 0x01, /* Unlock Door */
+ ZCL_DRLK_CLI_TOGGLE = 0x02, /* Toggle (Optional) */
+ ZCL_DRLK_CLI_UNLOCK_TIMEOUT = 0x03, /* Unlock with Timeout (Optional) */
+ ZCL_DRLK_CLI_GET_LOG = 0x04, /* Get Log Record (Optional) */
+ ZCL_DRLK_CLI_SETPIN = 0x05, /* Set PIN Code (Optional) */
+ ZCL_DRLK_CLI_GETPIN = 0x06, /* Get PIN Code (Optional) */
+ ZCL_DRLK_CLI_CLRPIN = 0x07, /* Clear PIN Code (Optional) */
+ ZCL_DRLK_CLI_CLR_ALL_PINS = 0x08, /* Clear All PIN Codes (Optional) */
+ ZCL_DRLK_CLI_SETUSER_STATUS = 0x09, /* Set User Status (Optional) */
+ ZCL_DRLK_CLI_GETUSER_STATUS = 0x0a, /* Get User Status (Optional) */
+ ZCL_DRLK_CLI_SETWD_SCHED = 0x0b, /* Set Weekday Schedule (Optional) */
+ ZCL_DRLK_CLI_GETWD_SCHED = 0x0c, /* Get Weekday Schedule (Optional) */
+ ZCL_DRLK_CLI_CLRWD_SCHED = 0x0d, /* Clear Weekday Schedule (Optional) */
+ ZCL_DRLK_CLI_SETYD_SCHED = 0x0e, /* Set Year Day Schedule (Optional) */
+ ZCL_DRLK_CLI_GETYD_SCHED = 0x0f, /* Get Year Day Schedule (Optional) */
+ ZCL_DRLK_CLI_CLRYD_SCHED = 0x10, /* Clear Year Day Schedule (Optional) */
+ ZCL_DRLK_CLI_SETHD_SCHED = 0x11, /* Set Holiday Schedule (Optional) */
+ ZCL_DRLK_CLI_GETHD_SCHED = 0x12, /* Get Holiday Schedule (Optional) */
+ ZCL_DRLK_CLI_CLRHD_SCHED = 0x13, /* Clear Holiday Schedule (Optional) */
+ ZCL_DRLK_CLI_SET_USERTYPE = 0x14, /* Set User Type (Optional) */
+ ZCL_DRLK_CLI_GET_USERTYPE = 0x15, /* Get User Type (Optional) */
+ ZCL_DRLK_CLI_SET_RFID = 0x16, /* Set RFID Code (Optional) */
+ ZCL_DRLK_CLI_GET_RFID = 0x17, /* Get RFID Code (Optional) */
+ ZCL_DRLK_CLI_CLR_RFID = 0x18, /* Clear RFID Code (Optional) */
+ ZCL_DRLK_CLI_CLR_ALL_RFIDS = 0x19 /* Clear All RFID Codes (Optional) */
+};
+
+/* Door Lock 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?) */
+ ZCL_DRLK_SVR_LOCK_RSP = 0x00, /* Lock Door Response */
+ ZCL_DRLK_SVR_UNLOCK_RSP = 0x01, /* Unlock Door Response */
+ ZCL_DRLK_SVR_TOGGLE_RSP = 0x02, /* Toggle Response (Optional) */
+ ZCL_DRLK_SVR_UNLOCK_TO_RSP = 0x03, /* Unlock with Timeout Response (Optional) */
+ ZCL_DRLK_SVR_GET_LOG_RSP = 0x04, /* Get Log Record Response (Optional) */
+ ZCL_DRLK_SVR_SETPIN_RSP = 0x05, /* Set PIN Code Response (Optional) */
+ ZCL_DRLK_SVR_GETPIN_RSP = 0x06, /* Get PIN Code Response (Optional) */
+ ZCL_DRLK_SVR_CLRPIN_RSP = 0x07, /* Clear PIN Code Response (Optional) */
+ ZCL_DRLK_SVR_CLR_ALL_PINS_RSP = 0x08, /* Clear All PIN Codes Response (Optional) */
+ ZCL_DRLK_SVR_SETUSER_STATUS_RSP = 0x09, /* Set User Status Response (Optional) */
+ ZCL_DRLK_SVR_GETUSER_STATUS_RSP = 0x0a, /* Get User Status Response (Optional) */
+ ZCL_DRLK_SVR_SETWD_SCHED_RSP = 0x0b, /* Set Weekday Schedule Response (Optional) */
+ ZCL_DRLK_SVR_GETWD_SCHED_RSP = 0x0c, /* Get Weekday Schedule Response (Optional) */
+ ZCL_DRLK_SVR_CLRWD_SCHED_RSP = 0x0d, /* Clear Weekday Schedule Response (Optional) */
+ ZCL_DRLK_SVR_SETYD_SCHED_RSP = 0x0e, /* Set Year Day Schedule Response (Optional) */
+ ZCL_DRLK_SVR_GETYD_SCHED_RSP = 0x0f, /* Get Year Day Schedule Response (Optional) */
+ ZCL_DRLK_SVR_CLRYD_SCHED_RSP = 0x10, /* Clear Year Day Schedule Response (Optional) */
+ ZCL_DRLK_SVR_SETHD_SCHED_RSP = 0x11, /* Set Holiday Schedule Response (Optional) */
+ ZCL_DRLK_SVR_GETHD_SCHED_RSP = 0x12, /* Get Holiday Schedule Response (Optional) */
+ ZCL_DRLK_SVR_CLRHD_SCHED_RSP = 0x13, /* Clear Holiday Schedule Response (Optional) */
+ ZCL_DRLK_SVR_SET_USERTYPE_RSP = 0x14, /* Set User Type Response (Optional) */
+ ZCL_DRLK_SVR_GET_USERTYPE_RSP = 0x15, /* Get User Type Response (Optional) */
+ ZCL_DRLK_SVR_SET_RFID_RSP = 0x16, /* Set RFID Code Response (Optional) */
+ ZCL_DRLK_SVR_GET_RFID_RSP = 0x17, /* Get RFID Code Response (Optional) */
+ ZCL_DRLK_SVR_CLR_RFID_RSP = 0x18, /* Clear RFID Code Response (Optional) */
+ ZCL_DRLK_SVR_CLR_ALL_RFIDS_RSP = 0x19, /* Clear All RFID Codes Response (Optional) */
/* Notifications */
- ZCL_DOORLOCK_SVR_OPER_EVENT_NOTIFY = 0x20,
- ZCL_DOORLOCK_SVR_PROG_EVENT_NOTIFY = 0x21
+ ZCL_DRLK_SVR_OPER_EVENT_NOTIFY = 0x20, /* Operating Event Notification (Optional) */
+ ZCL_DRLK_SVR_PROG_EVENT_NOTIFY = 0x21 /* Programming Event Notification (Optional) */
};
-/*---------------------------------------------------------------
- * Client
- *---------------------------------------------------------------
+/**
+ * Create a new instance of the Door Lock Client cluster
+ * @param zb Zigbee stack instance
+ * @param endpoint Endpoint on which to create cluster
+ * @return Cluster pointer, or NULL if there is an error
*/
-struct ZbZclClusterT * ZbZclDoorLockClientAlloc(struct ZigBeeT *zb, uint8_t ep);
+struct ZbZclClusterT * ZbZclDoorLockClientAlloc(struct ZigBeeT *zb, uint8_t endpoint);
/*---------------------------------------------------------------
* 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 */
+/** Lock Door request structure */
struct ZbZclDoorLockLockDoorReqT {
- uint8_t pin[DOORLOCK_MAX_PIN];
- uint8_t pin_len;
+ uint8_t pin[ZCL_DRLK_MAX_PIN_LEN]; /**< PIN/RFID Code */
+ uint8_t pin_len; /**< Length of PIN/RFID Code */
};
-enum ZclStatusCodeT ZbZclDoorLockClientLockReq(struct ZbZclClusterT *clusterPtr,
- const struct ZbApsAddrT *dst, struct ZbZclDoorLockLockDoorReqT *cmd_req,
+/**
+ * Send a Lock Door request command
+ * @param cluster Cluster instance from which to send this command
+ * @param dst Destination address for request
+ * @param req Lock Door request structure
+ * @param callback Callback function that will be invoked later when the response is received
+ * @param arg Pointer to application data that will later be provided back to the callback function when invoked
+ * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
+ */
+enum ZclStatusCodeT ZbZclDoorLockClientLockReq(struct ZbZclClusterT *cluster,
+ const struct ZbApsAddrT *dst, struct ZbZclDoorLockLockDoorReqT *req,
void (*callback)(struct ZbZclCommandRspT *zcl_rsp, void *arg), void *arg);
+/** Lock Door response structure */
struct ZbZclDoorLockLockDoorRspT {
- uint8_t status; /* e.g. DOORLOCK_STATUS_SUCCESS */
+ uint8_t status; /**< Status */
};
-enum ZclStatusCodeT ZbZclDoorLockServerSendLockRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+enum ZclStatusCodeT ZbZclDoorLockServerSendLockRsp(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *dst,
struct ZbZclDoorLockLockDoorRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
-/* ZCL_DOORLOCK_CLI_UNLOCK */
+/** Unlock Door request structure */
struct ZbZclDoorLockUnlockDoorReqT {
- uint8_t pin[DOORLOCK_MAX_PIN];
- uint8_t pin_len;
+ uint8_t pin[ZCL_DRLK_MAX_PIN_LEN]; /**< PIN/RFID Code */
+ uint8_t pin_len; /**< Length of PIN/RFID Code */
};
-enum ZclStatusCodeT ZbZclDoorLockClientUnlockReq(struct ZbZclClusterT *clusterPtr,
- const struct ZbApsAddrT *dst, struct ZbZclDoorLockUnlockDoorReqT *cmd_req,
+/**
+ * Send an Unlock Door request command
+ * @param cluster Cluster instance from which to send this command
+ * @param dst Destination address for request
+ * @param req Unlock Door request structure
+ * @param callback Callback function that will be invoked later when the response is received
+ * @param arg Pointer to application data that will later be provided back to the callback function when invoked
+ * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
+ */
+enum ZclStatusCodeT ZbZclDoorLockClientUnlockReq(struct ZbZclClusterT *cluster,
+ const struct ZbApsAddrT *dst, struct ZbZclDoorLockUnlockDoorReqT *req,
void (*callback)(struct ZbZclCommandRspT *zcl_rsp, void *arg), void *arg);
+/** Unlock Door response structure */
struct ZbZclDoorLockUnlockDoorRspT {
- uint8_t status; /* e.g. DOORLOCK_STATUS_SUCCESS */
+ uint8_t status; /**< Status */
};
-enum ZclStatusCodeT ZbZclDoorLockServerSendUnlockRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+enum ZclStatusCodeT ZbZclDoorLockServerSendUnlockRsp(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *dst,
struct ZbZclDoorLockUnlockDoorRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
-/* ZCL_DOORLOCK_CLI_TOGGLE */
+/** Toggle request structure */
struct ZbZclDoorLockToggleReqT {
- uint8_t pin[DOORLOCK_MAX_PIN];
- uint8_t pin_len;
+ uint8_t pin[ZCL_DRLK_MAX_PIN_LEN]; /**< PIN/RFID Code */
+ uint8_t pin_len; /**< Length of PIN/RFID Code */
};
-enum ZclStatusCodeT ZbZclDoorLockClientToggleReq(struct ZbZclClusterT *clusterPtr,
- const struct ZbApsAddrT *dst, struct ZbZclDoorLockToggleReqT *cmd_req,
+/**
+ * Send Toggle request command
+ * @param cluster Cluster instance from which to send this command
+ * @param dst Destination address for request
+ * @param req Toggle request structure
+ * @param callback Callback function that will be invoked later when the response is received
+ * @param arg Pointer to application data that will later be provided back to the callback function when invoked
+ * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
+ */
+enum ZclStatusCodeT ZbZclDoorLockClientToggleReq(struct ZbZclClusterT *cluster,
+ const struct ZbApsAddrT *dst, struct ZbZclDoorLockToggleReqT *req,
void (*callback)(struct ZbZclCommandRspT *zcl_rsp, void *arg), void *arg);
+/** Toggle response structure */
struct ZbZclDoorLockToggleRspT {
- uint8_t status; /* e.g. DOORLOCK_STATUS_SUCCESS */
+ uint8_t status; /**< Status */
};
-enum ZclStatusCodeT ZbZclDoorLockServerSendToggleRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+enum ZclStatusCodeT ZbZclDoorLockServerSendToggleRsp(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *dst,
struct ZbZclDoorLockToggleRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
-/* ZCL_DOORLOCK_CLI_UNLOCK_TIMEOUT */
+/** Unlock with Timeout request structure */
struct ZbZclDoorLockUnlockTimeoutReqT {
- uint16_t timeout;
- uint8_t pin[DOORLOCK_MAX_PIN];
- uint8_t pin_len;
+ uint16_t timeout; /**< Timeout in seconds */
+ uint8_t pin[ZCL_DRLK_MAX_PIN_LEN]; /**< PIN/RFID Code */
+ uint8_t pin_len; /**< Length of PIN/RFID Code */
};
-enum ZclStatusCodeT ZbZclDoorLockClientUnlockTimeoutReq(struct ZbZclClusterT *clusterPtr,
- const struct ZbApsAddrT *dst, struct ZbZclDoorLockUnlockTimeoutReqT *cmd_req,
+/**
+ * Send an Unlock with Timeout request command
+ * @param cluster Cluster instance from which to send this command
+ * @param dst Destination address for request
+ * @param req Unlock with Timeout request structure
+ * @param callback Callback function that will be invoked later when the response is received
+ * @param arg Pointer to application data that will later be provided back to the callback function when invoked
+ * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
+ */
+enum ZclStatusCodeT ZbZclDoorLockClientUnlockTimeoutReq(struct ZbZclClusterT *cluster,
+ const struct ZbApsAddrT *dst, struct ZbZclDoorLockUnlockTimeoutReqT *req,
void (*callback)(struct ZbZclCommandRspT *zcl_rsp, void *arg), void *arg);
+/** Unlock with Timeout response structure */
struct ZbZclDoorLockUnlockTimeoutRspT {
- uint8_t status; /* e.g. DOORLOCK_STATUS_SUCCESS */
+ uint8_t status; /**< Status */
};
-enum ZclStatusCodeT ZbZclDoorLockServerSendUnlockTimeoutRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+enum ZclStatusCodeT ZbZclDoorLockServerSendUnlockTimeoutRsp(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *dst,
struct ZbZclDoorLockUnlockTimeoutRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/*---------------------------------------------------------------
@@ -464,44 +509,64 @@ struct ZbZclDoorLockGetLogReqT {
};
enum ZclStatusCodeT ZbZclDoorLockClientGetLogReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
- struct ZbZclDoorLockGetLogReqT *get_log_req,
+ struct ZbZclDoorLockGetLogReqT *req,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+/** Get Log Record response structure */
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;
+ uint16_t log_entry_id; /**< Log Entry ID */
+ uint32_t time_stamp; /**< Timestamp */
+ uint8_t event_type; /**< Event Type */
+ uint8_t source; /**< Source (see Operation Event Sources) */
+ uint8_t alarm_code; /**< Event ID/Alarm Code (see Operation Event Codes) */
+ uint16_t user_id; /**< User ID */
+ uint8_t pin[ZCL_DRLK_MAX_PIN_LEN]; /**< PIN */
+ uint8_t pin_len; /**< Length of PIN */
};
-enum ZclStatusCodeT ZbZclDoorLockServerSendGetLogRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+/**
+ * Send a Get Log Record response command
+ * @param cluster Cluster instance from which to send this command
+ * @param dst Destination address for response, including sequence number and tx options
+ * @param rsp Get Log Record response structure
+ * @param callback Callback function that will be invoked later when the response is received
+ * @param arg Pointer to application data that will later be provided back to the callback function when invoked
+ * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
+ */
+enum ZclStatusCodeT ZbZclDoorLockServerSendGetLogRsp(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *dst,
struct ZbZclDoorLockGetLogRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/*---------------------------------------------------------------
* Client Set Pin Helper
*---------------------------------------------------------------
*/
+/** Set PIN Code request structure */
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;
+ uint16_t user_id; /**< User ID */
+ uint8_t user_status; /**< User Status */
+ uint8_t user_type; /**< User Type */
+ uint8_t pin[ZCL_DRLK_MAX_PIN_LEN]; /**< PIN */
+ uint8_t pin_len; /**< Length of PIN */
};
+/**
+ * Send a Set PIN Code request command
+ * @param cluster Cluster instance from which to send this command
+ * @param req Set PIN Code request structure
+ * @param callback Callback function that will be invoked later when the response is received
+ * @param arg Pointer to application data that will later be provided back to the callback function when invoked
+ * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
+ */
enum ZclStatusCodeT ZbZclDoorLockClientSetPinReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
- struct ZbZclDoorLockSetPinReqT *set_pin_req,
+ struct ZbZclDoorLockSetPinReqT *req,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+/** Set PIN Code response structure */
struct ZbZclDoorLockSetPinRspT {
- uint8_t status; /* e.g. DOORLOCK_STATUS_SUCCESS */
+ uint8_t status; /**< Status */
};
-enum ZclStatusCodeT ZbZclDoorLockServerSendSetPinRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+enum ZclStatusCodeT ZbZclDoorLockServerSendSetPinRsp(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *dst,
struct ZbZclDoorLockSetPinRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/*---------------------------------------------------------------
@@ -513,17 +578,28 @@ struct ZbZclDoorLockGetPinReqT {
};
enum ZclStatusCodeT ZbZclDoorLockClientGetPinReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
- struct ZbZclDoorLockGetPinReqT *get_pin_req,
+ struct ZbZclDoorLockGetPinReqT *req,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+/** Get PIN Code response structure */
struct ZbZclDoorLockGetPinRspT {
- uint16_t user_id;
- uint8_t user_status;
- uint8_t user_type;
- uint8_t pin[DOORLOCK_MAX_PIN];
- uint8_t pin_len;
+ uint16_t user_id; /**< User ID */
+ uint8_t user_status; /**< User Status */
+ uint8_t user_type; /**< User Type */
+ uint8_t pin[ZCL_DRLK_MAX_PIN_LEN]; /**< Code */
+ uint8_t pin_len; /**< Length of Code */
};
-enum ZclStatusCodeT ZbZclDoorLockServerSendGetPinRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+
+/**
+ * Send a Get PIN Code response command
+ * @param cluster Cluster instance from which to send this command
+ * @param dst Destination address for response, including sequence number and tx options
+ * @param rsp Get PIN Code response structure
+ * @param callback Callback function that will be invoked later when the response is received
+ * @param arg Pointer to application data that will later be provided back to the callback function when invoked
+ * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
+ */
+enum ZclStatusCodeT ZbZclDoorLockServerSendGetPinRsp(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *dst,
struct ZbZclDoorLockGetPinRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/*---------------------------------------------------------------
@@ -535,14 +611,15 @@ struct ZbZclDoorLockClrPinReqT {
};
enum ZclStatusCodeT ZbZclDoorLockClientClrPinReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
- struct ZbZclDoorLockClrPinReqT *clr_pin_req,
+ struct ZbZclDoorLockClrPinReqT *req,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+/** Clear PIN Code response structure */
struct ZbZclDoorLockClrPinRspT {
- uint8_t status; /* e.g. DOORLOCK_STATUS_SUCCESS */
+ uint8_t status; /**< Status */
};
-enum ZclStatusCodeT ZbZclDoorLockServerSendClrPinRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+enum ZclStatusCodeT ZbZclDoorLockServerSendClrPinRsp(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *dst,
struct ZbZclDoorLockClrPinRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/*---------------------------------------------------------------
@@ -556,7 +633,7 @@ struct ZbZclDoorLockClrAllPinRspT {
uint8_t status; /* e.g. DOORLOCK_STATUS_SUCCESS */
};
-enum ZclStatusCodeT ZbZclDoorLockServerSendClrAllPinRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+enum ZclStatusCodeT ZbZclDoorLockServerSendClrAllPinRsp(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *dst,
struct ZbZclDoorLockClrAllPinRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/*---------------------------------------------------------------
@@ -569,14 +646,15 @@ struct ZbZclDoorLockSetUserStatusReqT {
};
enum ZclStatusCodeT ZbZclDoorLockClientSetUserStatusReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
- struct ZbZclDoorLockSetUserStatusReqT *set_user_status_req,
+ struct ZbZclDoorLockSetUserStatusReqT *req,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+/** Set User Status response structure */
struct ZbZclDoorLockSetUserStatusRspT {
- uint8_t status; /* e.g. DOORLOCK_STATUS_SUCCESS */
+ uint8_t status; /**< Status */
};
-enum ZclStatusCodeT ZbZclDoorLockServerSendSetUserStatusRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+enum ZclStatusCodeT ZbZclDoorLockServerSendSetUserStatusRsp(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *dst,
struct ZbZclDoorLockSetUserStatusRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/*---------------------------------------------------------------
@@ -588,15 +666,16 @@ struct ZbZclDoorLockGetUserStatusReqT {
};
enum ZclStatusCodeT ZbZclDoorLockClientGetUserStatusReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
- struct ZbZclDoorLockGetUserStatusReqT *get_user_status_req,
+ struct ZbZclDoorLockGetUserStatusReqT *req,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+/** Get User Status response structure */
struct ZbZclDoorLockGetUserStatusRspT {
- uint16_t user_id;
- uint8_t user_status;
+ uint16_t user_id; /**< User ID */
+ uint8_t user_status; /**< User Status */
};
-enum ZclStatusCodeT ZbZclDoorLockServerSendGetUserStatusRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+enum ZclStatusCodeT ZbZclDoorLockServerSendGetUserStatusRsp(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *dst,
struct ZbZclDoorLockGetUserStatusRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/*---------------------------------------------------------------
@@ -613,13 +692,14 @@ struct ZbZclDoorLockSetWDScheduleReqT {
uint8_t end_minute;
};
enum ZclStatusCodeT ZbZclDoorLockClientSetWDScheduleReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
- struct ZbZclDoorLockSetWDScheduleReqT *set_wd_sched_req,
+ struct ZbZclDoorLockSetWDScheduleReqT *req,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+/** Set Weekday Schedule response structure */
struct ZbZclDoorLockSetWDScheduleRspT {
- uint8_t status; /* e.g. DOORLOCK_STATUS_SUCCESS */
+ uint8_t status; /**< Status */
};
-enum ZclStatusCodeT ZbZclDoorLockServerSendSetWDScheduleRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+enum ZclStatusCodeT ZbZclDoorLockServerSendSetWDScheduleRsp(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *dst,
struct ZbZclDoorLockSetWDScheduleRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/*---------------------------------------------------------------
@@ -631,12 +711,13 @@ struct ZbZclDoorLockGetWDScheduleReqT {
uint16_t user_id;
};
enum ZclStatusCodeT ZbZclDoorLockClientGetWDScheduleReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
- struct ZbZclDoorLockGetWDScheduleReqT *get_wd_sched_req,
+ struct ZbZclDoorLockGetWDScheduleReqT *req,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+/** Get Weekday Schedule response structure */
struct ZbZclDoorLockGetWDScheduleRspT {
- uint8_t schedule_id;
- uint16_t user_id;
+ uint8_t schedule_id; /**< Schedule ID */
+ uint16_t user_id; /**< User ID */
uint8_t status; /* e.g. ZCL_STATUS_SUCCESS */
uint8_t days_mask;
uint8_t start_hour;
@@ -644,7 +725,7 @@ struct ZbZclDoorLockGetWDScheduleRspT {
uint8_t end_hour;
uint8_t end_minute;
};
-enum ZclStatusCodeT ZbZclDoorLockServerSendGetWDScheduleRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+enum ZclStatusCodeT ZbZclDoorLockServerSendGetWDScheduleRsp(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *dst,
struct ZbZclDoorLockGetWDScheduleRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/*---------------------------------------------------------------
@@ -656,13 +737,14 @@ struct ZbZclDoorLockClrWDScheduleReqT {
uint16_t user_id;
};
enum ZclStatusCodeT ZbZclDoorLockClientClrWDScheduleReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
- struct ZbZclDoorLockClrWDScheduleReqT *clr_wd_schedule_req,
+ struct ZbZclDoorLockClrWDScheduleReqT *req,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+/** Clear Weekday Schedule response structure */
struct ZbZclDoorLockClrWDScheduleRspT {
- uint8_t status; /* e.g. DOORLOCK_STATUS_SUCCESS */
+ uint8_t status; /**< Status */
};
-enum ZclStatusCodeT ZbZclDoorLockServerSendClrWDScheduleRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+enum ZclStatusCodeT ZbZclDoorLockServerSendClrWDScheduleRsp(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *dst,
struct ZbZclDoorLockClrWDScheduleRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/*---------------------------------------------------------------
@@ -676,13 +758,14 @@ struct ZbZclDoorLockSetYDScheduleReqT {
uint32_t local_end_time;
};
enum ZclStatusCodeT ZbZclDoorLockClientSetYDScheduleReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
- struct ZbZclDoorLockSetYDScheduleReqT *set_yd_sched_req,
+ struct ZbZclDoorLockSetYDScheduleReqT *req,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+/** Set Year Day Schedule response structure */
struct ZbZclDoorLockSetYDScheduleRspT {
- uint8_t status; /* e.g. DOORLOCK_STATUS_SUCCESS */
+ uint8_t status; /**< Status */
};
-enum ZclStatusCodeT ZbZclDoorLockServerSendSetYDScheduleRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+enum ZclStatusCodeT ZbZclDoorLockServerSendSetYDScheduleRsp(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *dst,
struct ZbZclDoorLockSetYDScheduleRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/*---------------------------------------------------------------
@@ -694,17 +777,18 @@ struct ZbZclDoorLockGetYDScheduleReqT {
uint16_t user_id;
};
enum ZclStatusCodeT ZbZclDoorLockClientGetYDScheduleReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
- struct ZbZclDoorLockGetYDScheduleReqT *get_yd_sched_req,
+ struct ZbZclDoorLockGetYDScheduleReqT *req,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+/** Get Year Day Schedule response structure */
struct ZbZclDoorLockGetYDScheduleRspT {
- uint8_t schedule_id;
- uint16_t user_id;
+ uint8_t schedule_id; /**< Schedule ID */
+ uint16_t user_id; /**< User ID */
uint8_t status; /* e.g. ZCL_STATUS_SUCCESS */
uint32_t local_start_time;
uint32_t local_end_time;
};
-enum ZclStatusCodeT ZbZclDoorLockServerSendGetYDScheduleRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+enum ZclStatusCodeT ZbZclDoorLockServerSendGetYDScheduleRsp(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *dst,
struct ZbZclDoorLockGetYDScheduleRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/*---------------------------------------------------------------
@@ -716,13 +800,14 @@ struct ZbZclDoorLockClrYDScheduleReqT {
uint16_t user_id;
};
enum ZclStatusCodeT ZbZclDoorLockClientClrYDScheduleReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
- struct ZbZclDoorLockClrYDScheduleReqT *clr_yd_schedule_req,
+ struct ZbZclDoorLockClrYDScheduleReqT *req,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+/** Clear Year Day Schedule response structure */
struct ZbZclDoorLockClrYDScheduleRspT {
- uint8_t status; /* e.g. DOORLOCK_STATUS_SUCCESS */
+ uint8_t status; /**< Status */
};
-enum ZclStatusCodeT ZbZclDoorLockServerSendClrYDScheduleRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+enum ZclStatusCodeT ZbZclDoorLockServerSendClrYDScheduleRsp(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *dst,
struct ZbZclDoorLockClrYDScheduleRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/*---------------------------------------------------------------
@@ -736,13 +821,14 @@ struct ZbZclDoorLockSetHDScheduleReqT {
uint8_t operating_mode;
};
enum ZclStatusCodeT ZbZclDoorLockClientSetHDScheduleReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
- struct ZbZclDoorLockSetHDScheduleReqT *set_hd_sched_req,
+ struct ZbZclDoorLockSetHDScheduleReqT *req,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+/** Set Holiday Schedule response structure */
struct ZbZclDoorLockSetHDScheduleRspT {
- uint8_t status; /* e.g. DOORLOCK_STATUS_SUCCESS */
+ uint8_t status; /**< Status */
};
-enum ZclStatusCodeT ZbZclDoorLockServerSendSetHDScheduleRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+enum ZclStatusCodeT ZbZclDoorLockServerSendSetHDScheduleRsp(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *dst,
struct ZbZclDoorLockSetHDScheduleRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/*---------------------------------------------------------------
@@ -753,17 +839,18 @@ struct ZbZclDoorLockGetHDScheduleReqT {
uint8_t schedule_id;
};
enum ZclStatusCodeT ZbZclDoorLockClientGetHDScheduleReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
- struct ZbZclDoorLockGetHDScheduleReqT *get_hd_sched_req,
+ struct ZbZclDoorLockGetHDScheduleReqT *req,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+/** Get Holiday Schedule response structure */
struct ZbZclDoorLockGetHDScheduleRspT {
- uint8_t schedule_id;
- uint8_t status; /* e.g. ZCL_STATUS_SUCCESS */
+ uint8_t schedule_id; /**< Holiday Schedule ID */
+ uint8_t status; /**< Status */
uint32_t local_start_time;
uint32_t local_end_time;
uint8_t operating_mode;
};
-enum ZclStatusCodeT ZbZclDoorLockServerSendGetHDScheduleRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+enum ZclStatusCodeT ZbZclDoorLockServerSendGetHDScheduleRsp(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *dst,
struct ZbZclDoorLockGetHDScheduleRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/*---------------------------------------------------------------
@@ -774,13 +861,14 @@ struct ZbZclDoorLockClrHDScheduleReqT {
uint8_t schedule_id;
};
enum ZclStatusCodeT ZbZclDoorLockClientClrHDScheduleReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
- struct ZbZclDoorLockClrHDScheduleReqT *clr_hd_schedule_req,
+ struct ZbZclDoorLockClrHDScheduleReqT *req,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+/** Clear Holiday Schedule response structure */
struct ZbZclDoorLockClrHDScheduleRspT {
- uint8_t status; /* e.g. DOORLOCK_STATUS_SUCCESS */
+ uint8_t status; /**< Status */
};
-enum ZclStatusCodeT ZbZclDoorLockServerSendClrHDScheduleRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+enum ZclStatusCodeT ZbZclDoorLockServerSendClrHDScheduleRsp(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *dst,
struct ZbZclDoorLockClrHDScheduleRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/*---------------------------------------------------------------
@@ -792,13 +880,14 @@ struct ZbZclDoorLockSetUserTypeReqT {
uint8_t user_type;
};
enum ZclStatusCodeT ZbZclDoorLockClientSetUserTypeReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
- struct ZbZclDoorLockSetUserTypeReqT *set_user_type_req,
+ struct ZbZclDoorLockSetUserTypeReqT *req,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+/** Set User Type response structure */
struct ZbZclDoorLockSetUserTypeRspT {
- uint8_t status; /* e.g. DOORLOCK_STATUS_SUCCESS */
+ uint8_t status; /**< Status */
};
-enum ZclStatusCodeT ZbZclDoorLockServerSendSetUserTypeRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+enum ZclStatusCodeT ZbZclDoorLockServerSendSetUserTypeRsp(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *dst,
struct ZbZclDoorLockSetUserTypeRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/*---------------------------------------------------------------
@@ -809,35 +898,47 @@ struct ZbZclDoorLockGetUserTypeReqT {
uint16_t user_id;
};
enum ZclStatusCodeT ZbZclDoorLockClientGetUserTypeReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
- struct ZbZclDoorLockGetUserTypeReqT *get_user_type_req,
+ struct ZbZclDoorLockGetUserTypeReqT *req,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+/** Get User Type response structure */
struct ZbZclDoorLockGetUserTypeRspT {
- uint16_t user_id;
- uint8_t user_type;
+ uint16_t user_id; /**< User ID */
+ uint8_t user_type; /**< User Type */
};
-enum ZclStatusCodeT ZbZclDoorLockServerSendGetUserTypeRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+enum ZclStatusCodeT ZbZclDoorLockServerSendGetUserTypeRsp(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *dst,
struct ZbZclDoorLockGetUserTypeRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/*---------------------------------------------------------------
* Client Set RFID Helper
*---------------------------------------------------------------
*/
+/** Set RFID Code request structure */
struct ZbZclDoorLockSetRfidReqT {
- uint16_t user_id;
- uint8_t user_status;
- uint8_t user_type;
- uint8_t rfid[DOORLOCK_MAX_RFID];
- uint8_t rfid_len;
+ uint16_t user_id; /**< User ID */
+ uint8_t user_status; /**< User Status */
+ uint8_t user_type; /**< User Type */
+ uint8_t rfid[ZCL_DRLK_MAX_RFID_LEN]; /**< RFID Code */
+ uint8_t rfid_len; /**< Length of RFID Code */
};
+
+/**
+ * Send a Set RFID Code request command
+ * @param cluster Cluster instance from which to send this command
+ * @param req Set RFID Code request structure
+ * @param callback Callback function that will be invoked later when the response is received
+ * @param arg Pointer to application data that will later be provided back to the callback function when invoked
+ * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
+ */
enum ZclStatusCodeT ZbZclDoorLockClientSetRfidReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
- struct ZbZclDoorLockSetRfidReqT *set_rfid_req,
+ struct ZbZclDoorLockSetRfidReqT *req,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+/** Set RFID Code response structure */
struct ZbZclDoorLockSetRfidRspT {
- uint8_t status; /* e.g. DOORLOCK_STATUS_SUCCESS */
+ uint8_t status; /**< Status */
};
-enum ZclStatusCodeT ZbZclDoorLockServerSendSetRfidRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+enum ZclStatusCodeT ZbZclDoorLockServerSendSetRfidRsp(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *dst,
struct ZbZclDoorLockSetRfidRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/*---------------------------------------------------------------
@@ -848,17 +949,28 @@ struct ZbZclDoorLockGetRfidReqT {
uint16_t user_id;
};
enum ZclStatusCodeT ZbZclDoorLockClientGetRfidReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
- struct ZbZclDoorLockGetRfidReqT *get_rfid_req,
+ struct ZbZclDoorLockGetRfidReqT *req,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+/** Get RFID Code response structure */
struct ZbZclDoorLockGetRfidRspT {
- uint16_t user_id;
- uint8_t user_status;
- uint8_t user_type;
- uint8_t rfid[DOORLOCK_MAX_RFID];
- uint8_t rfid_len;
+ uint16_t user_id; /**< User ID */
+ uint8_t user_status; /**< User Status */
+ uint8_t user_type; /**< User Type */
+ uint8_t rfid[ZCL_DRLK_MAX_RFID_LEN]; /**< RFID Code */
+ uint8_t rfid_len; /**< Length of RFID Code */
};
-enum ZclStatusCodeT ZbZclDoorLockServerSendGetRfidRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+
+/**
+ * Send a Get RFID Code response command
+ * @param cluster Cluster instance from which to send this command
+ * @param dst Destination address for response, including sequence number and tx options
+ * @param rsp Get RFID Code response structure
+ * @param callback Callback function that will be invoked later when the response is received
+ * @param arg Pointer to application data that will later be provided back to the callback function when invoked
+ * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
+ */
+enum ZclStatusCodeT ZbZclDoorLockServerSendGetRfidRsp(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *dst,
struct ZbZclDoorLockGetRfidRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/*---------------------------------------------------------------
@@ -869,13 +981,14 @@ struct ZbZclDoorLockClrRfidReqT {
uint16_t user_id;
};
enum ZclStatusCodeT ZbZclDoorLockClientClrRfidReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
- struct ZbZclDoorLockClrRfidReqT *clr_rfid_req,
+ struct ZbZclDoorLockClrRfidReqT *req,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+/** Clear RFID Code response structure */
struct ZbZclDoorLockClrRfidRspT {
- uint8_t status; /* e.g. DOORLOCK_STATUS_SUCCESS */
+ uint8_t status; /**< Status */
};
-enum ZclStatusCodeT ZbZclDoorLockServerSendClrRfidRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+enum ZclStatusCodeT ZbZclDoorLockServerSendClrRfidRsp(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *dst,
struct ZbZclDoorLockClrRfidRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/*---------------------------------------------------------------
@@ -888,7 +1001,7 @@ enum ZclStatusCodeT ZbZclDoorLockClientClrAllRfidReq(struct ZbZclClusterT *clust
struct ZbZclDoorLockClrAllRfidRspT {
uint8_t status; /* e.g. DOORLOCK_STATUS_SUCCESS */
};
-enum ZclStatusCodeT ZbZclDoorLockServerSendClrAllRfidRsp(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *dst,
+enum ZclStatusCodeT ZbZclDoorLockServerSendClrAllRfidRsp(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *dst,
struct ZbZclDoorLockClrAllRfidRspT *rsp, void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/*---------------------------------------------------------------
@@ -901,36 +1014,72 @@ enum ZclStatusCodeT ZbZclDoorLockServerSendClrAllRfidRsp(struct ZbZclClusterT *c
* 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 */
+
+/** Door Lock Server callbacks configuration */
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,
+ enum ZclStatusCodeT (*lock)(struct ZbZclClusterT *cluster, struct ZbZclDoorLockLockDoorReqT *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Callback to application, invoked on receipt of Lock Door command. */
+ enum ZclStatusCodeT (*unlock)(struct ZbZclClusterT *cluster, struct ZbZclDoorLockUnlockDoorReqT *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Callback to application, invoked on receipt of Unlock Door command. */
+ enum ZclStatusCodeT (*toggle)(struct ZbZclClusterT *cluster, struct ZbZclDoorLockToggleReqT *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Callback to application, invoked on receipt of Toggle command. */
+ enum ZclStatusCodeT (*unlock_timeout)(struct ZbZclClusterT *cluster, struct ZbZclDoorLockUnlockTimeoutReqT *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Callback to application, invoked on receipt of Unlock with Timeout command. */
+ enum ZclStatusCodeT (*get_log)(struct ZbZclClusterT *cluster, struct ZbZclDoorLockGetLogReqT *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Callback to application, invoked on receipt of Get Log Record command. */
+ enum ZclStatusCodeT (*set_pin)(struct ZbZclClusterT *cluster, struct ZbZclDoorLockSetPinReqT *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Callback to application, invoked on receipt of Set PIN Code command. */
+ enum ZclStatusCodeT (*get_pin)(struct ZbZclClusterT *cluster, struct ZbZclDoorLockGetPinReqT *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Callback to application, invoked on receipt of Get PIN Code command. */
+ enum ZclStatusCodeT (*clr_pin)(struct ZbZclClusterT *cluster, struct ZbZclDoorLockClrPinReqT *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Callback to application, invoked on receipt of Clear PIN Code command. */
+ enum ZclStatusCodeT (*clr_all_pins)(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Callback to application, invoked on receipt of Clear All PIN Codes command. */
+ enum ZclStatusCodeT (*set_user_status)(struct ZbZclClusterT *cluster, struct ZbZclDoorLockSetUserStatusReqT *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Callback to application, invoked on receipt of Set User Status command. */
+ enum ZclStatusCodeT (*get_user_status)(struct ZbZclClusterT *cluster, struct ZbZclDoorLockGetUserStatusReqT *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Callback to application, invoked on receipt of Get User Status command. */
+ enum ZclStatusCodeT (*set_wd_sched)(struct ZbZclClusterT *cluster, struct ZbZclDoorLockSetWDScheduleReqT *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Callback to application, invoked on receipt of Set Weekday Schedule command. */
+ enum ZclStatusCodeT (*get_wd_sched)(struct ZbZclClusterT *cluster, struct ZbZclDoorLockGetWDScheduleReqT *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Callback to application, invoked on receipt of Get Weekday Schedule command. */
+ enum ZclStatusCodeT (*clr_wd_sched)(struct ZbZclClusterT *cluster, struct ZbZclDoorLockClrWDScheduleReqT *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Callback to application, invoked on receipt of Clear Weekday Schedule command. */
+ enum ZclStatusCodeT (*set_yd_sched)(struct ZbZclClusterT *cluster, struct ZbZclDoorLockSetYDScheduleReqT *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Callback to application, invoked on receipt of Set Year Day Schedule command. */
+ enum ZclStatusCodeT (*get_yd_sched)(struct ZbZclClusterT *cluster, struct ZbZclDoorLockGetYDScheduleReqT *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Callback to application, invoked on receipt of Get Year Day Schedule command. */
+ enum ZclStatusCodeT (*clr_yd_sched)(struct ZbZclClusterT *cluster, struct ZbZclDoorLockClrYDScheduleReqT *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Callback to application, invoked on receipt of Clear Year Day Schedule command. */
+ enum ZclStatusCodeT (*set_hd_sched)(struct ZbZclClusterT *cluster, struct ZbZclDoorLockSetHDScheduleReqT *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Callback to application, invoked on receipt of Set Holiday Schedule command. */
+ enum ZclStatusCodeT (*get_hd_sched)(struct ZbZclClusterT *cluster, struct ZbZclDoorLockGetHDScheduleReqT *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Callback to application, invoked on receipt of Get Holiday Schedule command. */
+ enum ZclStatusCodeT (*clr_hd_sched)(struct ZbZclClusterT *cluster, struct ZbZclDoorLockClrHDScheduleReqT *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Callback to application, invoked on receipt of Clear Holiday Schedule command. */
+ enum ZclStatusCodeT (*set_user_type)(struct ZbZclClusterT *cluster, struct ZbZclDoorLockSetUserTypeReqT *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Callback to application, invoked on receipt of Set User Type command. */
+ enum ZclStatusCodeT (*get_user_type)(struct ZbZclClusterT *cluster, struct ZbZclDoorLockGetUserTypeReqT *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Callback to application, invoked on receipt of Get User Type command. */
+ enum ZclStatusCodeT (*set_rfid)(struct ZbZclClusterT *cluster, struct ZbZclDoorLockSetRfidReqT *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Callback to application, invoked on receipt of Set RFID Code command. */
+ enum ZclStatusCodeT (*get_rfid)(struct ZbZclClusterT *cluster, struct ZbZclDoorLockGetRfidReqT *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Callback to application, invoked on receipt of Get RFID Code command. */
+ enum ZclStatusCodeT (*clr_rfid)(struct ZbZclClusterT *cluster, struct ZbZclDoorLockClrRfidReqT *req, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Callback to application, invoked on receipt of Clear RFID Code command. */
+ enum ZclStatusCodeT (*clr_all_rfids)(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *srcInfo, void *arg);
+ /**< Callback to application, invoked on receipt of Clear All RFID Codes command. */
+};
+
+/**
+ * Create a new instance of the Door Lock Server cluster
+ * @param zb Zigbee stack instance
+ * @param endpoint Endpoint on which to create cluster
+ * @param callbacks Structure containing any callback function pointers for this cluster
+ * @param arg Pointer to application data that will later be provided back to the callback functions when invoked
+ * @return Cluster pointer, or NULL if there is an error
+ */
+struct ZbZclClusterT * ZbZclDoorLockServerAlloc(struct ZigBeeT *zb, uint8_t endpoint,
struct ZbZclDoorLockServerCallbacksT *callbacks, void *arg);
-#endif /* ZCL_DOORLOCK_H */
+#endif
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
index ad5080db9..005946e72 100644
--- 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
@@ -5,12 +5,6 @@
#include "zcl/zcl.h"
-/*--------------------------------------------------------------------------
- * DESCRIPTION
- * Interface definition for the ZCL Electrical Measurement cluster.
- *--------------------------------------------------------------------------
- */
-
/* PICS.ZCL.Electrical.Measurement
* EMR.S | True
* EMR.C | True
@@ -167,8 +161,8 @@
* EMR.C.C01.Tx | True
*/
-/* Attribute Identifiers */
-enum {
+/** Electrical Measurement Server Attribute IDs */
+enum ZbZclElecMeasSvrAttrT {
ZCL_ELEC_MEAS_ATTR_MEAS_TYPE = 0x0000,
ZCL_ELEC_MEAS_ATTR_DC_VOLT = 0x0100,
ZCL_ELEC_MEAS_ATTR_DC_VOLT_MIN = 0x0101,
@@ -281,9 +275,9 @@ enum {
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_MIN_C = 0x0a09, /**< RMSCurrentMinPhC (Optional) */
ZCL_ELEC_MEAS_ATTR_RMS_CURR_MAX_C = 0x0a0a,
- ZCL_ELEC_MEAS_ATTR_ACTIVE_PWR_C = 0x0a0C,
+ ZCL_ELEC_MEAS_ATTR_ACTIVE_PWR_C = 0x0a0b, /**< ActivePowerPhC (Optional) */
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,
@@ -325,13 +319,13 @@ enum {
ZCL_ELEC_MEAS_SVR_GET_MEAS_PROFILE_RSP = 0x01
};
-struct elec_meas_get_meas_profile_req_t {
+struct ZbZclElecMeasClientGetMeasProfileReqT {
uint16_t attr_id;
uint32_t start_time;
uint8_t num_intervals;
};
-struct elec_meas_get_profile_info_rsp_t {
+struct ZbZclElecMeasSvrGetProfileInfoRspT {
/* 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
@@ -342,7 +336,7 @@ struct elec_meas_get_profile_info_rsp_t {
uint16_t *attr_list;
};
-struct elec_meas_get_meas_profile_rsp_t {
+struct ZbZclElecMeasSvrGetMeasProfileRspT {
uint32_t start_time;
uint8_t status;
uint8_t profile_interval_period;
@@ -355,9 +349,9 @@ struct elec_meas_get_meas_profile_rsp_t {
uint16_t interval_len; /**< Octet length of interval_data. */
};
-struct zcl_elec_meas_callbacks_t {
+struct ZbZclElecMeasSvrCallbacksT {
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,
+ enum ZclStatusCodeT (*get_meas_profile)(struct ZbZclClusterT *clusterPtr, struct ZbZclElecMeasClientGetMeasProfileReqT *cmd_req,
struct ZbZclAddrInfoT *src_info, void *arg);
};
@@ -368,19 +362,20 @@ struct zcl_elec_meas_callbacks_t {
/* 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);
+struct ZbZclClusterT * ZbZclElecMeasServerAlloc(struct ZigBeeT *zb, uint8_t endpoint,
+ struct ZbZclElecMeasSvrCallbacksT *callbacks, void *arg);
/* Client Generated Commands */
enum ZclStatusCodeT ZbZclElecMeasClientGetProfileInfoReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
enum ZclStatusCodeT ZbZclElecMeasClientGetMeasProfileReq(struct ZbZclClusterT *cluster, const struct ZbApsAddrT *dst,
- struct elec_meas_get_meas_profile_req_t *get_meas_profile_req,
+ struct ZbZclElecMeasClientGetMeasProfileReqT *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);
+enum ZclStatusCodeT ZbZclElecMeasServerSendProfileInfoRsp(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *dst,
+ struct ZbZclElecMeasSvrGetProfileInfoRspT *rsp);
+enum ZclStatusCodeT ZbZclElecMeasServerSendMeasProfileRsp(struct ZbZclClusterT *cluster, struct ZbZclAddrInfoT *dst,
+ struct ZbZclElecMeasSvrGetMeasProfileRspT *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
index 10bc66144..a663e22bb 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.fan.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.fan.h
@@ -3,12 +3,6 @@
#ifndef ZCL_FAN_H
#define ZCL_FAN_H
-/*--------------------------------------------------------------------------
- * DESCRIPTION
- * ZCL FAN cluster definitions
- *--------------------------------------------------------------------------
- */
-
/* PICS.ZCL.Fan
*
* FAN.S | True
@@ -28,37 +22,33 @@
#include "zcl/zcl.h"
-/*---------------------------------------------------------------
- * Definitions
- *---------------------------------------------------------------
- */
-/* Attribute Identifiers */
-enum {
- ZCL_FAN_ATTR_MODE = 0x0000,
- ZCL_FAN_ATTR_SEQUENCE = 0x00001,
+/** Fan Control Server Attribute IDs */
+enum ZbZclFanSvrAttrT {
+ ZCL_FAN_ATTR_MODE = 0x0000, /**< FanMode */
+ ZCL_FAN_ATTR_SEQUENCE = 0x00001, /**< FanModeSequence */
};
-/* Fan Mode Attribute Values */
+/** Fan Mode Attribute Values */
enum ZbZclFanModeT {
- FAN_MODE_OFF = 0x00,
- FAN_MODE_LOW = 0x01,
- FAN_MODE_MED = 0x02,
- FAN_MODE_HI = 0x03,
- FAN_MODE_ON = 0x04,
- FAN_MODE_AUTO = 0x05,
- FAN_MODE_SMART = 0x06
+ ZCL_FAN_MODE_OFF = 0x00, /**< Off */
+ ZCL_FAN_MODE_LOW = 0x01, /**< Low */
+ ZCL_FAN_MODE_MED = 0x02, /**< Medium */
+ ZCL_FAN_MODE_HI = 0x03, /**< High */
+ ZCL_FAN_MODE_ON = 0x04, /**< On */
+ ZCL_FAN_MODE_AUTO = 0x05, /**< Auto (the fan speed is self-regulated) */
+ ZCL_FAN_MODE_SMART = 0x06 /**< Smart (when the heated/cooled space is occupied, the fan is always on) */
};
-/* Fan Sequence Operation Attribute Values */
+/** Fan Sequence Operation Attribute Values */
enum ZbZclFanSeqT {
- FAN_SEQ_LMH = 0x00,
- FAN_SEQ_LH = 0x01,
- FAN_SEQ_LMHA = 0x02,
- FAN_SEQ_LHA = 0x03,
- FAN_SEQ_OA = 0x04
+ ZCL_FAN_SEQ_LMH = 0x00, /**< Low/Med/High */
+ ZCL_FAN_SEQ_LH = 0x01, /**< Low/High */
+ ZCL_FAN_SEQ_LMHA = 0x02, /**< Low/Med/High/Auto */
+ ZCL_FAN_SEQ_LHA = 0x03, /**< Low/High/Auto */
+ ZCL_FAN_SEQ_OA = 0x04 /**< On/Auto */
};
-struct ZbZclClusterT * ZbZclFanClientAlloc(struct ZigBeeT *zb, uint8_t ep);
-struct ZbZclClusterT * ZbZclFanServerAlloc(struct ZigBeeT *zb, uint8_t ep);
+struct ZbZclClusterT * ZbZclFanClientAlloc(struct ZigBeeT *zb, uint8_t endpoint);
+struct ZbZclClusterT * ZbZclFanServerAlloc(struct ZigBeeT *zb, uint8_t endpoint);
#endif
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
index 411ebb390..52ca90540 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.groups.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.groups.h
@@ -156,11 +156,6 @@ enum ZclStatusCodeT ZbZclGroupsClientRemoveReq(struct ZbZclClusterT *cluster, st
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
/** Remove All Groups Command */
-struct ZbZclGroupsClientRemoveAllReqT {
- struct ZbApsAddrT dst; /**< Destination Address */
- uint8_t num_groups; /**< Group count */
- uint16_t group_list[ZCL_GROUPS_GET_MEMBERS_MAX]; /**< Group list */
-};
/**
* Direct receiving entity or entities to remove all group associations
* @param clusterPtr Cluster instance to send this command from
@@ -169,8 +164,7 @@ struct ZbZclGroupsClientRemoveAllReqT {
* @param arg Application argument that will be included with the callback
* @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
*/
-enum ZclStatusCodeT ZbZclGroupsClientRemoveAllReq(struct ZbZclClusterT *cluster,
- struct ZbZclGroupsClientRemoveAllReqT *req,
+enum ZclStatusCodeT ZbZclGroupsClientRemoveAllReq(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
/** Add Group If Identifying Command */
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.meter.id.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.meter.id.h
index 153eb8f34..868c3711c 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.meter.id.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.meter.id.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_METER_ID_H
#define ZCL_METER_ID_H
@@ -33,7 +33,7 @@
*/
/* Attribute Identifiers */
-enum {
+enum ZbZclMeterIdSvrAttrT {
ZCL_METER_ID_ATTR_COMPANY_NAME = 0x0000,
ZCL_METER_ID_ATTR_METER_TYPE_ID = 0x0001,
ZCL_METER_ID_ATTR_DATA_QUAL_ID = 0x0004,
@@ -48,9 +48,8 @@ enum {
ZCL_METER_ID_ATTR_POWER_THRESH = 0x000E
};
-/* Level Status values */
-#define ZCL_METER_ID_COMPANY_NAME_LEN 32U
-#define ZCL_METER_ID_POD_LEN 32U
+#define ZCL_METER_ID_COMPANY_NAME_LEN_MAX 16U
+#define ZCL_METER_ID_POD_LEN_MAX 16U
/*---------------------------------------------------------------
* Meter Identification Cluster Definitions
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.occupancy.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.occupancy.h
index ac0ba0970..615d01da1 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.occupancy.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.occupancy.h
@@ -57,7 +57,7 @@ enum ZbZclOccupancySvrAttrT {
#define OCC_SENSOR_ULTRASONIC 0x01
#define OCC_SENSOR_PIR_ULTRASONIC 0x02
-struct ZbZclClusterT * ZbZclOccupancyClientAlloc(struct ZigBeeT *zb, uint8_t ept);
-struct ZbZclClusterT * ZbZclOccupancyServerAlloc(struct ZigBeeT *zb, uint8_t ept);
+struct ZbZclClusterT * ZbZclOccupancyClientAlloc(struct ZigBeeT *zb, uint8_t endpoint);
+struct ZbZclClusterT * ZbZclOccupancyServerAlloc(struct ZigBeeT *zb, uint8_t endpoint);
#endif /* ZCL_OCCUP_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
index 0899e9c2e..9c10fe26d 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.ota.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.ota.h
@@ -192,10 +192,10 @@ enum ZbZclOtaImageBlkReqFldCtrl {
#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_HEADER_LENGTH_MIN 56U /* no optional fields */
+#define ZCL_OTA_HEADER_LENGTH_MAX 69U /* all optional fields */
+#define ZCL_OTA_IMAGE_BLOCK_SUB_ELEMENT_HEADER 6U /* tag id [2] tag length [4] */
+#define ZCL_OTA_IMAGE_BLOCK_ZCL_MESSAGE_SIZE 14U /* 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)
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
index d5855b1e6..6a0e74ada 100644
--- 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
@@ -65,7 +65,7 @@
* PC.S.A007c | False
* PC.S.A007d | False
* PC.S.A007e | False
- * PC.S.Afffd | False
+ * PC.S.Afffd | True
* PC.S.Afffe | False
*
* Client Attributes
@@ -139,6 +139,48 @@ enum ZbZclPowerConfigSvrAttrT {
ZCL_POWER_CONFIG_ATTR_BATTERY3_ALARM_STATE = 0x007E,
};
+#define ZCL_POWER_CONFIG_MAINS_ALARM_MASK_MAINS_LOW 0x01U
+#define ZCL_POWER_CONFIG_MAINS_ALARM_MASK_MAINS_HIGH 0x02U
+#define ZCL_POWER_CONFIG_MAINS_ALARM_MASK_MAINS_LOST 0x04U
+#define ZCL_POWER_CONFIG_MAINS_ALARM_MASK_MAINS_MASK 0x07U
+
+#define ZCL_POWER_CONFIG_BATTERY_SIZE_NO_BATTERY 0x00U
+#define ZCL_POWER_CONFIG_BATTERY_SIZE_BUILT_IN 0x01U
+#define ZCL_POWER_CONFIG_BATTERY_SIZE_OTHER 0x02U
+#define ZCL_POWER_CONFIG_BATTERY_SIZE_AA 0x03U
+#define ZCL_POWER_CONFIG_BATTERY_SIZE_AAA 0x04U
+#define ZCL_POWER_CONFIG_BATTERY_SIZE_C 0x05U
+#define ZCL_POWER_CONFIG_BATTERY_SIZE_D 0x06U
+#define ZCL_POWER_CONFIG_BATTERY_SIZE_CR2 0x07U
+#define ZCL_POWER_CONFIG_BATTERY_SIZE_CR123A 0x08U
+#define ZCL_POWER_CONFIG_BATTERY_SIZE_UNKNOWN 0xffU
+
+#define ZCL_POWER_CONFIG_BATTERY_ALARM_MASK_LOW 0x01U
+#define ZCL_POWER_CONFIG_BATTERY_ALARM_MASK_BATT_ALARM1 0x02U
+#define ZCL_POWER_CONFIG_BATTERY_ALARM_MASK_BATT_ALARM2 0x04U
+#define ZCL_POWER_CONFIG_BATTERY_ALARM_MASK_BATT_ALARM3 0x08U
+#define ZCL_POWER_CONFIG_BATTERY_ALARM_MASK_MASK 0x0fU
+
+/* Battery Source 1 Alarm State */
+#define ZCL_POWER_CONFIG_BATTERY_ALARM_STATE_1_MIN_THRESH 0x00000001U
+#define ZCL_POWER_CONFIG_BATTERY_ALARM_STATE_1_THRESH1 0x00000002U
+#define ZCL_POWER_CONFIG_BATTERY_ALARM_STATE_1_THRESH2 0x00000004U
+#define ZCL_POWER_CONFIG_BATTERY_ALARM_STATE_1_THRESH3 0x00000008U
+/* Battery Source 2 Alarm State */
+#define ZCL_POWER_CONFIG_BATTERY_ALARM_STATE_2_MIN_THRESH 0x00000400U
+#define ZCL_POWER_CONFIG_BATTERY_ALARM_STATE_2_THRESH1 0x00000800U
+#define ZCL_POWER_CONFIG_BATTERY_ALARM_STATE_2_THRESH2 0x00001000U
+#define ZCL_POWER_CONFIG_BATTERY_ALARM_STATE_2_THRESH3 0x00002000U
+/* Battery Source 3 Alarm State */
+#define ZCL_POWER_CONFIG_BATTERY_ALARM_STATE_3_MIN_THRESH 0x00100000U
+#define ZCL_POWER_CONFIG_BATTERY_ALARM_STATE_3_THRESH1 0x00200000U
+#define ZCL_POWER_CONFIG_BATTERY_ALARM_STATE_3_THRESH2 0x00400000U
+#define ZCL_POWER_CONFIG_BATTERY_ALARM_STATE_3_THRESH3 0x00800000U
+/* Mains power supply lost */
+#define ZCL_POWER_CONFIG_BATTERY_ALARM_STATE_MAIN_LOST 0x40000000U
+/* All */
+#define ZCL_POWER_CONFIG_BATTERY_ALARM_STATE_MASK 0x40f03c0fU
+
/* Power Configuration default values */
#define ZCL_POWER_CONFIG_MAINS_ALARM_MASK_DEFAULT 0x00
#define ZCL_POWER_CONFIG_MAINS_VOLT_MIN_DEFAULT 0x0000
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 fd1a674a3..ba61334bf 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
@@ -6,7 +6,7 @@
#include "zcl/zcl.h"
/* Attribute Identifiers */
-enum {
+enum ZbZclPowerProfileSvrAttrT {
ZCL_POWER_PROF_SVR_ATTR_TOTAL_PROFILENUM = 0x0000,
ZCL_POWER_PROF_SVR_ATTR_MULTIPLE_SCHED = 0x0001,
ZCL_POWER_PROF_SVR_ATTR_ENERGY_FORMAT = 0x0002,
@@ -193,47 +193,47 @@ struct ZbZclClusterT * ZbZclPowerProfClientAlloc(struct ZigBeeT *zb, uint8_t end
struct ZbZclPowerProfClientCallbacks *callbacks, void *arg);
/* ZCL_PWR_PROF_CLI_PROFILE_REQ */
-enum ZclStatusCodeT ZbZclPowerProfClientProfileReq(struct ZbZclClusterT *clusterPtr,
+enum ZclStatusCodeT ZbZclPowerProfClientProfileReq(struct ZbZclClusterT *cluster,
const struct ZbApsAddrT *dst, struct ZbZclPowerProfCliProfileReq *req,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
/* ZCL_PWR_PROF_CLI_STATE_REQ */
-enum ZclStatusCodeT ZbZclPowerProfClientStateReq(struct ZbZclClusterT *clusterPtr,
+enum ZclStatusCodeT ZbZclPowerProfClientStateReq(struct ZbZclClusterT *cluster,
const struct ZbApsAddrT *dst,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
/* ZCL_PWR_PROF_CLI_PRICE_RSP */
-enum ZclStatusCodeT ZbZclPowerProfClientPriceRsp(struct ZbZclClusterT *clusterPtr,
+enum ZclStatusCodeT ZbZclPowerProfClientPriceRsp(struct ZbZclClusterT *cluster,
struct ZbZclAddrInfoT *dst, struct ZbZclPowerProfCliPriceRsp *rsp,
void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/* ZCL_PWR_PROF_CLI_SCHED_PRICE_RSP */
-enum ZclStatusCodeT ZbZclPowerProfClientSchedPriceRsp(struct ZbZclClusterT *clusterPtr,
+enum ZclStatusCodeT ZbZclPowerProfClientSchedPriceRsp(struct ZbZclClusterT *cluster,
struct ZbZclAddrInfoT *dst, struct ZbZclPowerProfCliSchedPriceRsp *rsp,
void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/* ZCL_PWR_PROF_CLI_PHASES_NOTIFY */
-enum ZclStatusCodeT ZbZclPowerProfClientPhasesNotify(struct ZbZclClusterT *clusterPtr,
+enum ZclStatusCodeT ZbZclPowerProfClientPhasesNotify(struct ZbZclClusterT *cluster,
const struct ZbApsAddrT *dst, struct ZbZclPowerProfCliPhasesNotify *notify,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
/* ZCL_PWR_PROF_CLI_PHASES_RSP */
-enum ZclStatusCodeT ZbZclPowerProfClientPhasesResponse(struct ZbZclClusterT *clusterPtr,
+enum ZclStatusCodeT ZbZclPowerProfClientPhasesResponse(struct ZbZclClusterT *cluster,
struct ZbZclAddrInfoT *dst, struct ZbZclPowerProfCliPhasesNotify *notify,
void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/* ZCL_PWR_PROF_CLI_SCHED_CONS_REQ */
-enum ZclStatusCodeT ZbZclPowerProfClientSchedConsReq(struct ZbZclClusterT *clusterPtr,
+enum ZclStatusCodeT ZbZclPowerProfClientSchedConsReq(struct ZbZclClusterT *cluster,
const struct ZbApsAddrT *dst, struct ZbZclPowerProfCliProfileReq *req,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
/* ZCL_PWR_PROF_CLI_PHASES_SCHED_STATE_REQ */
-enum ZclStatusCodeT ZbZclPowerProfClientPhasesSchedStateReq(struct ZbZclClusterT *clusterPtr,
+enum ZclStatusCodeT ZbZclPowerProfClientPhasesSchedStateReq(struct ZbZclClusterT *cluster,
const struct ZbApsAddrT *dst, struct ZbZclPowerProfCliProfileReq *req,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
/* ZCL_PWR_PROF_CLI_PRICE_EXT_RSP */
-enum ZclStatusCodeT ZbZclPowerProfClientPriceExtRsp(struct ZbZclClusterT *clusterPtr,
+enum ZclStatusCodeT ZbZclPowerProfClientPriceExtRsp(struct ZbZclClusterT *cluster,
struct ZbZclAddrInfoT *dst, struct ZbZclPowerProfCliPriceRsp *rsp,
void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
@@ -268,61 +268,61 @@ struct ZbZclClusterT * ZbZclPowerProfServerAlloc(struct ZigBeeT *zb, uint8_t end
/* Send a PowerProfileNotification Command. It is sent as a ZCL request with a unique
* sequence number, and can receive a Default Response if applicable. */
-enum ZclStatusCodeT ZbZclPowerProfServerProfileNotify(struct ZbZclClusterT *clusterPtr,
+enum ZclStatusCodeT ZbZclPowerProfServerProfileNotify(struct ZbZclClusterT *cluster,
const struct ZbApsAddrT *dst, struct ZbZclPowerProfSvrProfileRsp *notify,
void (*callback)(struct ZbZclCommandRspT *zcl_rsp, void *arg), void *arg);
/* Send a PowerProfileResponse Command. */
-enum ZclStatusCodeT ZbZclPowerProfServerProfileRsp(struct ZbZclClusterT *clusterPtr,
+enum ZclStatusCodeT ZbZclPowerProfServerProfileRsp(struct ZbZclClusterT *cluster,
struct ZbZclAddrInfoT *dst, struct ZbZclPowerProfSvrProfileRsp *rsp,
void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/* ZCL_PWR_PROF_SVR_STATE_RSP */
-enum ZclStatusCodeT ZbZclPowerProfServerStateRsp(struct ZbZclClusterT *clusterPtr,
+enum ZclStatusCodeT ZbZclPowerProfServerStateRsp(struct ZbZclClusterT *cluster,
struct ZbZclAddrInfoT *dst, struct ZbZclPowerProfSvrStateRsp *rsp,
void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/* ZCL_PWR_PROF_SVR_GET_PRICE */
-enum ZclStatusCodeT ZbZclPowerProfServerGetPriceReq(struct ZbZclClusterT *clusterPtr,
+enum ZclStatusCodeT ZbZclPowerProfServerGetPriceReq(struct ZbZclClusterT *cluster,
const struct ZbApsAddrT *dst, struct ZbZclPowerProfCliProfileReq *req,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
/* ZCL_PWR_PROF_SVR_STATE_NOTIFY */
-enum ZclStatusCodeT ZbZclPowerProfServerStateNotify(struct ZbZclClusterT *clusterPtr,
+enum ZclStatusCodeT ZbZclPowerProfServerStateNotify(struct ZbZclClusterT *cluster,
const struct ZbApsAddrT *dst, struct ZbZclPowerProfSvrStateRsp *notify,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
/* ZCL_PWR_PROF_SVR_GET_SCHED_PRICE */
-enum ZclStatusCodeT ZbZclPowerProfServerGetSchedPriceReq(struct ZbZclClusterT *clusterPtr,
+enum ZclStatusCodeT ZbZclPowerProfServerGetSchedPriceReq(struct ZbZclClusterT *cluster,
const struct ZbApsAddrT *dst, void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
/* ZCL_PWR_PROF_SVR_PHASES_REQ */
-enum ZclStatusCodeT ZbZclPowerProfServerPhasesReq(struct ZbZclClusterT *clusterPtr,
+enum ZclStatusCodeT ZbZclPowerProfServerPhasesReq(struct ZbZclClusterT *cluster,
const struct ZbApsAddrT *dst, struct ZbZclPowerProfCliProfileReq *req,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
/* ZCL_PWR_PROF_SVR_PHASES_RSP */
-enum ZclStatusCodeT ZbZclPowerProfServerPhasesRsp(struct ZbZclClusterT *clusterPtr,
+enum ZclStatusCodeT ZbZclPowerProfServerPhasesRsp(struct ZbZclClusterT *cluster,
struct ZbZclAddrInfoT *dst, struct ZbZclPowerProfSvrPhasesRsp *rsp,
void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/* ZCL_PWR_PROF_SVR_PHASES_NOTIFY */
-enum ZclStatusCodeT ZbZclPowerProfServerPhasesNotify(struct ZbZclClusterT *clusterPtr,
+enum ZclStatusCodeT ZbZclPowerProfServerPhasesNotify(struct ZbZclClusterT *cluster,
const struct ZbApsAddrT *dst, struct ZbZclPowerProfSvrPhasesRsp *notify,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
/* ZCL_PWR_PROF_SVR_CONSTRAINTS_NOTIFY */
-enum ZclStatusCodeT ZbZclPowerProfServerConstraintsNotify(struct ZbZclClusterT *clusterPtr,
+enum ZclStatusCodeT ZbZclPowerProfServerConstraintsNotify(struct ZbZclClusterT *cluster,
const struct ZbApsAddrT *dst, struct ZbZclPowerProfSvrConstraintsNotify *notify,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
/* ZCL_PWR_PROF_SVR_CONSTRAINTS_RSP */
-enum ZclStatusCodeT ZbZclPowerProfServerConstraintsRsp(struct ZbZclClusterT *clusterPtr,
+enum ZclStatusCodeT ZbZclPowerProfServerConstraintsRsp(struct ZbZclClusterT *cluster,
struct ZbZclAddrInfoT *dst, struct ZbZclPowerProfSvrConstraintsNotify *rsp,
void (*callback)(struct ZbApsdeDataConfT *conf, void *arg), void *arg);
/* ZCL_PWR_PROF_SVR_GET_PRICE_EXT */
-enum ZclStatusCodeT ZbZclPowerProfServerGetPriceReqExtReq(struct ZbZclClusterT *clusterPtr,
+enum ZclStatusCodeT ZbZclPowerProfServerGetPriceReqExtReq(struct ZbZclClusterT *cluster,
const struct ZbApsAddrT *dst, struct ZbZclPowerProfSvrGetPriceExtReq *req,
void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.press.meas.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.press.meas.h
index 29f3b585c..fa856cc3b 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.press.meas.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.press.meas.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_PRESS_MEAS_H
#define ZCL_PRESS_MEAS_H
@@ -12,7 +12,7 @@
*/
/* Attribute Identifiers */
-enum {
+enum ZbZclPressMeasSvrAttrT {
ZCL_PRESS_MEAS_ATTR_MEAS_VAL = 0x0000,
ZCL_PRESS_MEAS_ATTR_MIN_MEAS_VAL = 0x0001,
ZCL_PRESS_MEAS_ATTR_MAX_MEAS_VAL = 0x0002,
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
index d02634455..e7362a311 100644
--- 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
@@ -12,7 +12,7 @@
*/
/* Attribute Identifiers */
-enum {
+enum ZbZclRssiLocSvrAttrT {
ZCL_RSSI_LOC_SVR_ATTR_LOCATION_TYPE = 0x0000,
ZCL_RSSI_LOC_SVR_ATTR_LOCATION_METHOD = 0x0001,
ZCL_RSSI_LOC_SVR_ATTR_LOCATION_AGE = 0x0002,
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
index a7dd17ea2..f990e1dd6 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.scenes.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.scenes.h
@@ -52,7 +52,6 @@
* 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
@@ -64,6 +63,7 @@
* S.C.C02.Tx | True
* S.C.C03.Tx | True
* S.C.C04.Tx | True
+ * S.C.C05.Tx | True
* S.C.C06.Tx | True
* S.C.C40.Tx | True
* S.C.C41.Tx | True
@@ -129,12 +129,10 @@ struct zcl_scenes_add_response_t {
uint8_t sceneId;
};
-enum ZclStatusCodeT zcl_scenes_client_add_req(struct ZbZclClusterT *cluster,
- struct zcl_scenes_add_request_t *add_req,
+enum ZclStatusCodeT zcl_scenes_client_add_req(struct ZbZclClusterT *cluster, 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);
+enum ZclStatusCodeT zcl_scenes_client_add_rsp_parse(struct zcl_scenes_add_response_t *add_rsp, struct ZbZclCommandRspT *zcl_rsp);
/** View Scene command structure */
struct zcl_scenes_view_request_t {
@@ -163,12 +161,10 @@ struct zcl_scenes_view_response_t {
} extList[ZCL_SCENES_VIEW_EXT_LIST_MAX_SZ];
};
-enum ZclStatusCodeT zcl_scenes_client_view_req(struct ZbZclClusterT *cluster,
- struct zcl_scenes_view_request_t *view_req,
+enum ZclStatusCodeT zcl_scenes_client_view_req(struct ZbZclClusterT *cluster, 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);
+enum ZclStatusCodeT zcl_scenes_client_view_rsp_parse(struct zcl_scenes_view_response_t *view_rsp, struct ZbZclCommandRspT *zcl_rsp);
/** Remove Scene command structure */
struct zcl_scenes_remove_request_t {
@@ -184,12 +180,10 @@ struct zcl_scenes_remove_response_t {
uint8_t sceneId;
};
-enum ZclStatusCodeT zcl_scenes_client_remove_req(struct ZbZclClusterT *cluster,
- struct zcl_scenes_remove_request_t *remove_req,
+enum ZclStatusCodeT zcl_scenes_client_remove_req(struct ZbZclClusterT *cluster, 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);
+enum ZclStatusCodeT zcl_scenes_client_remove_rsp_parse(struct zcl_scenes_remove_response_t *remove_rsp, struct ZbZclCommandRspT *zcl_rsp);
/** Remove All Scenes command structure */
struct zcl_scenes_remove_all_request_t {
@@ -203,8 +197,7 @@ struct zcl_scenes_remove_all_response_t {
uint16_t groupId;
};
-enum ZclStatusCodeT zcl_scenes_client_remove_all_req(struct ZbZclClusterT *cluster,
- struct zcl_scenes_remove_all_request_t *remove_req,
+enum ZclStatusCodeT zcl_scenes_client_remove_all_req(struct ZbZclClusterT *cluster, 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,
@@ -224,12 +217,10 @@ struct zcl_scenes_store_response_t {
uint8_t sceneId;
};
-enum ZclStatusCodeT zcl_scenes_client_store_req(struct ZbZclClusterT *cluster,
- struct zcl_scenes_store_request_t *store_req,
+enum ZclStatusCodeT zcl_scenes_client_store_req(struct ZbZclClusterT *cluster, 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);
+enum ZclStatusCodeT zcl_scenes_client_store_rsp_parse(struct zcl_scenes_store_response_t *store_rsp, struct ZbZclCommandRspT *zcl_rsp);
/** Recall Scene command structure */
struct zcl_scenes_recall_request_t {
@@ -246,12 +237,10 @@ struct zcl_scenes_recall_response_t {
uint8_t status;
};
-enum ZclStatusCodeT zcl_scenes_client_recall_req(struct ZbZclClusterT *cluster,
- struct zcl_scenes_recall_request_t *recall_req,
+enum ZclStatusCodeT zcl_scenes_client_recall_req(struct ZbZclClusterT *cluster, 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);
+enum ZclStatusCodeT zcl_scenes_client_recall_rsp_parse(struct zcl_scenes_recall_response_t *recall_rsp, struct ZbZclCommandRspT *zcl_rsp);
/** Get Scene Membership command structure */
struct zcl_scenes_membership_request_t {
@@ -271,8 +260,7 @@ struct zcl_scenes_membership_response_t {
uint8_t sceneList[ZCL_SCENES_GET_MEMBERSHIP_MAX_SCENES];
};
-enum ZclStatusCodeT zcl_scenes_client_get_membership_req(struct ZbZclClusterT *cluster,
- struct zcl_scenes_membership_request_t *get_req,
+enum ZclStatusCodeT zcl_scenes_client_get_membership_req(struct ZbZclClusterT *cluster, 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,
@@ -295,11 +283,9 @@ struct zcl_scenes_copy_response_t {
uint8_t sceneFrom;
};
-enum ZclStatusCodeT zcl_scenes_client_copy_req(struct ZbZclClusterT *cluster,
- struct zcl_scenes_copy_request_t *copy_req,
+enum ZclStatusCodeT zcl_scenes_client_copy_req(struct ZbZclClusterT *cluster, 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);
+enum ZclStatusCodeT zcl_scenes_client_copy_rsp_parse(struct zcl_scenes_copy_response_t *copy_rsp, struct ZbZclCommandRspT *zcl_rsp);
#endif
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.temp.meas.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.temp.meas.h
index dde634559..320ecee86 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.temp.meas.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.temp.meas.h
@@ -46,7 +46,6 @@ enum ZbZclTempMeasSvrAttrT {
struct ZbZclClusterT * ZbZclTempMeasClientAlloc(struct ZigBeeT *zb, uint8_t endpoint);
/* Temperature Measurement Server */
-struct ZbZclClusterT * ZbZclTempMeasServerAlloc(struct ZigBeeT *zb, uint8_t endpoint,
- int16_t min, int16_t max, uint16_t tolerance);
+struct ZbZclClusterT * ZbZclTempMeasServerAlloc(struct ZigBeeT *zb, uint8_t endpoint, int16_t min, int16_t max, uint16_t tolerance);
#endif
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
index b71b17b64..4d0453ef8 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.therm.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.therm.h
@@ -92,7 +92,7 @@
*---------------------------------------------------------------
*/
/* Attribute Identifiers */
-enum {
+enum ZbZclThermAttrT {
/* Thermostat Info - 0x000x */
ZCL_THERM_SVR_ATTR_LOCAL_TEMP = 0x0000, /* int16 [0x954d,0x7fff] - MANDATORY */
ZCL_THERM_SVR_ATTR_OUTDOOR_TEMP = 0x0001, /* int16 */
@@ -192,19 +192,10 @@ enum {
ZCL_THERM_SVR_GET_RELAY_LOG_RSP = 0x01
};
-struct ZbZclThermCliSetpointT {
- uint8_t mode;
- int8_t amount;
-};
+/* Thermostat Client */
#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
@@ -217,6 +208,41 @@ struct ZbZclThermTransitionsT {
#define ZCL_THERM_MODE_HEAT_SETPOINT_PRESENT 0x01
#define ZCL_THERM_MODE_COOL_SETPOINT_PRESENT 0x02
+/**
+ * Create a new instance of the Scenes Client cluster
+ * @param zb Zigbee stack instance
+ * @param endpoint Endpoint on which to create cluster
+ * @return Cluster pointer, or NULL if there is an error
+ */
+struct ZbZclClusterT * ZbZclThermClientAlloc(struct ZigBeeT *zb, uint8_t endpoint);
+
+/** Thermostat Setpoint structure */
+struct ZbZclThermCliSetpointT {
+ uint8_t mode; /**< Mode */
+ int8_t amount; /**< Amount */
+};
+
+/**
+ * Send a Setpoint Raise/Lower command
+ * @param cluster Cluster instance from which to send this command
+ * @param dst Destination address for request
+ * @param req Thermostat Setpoint structure
+ * @param callback Callback function that will be called when the response for this request is received
+ * @param arg Pointer to application data that will later be provided back to the callback functions when invoked
+ * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
+ */
+enum ZclStatusCodeT ZbZclThermClientSetpointRaiseLower(struct ZbZclClusterT *cluster,
+ const struct ZbApsAddrT *dst, struct ZbZclThermCliSetpointT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+/** Thermostat Transition structure */
+struct ZbZclThermTransitionsT {
+ uint16_t transition_time; /**< Transition Time */
+ int16_t heat_set_point; /**< Heat Set Point (optional) */
+ int16_t cool_set_point; /**< Cool Set Point (optional) */
+};
+
+/** Thermostat Weekly Schedule structure */
struct ZbZclThermWeeklySchedT {
uint8_t num_transitions;
uint8_t day_of_week_seq; /* e.g. ZCL_THERM_DAY_OF_WEEK_SUNDAY */
@@ -224,76 +250,126 @@ struct ZbZclThermWeeklySchedT {
struct ZbZclThermTransitionsT transitions[ZCL_THERM_NUM_TRANSITIONS_MAX];
};
+/**
+ * Send a Set Weekly Schedule command (Optional)
+ * @param cluster Cluster instance from which to send this command
+ * @param dst Destination address for request
+ * @param req Thermostat Weekly Schedule structure
+ * @param callback Callback function that will be called when the response for this request is received
+ * @param arg Pointer to application data that will later be provided back to the callback functions when invoked
+ * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
+ */
+enum ZclStatusCodeT ZbZclThermClientSetWeeklySched(struct ZbZclClusterT *cluster,
+ const struct ZbApsAddrT *dst, struct ZbZclThermWeeklySchedT *req,
+ void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg);
+
+/** Thermostat Get Weekly Schedule structure */
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,
+/**
+ * Send a Get Weekly Schedule command (Optional)
+ * @param cluster Cluster instance from which to send this command
+ * @param dst Destination address for request
+ * @param req Thermostat Get Weekly Schedule info
+ * @param callback Callback function that will be called when the response for this request is received
+ * @param arg Pointer to application data that will later be provided back to the callback functions when invoked
+ * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
+ */
+enum ZclStatusCodeT ZbZclThermClientGetWeeklySched(struct ZbZclClusterT *cluster,
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,
+/**
+ * Send a Clear Weekly Schedule command (Optional)
+ * @param cluster Cluster instance from which to send this command
+ * @param dst Destination address for request
+ * @param callback Callback function that will be called when the response for this request is received
+ * @param arg Pointer to application data that will later be provided back to the callback functions when invoked
+ * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
+ */
+enum ZclStatusCodeT ZbZclThermClientClearWeeklySched(struct ZbZclClusterT *cluster,
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,
+/**
+ * Send a Get Relay Status Log command (Optional)
+ * @param cluster Cluster instance from which to send this command
+ * @param dst Destination address for request
+ * @param callback Callback function that will be called when the response for this request is received
+ * @param arg Pointer to application data that will later be provided back to the callback functions when invoked
+ * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
+ */
+enum ZclStatusCodeT ZbZclThermClientGetRelayStatusLog(struct ZbZclClusterT *cluster,
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;
-};
-
+/** Thermostat Server callbacks configuration */
struct ZbZclThermServerCallbacksT {
- enum ZclStatusCodeT (*setpoint_raise_lower)(struct ZbZclClusterT *clusterPtr, void *arg,
+ enum ZclStatusCodeT (*setpoint_raise_lower)(struct ZbZclClusterT *cluster, void *arg,
struct ZbZclThermCliSetpointT *req, struct ZbZclAddrInfoT *srcInfo);
+ /**< Callback to handle Setpoint Raise/Lower command response */
- enum ZclStatusCodeT (*set_weekly)(struct ZbZclClusterT *clusterPtr, void *arg,
+ enum ZclStatusCodeT (*set_weekly)(struct ZbZclClusterT *cluster, void *arg,
struct ZbZclThermWeeklySchedT *req, struct ZbZclAddrInfoT *srcInfo);
+ /**< Callback to handle Set Weekly Schedule command response */
- enum ZclStatusCodeT (*get_weekly)(struct ZbZclClusterT *clusterPtr, void *arg,
+ enum ZclStatusCodeT (*get_weekly)(struct ZbZclClusterT *cluster, void *arg,
struct ZbZclThermCliGetWeeklyT *req, struct ZbZclAddrInfoT *srcInfo);
+ /**< Callback to handle Get Weekly Schedule command response */
- enum ZclStatusCodeT (*clear_weekly)(struct ZbZclClusterT *clusterPtr, void *arg,
+ enum ZclStatusCodeT (*clear_weekly)(struct ZbZclClusterT *cluster, void *arg,
struct ZbZclAddrInfoT *srcInfo);
+ /**< Callback to handle Clear Weekly Schedule command response */
- enum ZclStatusCodeT (*get_relay_status_log)(struct ZbZclClusterT *clusterPtr, void *arg,
+ enum ZclStatusCodeT (*get_relay_status_log)(struct ZbZclClusterT *cluster, void *arg,
struct ZbZclAddrInfoT *srcInfo);
+ /**< Callback to handle Get Relay Status Log command response */
};
-struct ZbZclClusterT * ZbZclThermServerAlloc(struct ZigBeeT *zb, uint8_t ep,
+/**
+ * Create a new instance of the Thermostat Server cluster
+ * @param zb Zigbee stack instance
+ * @param endpoint Endpoint on which to create cluster
+ * @param callbacks Structure containing callback function pointers for this cluster
+ * @param arg Pointer to application data that will later be provided back to the callback functions when invoked
+ * @return Cluster pointer, or NULL if there is an error
+ */
+struct ZbZclClusterT * ZbZclThermServerAlloc(struct ZigBeeT *zb, uint8_t endpoint,
struct ZbZclThermServerCallbacksT *callbacks, void *arg);
-/* ZCL_THERM_SVR_GET_WEEK_RSP */
-enum ZclStatusCodeT ZbZclThermServerGetWeeklySchedRsp(struct ZbZclClusterT *clusterPtr,
- struct ZbZclAddrInfoT *dstInfo, struct ZbZclThermWeeklySchedT *rsp);
+/**
+ * Send a Get Weekly Schedule Response command
+ * @param cluster Cluster instance from which to send this command
+ * @param dst Destination address for request
+ * @param rsp Server Clear Get Weekly Schedule response
+ * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
+ */
+enum ZclStatusCodeT ZbZclThermServerGetWeeklySchedRsp(struct ZbZclClusterT *cluster,
+ struct ZbZclAddrInfoT *dst, struct ZbZclThermWeeklySchedT *rsp);
-/* ZCL_THERM_SVR_GET_RELAY_LOG_RSP */
-enum ZclStatusCodeT ZbZclThermServerGetRelayStatusLogRsp(struct ZbZclClusterT *clusterPtr,
- struct ZbZclAddrInfoT *dstInfo, struct ZbZclThermSvrGetRelayStatusLogRspT *rsp);
+/** Get Relay Status Log Response structure */
+struct ZbZclThermSvrGetRelayStatusLogRspT {
+ uint16_t time_of_day; /**< Time of Day */
+ uint16_t relay_status; /**< Relay Status */
+ int16_t local_temp; /**< Local Temperature */
+ uint8_t humidity_percent; /**< Humidity in Percentage */
+ int16_t set_point; /*8< Set Point */
+ uint16_t unread_entries; /**< Unread Entries */
+};
+
+/**
+ * Send a Get Relay Status Log Response command
+ * @param cluster Cluster instance from which to send this command
+ * @param dst Destination address for request
+ * @param rsp Get Relay Status Log Response structure
+ * @return ZCL_STATUS_SUCCESS if successful, or other ZclStatusCodeT value on error
+ */
+enum ZclStatusCodeT ZbZclThermServerGetRelayStatusLogRsp(struct ZbZclClusterT *cluster,
+ struct ZbZclAddrInfoT *dst, struct ZbZclThermSvrGetRelayStatusLogRspT *rsp);
-#endif /* __ZCL_TERM__H */
+#endif
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.touchlink.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.touchlink.h
index 1e8edab3a..9b911c6cd 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.touchlink.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zcl/zcl.touchlink.h
@@ -75,20 +75,20 @@
/* Zigbee Information Field
* See Figure 13-10. Format of the ZigBee Information Field */
/* Logical Type */
-#define ZCL_TL_ZBINFO_TYPE_MASK 0x03
-#define ZCL_TL_ZBINFO_TYPE_COORD 0x00
-#define ZCL_TL_ZBINFO_TYPE_ROUTER 0x01
-#define ZCL_TL_ZBINFO_TYPE_END_DEVICE 0x02
+#define ZCL_TL_ZBINFO_TYPE_MASK 0x03U
+#define ZCL_TL_ZBINFO_TYPE_COORD 0x00U
+#define ZCL_TL_ZBINFO_TYPE_ROUTER 0x01U
+#define ZCL_TL_ZBINFO_TYPE_END_DEVICE 0x02U
/* Rx on when idle */
-#define ZCL_TL_ZBINFO_RX_ON_IDLE 0x04
+#define ZCL_TL_ZBINFO_RX_ON_IDLE 0x04U
/* Reserved */
-#define ZCL_TL_ZBINFO_RESERVED 0xf8
+#define ZCL_TL_ZBINFO_RESERVED 0xf8U
/* Internal use flags (don't get sent over-the-air)
* EXEGIN - These used to be mixed with the ZCL_TL_ZBINFO_ flags, so for backward
* compatibility make sure they don't conflict. */
-#define ZCL_TL_FLAGS_IS_TARGET (uint8_t)0x10
-#define ZCL_TL_FLAGS_USE_PERSIST (uint8_t)0x20
-#define ZCL_TL_FLAGS_FACTORY_RESET (uint8_t)0x40
+#define ZCL_TL_FLAGS_IS_TARGET 0x10U
+#define ZCL_TL_FLAGS_USE_PERSIST 0x20U
+#define ZCL_TL_FLAGS_FACTORY_RESET 0x40U
#endif
diff --git a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.h b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.h
index e74600e06..62908b55f 100644
--- a/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.h
+++ b/Middlewares/ST/STM32_WPAN/zigbee/stack/include/zigbee.h
@@ -564,14 +564,6 @@ unsigned long ZbHeapUsed(struct ZigBeeT *zb);
unsigned long ZbHeapHighWaterMark(struct ZigBeeT *zb);
-/*
- * Dumps outstanding memory allocation information.
- * If printfCb is NULL, output is sent to log output provided by
- * ZbSetLogging.
- */
-typedef void (*ZbHeapDumpCallbackT)(void *cbarg, const char *fmt, ...);
-void ZbHeapDumpMemAllocTbl(struct ZigBeeT *zb, ZbHeapDumpCallbackT callback, void *cbarg);
-
/* String conversion */
int zb_hex_str_to_bin(const char *string, void *out, unsigned int maxlen);
unsigned int zb_hex_bin_to_str(const uint8_t *in_data, unsigned int in_len, char *out_str, unsigned int max_len,
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Inc/app_common.h
index 9dbfbba05..7e66ee35a 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Inc/app_common.h
@@ -67,9 +67,13 @@ extern "C"
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Inc/app_conf.h
index 4eba84ee5..4ed02a580 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Inc/app_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Inc/app_conf.h
@@ -51,7 +51,7 @@
*/
#define CFG_BONDING_MODE (1)
#define CFG_FIXED_PIN (111111)
-#define CFG_USED_FIXED_PIN (0)
+#define CFG_USED_FIXED_PIN (1)
#define CFG_ENCRYPTION_KEY_SIZE_MAX (16)
#define CFG_ENCRYPTION_KEY_SIZE_MIN (8)
@@ -75,6 +75,29 @@
#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_NOT_SUPPORTED
+
+/**
+ * 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)
+
+/**
* Generic Access Appearance
*/
#define CFG_UNKNOWN_APPEARANCE (0)
@@ -133,7 +156,7 @@
* Maximum number of simultaneous connections that the device will support.
* Valid values are from 1 to 8
*/
-#define CFG_BLE_NUM_LINK 8
+#define CFG_BLE_NUM_LINK 2
/**
* Maximum number of Services that can be stored in the GATT database.
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Inc/hw_conf.h
index 0a91cad1a..c88acf2f0 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Inc/hw_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Inc/hw_conf.h
@@ -1,36 +1,39 @@
+/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file hw_conf.h
* @author MCD Application Team
* @brief Configuration of hardware interface
- ******************************************************************************
- * @attention
- *
+ ******************************************************************************
+ * @attention
+ *
* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under Ultimate Liberty license
- * SLA0044, the "License"; You may not use this file except in compliance with
- * the License. You may obtain a copy of the License at:
- * www.st.com/SLA0044
- *
- ******************************************************************************
- */
-
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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
+#ifndef HW_CONF_H
+#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
* 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.
+* Once the Semaphore has been released, there shall be at least 1us before it can be taken again. This is required
+* to give the opportunity to CPU2 to take it.
* 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()
@@ -69,7 +72,6 @@
/* Index of the semaphore used to access the RNG */
#define CFG_HW_RNG_SEMID 0
-
/******************************************************************************
* HW TIMER SERVER
*****************************************************************************/
@@ -84,7 +86,7 @@
* wakeup timer.
* This setting is the preemptpriority part of the NVIC.
*/
-#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+#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
@@ -92,7 +94,7 @@
* 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 CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
/**
* Define a critical section in the Timer server
@@ -108,25 +110,25 @@
* 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
+#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
- */
+ * 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
/******************************************************************************
@@ -135,8 +137,8 @@
#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
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
/**
* LPUART1
@@ -242,6 +244,6 @@
#define CFG_HW_USART1_TX_DMA_IRQn DMA2_Channel4_IRQn
#define CFG_HW_USART1_DMA_TX_IRQHandler DMA2_Channel4_IRQHandler
-#endif /*__HW_CONF_H */
+#endif /*HW_CONF_H */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Inc/main.h
index bbe71a4da..d104dcb7e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Inc/main.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Inc/main.h
@@ -32,6 +32,7 @@ extern RTC_HandleTypeDef hrtc; /**< RTC handler declaration */
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
+void Error_Handler(void);
#endif /* __MAIN_H */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Src/app_entry.c
index 1a39098bc..b05d4f603 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Src/app_entry.c
@@ -188,7 +188,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Src/main.c
index 25a8c45e0..d8d86fb0f 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/Core/Src/main.c
@@ -38,6 +38,7 @@
/* Includes ------------------------------------------------------------------*/
+#include "main.h"
#include "app_common.h"
#include "app_entry.h"
@@ -317,4 +318,11 @@ void HAL_Delay(uint32_t Delay)
}
}
+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 */
+}
/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/STM32_WPAN/App/app_ble.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/STM32_WPAN/App/app_ble.c
index 75b843999..a2b54c1df 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/STM32_WPAN/App/app_ble.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_CableReplacement/STM32_WPAN/App/app_ble.c
@@ -19,6 +19,7 @@
/* Includes ------------------------------------------------------------------*/
+#include "main.h"
#include "app_common.h"
#include "dbg_trace.h"
@@ -58,18 +59,6 @@ typedef struct _tSecurityParams
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
@@ -269,7 +258,10 @@ void APP_BLE_Init( void )
/**
* Starts the BLE Stack on CPU2
*/
- SHCI_C2_BLE_Init( &ble_init_cmd_packet );
+ if (SHCI_C2_BLE_Init( &ble_init_cmd_packet ) != SHCI_Success)
+ {
+ Error_Handler();
+ }
/**
* Initialization of HCI & GATT & GAP layer
@@ -758,7 +750,6 @@ static void Ble_Tl_Init( void )
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];
@@ -846,8 +837,6 @@ static void Ble_Hci_Gap_Gatt_Init(void){
BLE_DBG_SVCCTL_MSG("Appearance aci_gatt_update_char_value failed.\n");
}
-
-
/**
* Initialize IO capability
*/
@@ -858,26 +847,21 @@ static void Ble_Hci_Gap_Gatt_Init(void){
* 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;
- }
+ 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;
aci_gap_set_authentication_requirement(BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode,
BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode,
- 0,
- 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
);
/**
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 669bcdbf2..e7049681d 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
@@ -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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Inc/app_common.h
index 9dbfbba05..7e66ee35a 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Inc/app_common.h
@@ -67,9 +67,13 @@ extern "C"
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Inc/app_conf.h
index a2b5f5fc2..807faa92e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Inc/app_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Inc/app_conf.h
@@ -64,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_DISPLAY_YES_NO
/**
* Define MITM modes
@@ -75,6 +75,29 @@
#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)
+
+/**
* Generic Access Appearance
*/
#define CFG_UNKNOWN_APPEARANCE (0)
@@ -127,7 +150,7 @@
* When set to 1, the device is central
* When set to 0, the device is peripheral
*/
-#define CFG_BLE_CENTRAL 1
+#define CFG_BLE_CENTRAL 0
#define CFG_SERVER_ONLY 0
/**
@@ -196,7 +219,7 @@
* Maximum number of simultaneous connections that the device will support.
* Valid values are from 1 to 8
*/
-#define CFG_BLE_NUM_LINK 8
+#define CFG_BLE_NUM_LINK 2
/**
* Maximum number of Services that can be stored in the GATT database.
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Inc/hw_conf.h
index 1e2d7a616..b703e7393 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Inc/hw_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Inc/hw_conf.h
@@ -1,36 +1,39 @@
+/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file hw_conf.h
* @author MCD Application Team
* @brief Configuration of hardware interface
- ******************************************************************************
- * @attention
- *
+ ******************************************************************************
+ * @attention
+ *
* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under Ultimate Liberty license
- * SLA0044, the "License"; You may not use this file except in compliance with
- * the License. You may obtain a copy of the License at:
- * www.st.com/SLA0044
- *
- ******************************************************************************
- */
-
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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
+#ifndef HW_CONF_H
+#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
* 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.
+* Once the Semaphore has been released, there shall be at least 1us before it can be taken again. This is required
+* to give the opportunity to CPU2 to take it.
* 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()
@@ -69,7 +72,6 @@
/* Index of the semaphore used to access the RNG */
#define CFG_HW_RNG_SEMID 0
-
/******************************************************************************
* HW TIMER SERVER
*****************************************************************************/
@@ -84,7 +86,7 @@
* wakeup timer.
* This setting is the preemptpriority part of the NVIC.
*/
-#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+#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
@@ -92,7 +94,7 @@
* 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 CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
/**
* Define a critical section in the Timer server
@@ -108,35 +110,35 @@
* 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
+#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
- */
+ * 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_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
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
/**
* LPUART1
@@ -242,6 +244,6 @@
#define CFG_HW_USART1_TX_DMA_IRQn DMA2_Channel4_IRQn
#define CFG_HW_USART1_DMA_TX_IRQHandler DMA2_Channel4_IRQHandler
-#endif /*__HW_CONF_H */
+#endif /*HW_CONF_H */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Inc/main.h
index 4b98bcca3..0f8bf59ea 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Inc/main.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Inc/main.h
@@ -32,7 +32,6 @@ 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_DataThroughput/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Src/app_entry.c
index 8bad226ef..6fc1432c6 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Src/app_entry.c
@@ -169,7 +169,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Src/main.c
index 6fa7208d2..0022c15aa 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Src/main.c
@@ -36,6 +36,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "app_entry.h"
@@ -162,11 +163,10 @@ void SystemClock_Config(void)
/** Configure LSE Drive Capability
*/
__HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
- /** Configure the main internal regulator output voltage
+ /** Configure the main internal regulator output voltage
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
- /** Initializes the RCC Oscillators according to the specified parameters
- * in the RCC_OscInitTypeDef structure.
+ /** Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
|RCC_OSCILLATORTYPE_LSE;
@@ -179,7 +179,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
@@ -195,7 +195,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Initializes the peripherals clocks
+ /** Initializes the peripherals clocks
*/
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
|RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
@@ -371,10 +371,10 @@ static void MX_RTC_Init(void)
}
-/**
+/**
* Enable DMA controller clock
*/
-static void MX_DMA_Init(void)
+static void MX_DMA_Init(void)
{
/* DMA controller clock enable */
__HAL_RCC_DMAMUX1_CLK_ENABLE();
@@ -609,7 +609,7 @@ void Error_Handler(void)
* @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) */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Src/stm32wbxx_hal_msp.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Src/stm32wbxx_hal_msp.c
index f3db38af6..91fb787ab 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Src/stm32wbxx_hal_msp.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Src/stm32wbxx_hal_msp.c
@@ -125,9 +125,9 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
/* USER CODE END LPUART1_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_LPUART1_CLK_ENABLE();
-
+
__HAL_RCC_GPIOA_CLK_ENABLE();
- /**LPUART1 GPIO Configuration
+ /**LPUART1 GPIO Configuration
PA2 ------> LPUART1_TX
PA3 ------> LPUART1_RX
PA6 ------> LPUART1_CTS
@@ -178,13 +178,13 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
/* 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
+ /**USART1 GPIO Configuration
PA11 ------> USART1_CTS
PB6 ------> USART1_TX
- PB7 ------> USART1_RX
+ PB7 ------> USART1_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
@@ -243,8 +243,8 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
/* USER CODE END LPUART1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_LPUART1_CLK_DISABLE();
-
- /**LPUART1 GPIO Configuration
+
+ /**LPUART1 GPIO Configuration
PA2 ------> LPUART1_TX
PA3 ------> LPUART1_RX
PA6 ------> LPUART1_CTS
@@ -267,11 +267,11 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
/* USER CODE END USART1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_USART1_CLK_DISABLE();
-
- /**USART1 GPIO Configuration
+
+ /**USART1 GPIO Configuration
PA11 ------> USART1_CTS
PB6 ------> USART1_TX
- PB7 ------> USART1_RX
+ PB7 ------> USART1_RX
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11);
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Src/stm32wbxx_it.c
index 42033525c..b37e5a9ab 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Src/stm32wbxx_it.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_DataThroughput/Core/Src/stm32wbxx_it.c
@@ -79,7 +79,7 @@ extern UART_HandleTypeDef huart1;
/* USER CODE END EV */
/******************************************************************************/
-/* Cortex Processor Interruption and Exception Handlers */
+/* Cortex Processor Interruption and Exception Handlers */
/******************************************************************************/
/**
* @brief This function handles Non maskable interrupt.
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 407dcd5be..ce1d683b3 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
@@ -19,6 +19,7 @@
/* Includes ------------------------------------------------------------------*/
+#include "main.h"
#include "app_common.h"
#include "dbg_trace.h"
@@ -75,18 +76,6 @@ typedef struct _tSecurityParams
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
@@ -301,7 +290,10 @@ void APP_BLE_Init( void )
/**
* Starts the BLE Stack on CPU2
*/
- SHCI_C2_BLE_Init( &ble_init_cmd_packet );
+ if (SHCI_C2_BLE_Init( &ble_init_cmd_packet ) != SHCI_Success)
+ {
+ Error_Handler();
+ }
/**
* Initialization of HCI & GATT & GAP layer
@@ -413,7 +405,6 @@ static void Ble_Tl_Init( void )
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];
@@ -512,26 +503,21 @@ static void Ble_Hci_Gap_Gatt_Init(void){
* 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;
- }
+ 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;
aci_gap_set_authentication_requirement(BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode,
BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode,
- 0,
- 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
);
/**
@@ -770,8 +756,17 @@ SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
case EVT_BLUE_GAP_PASS_KEY_REQUEST:
APP_DBG_MSG("respond to the passkey request\n");
- aci_gap_pass_key_resp(BleApplicationContext.BleApplicationContext_legacy.connectionHandle, 0x00001234);
+ aci_gap_pass_key_resp(BleApplicationContext.BleApplicationContext_legacy.connectionHandle, 111111);
break;
+
+ case (EVT_BLUE_GAP_NUMERIC_COMPARISON_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_GATT_TX_POOL_AVAILABLE:
DTS_App_TxPoolAvailableNotification();
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 669bcdbf2..e7049681d 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
@@ -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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS/readme.txt
index d2785c5b3..875f4449e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS/readme.txt
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS/readme.txt
@@ -20,7 +20,7 @@
@par Example Description
-How to use the Heart Rate profile as specified by the BLE SIG.
+How to use the Heart Rate profile as specified by the BLE SIG with FreeRTOS.
@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
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
index 836f40dcf..cf8a5baa6 100644
--- 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
@@ -66,9 +66,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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
index 38656e913..12866e785 100644
--- 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
@@ -163,7 +163,7 @@
* Maximum number of simultaneous connections that the device will support.
* Valid values are from 1 to 8
*/
-#define CFG_BLE_NUM_LINK 8
+#define CFG_BLE_NUM_LINK 2
/**
* Maximum number of Services that can be stored in the GATT database.
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
index 097cedfd8..06ca353db 100644
--- 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
@@ -1,13 +1,13 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
- * File Name : hw_conf.h
- * Description : Hardware configuration file for BLE
- * middleWare.
+ * @file hw_conf.h
+ * @author MCD Application Team
+ * @brief Configuration of hardware interface
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -34,6 +34,8 @@
* 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.
+* Once the Semaphore has been released, there shall be at least 1us before it can be taken again. This is required
+* to give the opportunity to CPU2 to take it.
* 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()
@@ -134,7 +136,6 @@
/******************************************************************************
* HW UART
*****************************************************************************/
-
#define CFG_HW_LPUART1_ENABLED 0
#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 0
@@ -142,6 +143,58 @@
#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
@@ -189,9 +242,9 @@
#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
+#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 */
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
index 996a0dfd3..eaceee861 100644
--- 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
@@ -25,7 +25,7 @@
#ifdef __cplusplus
extern "C" {
-#endif
+#endif
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
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
index aa75a01f2..14ed65c22 100644
--- 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
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "app_common.h"
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
index ea5141103..24cf7eca4 100644
--- 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
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "main.h"
@@ -221,7 +222,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
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
index b1843d279..eec1ef82f 100644
--- 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
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "FreeRTOS.h"
#include "task.h"
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
index 862ee811e..1cc430948 100644
--- 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
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
@@ -28,6 +29,7 @@
/* Private typedef -----------------------------------------------------------*/
typedef struct
{
+ uint64_t LpTimeDiffVal;
uint32_t LpTimeLeftOnEntry;
uint8_t LpTimerFreeRTOS_Id;
} LpTimerContext_t;
@@ -60,19 +62,20 @@ typedef struct
*/
#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 LpTimerCb( void );
static void LpTimerStart( uint32_t time_to_sleep );
static void LpEnter( void );
static uint32_t LpGetElapsedTime( void );
void vPortSetupTimerInterrupt( void );
#endif
+
/* Functions Definition ------------------------------------------------------*/
/**
@@ -198,6 +201,7 @@ void vPortSetupTimerInterrupt( void )
static void LpTimerInit( void )
{
( void ) HW_TS_Create(CFG_TIM_PROC_ID_ISR, &(LpTimerContext.LpTimerFreeRTOS_Id), hw_ts_SingleShot, LpTimerCb);
+ LpTimerContext.LpTimeDiffVal = 0;
return;
}
@@ -219,6 +223,7 @@ static void LpTimerCb( void )
return;
}
#endif
+
/**
* @brief Request to start a low power timer ( running is stop mode )
*
@@ -228,52 +233,15 @@ static void LpTimerCb( void )
#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);
+ uint64_t time;
+ /* Converts the number of FreeRTOS ticks into hw timer tick */
+
+ time = (time_to_sleep * 1000 * 1000 );
+ time = time / ( CFG_TS_TICK_VAL * configTICK_RATE_HZ );
+
+ HW_TS_Start(LpTimerContext.LpTimerFreeRTOS_Id, (uint32_t)time);
+
/**
* There might be other timers already running in the timer server that may elapse
* before this one.
@@ -311,19 +279,34 @@ static void LpEnter( void )
#if ( CFG_LPM_SUPPORTED != 0)
static uint32_t LpGetElapsedTime( void )
{
- uint64_t val_ticks, time_us;
+ uint64_t val_ticks, time_us, diff_ps;
+ uint32_t LpTimeLeftOnExit;
- time_us = (CFG_TS_TICK_VAL) * (uint64_t)(LpTimerContext.LpTimeLeftOnEntry - HW_TS_RTC_ReadLeftTicksToCount( ));
+ LpTimeLeftOnExit = HW_TS_RTC_ReadLeftTicksToCount();
+ time_us = (CFG_TS_TICK_VAL) * (uint64_t)(LpTimerContext.LpTimeLeftOnEntry - LpTimeLeftOnExit);
- val_ticks = time_us * configTICK_RATE_HZ;
- val_ticks = val_ticks / (1000 * 1000);
+ /* Corrects the time precision lost in CFG_TS_TICK_VAL computation */
+
+ /* Compute the amount of pico seconds lost at each TS ticks */
+ diff_ps = DIVR( ((uint64_t)CFG_RTCCLK_DIV * 1000000 * 1000000), (uint64_t)LSE_VALUE );
+ diff_ps -= DIVF( (CFG_RTCCLK_DIV * 1000000), LSE_VALUE ) * 1000000;
+ /* Compute the total amount of time shift */
+ diff_ps *= (uint64_t)(LpTimerContext.LpTimeLeftOnEntry - LpTimeLeftOnExit);
- /* 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)) )
+ /* Save the time shift for next time */
+ LpTimerContext.LpTimeDiffVal += diff_ps;
+
+ while(LpTimerContext.LpTimeDiffVal >= (uint64_t)(1000 * 1000))
{
- val_ticks++;
+ /* Reports the time difference into returned time elapsed value */
+ time_us++;
+ LpTimerContext.LpTimeDiffVal -= (uint64_t)(1000 * 1000);
}
+ /* Convert uS time into OS ticks */
+ val_ticks = time_us * configTICK_RATE_HZ;
+ val_ticks = val_ticks / (1000 * 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()
@@ -335,4 +318,5 @@ static uint32_t LpGetElapsedTime( void )
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/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/Core/Src/main.c
index 369af8d27..1c06069e0 100644
--- 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
@@ -37,6 +37,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "cmsis_os.h"
@@ -177,7 +178,7 @@ int main(void)
APPE_Init();
/* Start scheduler */
osKernelStart();
-
+
/* We should never get here as control is now taken by the scheduler */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
@@ -204,11 +205,10 @@ void SystemClock_Config(void)
*/
HAL_PWR_EnableBkUpAccess();
__HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
- /** Configure the main internal regulator output voltage
+ /** Configure the main internal regulator output voltage
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
- /** Initializes the RCC Oscillators according to the specified parameters
- * in the RCC_OscInitTypeDef structure.
+ /** Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
|RCC_OSCILLATORTYPE_LSE;
@@ -221,7 +221,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
@@ -237,7 +237,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Initializes the peripherals clocks
+ /** Initializes the peripherals clocks
*/
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
|RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
@@ -422,10 +422,10 @@ static void MX_RTC_Init(void)
}
-/**
+/**
* Enable DMA controller clock
*/
-static void MX_DMA_Init(void)
+static void MX_DMA_Init(void)
{
/* DMA controller clock enable */
@@ -657,7 +657,7 @@ void StartDefaultTask(void *argument)
{
osThreadFlagsWait(1,osFlagsWaitAll,osWaitForever);
}
- /* USER CODE END 5 */
+ /* USER CODE END 5 */
}
/**
@@ -702,7 +702,7 @@ void Error_Handler(void)
* @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) */
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
index 00f6f0a31..702eb8fdd 100644
--- 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
@@ -101,9 +101,9 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
/* USER CODE END LPUART1_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_LPUART1_CLK_ENABLE();
-
+
__HAL_RCC_GPIOA_CLK_ENABLE();
- /**LPUART1 GPIO Configuration
+ /**LPUART1 GPIO Configuration
PA2 ------> LPUART1_TX
PA3 ------> LPUART1_RX
PA6 ------> LPUART1_CTS
@@ -164,13 +164,13 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
/* 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
+ /**USART1 GPIO Configuration
PA11 ------> USART1_CTS
PB6 ------> USART1_TX
- PB7 ------> USART1_RX
+ PB7 ------> USART1_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
@@ -229,8 +229,8 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
/* USER CODE END LPUART1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_LPUART1_CLK_DISABLE();
-
- /**LPUART1 GPIO Configuration
+
+ /**LPUART1 GPIO Configuration
PA2 ------> LPUART1_TX
PA3 ------> LPUART1_RX
PA6 ------> LPUART1_CTS
@@ -253,11 +253,11 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
/* USER CODE END USART1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_USART1_CLK_DISABLE();
-
- /**USART1 GPIO Configuration
+
+ /**USART1 GPIO Configuration
PA11 ------> USART1_CTS
PB6 ------> USART1_TX
- PB7 ------> USART1_RX
+ PB7 ------> USART1_RX
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11);
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
index b1f6520ae..2db479625 100644
--- 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
@@ -55,6 +55,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "stm32wbxx_hal.h"
#include "stm32wbxx_hal_tim.h"
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
index bc3fe2af0..4351c429d 100644
--- 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
@@ -73,7 +73,7 @@ extern TIM_HandleTypeDef htim17;
/* USER CODE END EV */
/******************************************************************************/
-/* Cortex Processor Interruption and Exception Handlers */
+/* Cortex Processor Interruption and Exception Handlers */
/******************************************************************************/
/**
* @brief This function handles Non maskable interrupt.
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
index 2b64f5f40..6f7250cf6 100644
--- 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
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
@@ -367,7 +368,10 @@ void APP_BLE_Init( void )
/**
* Starts the BLE Stack on CPU2
*/
- SHCI_C2_BLE_Init( &ble_init_cmd_packet );
+ if (SHCI_C2_BLE_Init( &ble_init_cmd_packet ) != SHCI_Success)
+ {
+ Error_Handler();
+ }
/**
* Initialization of HCI & GATT & GAP layer
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
index a47c2ac11..59c66fad3 100644
--- 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
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "ble.h"
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
index 1ceefa7fa..b4aca3c3c 100644
--- 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
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
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
index c6e1ca97a..e7049681d 100644
--- 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -53,7 +63,7 @@ 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 -----------------------------------------------*/
@@ -83,14 +93,34 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_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 ))
@@ -123,8 +153,11 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_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 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -394,78 +433,191 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
- * ZIGBEE
+ * LLD TESTS
******************************************************************************/
-#ifdef ZIGBEE_WB
-void HW_IPCC_ZIGBEE_Init( void )
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_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_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( 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_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
- return;
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( 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_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( 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_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
- return;
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_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_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ 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_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 */
/******************************************************************************
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
index dd1f230b8..86e5f8ac8 100644
--- 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
@@ -20,16 +20,16 @@
@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.
-
+How to read notifications from Apple Notification Center Service (ANCS) as specified by Apple specification
+and use the Heart Rate profile as specified by the BLE SIG with FreeRTOS.
+
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).
-
+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).This application
+use STM32 sequencer API to schedule SW tasks.
+For more details about Apple Notification Center Service (ANCS) refer to Apple specification at:
+https://developer.apple.com/library/archive/documentation/CoreBluetooth/Reference/AppleNotificationCenterServiceSpecification/
@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
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
index 836f40dcf..cf8a5baa6 100644
--- 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
@@ -66,9 +66,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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
index bfd21fb00..a8fd5f658 100644
--- 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
@@ -163,7 +163,7 @@
* Maximum number of simultaneous connections that the device will support.
* Valid values are from 1 to 8
*/
-#define CFG_BLE_NUM_LINK 8
+#define CFG_BLE_NUM_LINK 2
/**
* Maximum number of Services that can be stored in the GATT database.
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
index 5492cbb08..b703e7393 100644
--- 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
@@ -1,13 +1,13 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
- * File Name : hw_conf.h
- * Description : Hardware configuration file for BLE
- * middleWare.
+ * @file hw_conf.h
+ * @author MCD Application Team
+ * @brief Configuration of hardware interface
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -32,6 +32,8 @@
* 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.
+* Once the Semaphore has been released, there shall be at least 1us before it can be taken again. This is required
+* to give the opportunity to CPU2 to take it.
* 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()
@@ -132,7 +134,6 @@
/******************************************************************************
* HW UART
*****************************************************************************/
-
#define CFG_HW_LPUART1_ENABLED 0
#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 0
@@ -140,6 +141,58 @@
#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
@@ -187,9 +240,9 @@
#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
+#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 */
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
index 8887a1a73..12466d5e3 100644
--- 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
@@ -25,7 +25,7 @@
#ifdef __cplusplus
extern "C" {
-#endif
+#endif
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
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
index aa75a01f2..14ed65c22 100644
--- 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
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "app_common.h"
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
index 0be8a6e05..a00f1921c 100644
--- 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
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "main.h"
@@ -189,7 +190,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
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
index bb02ffb6a..cea2fdfb2 100644
--- 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
@@ -37,6 +37,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "app_entry.h"
@@ -165,11 +166,10 @@ void SystemClock_Config(void)
*/
HAL_PWR_EnableBkUpAccess();
__HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
- /** Configure the main internal regulator output voltage
+ /** Configure the main internal regulator output voltage
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
- /** Initializes the RCC Oscillators according to the specified parameters
- * in the RCC_OscInitTypeDef structure.
+ /** Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
|RCC_OSCILLATORTYPE_LSE;
@@ -182,7 +182,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
@@ -198,7 +198,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Initializes the peripherals clocks
+ /** Initializes the peripherals clocks
*/
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
|RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
@@ -383,10 +383,10 @@ static void MX_RTC_Init(void)
}
-/**
+/**
* Enable DMA controller clock
*/
-static void MX_DMA_Init(void)
+static void MX_DMA_Init(void)
{
/* DMA controller clock enable */
@@ -623,7 +623,7 @@ void Error_Handler(void)
* @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) */
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
index 9307e5c50..fc4e64f31 100644
--- 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
@@ -96,9 +96,9 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
/* USER CODE END LPUART1_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_LPUART1_CLK_ENABLE();
-
+
__HAL_RCC_GPIOA_CLK_ENABLE();
- /**LPUART1 GPIO Configuration
+ /**LPUART1 GPIO Configuration
PA2 ------> LPUART1_TX
PA3 ------> LPUART1_RX
PA6 ------> LPUART1_CTS
@@ -159,13 +159,13 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
/* 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
+ /**USART1 GPIO Configuration
PA11 ------> USART1_CTS
PB6 ------> USART1_TX
- PB7 ------> USART1_RX
+ PB7 ------> USART1_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
@@ -224,8 +224,8 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
/* USER CODE END LPUART1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_LPUART1_CLK_DISABLE();
-
- /**LPUART1 GPIO Configuration
+
+ /**LPUART1 GPIO Configuration
PA2 ------> LPUART1_TX
PA3 ------> LPUART1_RX
PA6 ------> LPUART1_CTS
@@ -248,11 +248,11 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
/* USER CODE END USART1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_USART1_CLK_DISABLE();
-
- /**USART1 GPIO Configuration
+
+ /**USART1 GPIO Configuration
PA11 ------> USART1_CTS
PB6 ------> USART1_TX
- PB7 ------> USART1_RX
+ PB7 ------> USART1_RX
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11);
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
index eed398f21..d469f29ab 100644
--- 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
@@ -69,7 +69,7 @@ extern UART_HandleTypeDef huart1;
/* USER CODE END EV */
/******************************************************************************/
-/* Cortex Processor Interruption and Exception Handlers */
+/* Cortex Processor Interruption and Exception Handlers */
/******************************************************************************/
/**
* @brief This function handles Non maskable interrupt.
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
index e53f4f8d1..48894a281 100644
--- 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
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
@@ -334,7 +335,10 @@ void APP_BLE_Init( void )
/**
* Starts the BLE Stack on CPU2
*/
- SHCI_C2_BLE_Init( &ble_init_cmd_packet );
+ if (SHCI_C2_BLE_Init( &ble_init_cmd_packet ) != SHCI_Success)
+ {
+ Error_Handler();
+ }
/**
* Initialization of HCI & GATT & GAP layer
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
index a47c2ac11..59c66fad3 100644
--- 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
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "ble.h"
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
index 1fa2c5234..081905ee3 100644
--- 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
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
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
index c6e1ca97a..e7049681d 100644
--- 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -53,7 +63,7 @@ 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 -----------------------------------------------*/
@@ -83,14 +93,34 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_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 ))
@@ -123,8 +153,11 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_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 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -394,78 +433,191 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
- * ZIGBEE
+ * LLD TESTS
******************************************************************************/
-#ifdef ZIGBEE_WB
-void HW_IPCC_ZIGBEE_Init( void )
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_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_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendAppliCmd( void )
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( 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_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmd( void )
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
{
- LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_THREAD_CLI_CMD_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
- return;
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
-void HW_IPCC_ZIGBEE_SendAppliCmdAck( void )
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( 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_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
return;
}
-void HW_IPCC_ZIGBEE_SendCliCmdAck( void )
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( 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_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
- return;
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_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_THREAD_OT_CMD_RSP_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_AppliCmdNotification();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_AppliAsyncEvtNotification();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
-static void HW_IPCC_ZIGBEE_CliNotifEvtHandler( void )
+static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_THREAD_CLI_NOTIFICATION_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_CliEvtNotification();
+ 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_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 */
/******************************************************************************
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
index 897ef5035..4c4958886 100644
--- 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
@@ -20,16 +20,16 @@
@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.
-
+How to read notifications from Apple Notification Center Service (ANCS) as specified by Apple specification
+and use Heart Rate profile as specified by the BLE SIG.
+
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).
-
+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). This application
+use STM32 sequencer API to schedule SW tasks.
+For more details about Apple Notification Center Service (ANCS) refer to Apple specification at:
+https://developer.apple.com/library/archive/documentation/CoreBluetooth/Reference/AppleNotificationCenterServiceSpecification/
@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
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 836f40dcf..cf8a5baa6 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
@@ -66,9 +66,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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 b4ad28b26..e5a92f20f 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
@@ -149,7 +149,7 @@
* Maximum number of simultaneous connections that the device will support.
* Valid values are from 1 to 8
*/
-#define CFG_BLE_NUM_LINK 8
+#define CFG_BLE_NUM_LINK 2
/**
* Maximum number of Services that can be stored in the GATT database.
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 5492cbb08..b703e7393 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
@@ -1,13 +1,13 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
- * File Name : hw_conf.h
- * Description : Hardware configuration file for BLE
- * middleWare.
+ * @file hw_conf.h
+ * @author MCD Application Team
+ * @brief Configuration of hardware interface
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -32,6 +32,8 @@
* 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.
+* Once the Semaphore has been released, there shall be at least 1us before it can be taken again. This is required
+* to give the opportunity to CPU2 to take it.
* 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()
@@ -132,7 +134,6 @@
/******************************************************************************
* HW UART
*****************************************************************************/
-
#define CFG_HW_LPUART1_ENABLED 0
#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 0
@@ -140,6 +141,58 @@
#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
@@ -187,9 +240,9 @@
#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
+#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 */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/stm32wbxx_it.h
index 8887a1a73..12466d5e3 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/stm32wbxx_it.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Inc/stm32wbxx_it.h
@@ -25,7 +25,7 @@
#ifdef __cplusplus
extern "C" {
-#endif
+#endif
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
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 aa75a01f2..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
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "app_common.h"
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 0be8a6e05..a00f1921c 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
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "main.h"
@@ -189,7 +190,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
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 3fb378252..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
@@ -37,6 +37,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "app_entry.h"
@@ -165,11 +166,10 @@ void SystemClock_Config(void)
*/
HAL_PWR_EnableBkUpAccess();
__HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
- /** Configure the main internal regulator output voltage
+ /** Configure the main internal regulator output voltage
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
- /** Initializes the RCC Oscillators according to the specified parameters
- * in the RCC_OscInitTypeDef structure.
+ /** Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
|RCC_OSCILLATORTYPE_LSE;
@@ -182,7 +182,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
@@ -198,7 +198,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Initializes the peripherals clocks
+ /** Initializes the peripherals clocks
*/
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
|RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
@@ -387,10 +387,10 @@ static void MX_RTC_Init(void)
}
-/**
+/**
* Enable DMA controller clock
*/
-static void MX_DMA_Init(void)
+static void MX_DMA_Init(void)
{
/* DMA controller clock enable */
@@ -627,7 +627,7 @@ void Error_Handler(void)
* @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) */
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 9307e5c50..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
@@ -96,9 +96,9 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
/* USER CODE END LPUART1_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_LPUART1_CLK_ENABLE();
-
+
__HAL_RCC_GPIOA_CLK_ENABLE();
- /**LPUART1 GPIO Configuration
+ /**LPUART1 GPIO Configuration
PA2 ------> LPUART1_TX
PA3 ------> LPUART1_RX
PA6 ------> LPUART1_CTS
@@ -159,13 +159,13 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
/* 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
+ /**USART1 GPIO Configuration
PA11 ------> USART1_CTS
PB6 ------> USART1_TX
- PB7 ------> USART1_RX
+ PB7 ------> USART1_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
@@ -224,8 +224,8 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
/* USER CODE END LPUART1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_LPUART1_CLK_DISABLE();
-
- /**LPUART1 GPIO Configuration
+
+ /**LPUART1 GPIO Configuration
PA2 ------> LPUART1_TX
PA3 ------> LPUART1_RX
PA6 ------> LPUART1_CTS
@@ -248,11 +248,11 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
/* USER CODE END USART1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_USART1_CLK_DISABLE();
-
- /**USART1 GPIO Configuration
+
+ /**USART1 GPIO Configuration
PA11 ------> USART1_CTS
PB6 ------> USART1_TX
- PB7 ------> USART1_RX
+ PB7 ------> USART1_RX
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11);
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/stm32wbxx_it.c
index eed398f21..d469f29ab 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/stm32wbxx_it.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/Core/Src/stm32wbxx_it.c
@@ -69,7 +69,7 @@ extern UART_HandleTypeDef huart1;
/* USER CODE END EV */
/******************************************************************************/
-/* Cortex Processor Interruption and Exception Handlers */
+/* Cortex Processor Interruption and Exception Handlers */
/******************************************************************************/
/**
* @brief This function handles Non maskable interrupt.
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 e896a9974..2878c488d 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
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
@@ -64,18 +65,6 @@ typedef struct _tSecurityParams
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
@@ -309,7 +298,10 @@ void APP_BLE_Init( void )
/**
* Starts the BLE Stack on CPU2
*/
- SHCI_C2_BLE_Init( &ble_init_cmd_packet );
+ if (SHCI_C2_BLE_Init( &ble_init_cmd_packet ) != SHCI_Success)
+ {
+ Error_Handler();
+ }
/**
* Initialization of HCI & GATT & GAP layer
@@ -681,7 +673,6 @@ static void Ble_Tl_Init( void )
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];
@@ -812,16 +803,11 @@ static void Ble_Hci_Gap_Gatt_Init(void){
* 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,
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/STM32_WPAN/App/dis_app.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/STM32_WPAN/App/dis_app.c
index a47c2ac11..59c66fad3 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/STM32_WPAN/App/dis_app.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/STM32_WPAN/App/dis_app.c
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "ble.h"
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 1fa2c5234..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
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
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 a58b95cad..e7049681d 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/readme.txt
index 06b83aafe..c26bb5df8 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/readme.txt
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRate_ota/readme.txt
@@ -20,7 +20,7 @@
@par Example Description
-How to use the Heart Rate profile as specified by the BLE SIG.
+How to use the Heart Rate profile as specified by the BLE SIG to be downloaded with BLE OTA application.
@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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Inc/app_common.h
index 79439597f..d580f0365 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Inc/app_common.h
@@ -67,9 +67,13 @@ extern "C"
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Inc/app_conf.h
index 1d11e448c..5bff790a7 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Inc/app_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Inc/app_conf.h
@@ -75,6 +75,29 @@
#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_NOT_SUPPORTED
+
+/**
+ * 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)
+
+/**
* Define PHY
*/
#define ALL_PHYS_PREFERENCE 0x00
@@ -90,6 +113,7 @@
*/
#define CFG_UNKNOWN_APPEARANCE (0)
#define CFG_GAP_APPEARANCE (832)
+#define BLE_APPEARANCE_HID_MOUSE (962)
/**
* Identity root key used to derive LTK and CSRK
@@ -125,7 +149,7 @@
* Maximum number of simultaneous connections that the device will support.
* Valid values are from 1 to 8
*/
-#define CFG_BLE_NUM_LINK 8
+#define CFG_BLE_NUM_LINK 2
/**
* Maximum number of Services that can be stored in the GATT database.
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Inc/hw_conf.h
index 18d8e28f8..c88acf2f0 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Inc/hw_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Inc/hw_conf.h
@@ -1,36 +1,39 @@
+/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file hw_conf.h
* @author MCD Application Team
* @brief Configuration of hardware interface
- ******************************************************************************
- * @attention
- *
+ ******************************************************************************
+ * @attention
+ *
* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under Ultimate Liberty license
- * SLA0044, the "License"; You may not use this file except in compliance with
- * the License. You may obtain a copy of the License at:
- * www.st.com/SLA0044
- *
- ******************************************************************************
- */
-
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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
+#ifndef HW_CONF_H
+#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
* 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.
+* Once the Semaphore has been released, there shall be at least 1us before it can be taken again. This is required
+* to give the opportunity to CPU2 to take it.
* 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()
@@ -69,7 +72,6 @@
/* Index of the semaphore used to access the RNG */
#define CFG_HW_RNG_SEMID 0
-
/******************************************************************************
* HW TIMER SERVER
*****************************************************************************/
@@ -84,7 +86,7 @@
* wakeup timer.
* This setting is the preemptpriority part of the NVIC.
*/
-#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+#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
@@ -92,7 +94,7 @@
* 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 CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
/**
* Define a critical section in the Timer server
@@ -108,25 +110,25 @@
* 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
+#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
- */
+ * 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
/******************************************************************************
@@ -135,8 +137,8 @@
#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 0
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
/**
* LPUART1
@@ -242,6 +244,6 @@
#define CFG_HW_USART1_TX_DMA_IRQn DMA2_Channel4_IRQn
#define CFG_HW_USART1_DMA_TX_IRQHandler DMA2_Channel4_IRQHandler
-#endif /*__HW_CONF_H */
+#endif /*HW_CONF_H */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Inc/main.h
index bbe71a4da..d104dcb7e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Inc/main.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Inc/main.h
@@ -32,6 +32,7 @@ extern RTC_HandleTypeDef hrtc; /**< RTC handler declaration */
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
+void Error_Handler(void);
#endif /* __MAIN_H */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Src/app_entry.c
index 90d87aa7f..b722825a0 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Src/app_entry.c
@@ -190,7 +190,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Src/main.c
index 25a8c45e0..7bcb4bf8c 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/Core/Src/main.c
@@ -38,6 +38,7 @@
/* Includes ------------------------------------------------------------------*/
+#include "main.h"
#include "app_common.h"
#include "app_entry.h"
@@ -59,6 +60,7 @@ static void SystemClock_Config( void );
static void Reset_Device( void );
static void Reset_IPCC( void );
static void Init_Exti( void );
+void Error_Handler(void);
/* Functions Definition ------------------------------------------------------*/
@@ -206,6 +208,18 @@ static void Init_RTC( void )
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 */
+}
+
/**
* @brief Configure the system clock
*
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/MDK-ARM/BLE_Hid.uvoptx b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/MDK-ARM/BLE_Hid.uvoptx
index bfcef34bd..9a6300ad5 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/MDK-ARM/BLE_Hid.uvoptx
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/MDK-ARM/BLE_Hid.uvoptx
@@ -247,6 +247,18 @@
<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>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>
@@ -262,7 +274,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>2</GroupNumber>
- <FileNumber>7</FileNumber>
+ <FileNumber>8</FileNumber>
<FileType>2</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -282,7 +294,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>3</GroupNumber>
- <FileNumber>8</FileNumber>
+ <FileNumber>9</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -294,7 +306,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
- <FileNumber>9</FileNumber>
+ <FileNumber>10</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -314,7 +326,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>4</GroupNumber>
- <FileNumber>10</FileNumber>
+ <FileNumber>11</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -334,7 +346,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>5</GroupNumber>
- <FileNumber>11</FileNumber>
+ <FileNumber>12</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -354,7 +366,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>6</GroupNumber>
- <FileNumber>12</FileNumber>
+ <FileNumber>13</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -374,7 +386,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>7</GroupNumber>
- <FileNumber>13</FileNumber>
+ <FileNumber>14</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -394,7 +406,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>14</FileNumber>
+ <FileNumber>15</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -406,7 +418,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>15</FileNumber>
+ <FileNumber>16</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -418,7 +430,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>16</FileNumber>
+ <FileNumber>17</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -430,7 +442,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>17</FileNumber>
+ <FileNumber>18</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -442,7 +454,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>18</FileNumber>
+ <FileNumber>19</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -454,7 +466,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>19</FileNumber>
+ <FileNumber>20</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -466,7 +478,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>20</FileNumber>
+ <FileNumber>21</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -478,7 +490,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>21</FileNumber>
+ <FileNumber>22</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -490,7 +502,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>22</FileNumber>
+ <FileNumber>23</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -502,7 +514,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>23</FileNumber>
+ <FileNumber>24</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -514,7 +526,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>24</FileNumber>
+ <FileNumber>25</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -526,7 +538,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>25</FileNumber>
+ <FileNumber>26</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -538,7 +550,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>26</FileNumber>
+ <FileNumber>27</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -550,7 +562,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>27</FileNumber>
+ <FileNumber>28</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -562,7 +574,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>28</FileNumber>
+ <FileNumber>29</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -574,7 +586,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>29</FileNumber>
+ <FileNumber>30</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -594,7 +606,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>30</FileNumber>
+ <FileNumber>31</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -606,7 +618,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>31</FileNumber>
+ <FileNumber>32</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -626,7 +638,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>32</FileNumber>
+ <FileNumber>33</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -638,7 +650,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>33</FileNumber>
+ <FileNumber>34</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -650,7 +662,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>34</FileNumber>
+ <FileNumber>35</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -662,7 +674,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>35</FileNumber>
+ <FileNumber>36</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -674,7 +686,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>36</FileNumber>
+ <FileNumber>37</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -686,7 +698,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>37</FileNumber>
+ <FileNumber>38</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -706,7 +718,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>11</GroupNumber>
- <FileNumber>38</FileNumber>
+ <FileNumber>39</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -718,7 +730,7 @@
</File>
<File>
<GroupNumber>11</GroupNumber>
- <FileNumber>39</FileNumber>
+ <FileNumber>40</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -738,7 +750,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>12</GroupNumber>
- <FileNumber>40</FileNumber>
+ <FileNumber>41</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -758,7 +770,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>41</FileNumber>
+ <FileNumber>42</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -770,7 +782,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>42</FileNumber>
+ <FileNumber>43</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -782,7 +794,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>43</FileNumber>
+ <FileNumber>44</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -794,7 +806,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>44</FileNumber>
+ <FileNumber>45</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -806,7 +818,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>45</FileNumber>
+ <FileNumber>46</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -826,7 +838,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>14</GroupNumber>
- <FileNumber>46</FileNumber>
+ <FileNumber>47</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -838,7 +850,7 @@
</File>
<File>
<GroupNumber>14</GroupNumber>
- <FileNumber>47</FileNumber>
+ <FileNumber>48</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -850,7 +862,7 @@
</File>
<File>
<GroupNumber>14</GroupNumber>
- <FileNumber>48</FileNumber>
+ <FileNumber>49</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -862,7 +874,7 @@
</File>
<File>
<GroupNumber>14</GroupNumber>
- <FileNumber>49</FileNumber>
+ <FileNumber>50</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -882,7 +894,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>15</GroupNumber>
- <FileNumber>50</FileNumber>
+ <FileNumber>51</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -894,7 +906,7 @@
</File>
<File>
<GroupNumber>15</GroupNumber>
- <FileNumber>51</FileNumber>
+ <FileNumber>52</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/MDK-ARM/BLE_Hid.uvprojx b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/MDK-ARM/BLE_Hid.uvprojx
index 623623d31..761a75bba 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/MDK-ARM/BLE_Hid.uvprojx
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/MDK-ARM/BLE_Hid.uvprojx
@@ -16,7 +16,7 @@
<TargetCommonOption>
<Device>STM32WB55RGVx</Device>
<Vendor>STMicroelectronics</Vendor>
- <PackID>Keil.STM32WBxx.0.0.6</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>
@@ -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>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/STM32_WPAN/App/app_ble.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/STM32_WPAN/App/app_ble.c
index 3e1952217..34b2c157b 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/STM32_WPAN/App/app_ble.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Hid/STM32_WPAN/App/app_ble.c
@@ -19,6 +19,7 @@
/* Includes ------------------------------------------------------------------*/
+#include "main.h"
#include "app_common.h"
#include "dbg_trace.h"
@@ -69,18 +70,6 @@ typedef struct _tSecurityParams
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
@@ -272,7 +261,10 @@ void APP_BLE_Init( void )
/**
* Starts the BLE Stack on CPU2
*/
- SHCI_C2_BLE_Init( &ble_init_cmd_packet );
+ if (SHCI_C2_BLE_Init( &ble_init_cmd_packet ) != SHCI_Success)
+ {
+ Error_Handler();
+ }
/**
* Initialization of HCI & GATT & GAP layer
@@ -453,7 +445,6 @@ static void Ble_Tl_Init( void )
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];
@@ -552,26 +543,21 @@ static void Ble_Hci_Gap_Gatt_Init(void){
* 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 = 0;
- 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;
- }
+ 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;
aci_gap_set_authentication_requirement(BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode,
BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode,
- 0,
- 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
);
/**
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 10c61f9ac..e7049681d 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
@@ -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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,11 +183,17 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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_MeshLightingLPN/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_common.h
index 9dbfbba05..7e66ee35a 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_common.h
@@ -67,9 +67,13 @@ extern "C"
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_conf.h
index 20827dbdf..217b10968 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_conf.h
@@ -51,7 +51,7 @@
*/
#define CFG_BONDING_MODE (1)
#define CFG_FIXED_PIN (111111)
-#define CFG_USED_FIXED_PIN (0)
+#define CFG_USED_FIXED_PIN (1)
#define CFG_ENCRYPTION_KEY_SIZE_MAX (16)
#define CFG_ENCRYPTION_KEY_SIZE_MIN (8)
@@ -74,6 +74,28 @@
#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_NOT_SUPPORTED
+
+/**
+ * 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)
/**
* Define PHY
@@ -142,7 +164,7 @@
* Maximum number of simultaneous connections that the device will support.
* Valid values are from 1 to 8
*/
-#define CFG_BLE_NUM_LINK 8
+#define CFG_BLE_NUM_LINK 2
/**
* Maximum number of Services that can be stored in the GATT database.
@@ -290,7 +312,7 @@
/**
* Enable/Disable USB interface
*/
-#define CFG_USB_INTERFACE_ENABLE 0
+#define CFG_USB_INTERFACE_ENABLE 0
/******************************************************************************
* Low Power
@@ -299,7 +321,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 1
+#define CFG_LPM_SUPPORTED 1
/******************************************************************************
* Timer Server
@@ -487,6 +509,7 @@ typedef enum
CFG_TASK_MESH_UART_RX_REQ_ID,
CFG_TASK_APPLI_REQ_ID,
CFG_TASK_MESH_SW1_REQ_ID,
+ CFG_TASK_MESH_SW3_REQ_ID,
CFG_TASK_MESH_LPN_REQ_ID,
CFG_LAST_TASK_ID_WITH_HCICMD, /**< Shall be LAST in the list */
@@ -496,7 +519,7 @@ typedef enum
typedef enum
{
CFG_FIRST_TASK_ID_WITH_NO_HCICMD = CFG_LAST_TASK_ID_WITH_HCICMD - 1, /**< Shall be FIRST in the list */
-
+ CFG_TASK_SW1_BUTTON_PUSHED_ID,
CFG_TASK_SYSTEM_HCI_ASYNCH_EVT_ID,
CFG_LAST_TASK_ID_WITHO_NO_HCICMD /**< Shall be LAST in the list */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/hw_conf.h
index 1e2d7a616..b703e7393 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/hw_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/hw_conf.h
@@ -1,36 +1,39 @@
+/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file hw_conf.h
* @author MCD Application Team
* @brief Configuration of hardware interface
- ******************************************************************************
- * @attention
- *
+ ******************************************************************************
+ * @attention
+ *
* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under Ultimate Liberty license
- * SLA0044, the "License"; You may not use this file except in compliance with
- * the License. You may obtain a copy of the License at:
- * www.st.com/SLA0044
- *
- ******************************************************************************
- */
-
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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
+#ifndef HW_CONF_H
+#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
* 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.
+* Once the Semaphore has been released, there shall be at least 1us before it can be taken again. This is required
+* to give the opportunity to CPU2 to take it.
* 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()
@@ -69,7 +72,6 @@
/* Index of the semaphore used to access the RNG */
#define CFG_HW_RNG_SEMID 0
-
/******************************************************************************
* HW TIMER SERVER
*****************************************************************************/
@@ -84,7 +86,7 @@
* wakeup timer.
* This setting is the preemptpriority part of the NVIC.
*/
-#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+#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
@@ -92,7 +94,7 @@
* 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 CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
/**
* Define a critical section in the Timer server
@@ -108,35 +110,35 @@
* 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
+#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
- */
+ * 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_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
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
/**
* LPUART1
@@ -242,6 +244,6 @@
#define CFG_HW_USART1_TX_DMA_IRQn DMA2_Channel4_IRQn
#define CFG_HW_USART1_DMA_TX_IRQHandler DMA2_Channel4_IRQHandler
-#endif /*__HW_CONF_H */
+#endif /*HW_CONF_H */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/main.h
index 3de57ae3e..7d6b87d0e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/main.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/main.h
@@ -30,6 +30,8 @@
/* Exported variables --------------------------------------------------------*/
extern RTC_HandleTypeDef hrtc; /**< RTC handler declaration */
+/* Exported functions prototypes ---------------------------------------------*/
+void Error_Handler(void);
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/app_entry.c
index ca974416b..e8f88455a 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/app_entry.c
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "main.h"
@@ -232,7 +233,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
@@ -373,37 +374,14 @@ void HAL_GPIO_EXTI_Callback( uint16_t GPIO_Pin )
break;
#ifdef ENABLE_OCCUPANCY_SENSOR
- case BUTTON_SW2_PIN:
+ case BUTTON_SW3_PIN:
{
Occupancy_Flag = 1;
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_SW3_REQ_ID, CFG_SCH_PRIO_0);
}
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;
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/main.c
index 34c013a8e..95537ac98 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/Core/Src/main.c
@@ -327,11 +327,10 @@ void SystemClock_Config(void)
/** Configure LSE Drive Capability
*/
__HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
- /** Configure the main internal regulator output voltage
+ /** Configure the main internal regulator output voltage
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
- /** Initializes the RCC Oscillators according to the specified parameters
- * in the RCC_OscInitTypeDef structure.
+ /** Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
|RCC_OSCILLATORTYPE_LSE;
@@ -344,7 +343,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
@@ -364,7 +363,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Initializes the peripherals clocks
+ /** Initializes the peripherals clocks
*/
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
|RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
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
index f8f7c1c51..55ec9e895 100644
--- 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
@@ -833,7 +833,6 @@
<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>
@@ -1120,6 +1119,9 @@
<name>$PROJ_DIR$\..\STM32_WPAN\app\appli_sensor.c</name>
</file>
<file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\appli_sensors_client.c</name>
+ </file>
+ <file>
<name>$PROJ_DIR$\..\STM32_WPAN\app\appli_vendor.c</name>
</file>
<file>
@@ -1260,6 +1262,9 @@
<name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\sensors.c</name>
</file>
<file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\sensors_client.c</name>
+ </file>
+ <file>
<name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\svc\Src\svc_ctl.c</name>
</file>
<file>
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
index 802b329f7..403539cb0 100644
--- 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
@@ -479,6 +479,18 @@
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>25</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\STM32_WPAN\app\appli_sensors_client.c</PathWithFileName>
+ <FilenameWithoutPath>appli_sensors_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
</Group>
<Group>
@@ -489,7 +501,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>4</GroupNumber>
- <FileNumber>25</FileNumber>
+ <FileNumber>26</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -509,7 +521,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>5</GroupNumber>
- <FileNumber>26</FileNumber>
+ <FileNumber>27</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -529,7 +541,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>6</GroupNumber>
- <FileNumber>27</FileNumber>
+ <FileNumber>28</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -549,7 +561,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>7</GroupNumber>
- <FileNumber>28</FileNumber>
+ <FileNumber>29</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -569,7 +581,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>29</FileNumber>
+ <FileNumber>30</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -581,7 +593,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>30</FileNumber>
+ <FileNumber>31</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -593,7 +605,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>31</FileNumber>
+ <FileNumber>32</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -605,7 +617,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>32</FileNumber>
+ <FileNumber>33</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -617,7 +629,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>33</FileNumber>
+ <FileNumber>34</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -629,7 +641,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>34</FileNumber>
+ <FileNumber>35</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -641,7 +653,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>35</FileNumber>
+ <FileNumber>36</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -653,7 +665,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>36</FileNumber>
+ <FileNumber>37</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -665,7 +677,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>37</FileNumber>
+ <FileNumber>38</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -677,7 +689,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>38</FileNumber>
+ <FileNumber>39</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -689,7 +701,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>39</FileNumber>
+ <FileNumber>40</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -701,7 +713,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>40</FileNumber>
+ <FileNumber>41</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -713,7 +725,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>41</FileNumber>
+ <FileNumber>42</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -725,7 +737,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>42</FileNumber>
+ <FileNumber>43</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -737,7 +749,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>43</FileNumber>
+ <FileNumber>44</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -749,7 +761,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>44</FileNumber>
+ <FileNumber>45</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -761,7 +773,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>45</FileNumber>
+ <FileNumber>46</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -773,7 +785,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>46</FileNumber>
+ <FileNumber>47</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -793,7 +805,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>47</FileNumber>
+ <FileNumber>48</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -805,7 +817,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>48</FileNumber>
+ <FileNumber>49</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -817,7 +829,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>49</FileNumber>
+ <FileNumber>50</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -829,7 +841,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>50</FileNumber>
+ <FileNumber>51</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -841,7 +853,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>51</FileNumber>
+ <FileNumber>52</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -853,7 +865,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>52</FileNumber>
+ <FileNumber>53</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -865,7 +877,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>53</FileNumber>
+ <FileNumber>54</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -877,7 +889,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>54</FileNumber>
+ <FileNumber>55</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -889,7 +901,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>55</FileNumber>
+ <FileNumber>56</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -901,7 +913,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>56</FileNumber>
+ <FileNumber>57</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -913,7 +925,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>57</FileNumber>
+ <FileNumber>58</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -925,7 +937,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>58</FileNumber>
+ <FileNumber>59</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -935,6 +947,18 @@
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
+ <File>
+ <GroupNumber>9</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\sensors_client.c</PathWithFileName>
+ <FilenameWithoutPath>sensors_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
</Group>
<Group>
@@ -945,7 +969,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>59</FileNumber>
+ <FileNumber>61</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -957,7 +981,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>60</FileNumber>
+ <FileNumber>62</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -969,7 +993,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>61</FileNumber>
+ <FileNumber>63</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -981,7 +1005,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>62</FileNumber>
+ <FileNumber>64</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -993,7 +1017,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>63</FileNumber>
+ <FileNumber>65</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1005,7 +1029,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>64</FileNumber>
+ <FileNumber>66</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1025,7 +1049,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>11</GroupNumber>
- <FileNumber>65</FileNumber>
+ <FileNumber>67</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1045,7 +1069,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>12</GroupNumber>
- <FileNumber>66</FileNumber>
+ <FileNumber>68</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1057,7 +1081,7 @@
</File>
<File>
<GroupNumber>12</GroupNumber>
- <FileNumber>67</FileNumber>
+ <FileNumber>69</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1069,7 +1093,7 @@
</File>
<File>
<GroupNumber>12</GroupNumber>
- <FileNumber>68</FileNumber>
+ <FileNumber>70</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1081,7 +1105,7 @@
</File>
<File>
<GroupNumber>12</GroupNumber>
- <FileNumber>69</FileNumber>
+ <FileNumber>71</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1093,7 +1117,7 @@
</File>
<File>
<GroupNumber>12</GroupNumber>
- <FileNumber>70</FileNumber>
+ <FileNumber>72</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1113,7 +1137,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>71</FileNumber>
+ <FileNumber>73</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1125,7 +1149,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>72</FileNumber>
+ <FileNumber>74</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1137,7 +1161,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>73</FileNumber>
+ <FileNumber>75</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1149,7 +1173,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>74</FileNumber>
+ <FileNumber>76</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1161,7 +1185,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>75</FileNumber>
+ <FileNumber>77</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1173,7 +1197,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>76</FileNumber>
+ <FileNumber>78</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1193,7 +1217,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>14</GroupNumber>
- <FileNumber>77</FileNumber>
+ <FileNumber>79</FileNumber>
<FileType>4</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1206,26 +1230,6 @@
</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>78</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>
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
index 9b6c366a8..63a48efbb 100644
--- 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
@@ -512,6 +512,11 @@
<FileType>1</FileType>
<FilePath>..\STM32_WPAN\app\appli_light_client.c</FilePath>
</File>
+ <File>
+ <FileName>appli_sensors_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\STM32_WPAN\app\appli_sensors_client.c</FilePath>
+ </File>
</Files>
</Group>
<Group>
@@ -712,6 +717,11 @@
<FileType>1</FileType>
<FilePath>..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\light_client.c</FilePath>
</File>
+ <File>
+ <FileName>sensors_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\sensors_client.c</FilePath>
+ </File>
</Files>
</Group>
<Group>
@@ -835,16 +845,6 @@
</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>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32CubeIDE/.cproject b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32CubeIDE/.cproject
index 725b4be04..917f86a37 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32CubeIDE/.cproject
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32CubeIDE/.cproject
@@ -14,7 +14,7 @@
</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="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1042125049" name="Debug" parent="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug">
+ <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="" errorParsers="org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.CWDLocator;org.eclipse.cdt.core.GCCErrorParser" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1042125049" name="Debug" parent="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug">
<folderInfo id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1042125049." name="/" resourcePath="">
<toolChain id="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.debug.1789394074" name="MCU ARM GCC" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.debug">
<option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.type.1954199454" name="Internal Toolchain Type" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.type" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32" valueType="string"/>
@@ -26,8 +26,8 @@
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.167219937" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.softfp" valueType="enumerated"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.1720085122" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" value="genericBoard" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.869117360" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.3 || Debug || true || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32 || STM32WB55RGVx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../../../../../../../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 || || || USE_HAL_DRIVER | STM32 | USE_STM32WBXX_NUCLEO | TRACE_ENABLE_NO_FUNCTION | SERVER | CORE_CM4 | ENABLE_USART | STM32WB55xx || || || || || ${workspace_loc:/${ProjName}/STM32WB55RGVX_FLASH.ld} || true || NonSecure || || || " valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.convertbinary.2053324477" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.convertbinary" value="false" valueType="boolean"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.converthex.918194408" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.converthex" value="true" valueType="boolean"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.convertbinary.2053324477" name="Convert to binary file (-O binary)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.convertbinary" value="false" valueType="boolean"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.converthex.918194408" name="Convert to Intel Hex file (-O ihex)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.converthex" value="true" valueType="boolean"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.1753120064" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/>
<builder buildPath="${workspace_loc:/BLE_MeshLightingLPN}/Debug" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.741542336" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.650853640" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler">
@@ -54,6 +54,7 @@
<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="../../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Src"/>
<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"/>
@@ -79,11 +80,9 @@
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script.1644942518" name="Linker Script (-T)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" value="${workspace_loc:/${ProjName}/STM32WB55RGVX_FLASH.ld}" valueType="string"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.libraries.745902598" name="Libraries (-l)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.libraries" valueType="libs">
<listOptionValue builtIn="false" value=":libBle_Mesh_CM4_GCC.a"/>
- <listOptionValue builtIn="false" value=":STM32CryptographicV3.1.3_CM4_GCC.a"/>
</option>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.directories.1301827721" name="Library search path (-L)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.directories" 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>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input.492959671" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input">
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
@@ -132,8 +131,8 @@
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.1917820365" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.softfp" valueType="enumerated"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.2053219768" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="genericBoard" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.551749859" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.3 || Release || false || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32 || STM32WB55RGVx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../../../../../../../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 || || || USE_HAL_DRIVER | STM32 | USE_STM32WBXX_NUCLEO | TRACE_ENABLE_NO_FUNCTION | SERVER | CORE_CM4 | ENABLE_USART | STM32WB55xx || || || || || ${workspace_loc:/${ProjName}/STM32WB55RGVX_FLASH.ld} || true || NonSecure || Size || || " valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.converthex.1632491656" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.converthex" value="true" valueType="boolean"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.convertbinary.93237358" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.convertbinary" value="false" valueType="boolean"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.converthex.1632491656" name="Convert to Intel Hex file (-O ihex)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.converthex" useByScannerDiscovery="false" value="true" valueType="boolean"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.convertbinary.93237358" name="Convert to binary file (-O binary)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.convertbinary" useByScannerDiscovery="false" value="false" valueType="boolean"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.1917451314" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/>
<builder buildPath="${workspace_loc:/BLE_MeshLightingLPN}/Release" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.1005567220" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.1291888201" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler">
@@ -142,7 +141,7 @@
</tool>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.1394323253" name="MCU GCC Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler">
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.74438747" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.value.g0" valueType="enumerated"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.262934276" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.value.os" valueType="enumerated"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.262934276" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.value.o3" valueType="enumerated"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols.904414974" name="Define symbols (-D)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols" useByScannerDiscovery="false" valueType="definedSymbols">
<listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
<listOptionValue builtIn="false" value="STM32"/>
@@ -184,11 +183,9 @@
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script.1025146365" name="Linker Script (-T)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" useByScannerDiscovery="false" value="${workspace_loc:/${ProjName}/STM32WB55RGVX_FLASH.ld}" valueType="string"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.libraries.624087010" name="Libraries (-l)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.libraries" 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 IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.directories.1593864089" name="Library search path (-L)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.directories" 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>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input.2011372275" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input">
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
@@ -227,4 +224,5 @@
</scannerConfigBuildInfo>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
+ <storageModule moduleId="refreshScope"/>
</cproject>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32CubeIDE/.project b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32CubeIDE/.project
index 3b1df7377..0cdca0a8b 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32CubeIDE/.project
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32CubeIDE/.project
@@ -232,6 +232,11 @@
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/app/appli_sensor.c</locationURI>
</link>
<link>
+ <name>Application/STM32_WPAN/app/appli_sensors_client.c</name>
+ <type>1</type>
+ <locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/app/appli_sensors_client.c</locationURI>
+ </link>
+ <link>
<name>Application/STM32_WPAN/app/appli_vendor.c</name>
<type>1</type>
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/app/appli_vendor.c</locationURI>
@@ -332,6 +337,11 @@
<locationURI>$%7BPARENT-6-PROJECT_LOC%7D/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors.c</locationURI>
</link>
<link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/sensors_client.c</name>
+ <type>1</type>
+ <locationURI>$%7BPARENT-6-PROJECT_LOC%7D/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors_client.c</locationURI>
+ </link>
+ <link>
<name>Middlewares/STM32_WPAN/ble/blesvc/svc_ctl.c</name>
<type>1</type>
<locationURI>$%7BPARENT-6-PROJECT_LOC%7D/Middlewares/ST/STM32_WPAN/ble/svc/Src/svc_ctl.c</locationURI>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/app_ble.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/app_ble.c
index 2550466f7..5c7a8f6d9 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/app_ble.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/app_ble.c
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
@@ -35,7 +36,7 @@
#include "types.h"
#include "ble_mesh.h"
-#include "appli_mesh.h"
+//#include "appli_mesh.h"
#include "mesh_cfg.h"
/* Private includes ----------------------------------------------------------*/
@@ -296,7 +297,10 @@ void APP_BLE_Init( void )
/**
* Starts the BLE Stack on CPU2
*/
- SHCI_C2_BLE_Init( &ble_init_cmd_packet );
+ if (SHCI_C2_BLE_Init( &ble_init_cmd_packet ) != SHCI_Success)
+ {
+ Error_Handler();
+ }
/**
* Initialization of HCI & GATT & GAP layer
@@ -329,6 +333,7 @@ void APP_BLE_Init( void )
SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
{
+/* callback of mesh Library to receive all GAP/GATT events*/
HCI_Event_CB(pckt);
#if (LOW_POWER_FEATURE == 1)
@@ -480,11 +485,11 @@ static void Ble_Hci_Gap_Gatt_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;
@@ -492,13 +497,13 @@ static void Ble_Hci_Gap_Gatt_Init(void){
aci_gap_set_authentication_requirement(BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode,
BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode,
- 0,
- 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
);
/**
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/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 578a6f4bf..3b7fce7a2 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_config_client.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_config_client.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
@@ -24,6 +24,7 @@
#include "appli_generic.h"
#include "appli_light.h"
#include "common.h"
+#include "mesh_cfg.h"
#include "mesh_cfg_usr.h"
#include "appli_nvm.h"
#include "config_client.h"
@@ -58,6 +59,10 @@
#define NUM_VENDOR_MODELS_TO_PUBLISH 0
#define NUM_VENDOR_MODELS_TO_BIND_APP 0
+/******************************************************************************/
+#if defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER)
+/******************************************************************************/
+
const MOBLEUINT8 aConfigAppKeyDefault[19]=
{ /* NetKeyIndexAndAppKeyIndex : 3B
Index of the NetKey and index of the AppKey*/
@@ -88,51 +93,6 @@ 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,
@@ -618,7 +578,7 @@ const MODEL_CONFIG_CLIENT_OpcodeTableParam_t ConfigClient_MessageOpcodes_Table[]
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
+ /* { OPCODE_HEALTH_PERIOD_STATUS 0x8037 */
@@ -732,6 +692,8 @@ 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 ---------------------------------------------------------*/
/**
@@ -1478,10 +1440,10 @@ MOBLE_RESULT AppliConfigClient_SelfPublicationSetDefault (void)
MOBLEUINT8 elementIndex;
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
- for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ for (elementIndex=0; elementIndex < APPLICATION_NUMBER_OF_ELEMENTS; elementIndex++ )
{
/*Checking for SIG Models*/
- for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
+ for (MOBLEUINT8 index=0; index < APPLICATION_SIG_MODELS_MAX_COUNT; index++)
{
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1492,6 +1454,14 @@ MOBLE_RESULT AppliConfigClient_SelfPublicationSetDefault (void)
{
break;
}
+ else if (MODEL_IS_FOUNDATION_MODEL(modelIdentifier))
+ {
+ /* If Model is Foundation Model, then it doesnt need to be
+ added for Publishing */
+
+ /* Do NOTHING, let the next Model be picked */
+ }
+
else
{
ConfigClient_PublicationSet(elementAddress,
@@ -1507,7 +1477,7 @@ MOBLE_RESULT AppliConfigClient_SelfPublicationSetDefault (void)
}
/*Checking for VENDOR Models*/
- for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
+ for (MOBLEUINT8 index=0; index < APPLICATION_VENDOR_MODELS_MAX_COUNT; index++)
{
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1551,10 +1521,10 @@ MOBLE_RESULT AppliConfigClient_SelfSubscriptionSetDefault (void)
MOBLEUINT16 address = DEFAULT_GROUP_ADDR;
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
- for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ for (elementIndex=0; elementIndex < APPLICATION_NUMBER_OF_ELEMENTS; elementIndex++ )
{
/*Checking for SIG Models*/
- for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
+ for (MOBLEUINT8 index=0; index < APPLICATION_SIG_MODELS_MAX_COUNT; index++)
{
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1566,6 +1536,13 @@ MOBLE_RESULT AppliConfigClient_SelfSubscriptionSetDefault (void)
{
break;
}
+ else if (MODEL_IS_FOUNDATION_MODEL(modelIdentifier))
+ {
+ /* If Model is Foundation Model, then it doesnt need to be
+ Subscribed */
+
+ /* Do NOTHING, let the next Model be picked */
+ }
else
{
ConfigClient_SubscriptionAdd (elementAddress, address, modelIdentifier);
@@ -1573,7 +1550,7 @@ MOBLE_RESULT AppliConfigClient_SelfSubscriptionSetDefault (void)
}
/*Checking for Vendor Models*/
- for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
+ for (MOBLEUINT8 index=0; index < APPLICATION_VENDOR_MODELS_MAX_COUNT; index++)
{
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1610,10 +1587,10 @@ MOBLE_RESULT Appli_ConfigClient_SelfDefaultAppKeyBind (void)
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
appKeyIndex = DEFAULT_APPKEY_INDEX;
- for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ for (elementIndex=0; elementIndex < APPLICATION_NUMBER_OF_ELEMENTS; elementIndex++ )
{
/*Checking for SIG Models*/
- for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
+ for (MOBLEUINT8 index=0; index < APPLICATION_SIG_MODELS_MAX_COUNT; index++)
{
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1624,6 +1601,13 @@ MOBLE_RESULT Appli_ConfigClient_SelfDefaultAppKeyBind (void)
{
break;
}
+ else if (MODEL_IS_FOUNDATION_MODEL(modelIdentifier))
+ {
+ /* If Model is Foundation Model, then it doesnt need to be binded
+ with AppKey */
+
+ /* Do NOTHING, let the next Model be picked */
+ }
else
{
ConfigClient_ModelAppBind (elementAddress, appKeyIndex, modelIdentifier);
@@ -1631,7 +1615,7 @@ MOBLE_RESULT Appli_ConfigClient_SelfDefaultAppKeyBind (void)
}
/*Checking for VENDOR Models*/
- for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
+ for (MOBLEUINT8 index=0; index < APPLICATION_VENDOR_MODELS_MAX_COUNT; index++)
{
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1741,7 +1725,6 @@ MOBLEUINT16 GetSIGModelToBindApp(MOBLEUINT8 elementIndex,
MOBLEUINT8 numberOfModels)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
MOBLEUINT16 model_id;
MOBLEUINT8 index;
MOBLEUINT8 idxSIG = *pModelIndex;
@@ -1762,9 +1745,7 @@ MOBLEUINT16 GetSIGModelToBindApp(MOBLEUINT8 elementIndex,
*pModelIndex = index;
return model_id;
-#else
- return aSigModelsToBind[idxSIG][elementIdx] ;
-#endif
+
}
@@ -1777,11 +1758,7 @@ MOBLEUINT16 GetSIGModelToBindApp(MOBLEUINT8 elementIndex,
*/
MOBLEUINT32 GetVendorModelToBindApp(MOBLEUINT8 elementIndex, MOBLEUINT8 indexModels)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].aVendorModels[indexModels];
-#else
- return VENDORMODEL_STMICRO_ID1 ;
-#endif
}
/**
@@ -1792,11 +1769,7 @@ MOBLEUINT32 GetVendorModelToBindApp(MOBLEUINT8 elementIndex, MOBLEUINT8 indexMod
*/
MOBLEUINT8 GetCountSIGModelToBindApp(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumSIGmodels;
-#else
- return sizeof(aSigModelsToBind)/sizeof(MOBLEUINT16);
-#endif
}
@@ -1807,11 +1780,7 @@ MOBLEUINT8 GetCountSIGModelToBindApp(MOBLEUINT8 elementIndex)
*/
MOBLEUINT8 GetCountVendorModelToBindApp(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumVendorModels;
-#else
- return NUM_VENDOR_MODELS_TO_BIND_APP;
-#endif
}
@@ -1827,13 +1796,9 @@ MOBLEUINT16 GetSIGModelToPublish(MOBLEUINT8 elementIndex,
MOBLEUINT8 numberOfModels)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return GetSIGModelToBindApp(elementIndex,
pModelIndex,
numberOfModels);
-#else
- return aPublishModels[idxSIG] ;
-#endif
}
@@ -1845,11 +1810,7 @@ MOBLEUINT16 GetSIGModelToPublish(MOBLEUINT8 elementIndex,
*/
MOBLEUINT32 GetVendorModelToPublish(MOBLEUINT8 elementIndex, MOBLEUINT8 idxSIG)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].aVendorModels[idxSIG];
-#else
- return VENDORMODEL_STMICRO_ID1 ;
-#endif
}
@@ -1860,11 +1821,7 @@ MOBLEUINT32 GetVendorModelToPublish(MOBLEUINT8 elementIndex, MOBLEUINT8 idxSIG)
*/
MOBLEUINT8 GetCountSIGModelToPublish(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumSIGmodels;
-#else
- return sizeof(aPublishModels)/sizeof(MOBLEUINT16);
-#endif
}
@@ -1875,11 +1832,7 @@ MOBLEUINT8 GetCountSIGModelToPublish(MOBLEUINT8 elementIndex)
*/
MOBLEUINT8 GetCountVendorModelToPublish(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumVendorModels;
-#else
- return NUM_VENDOR_MODELS_TO_PUBLISH;
-#endif
}
@@ -1894,13 +1847,9 @@ MOBLEUINT16 GetSIGModelToSubscribe(MOBLEUINT8 elementIndex,
MOBLEUINT8 *pModelIndex,
MOBLEUINT8 numberOfModels)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return GetSIGModelToBindApp(elementIndex,
pModelIndex,
numberOfModels);
-#else
- return aSubscribeModels[idxSIG] ;
-#endif
}
@@ -1914,11 +1863,7 @@ MOBLEUINT16 GetSIGModelToSubscribe(MOBLEUINT8 elementIndex,
MOBLEUINT32 GetVendorModelToSubscribe(MOBLEUINT8 elementIndex,
MOBLEUINT8 idxSIG)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].aVendorModels[idxSIG];
-#else
- return VENDORMODEL_STMICRO_ID1 ;
-#endif
}
@@ -1929,11 +1874,7 @@ MOBLEUINT32 GetVendorModelToSubscribe(MOBLEUINT8 elementIndex,
*/
MOBLEUINT8 GetCountSIGModelToSubscribe(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumSIGmodels;
-#else
- return sizeof(aSubscribeModels)/sizeof(MOBLEUINT16);
-#endif
}
@@ -1945,11 +1886,7 @@ MOBLEUINT8 GetCountSIGModelToSubscribe(MOBLEUINT8 elementIndex)
*/
MOBLEUINT8 GetCountVendorModelToSubscribe(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumVendorModels;
-#else
- return NUM_VENDOR_MODELS_TO_SUBSCRIBE;
-#endif
}
@@ -1965,6 +1902,9 @@ MOBLEUINT8 AppliConfigClient_SendMessageDefault(MOBLEUINT8 elementIdx)
return NUM_VENDOR_MODELS_TO_SUBSCRIBE;
}
+/******************************************************************************/
+#endif /* defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER) */
+/******************************************************************************/
/**
* @}
@@ -1974,5 +1914,5 @@ MOBLEUINT8 AppliConfigClient_SendMessageDefault(MOBLEUINT8 elementIdx)
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/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 34169448c..b380cf636 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_config_client.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_config_client.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
@@ -26,7 +26,7 @@
#include "generic.h"
#include "mesh_cfg.h"
#include "config_client.h"
-
+#include "mesh_cfg_usr.h"
/* Exported macro ------------------------------------------------------------*/
#define MAX_CONFIG_PARAM_SIZE 22
@@ -35,6 +35,9 @@
/* Exported variables ------------------------------------------------------- */
/* Application Variable-------------------------------------------------------*/
/* Exported Functions Prototypes ---------------------------------------------*/
+
+#if defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER)
+
MOBLE_RESULT Appli_ConfigClient_Init(void);
MOBLE_RESULT Appli_ConfigClient_Process(void);
MOBLE_RESULT Appli_ConfigClient_ConfigureNode(void);
@@ -82,8 +85,9 @@ MOBLEUINT8 GetCountSIGModelToPublish(MOBLEUINT8 elementIdx);
MOBLEUINT8 GetCountVendorModelToPublish(MOBLEUINT8 elementIdx);
+#endif /*defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER) */
#endif /* __APPLI_CONFIG_CLIENT_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic.c
index 0ecaea465..c5d21b225 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic.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
@@ -50,16 +50,21 @@ 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;
+
+Appli_Generic_OnOffSet AppliOnOffSet[APPLICATION_NUMBER_OF_ELEMENTS];
+Appli_Generic_LevelSet AppliLevelSet[APPLICATION_NUMBER_OF_ELEMENTS];
+Appli_Generic_PowerOnOffSet AppliPowerOnSet[APPLICATION_NUMBER_OF_ELEMENTS];
+Appli_Generic_DefaultTransitionSet AppliDefaultTransitionSet[APPLICATION_NUMBER_OF_ELEMENTS];
/* 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);
+MOBLE_RESULT Appli_Generic_LevelDelta_Set(Generic_LevelStatus_t* pdeltalevelParam,
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_LevelMove_Set(Generic_LevelStatus_t* pdeltaMoveParam,
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
/* Private functions ---------------------------------------------------------*/
/******************************************************************************/
@@ -71,43 +76,57 @@ MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t* pdeltalevelParam,
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t* pGeneric_OnOffParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- AppliOnOffSet.Present_OnOff = pGeneric_OnOffParam->Present_OnOff_State;
- AppliOnOffSet.Present_OnOffValue = pGeneric_OnOffParam->Present_OnOff_Value;
-
+ /*User need to modify the parameters as per the number of elements per node*/
+ AppliOnOffSet[elementIndex].Present_OnOff = pGeneric_OnOffParam->Present_OnOff_State;
+ AppliOnOffSet[elementIndex].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.
- */
+ /* 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;
+ Appli_LightPwmValue.IntensityValue = AppliOnOffSet[elementIndex].Present_OnOffValue;
Light_UpdateLedValue(LOAD_STATE ,Appli_LightPwmValue);
- if(AppliOnOffSet.Present_OnOff == APPLI_LED_ON)
+
+ #if 0 /* EME */
+ if(AppliOnOffSet[elementIndex].Present_OnOff == APPLI_LED_ON)
{
- AppliOnOffSet.TargetValue = PWM_TIME_PERIOD;
+ AppliOnOffSet[elementIndex].TargetValue = PWM_TIME_PERIOD;
}
else
{
- AppliOnOffSet.TargetValue = APPLI_LED_OFF;
+ AppliOnOffSet[elementIndex].TargetValue = APPLI_LED_OFF;
}
+ #else
+ AppliOnOffSet[elementIndex].TargetValue = pGeneric_OnOffParam->Target_OnOff;
+ #endif /* EME */
- if(AppliOnOffSet.Present_OnOffValue > 16000)
- {
- BSP_LED_On(LED_BLUE);
- }
- else
+ if(AppliOnOffSet[elementIndex].Present_OnOffValue == AppliOnOffSet[elementIndex].TargetValue)
{
- BSP_LED_Off(LED_BLUE);
+ if(AppliOnOffSet[elementIndex].Present_OnOffValue > 0)
+ {
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+ }
}
}
else
{
- if((AppliOnOffSet.Present_OnOff == APPLI_LED_ON) && (OptionalValid == NO_TRANSITION))
+ if((AppliOnOffSet[elementIndex].Present_OnOff == APPLI_LED_ON) && (OptionalValid == NO_TRANSITION))
{
Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
@@ -120,18 +139,15 @@ MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t* pGeneric_OnOffParam,
BSP_LED_Off(LED_BLUE);
}
}
+
+ TRACE_M(TF_GENERIC,"Generic_OnOff_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8202%02hx!\n\r",AppliOnOffSet[elementIndex].Present_OnOff);
- TRACE_M(TF_SERIAL_CTRL,"#8202%02hx!\n\r",AppliOnOffSet.Present_OnOff);
+ NvmStatePowerFlag_Set(GENERIC_ON_OFF_NVM_FLAG, elementIndex);
- /* set the flag value for NVM store */
- RestoreFlag = GENERIC_ON_OFF_NVM_FLAG;
-
- AppliNvm_SaveMessageParam();
-
return MOBLE_RESULT_SUCCESS;
}
-
/******************************************************************************/
#endif /* #ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF */
/******************************************************************************/
@@ -142,15 +158,20 @@ MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t* pGeneric_OnOffParam,
* when Generic OnOff message is received
* @param pOnOff_status: Pointer to the parameters received for message
* @param plength: length of the data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUINT32 plength)
+MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
MOBLEUINT8 i;
- TRACE_M(TF_GENERIC,"Appli_Generic_OnOff_Status callback received \r\n");
+ TRACE_M(TF_GENERIC,"Generic_OnOff_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8204!\r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8204! \n\r");
for(i = 0; i < plength; i++)
{
if(i == 0)
@@ -164,6 +185,7 @@ MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUI
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_GENERIC_MODEL_SERVER_LEVEL
/******************************************************************************/
@@ -173,21 +195,26 @@ MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUI
* when Generic Level message is received
* @param plevelParam: Pointer to the parameters message
* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t* plevelParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid,MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
MOBLEUINT16 duty;
static MOBLEUINT16 previousIntensity = 0;
- AppliLevelSet.Present_Level16= plevelParam->Present_Level16;
- if(AppliLevelSet.Present_Level16 <= 0)
+ AppliLevelSet[elementIndex].Present_Level16= plevelParam->Present_Level16;
+ if(AppliLevelSet[elementIndex].Present_Level16 <= 0)
{
- AppliLevelSet.Present_Level16 = 0;
+ AppliLevelSet[elementIndex].Present_Level16 = 0;
}
- IntensityValue = AppliLevelSet.Present_Level16;
+ IntensityValue = AppliLevelSet[elementIndex].Present_Level16;
if(((IntensityValue > previousIntensity) && (IntensityValue <PWM_TIME_PERIOD)) ||
IntensityValue == INTENSITY_LEVEL_ZERO)
@@ -200,49 +227,42 @@ MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t* plevelParam,
}
previousIntensity = IntensityValue;
- if(AppliLevelSet.Present_Level16 < 0x00)
+ if(AppliLevelSet[elementIndex].Present_Level16 < 0x00)
{
- AppliLevelSet.Present_Level16 = 0;
+ AppliLevelSet[elementIndex].Present_Level16 = 0;
}
- duty = PwmValueMapping(AppliLevelSet.Present_Level16 , 0x7FFF ,0x0000);
+ duty = PwmValueMapping(AppliLevelSet[elementIndex].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);
- }
+ TRACE_M(TF_GENERIC,"Generic_Level_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8206!\r\n");
+ NvmStatePowerFlag_Set(GENERIC_LEVEL_NVM_FLAG, elementIndex);
+
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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t* pdeltalevelParam,
- MOBLEUINT8 OptionalValid)
+MOBLE_RESULT Appli_Generic_LevelDelta_Set(Generic_LevelStatus_t* pdeltalevelParam,
+ MOBLEUINT8 OptionalValid,MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-
- AppliLevelSet.Present_Level16 = pdeltalevelParam->Present_Level16;
+ AppliLevelSet[elementIndex].Present_Level16 = pdeltalevelParam->Present_Level16;
/* For demo, if Level is more than 50, switch ON the LED */
- if (AppliLevelSet.Present_Level16 >= 50)
+ if (AppliLevelSet[elementIndex].Present_Level16 >= 50)
{
Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
@@ -253,32 +273,43 @@ MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t* pdeltalevelParam,
Light_UpdateLedValue(RESET_STATE , Appli_LightPwmValue);
BSP_LED_Off(LED_BLUE);
}
- TRACE_M(TF_SERIAL_CTRL,"#8206!\n\r");
+
+ TRACE_M(TF_GENERIC,"Generic_LevelDelta_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8209!\r\n");
+
return MOBLE_RESULT_SUCCESS;
}
/**
-* @brief Appli_Generic_Move_Set: This function is callback for Application
+* @brief Appli_Generic_LevelMove_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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
- MOBLEUINT8 OptionalValid)
+MOBLE_RESULT Appli_Generic_LevelMove_Set(Generic_LevelStatus_t* pdeltaMoveParam,
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- AppliLevelSet.Last_delta_level = pdeltaMoveParam->Last_delta_level;
- AppliLevelSet.Last_Level_TID = pdeltaMoveParam->Last_Level_TID;
- AppliLevelSet.Last_Present_Level16 = pdeltaMoveParam->Last_Present_Level16;
- AppliLevelSet.Present_Level16 = pdeltaMoveParam->Present_Level16;
- AppliLevelSet.RemainingTime = pdeltaMoveParam->RemainingTime;
- AppliLevelSet.Target_Level16 = pdeltaMoveParam->Target_Level16;
+// if(OptionalValid == 1)
+// {
+ AppliLevelSet[elementIndex].Last_delta_level = pdeltaMoveParam->Last_delta_level;
+ AppliLevelSet[elementIndex].Last_Level_TID = pdeltaMoveParam->Last_Level_TID;
+ AppliLevelSet[elementIndex].Last_Present_Level16 = pdeltaMoveParam->Last_Present_Level16;
+ AppliLevelSet[elementIndex].Present_Level16 = pdeltaMoveParam->Present_Level16;
+ AppliLevelSet[elementIndex].RemainingTime = pdeltaMoveParam->RemainingTime;
+ AppliLevelSet[elementIndex].Target_Level16 = pdeltaMoveParam->Target_Level16;
+// }
- TRACE_M(TF_SERIAL_CTRL,"#8206!\n\r");
-
- return MOBLE_RESULT_SUCCESS;
+ TRACE_M(TF_GENERIC,"Generic_LevelMove_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#820B! \r\n");
+ return MOBLE_RESULT_SUCCESS;
}
@@ -291,39 +322,45 @@ MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
* when Generic Level Move message is received
* @param plevel_status: Pointer to the parameters message
* @param plength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Generic_Level_Status(MOBLEUINT8 const *plevel_status,
- MOBLEUINT32 plength)
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT8 i;
MOBLEUINT8 level = 0;
-#endif
-
- TRACE_M(TF_GENERIC,"Generic_Level_Status callback received \r\n");
+#endif
- TRACE_M(TF_SERIAL_CTRL,"#8208! \n\r");
+ TRACE_M(TF_GENERIC,"Generic_Level_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8208! \r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < plength; i++)
{
if((i == 0) || (i == 2))
level = plevel_status[i];
else if(i == 1)
- TRACE_M(TF_GENERIC,"Present Level value: %d\n\r",
+ TRACE_M(TF_SERIAL_CTRL,"Present Level value: %d\n\r",
(plevel_status[i]<<8)|level);
else if(i == 3)
- TRACE_M(TF_GENERIC,"Target Level value: %d\n\r",
+ TRACE_M(TF_SERIAL_CTRL,"Target Level value: %d\n\r",
(plevel_status[i]<<8)|level);
else if(i == 4)
- TRACE_M(TF_GENERIC,"Remaining Time value: %d\n\r", plevel_status[i]);
+ TRACE_M(TF_SERIAL_CTRL,"Remaining Time value: %d\n\r", plevel_status[i]);
}
-#endif
+#endif
+
return MOBLE_RESULT_SUCCESS;
}
-
+
/******************************************************************************/
#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF
/******************************************************************************/
@@ -333,17 +370,26 @@ MOBLE_RESULT Appli_Generic_Level_Status(MOBLEUINT8 const *plevel_status,
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Generic_PowerOnOff_Set(Generic_PowerOnOffParam_t* pPowerOnOffParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- AppliPowerOnSet.PowerOnState = pPowerOnOffParam->PowerOnOffState;
-
- TRACE_M(TF_SERIAL_CTRL,"#8213!\n\r");
+ AppliPowerOnSet[elementIndex].PowerOnState = pPowerOnOffParam->PowerOnOffState;
+
+ TRACE_M(TF_GENERIC,"Generic_PowerOnOff_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8213!\r\n");
- /* set the flag value for NVM store */
- //RestoreFlag = GENERIC_ON_OFF_NVM_FLAG;
+ if(AppliPowerOnSet[elementIndex].PowerOnState == GENERIC_POWER_ON_STATE)
+ {
+ /* set the flag value for NVM store */
+ RestoreFlag = GENERIC_ON_OFF_NVM_FLAG;
+ }
AppliNvm_SaveMessageParam();
@@ -359,17 +405,20 @@ MOBLE_RESULT Appli_Generic_PowerOnOff_Set(Generic_PowerOnOffParam_t* pPowerOnOff
* when Generic Power on off set message is received
* @param powerOnOff_status: Pointer to the parameters message
* @param plength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status ,
- MOBLEUINT32 plength)
+MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status,\
+ MOBLEUINT32 plength, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
MOBLEUINT8 i;
- TRACE_M(TF_GENERIC,"Generic_PowerOnOff_Status callback received \r\n");
+ TRACE_M(TF_GENERIC,"Generic_PowerOnOff_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8212!\r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8212! \n\r");
-
for(i = 0; i < plength; i++)
{
if(i == 0)
@@ -390,37 +439,43 @@ MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Set(Generic_DefaultTransitionParam_t* pDefaultTimeParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- AppliDefaultTransitionSet.DefaultTransitionTime = pDefaultTimeParam->DefaultTransitionTime;
+ AppliDefaultTransitionSet[elementIndex].DefaultTransitionTime = pDefaultTimeParam->DefaultTransitionTime;
+ TRACE_M(TF_GENERIC,"Generic_DefaultTransitionTime_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#820E!\r\n");
return MOBLE_RESULT_SUCCESS;
}
-
/******************************************************************************/
#endif /* ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME */
/******************************************************************************/
-
/**
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status ,
- MOBLEUINT32 plength)
+MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status , MOBLEUINT32 plength,MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_GENERIC,"Generic_DefaultTransitionTime_Status callback received \r\n");
-
- TRACE_M(TF_SERIAL_CTRL,"#8210! \n\r");
+ TRACE_M(TF_GENERIC,"Generic_DefaultTransitionTime_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8210!\r\n");
return MOBLE_RESULT_SUCCESS;
}
@@ -431,83 +486,99 @@ MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTrans
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_GetOnOffStatus(MOBLEUINT8* pOnOff_Status)
+MOBLE_RESULT Appli_Generic_GetOnOffStatus(MOBLEUINT8* pOnOff_Status,MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- *pOnOff_Status = AppliOnOffSet.Present_OnOff;
- TRACE_M(TF_SERIAL_CTRL,"Generic Get OnOff Status: Status %d!\n\r",
- AppliOnOffSet.Present_OnOff);
-
+ *pOnOff_Status = AppliOnOffSet[elementIndex].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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_GetOnOffValue(MOBLEUINT8* pOnOff_Value)
+MOBLE_RESULT Appli_Generic_GetOnOffValue(MOBLEUINT8* pOnOff_Value, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- *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);
+ *pOnOff_Value = AppliOnOffSet[elementIndex].Present_OnOffValue;
+ *(pOnOff_Value+1) = AppliOnOffSet[elementIndex].Present_OnOffValue >> 8;
+ *(pOnOff_Value+2) = AppliOnOffSet[elementIndex].TargetValue;
+ *(pOnOff_Value+3) = AppliOnOffSet[elementIndex].TargetValue >> 8;
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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_GetLevelStatus(MOBLEUINT8* pLevel_Status)
+MOBLE_RESULT Appli_Generic_GetLevelStatus(MOBLEUINT8* pLevel_Status, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- *pLevel_Status = AppliLevelSet.Present_Level16;
- *(pLevel_Status+1) = AppliLevelSet.Present_Level16 >> 8;
- *(pLevel_Status+2) = AppliLevelSet.Target_Level16;
- *(pLevel_Status+3) = AppliLevelSet.Target_Level16 >> 8;
-// TRACE_M(TF_SERIAL_CTRL,"Generic Get Level Status: Value %d!\n\r",
-// *pLevel_Status);
+ *pLevel_Status = AppliLevelSet[elementIndex].Present_Level16;
+ *(pLevel_Status+1) = AppliLevelSet[elementIndex].Present_Level16 >> 8;
+ *(pLevel_Status+2) = AppliLevelSet[elementIndex].Target_Level16;
+ *(pLevel_Status+3) = AppliLevelSet[elementIndex].Target_Level16 >> 8;
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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_GetPowerOnOffStatus(MOBLEUINT8* pPower_Status)
+MOBLE_RESULT Appli_Generic_GetPowerOnOffStatus(MOBLEUINT8* pPower_Status, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- *pPower_Status = AppliPowerOnSet.PowerOnState;
- TRACE_M(TF_SERIAL_CTRL,"Generic Get OnOff Status: Status %d!\n\r",
- AppliPowerOnSet.PowerOnState);
+
+ *pPower_Status = AppliPowerOnSet[elementIndex].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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_Status)
+MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_Status,MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- *pTransition_Status = AppliDefaultTransitionSet.DefaultTransitionTime;
- TRACE_M(TF_SERIAL_CTRL,"Get Default Transition Status: Status %d!\n\r",
- AppliDefaultTransitionSet.DefaultTransitionTime);
+
+ *pTransition_Status = AppliDefaultTransitionSet[elementIndex].DefaultTransitionTime;
return MOBLE_RESULT_SUCCESS;
}
+
/**
* @}
*/
@@ -516,5 +587,5 @@ MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_St
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic.h
index 992baad9b..370769608 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic.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
@@ -86,35 +86,72 @@ typedef struct
/* Exported Functions Prototypes ---------------------------------------------*/
-MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t*, MOBLEUINT8);
+MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t*,
+ MOBLEUINT8,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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 );
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t*,
+ MOBLEUINT8,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t*,
+ MOBLEUINT8,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
- MOBLEUINT8 OptionalValid);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_Level_Status(MOBLEUINT8 const *plevel_status,
- MOBLEUINT32 plength);
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_PowerOnOff_Set(Generic_PowerOnOffParam_t* pPowerOnOffParam,
- MOBLEUINT8 OptionalValid);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status ,
- MOBLEUINT32 plength);
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Set(Generic_DefaultTransitionParam_t* pDefaultTimeParam,
- MOBLEUINT8 OptionalValid);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status ,
- MOBLEUINT32 plength);
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
-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_GetOnOffStatus(MOBLEUINT8* pOnOff_Status,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_GetOnOffValue(MOBLEUINT8* pOnOff_Value,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_GetLevelStatus(MOBLEUINT8* pLevel_Status,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_GetPowerOnOffStatus(MOBLEUINT8* pLevel_Status,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Generic_Restore_PowerOn_Value(MOBLEUINT8 restoreValue,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_Status,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status,
- MOBLEUINT32 plength);
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
#endif /* __APPLI_GENERIC_H */
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/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 aecd5575e..317071a1c 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic_client.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic_client.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
@@ -41,58 +41,166 @@
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
-
-MOBLEUINT8 Led_Value;
/* Private function prototypes -----------------------------------------------*/
-MOBLE_RESULT Appli_GenericClient_OnOff_Set(void);
-/* Private functions ---------------------------------------------------------*/
+
+/* Private functions ---------------------------------------------------------*/
/**
-* @brief Appli_Generic_OnOff_Set: This function is callback for Application
-* when Generic OnOff message is called
-* @param void
+* @brief Appli_GenericClient_API: This function is a Wrapper to call Generic Client API depending on opcode received in input
+* @param elementIndex: Index of the element
+* @param msg_opcode: opcode of the desired API
+* @param msg_params: buffer containing the desired API parameters
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_GenericClient_OnOff_Set(void)
+MOBLE_RESULT Appli_GenericClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8 *msg_params)
{
- 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;
-}
-
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+ switch(msg_opcode){
/******************************************************************************/
-#ifdef ENABLE_GENERIC_MODEL_CLIENT_LEVEL
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_ONOFF
/******************************************************************************/
-
-/**
-* @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));
+ case GENERIC_ON_OFF_GET:
+ {
+ result = GenericClient_OnOff_Get(elementIndex);
+ break;
+ }
+ case GENERIC_ON_OFF_SET_ACK:
+ {
+ result = GenericClient_OnOff_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_OnOffParam_t) );
+ break;
+ }
+ case GENERIC_ON_OFF_SET_UNACK:
+ {
+ result = GenericClient_OnOff_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_OnOffParam_t) );
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_GENERIC_MODEL_CLIENT_ONOFF */
+/******************************************************************************/
- return MOBLE_RESULT_SUCCESS;
-}
+/******************************************************************************/
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_LEVEL
+/******************************************************************************/
+ case GENERIC_LEVEL_GET:
+ {
+ result = GenericClient_Level_Get(elementIndex);
+ break;
+ }
+ case GENERIC_LEVEL_SET_ACK:
+ {
+ result = GenericClient_Level_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_LevelParam_t));
+ break;
+ }
+ case GENERIC_LEVEL_SET_UNACK:
+ {
+ result = GenericClient_Level_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_LevelParam_t));
+ break;
+ }
+ case GENERIC_DELTA_SET:
+ {
+
+ result = GenericClient_Delta_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_DeltaLevelParam_t));
+ break;
+ }
+ case GENERIC_DELTA_SET_UNACK:
+ {
+ result = GenericClient_Delta_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_DeltaLevelParam_t));
+ break;
+ }
+ case GENERIC_MOVE_SET:
+ {
+ result = GenericClient_Move_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_LevelMoveParam_t));
+ break;
+ }
+ case GENERIC_MOVE_SET_UNACK:
+ {
+ result = GenericClient_Move_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_LevelMoveParam_t));
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_GENERIC_MODEL_CLIENT_LEVEL */
+/******************************************************************************/
/******************************************************************************/
-#endif /* #ifdef ENABLE_GENERIC_MODEL_CLIENT_LEVEL */
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_POWER_ONOFF
/******************************************************************************/
+ case GENERIC_POWER_ON_OFF_GET:
+ {
+ GenericClient_PowerOnOff_Get(elementIndex);
+ break;
+ }
+ case GENERIC_POWER_ON_OFF_SET:
+ {
+ result = GenericClient_PowerOnOff_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_PowerOnOffParam_t));
+ break;
+ }
+ case GENERIC_POWER_ON_OFF_SET_UNACK:
+ {
+ result = GenericClient_PowerOnOff_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_PowerOnOffParam_t));
+ break;
+ }
+
+/******************************************************************************/
+#endif /* #ifdef ENABLE_GENERIC_MODEL_CLIENT_POWER_ONOFF */
+/******************************************************************************/
+
+/******************************************************************************/
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_DEFAULT_TRANSITION_TIME
+/******************************************************************************/
+ case GENERIC_DEFAULT_TRANSITION_TIME_GET:
+ {
+ result = GenericClient_DefaultTransitionTime_Get(elementIndex);
+ break;
+ }
+
+ case GENERIC_DEFAULT_TRANSITION_TIME_SET:
+ {
+ result = GenericClient_DefaultTransitionTime_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_DefaultTransitionParam_t));
+ break;
+ }
+
+ case GENERIC_DEFAULT_TRANSITION_TIME_SET_UNACK:
+ {
+ result = GenericClient_DefaultTransitionTime_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_DefaultTransitionParam_t));
+ break;
+ }
+
+/******************************************************************************/
+#endif /* #ifdef ENABLE_GENERIC_MODEL_CLIENT_DEFAULT_TRANSITION_TIME */
+/******************************************************************************/
+
+ default:
+ {
+ TRACE_M(TF_GENERIC, "OpCode value invalid %d \r\n", msg_opcode);
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+ return result;
+}
/**
* @}
@@ -102,5 +210,5 @@ MOBLE_RESULT Appli_GenericClient_Level_Set_Unack(void)
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/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 742fd1e68..c56fd5a9e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic_client.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_generic_client.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
@@ -32,12 +32,12 @@
/* 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);
+MOBLE_RESULT Appli_GenericClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8 *msg_params);
+
#endif /* __APPLI_GENERIC_CLIENT_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light.c
index 318929ffc..19face0da 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light.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
@@ -41,7 +41,9 @@
* @{
*/
-MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState);
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
@@ -55,9 +57,8 @@ 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;
+Appli_Light_lightnessSet ApplilightnessSet[APPLICATION_NUMBER_OF_ELEMENTS] = {{1,0,0,0,0,0}};
+Appli_Light_lightnessLinearSet ApplilightnessLinearSet[APPLICATION_NUMBER_OF_ELEMENTS];
/******************************************************************************/
#endif /* #ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS */
@@ -70,10 +71,9 @@ 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;
+ Appli_Light_CtlSet AppliCtlSet[APPLICATION_NUMBER_OF_ELEMENTS];
+ Appli_Light_CtlTemperatureRangeSet AppliCtlTemperatureRangeSet[APPLICATION_NUMBER_OF_ELEMENTS];
+ Appli_Light_CtlDefaultSet AppliCtlDefaultSet[APPLICATION_NUMBER_OF_ELEMENTS];
/******************************************************************************/
#endif /* #ifdef ENABLE_LIGHT_MODEL_SERVER_CTL */
@@ -83,14 +83,11 @@ Appli_Light_CtlDefaultSet AppliCtlDefaultSet;
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;
+ Appli_Light_HslSet AppliHslSet[APPLICATION_NUMBER_OF_ELEMENTS];
+ Appli_Light_HslDefaultSet Appli_HslDefaultSet[APPLICATION_NUMBER_OF_ELEMENTS] = {{0x7FFF,0x7FFF,0x7FFF}};
+ Appli_Light_RGBSet Appli_RGBParam[APPLICATION_NUMBER_OF_ELEMENTS];
+ Appli_Light_HslRangeSet AppliHslRangeSet[APPLICATION_NUMBER_OF_ELEMENTS];
/*******************************************************************************/
#endif /*End of the LIGHTING HSL MODEL variables */
@@ -117,22 +114,28 @@ extern MOBLEUINT16 IntensityValue;
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_LightnessParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
MOBLEUINT16 duty;
static MOBLEUINT16 previousIntensity = 0;
- TRACE_M(TF_SERIAL_CTRL,"#824C!\n\r");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#824C!\r\n");
- ApplilightnessSet.PresentState16 = pLight_LightnessParam->LightnessPresentValue16;
- ApplilightnessSet.LastLightness16 = pLight_LightnessParam->LightnessLastStatus;
+ ApplilightnessSet[elementIndex].PresentState16 = pLight_LightnessParam->LightnessPresentValue16;
+ ApplilightnessSet[elementIndex].LastLightness16 = pLight_LightnessParam->LightnessLastStatus;
if(pLight_LightnessParam->LightnessPresentValue16 != 0x00)
{
- ApplilightnessSet.LastLightness16 = pLight_LightnessParam->LightnessPresentValue16;
+ ApplilightnessSet[elementIndex].LastLightness16 = pLight_LightnessParam->LightnessPresentValue16;
}
if(((IntensityValue > previousIntensity) && (IntensityValue <PWM_TIME_PERIOD)) ||
@@ -146,6 +149,7 @@ MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_Lightness
}
previousIntensity = IntensityValue;
+#if 0
/* For demo, if Level is more than 100, switch ON the LED */
if(pLight_LightnessParam->LightnessPresentValue16 >= 0x8000)
{
@@ -155,16 +159,17 @@ MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_Lightness
{
BSP_LED_Off(LED_BLUE);
}
- TRACE_M(TF_SERIAL_CTRL,"#8206%04hx!\n\r",ApplilightnessSet.PresentState16);
+#endif
+
+ TRACE_M(TF_SERIAL_CTRL,"#8206%04hx!\n\r",
+ ApplilightnessSet[elementIndex].PresentState16);
- duty = PwmValueMapping(ApplilightnessSet.PresentState16 , 0xfFFF ,0);
+ duty = PwmValueMapping(ApplilightnessSet[elementIndex].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();
+ NvmStatePowerFlag_Set(LIGHT_LIGHTNESS_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
@@ -181,18 +186,18 @@ MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_Lightness
* @param pLength: length of data
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_Lightness_Status callback received \r\n");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#824E!\r\n");
- TRACE_M(TF_SERIAL_CTRL,"#824E! \n\r");
-
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2))
@@ -201,28 +206,33 @@ MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, M
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present Lightness: %d \r\n",
- value << 8 | pLightness_status[i]);
+ TRACE_M(TF_LIGHT,"Present Lightness: 0x%x (%d)\r\n",
+ value | pLightness_status[i] << 8,
+ value | pLightness_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Target Lightness: %d \r\n",
- value << 8 | pLightness_status[i]);
+ TRACE_M(TF_LIGHT,"Target Lightness: 0x%x (%d)\r\n",
+ value | pLightness_status[i] << 8,
+ value | pLightness_status[i] << 8);
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\r\n",
+ pLightness_status[i],
pLightness_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#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
@@ -231,11 +241,13 @@ MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, M
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Lightness_Linear_Set(Light_LightnessStatus_t* pLight_LightnessLinearParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- ApplilightnessLinearSet.PresentState16 = pLight_LightnessLinearParam->LinearPresentValue16;
+ ApplilightnessLinearSet[elementIndex].PresentState16 = pLight_LightnessLinearParam->LinearPresentValue16;
- TRACE_M(TF_SERIAL_CTRL,"#8250!\n\r");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Linear_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8250!\r\n");
return MOBLE_RESULT_SUCCESS;
}
@@ -248,20 +260,25 @@ MOBLE_RESULT Appli_Light_Lightness_Linear_Set(Light_LightnessStatus_t* pLight_Li
* @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 dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @param pLength: length of data
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_Lightness_Linear_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8252! \n\r");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Linear_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8252!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2))
@@ -270,24 +287,29 @@ MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLin
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present Lightness: %d \r\n",
- value << 8 | pLightnessLinear_status[i]);
+ TRACE_M(TF_LIGHT,"Present Lightness: 0x%x (%d)\r\n",
+ value | pLightnessLinear_status[i] << 8,
+ value | pLightnessLinear_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Target Lightness: %d \r\n",
- value << 8 | pLightnessLinear_status[i]);
+ TRACE_M(TF_LIGHT,"Target Lightness: 0x%x (%d)\r\n",
+ value | pLightnessLinear_status[i] << 8,
+ value | pLightnessLinear_status[i] << 8);
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\r\n",
+ pLightnessLinear_status[i],
pLightnessLinear_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP
/******************************************************************************/
@@ -297,11 +319,17 @@ MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLin
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pLight_LightnessDefaultParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
+#if 0
if(pLight_LightnessDefaultParam->LightnessDefaultStatus > 0)
{
BSP_LED_On(LED_BLUE);
@@ -310,14 +338,16 @@ MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pL
{
BSP_LED_Off(LED_BLUE);
}
- ApplilightnessSet.LightnessDefault = pLight_LightnessDefaultParam->LightnessDefaultStatus;
+#endif
+
+ ApplilightnessSet[elementIndex].LightnessDefault =
+ pLight_LightnessDefaultParam->LightnessDefaultStatus;
+
+ TRACE_M(TF_LIGHT,"Light_Lightness_Default_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8259! \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8259!\n\r");
-
/* set the flag value for NVM store */
- RestoreFlag = LIGHT_LIGHTNESS_NVM_FLAG;
-
- AppliNvm_SaveMessageParam();
+ NvmStatePowerFlag_Set(LIGHT_LIGHTNESS_NVM_FLAG,elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -331,19 +361,25 @@ MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pL
* when Light Lightness Default status message is received
* @param pLightnessDefault_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDefault_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDefault_status, MOBLEUINT32 pLength
+ , MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
- MOBLEUINT16 value = 0;
- #endif
- TRACE_M(TF_LIGHT,"Light_Lightness_Default_Status callback received \r\n");
+ MOBLEUINT16 value;
+#endif
- TRACE_M(TF_SERIAL_CTRL,"#8256! \n\r");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Default_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8256!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if(i == 0)
@@ -352,14 +388,61 @@ MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDe
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Lightness: %d \r\n",
- value << 8 | pLightnessDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Lightness Default: 0x%x (%d)\r\n",
+ value | pLightnessDefault_status[i] << 8,
+ value | pLightnessDefault_status[i] << 8);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
+/**
+* @brief Appli_Light_Lightness_Last_Status: This function is callback for Application
+* when Light Lightness Last status message is received
+* @param pLightnessDefault_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Lightness_Last_Status(MOBLEUINT8 const *pLightnessLast_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+#if ( CFG_DEBUG_TRACE != 0 )
+ MOBLEUINT32 i;
+ MOBLEUINT16 value;
+#endif
+
+ TRACE_M(TF_LIGHT,"Light_Lightness_Last_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8256!\r\n");
+
+#if ( CFG_DEBUG_TRACE != 0 )
+ for(i = 0; i < pLength; i++)
+ {
+ if(i == 0)
+ {
+ value = pLightnessLast_status[i];
+ }
+ else if(i == 1)
+ {
+ TRACE_M(TF_LIGHT,"Lightness Last: 0x%x (%d)\r\n",
+ value | pLightnessLast_status[i] << 8,
+ value | pLightnessLast_status[i] << 8);
+ }
+ }
+#endif
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP
/******************************************************************************/
@@ -369,16 +452,22 @@ MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDe
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Lightness_Range_Set(Light_LightnessRangeParam_t* pLight_LightnessRangeParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- ApplilightnessSet.StatusCode = pLight_LightnessRangeParam->StatusCode;
- ApplilightnessSet.RangeMin = pLight_LightnessRangeParam->MinRangeStatus;
- ApplilightnessSet.RangeMax = pLight_LightnessRangeParam->MaxRangeStatus;
+ ApplilightnessSet[elementIndex].StatusCode = pLight_LightnessRangeParam->StatusCode;
+ ApplilightnessSet[elementIndex].RangeMin = pLight_LightnessRangeParam->MinRangeStatus;
+ ApplilightnessSet[elementIndex].RangeMax = pLight_LightnessRangeParam->MaxRangeStatus;
- TRACE_M(TF_SERIAL_CTRL,"#825B! \n\r");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Range_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#825B!\r\n");
return MOBLE_RESULT_SUCCESS;
}
@@ -392,45 +481,56 @@ MOBLE_RESULT Appli_Light_Lightness_Range_Set(Light_LightnessRangeParam_t* pLight
* when Light Lightness range ststus message is received
* @param pLightnessRange_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status, MOBLEUINT32 pLength
+ , MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
- MOBLEUINT16 value = 0;
+ MOBLEUINT16 value;
#endif
- TRACE_M(TF_LIGHT,"Light_Lightness_Range_Status callback received \r\n");
-
- TRACE_M(TF_SERIAL_CTRL,"#8258! \n\r");
-#ifdef CFG_DEBUG_TRACE
+ TRACE_M(TF_LIGHT,"Light_Lightness_Range_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8258!\r\n");
+
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if(i == 0)
{
- TRACE_M(TF_LIGHT,"Status Code: %d \r\n",
- value << 8 | pLightnessRange_status[i]);
+ TRACE_M(TF_LIGHT,"Status Code: 0x%x (%d)\r\n",
+ pLightnessRange_status[i],
+ pLightnessRange_status[i]);
}
else if((i == 1) || (i == 3))
{
value = pLightnessRange_status[i];
}
- else if(i == 1)
+ else if(i == 2)
{
- TRACE_M(TF_LIGHT,"Range Min: %d \r\n",
- value << 8 | pLightnessRange_status[i]);
+ TRACE_M(TF_LIGHT,"Range Min: 0x%x (%d)\r\n",
+ value | pLightnessRange_status[i] << 8,
+ value | pLightnessRange_status[i] << 8);
}
- else if(i == 3)
+ else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Range Max: %d \r\n",
- value << 8 | pLightnessRange_status[i]);
+ TRACE_M(TF_LIGHT,"Range Max: 0x%x (%d)\r\n",
+ value | pLightnessRange_status[i] << 8,
+ value | pLightnessRange_status[i] << 8);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL
/******************************************************************************/
@@ -440,22 +540,34 @@ MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRang
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Ctl_Set(Light_CtlStatus_t* pLight_CtlParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
float colourRatio;
float brightRatio;
- TRACE_M(TF_SERIAL_CTRL,"#825E! \n\r");
+ TRACE_M(TF_LIGHT,"Appli_Light_Ctl_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#825E!\r\n");
- 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);
+ AppliCtlSet[elementIndex].PresentLightness16 = pLight_CtlParam->PresentCtlLightness16;
+ AppliCtlSet[elementIndex].PresentTemperature16 = pLight_CtlParam->PresentCtlTemperature16;
+ AppliCtlSet[elementIndex].PresentCtlDelta16 = pLight_CtlParam->PresentCtlDelta16;
- brightRatio = Ratio_CalculateValue(AppliCtlSet.PresentLightness16 ,0XFFFF ,0);
+ /* Save target parameters if transition is available */
+ AppliCtlSet[elementIndex].TargetLightness16 = pLight_CtlParam->TargetCtlLightness16;
+ AppliCtlSet[elementIndex].TargetTemperature16 = pLight_CtlParam->TargetCtlTemperature16;
+ AppliCtlSet[elementIndex].TargetCtlDelta16 = pLight_CtlParam->TargetCtlDeltaUv16;
+
+ colourRatio = Ratio_CalculateValue(AppliCtlSet[elementIndex].PresentTemperature16 ,MAX_CTL_TEMP_RANGE ,MIN_CTL_TEMP_RANGE);
+
+ brightRatio = Ratio_CalculateValue(AppliCtlSet[elementIndex].PresentLightness16 ,0XFFFF ,0);
Appli_LightPwmValue.PwmCoolValue = PWM_CoolValue(colourRatio , brightRatio);
Appli_LightPwmValue.PwmWarmValue = PWM_WarmValue(colourRatio , brightRatio);
@@ -464,15 +576,8 @@ MOBLE_RESULT Appli_Light_Ctl_Set(Light_CtlStatus_t* pLight_CtlParam,
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();
+ NvmStatePowerFlag_Set(LIGHT_CTL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -488,18 +593,18 @@ MOBLE_RESULT Appli_Light_Ctl_Set(Light_CtlStatus_t* pLight_CtlParam,
* @param pLength: length of data
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status,
- MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_Ctl_Status callback received \r\n");
-
- TRACE_M(TF_SERIAL_CTRL,"#8260! \n\r");
+
+ TRACE_M(TF_LIGHT,"Light_Ctl_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8260!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2) || (i == 4) || (i == 6))
@@ -508,34 +613,41 @@ MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status,
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present CTL Lightness: %d \r\n",
- value << 8 | pLightCtl_status[i]);
+ TRACE_M(TF_LIGHT,"Present CTL Lightness: 0x%x (%d)\r\n",
+ value | pLightCtl_status[i] << 8,
+ value | pLightCtl_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Present CTL Temperature: %d \r\n",
- value << 8 | pLightCtl_status[i]);
+ TRACE_M(TF_LIGHT,"Present CTL Temperature: 0x%x (%d)\r\n",
+ value | pLightCtl_status[i] << 8,
+ value | pLightCtl_status[i] << 8);
}
else if(i == 5)
{
- TRACE_M(TF_LIGHT,"Target CTL Lightness: %d \r\n",
- value << 8 | pLightCtl_status[i]);
+ TRACE_M(TF_LIGHT,"Target CTL Lightness: 0x%x (%d)\r\n",
+ value | pLightCtl_status[i] << 8,
+ value | pLightCtl_status[i] << 8);
}
else if(i == 7)
{
- TRACE_M(TF_LIGHT,"Target CTL Temperature: %d \r\n",
- value << 8 | pLightCtl_status[i]);
+ TRACE_M(TF_LIGHT,"Target CTL Temperature: 0x%x (%d)\r\n",
+ value | pLightCtl_status[i] << 8,
+ value | pLightCtl_status[i] << 8);
}
else if(i == 8)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time:0x%x (%d)\r\n",
+ pLightCtl_status[i],
pLightCtl_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE
/******************************************************************************/
@@ -545,21 +657,32 @@ MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status,
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_CtlTemperature_Set(Light_CtlStatus_t* pLight_CtltempParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
float colourRatio;
float brightRatio;
- TRACE_M(TF_SERIAL_CTRL,"#8264!\n\r");
- AppliCtlSet.PresentTemperature16 = pLight_CtltempParam->PresentCtlTemperature16;
- AppliCtlSet.PresentCtlDelta16 = pLight_CtltempParam->PresentCtlDelta16;
+ TRACE_M(TF_LIGHT,"Appli_Light_CtlTemperature_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8264!\r\n");
+
+ AppliCtlSet[elementIndex].PresentTemperature16 = pLight_CtltempParam->PresentCtlTemperature16;
+ AppliCtlSet[elementIndex].PresentCtlDelta16 = pLight_CtltempParam->PresentCtlDelta16;
- colourRatio = Ratio_CalculateValue(AppliCtlSet.PresentTemperature16 ,MAX_CTL_TEMP_RANGE ,MIN_CTL_TEMP_RANGE);
+ /* Made a copy of target in case of transition values change */
+ AppliCtlSet[elementIndex].TargetTemperature16 = pLight_CtltempParam->TargetCtlTemperature16;
+ AppliCtlSet[elementIndex].TargetCtlDelta16 = pLight_CtltempParam->TargetCtlDeltaUv16;
- brightRatio = Ratio_CalculateValue(AppliCtlSet.PresentLightness16 ,0XFFFF ,0);
+ colourRatio = Ratio_CalculateValue(AppliCtlSet[elementIndex].PresentTemperature16 ,MAX_CTL_TEMP_RANGE ,MIN_CTL_TEMP_RANGE);
+
+ brightRatio = Ratio_CalculateValue(AppliCtlSet[elementIndex].PresentLightness16 ,0XFFFF ,0);
Appli_LightPwmValue.PwmCoolValue = PWM_CoolValue(colourRatio , brightRatio);
Appli_LightPwmValue.PwmWarmValue = PWM_WarmValue(colourRatio , brightRatio);
@@ -568,9 +691,7 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Set(Light_CtlStatus_t* pLight_CtltempPar
Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
/* set the flag value for NVM store */
- RestoreFlag = LIGHT_CTL_NVM_FLAG;
-
- AppliNvm_SaveMessageParam();
+ NvmStatePowerFlag_Set(LIGHT_CTL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -584,19 +705,25 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Set(Light_CtlStatus_t* pLight_CtltempPar
* when Light CTL temperature status message is received
* @param pLightCtlTemp_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status, MOBLEUINT32 pLength
+ , MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_CtlTemperature_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8266! \n\r");
+ TRACE_M(TF_LIGHT,"Light_CtlTemperature_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8266!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2) || (i == 4) || (i == 6))
@@ -605,35 +732,42 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_s
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present CTL Temperature: %d \r\n",
- value << 8 | pLightCtlTemp_status[i]);
+ TRACE_M(TF_LIGHT,"Present CTL Temperature: 0x%x (%d)\r\n",
+ value | pLightCtlTemp_status[i] << 8,
+ value | pLightCtlTemp_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Present CTL Delta UV: %d \r\n",
- value << 8 | pLightCtlTemp_status[i]);
+ TRACE_M(TF_LIGHT,"Present CTL Delta UV: 0x%x (%d)\r\n",
+ value | pLightCtlTemp_status[i] << 8,
+ value | pLightCtlTemp_status[i] << 8);
}
else if(i == 5)
{
- TRACE_M(TF_LIGHT,"Target CTL Temperature: %d \r\n",
- value << 8 | pLightCtlTemp_status[i]);
+ TRACE_M(TF_LIGHT,"Target CTL Temperature: 0x%x (%d)\r\n",
+ value | pLightCtlTemp_status[i] << 8,
+ value | pLightCtlTemp_status[i] << 8);
}
else if(i == 7)
{
- TRACE_M(TF_LIGHT,"Target CTL Delta UV: %d \r\n",
- value << 8 | pLightCtlTemp_status[i]);
+ TRACE_M(TF_LIGHT,"Target CTL Delta UV: 0x%x (%d)\r\n",
+ value | pLightCtlTemp_status[i] << 8,
+ value | pLightCtlTemp_status[i] << 8);
}
else if(i == 8)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\r\n",
+ pLightCtlTemp_status[i],
pLightCtlTemp_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP
/******************************************************************************/
@@ -643,16 +777,22 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_s
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_CtlTemperature_Range_Set(Light_CtlTemperatureRangeParam_t* pLight_CtlTempRangeParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- AppliCtlTemperatureRangeSet.RangeMin = pLight_CtlTempRangeParam->MinRangeStatus;
- AppliCtlTemperatureRangeSet.RangeMax = pLight_CtlTempRangeParam->MaxRangeStatus;
- AppliCtlTemperatureRangeSet.StatusCode = pLight_CtlTempRangeParam->StatusCode;
+ AppliCtlTemperatureRangeSet[elementIndex].RangeMin = pLight_CtlTempRangeParam->MinRangeStatus;
+ AppliCtlTemperatureRangeSet[elementIndex].RangeMax = pLight_CtlTempRangeParam->MaxRangeStatus;
+ AppliCtlTemperatureRangeSet[elementIndex].StatusCode = pLight_CtlTempRangeParam->StatusCode;
- TRACE_M(TF_SERIAL_CTRL,"#826B!\n\r");
+ TRACE_M(TF_LIGHT,"Light_CtlTemperature_Range_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#826B!\r\n");
return MOBLE_RESULT_SUCCESS;
}
@@ -667,28 +807,34 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Range_Set(Light_CtlTemperatureRangeParam
* when Light CTL temperature range status message is received
* @param pCtlTempRange_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
- MOBLEUINT16 value = 0;
+ MOBLEUINT16 value;
#endif
- TRACE_M(TF_LIGHT,"Light_CtlTemperature_Range_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8263! \n\r");
+ TRACE_M(TF_LIGHT,"Light_CtlTemperature_Range_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8263!\r\n");
- RestoreFlag = LIGHT_CTL_NVM_FLAG;
+ RestoreFlag = LIGHT_CTL_NVM_FLAG;
AppliNvm_SaveMessageParam();
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if(i == 0)
{
- TRACE_M(TF_LIGHT,"Status Code: %d \r\n",
+ TRACE_M(TF_LIGHT,"Status Code: 0x%x (%d)\r\n",
+ pCtlTempRange_status[i],
pCtlTempRange_status[i]);
}
else if((i == 1) || (i == 3))
@@ -697,19 +843,23 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempR
}
else if(i == 2)
{
- TRACE_M(TF_LIGHT,"Range Min: %d \r\n",
- value << 8 | pCtlTempRange_status[i]);
+ TRACE_M(TF_LIGHT,"Range Min: 0x%x (%d)\r\n",
+ value | pCtlTempRange_status[i] << 8,
+ value | pCtlTempRange_status[i] << 8 );
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Range Max: %d \r\n",
- value << 8 | pCtlTempRange_status[i]);
+ TRACE_M(TF_LIGHT,"Range Max: 0x%x (%d)\r\n",
+ value | pCtlTempRange_status[i] << 8,
+ value | pCtlTempRange_status[i] << 8 );
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP
/******************************************************************************/
@@ -719,16 +869,22 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempR
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_CtlDefault_Set(Light_CtlDefaultParam_t* pLight_CtlDefaultParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- AppliCtlDefaultSet.CtlDefaultLightness16 = pLight_CtlDefaultParam->CtlDefaultLightness16;
- AppliCtlDefaultSet.CtlDefaultTemperature16 = pLight_CtlDefaultParam->CtlDefaultTemperature16;
- AppliCtlDefaultSet.CtlDefaultDeltaUv = pLight_CtlDefaultParam->CtlDefaultDeltaUv;
+ AppliCtlDefaultSet[elementIndex].CtlDefaultLightness16 = pLight_CtlDefaultParam->CtlDefaultLightness16;
+ AppliCtlDefaultSet[elementIndex].CtlDefaultTemperature16 = pLight_CtlDefaultParam->CtlDefaultTemperature16;
+ AppliCtlDefaultSet[elementIndex].CtlDefaultDeltaUv = pLight_CtlDefaultParam->CtlDefaultDeltaUv;
- TRACE_M(TF_SERIAL_CTRL,"#8269!\n\r");
+ TRACE_M(TF_LIGHT,"Light_CtlDefault_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8269!\r\n");
return MOBLE_RESULT_SUCCESS;
}
@@ -742,19 +898,24 @@ MOBLE_RESULT Appli_Light_CtlDefault_Set(Light_CtlDefaultParam_t* pLight_CtlDefau
* when Light CTL Default status message is received
* @param pCtlDefault_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_Ctl_DefaultStatus callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8268! \n\r");
+ TRACE_M(TF_LIGHT,"Light_Ctl_DefaultStatus callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8268!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2) || (i == 4))
@@ -763,24 +924,29 @@ MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status,
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Lightness: %d \r\n",
- value << 8 | pCtlDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Lightness: 0x%x (%d)\n\r",
+ value | pCtlDefault_status[i] << 8,
+ value | pCtlDefault_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Temperature: %d \r\n",
- value << 8 | pCtlDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Temperature: 0x%x (%d)\n\r",
+ value | pCtlDefault_status[i] << 8,
+ value | pCtlDefault_status[i] << 8);
}
else if(i == 5)
{
- TRACE_M(TF_LIGHT,"Delta UV: %d \r\n",
- value << 8 | pCtlDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Delta UV: 0x%x (%d)\n\r",
+ value | pCtlDefault_status[i] << 8,
+ value | pCtlDefault_status[i] << 8);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL
/******************************************************************************/
@@ -790,32 +956,41 @@ MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status,
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Hsl_Set(Light_HslStatus_t* pLight_HslParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_SERIAL_CTRL,"#8276!\n\r");
+ TRACE_M(TF_LIGHT,"Appli_Light_Hsl_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8276!\r\n");
- AppliHslSet.HslLightness16 = pLight_HslParam->PresentHslLightness16;
- AppliHslSet.HslHueLightness16 = pLight_HslParam->PresentHslHueLightness16;
- AppliHslSet.HslSaturation16 = pLight_HslParam->PresentHslSaturation16;
+ AppliHslSet[elementIndex].HslLightness16 = pLight_HslParam->PresentHslLightness16;
+ AppliHslSet[elementIndex].HslHueLightness16 = pLight_HslParam->PresentHslHueLightness16;
+ AppliHslSet[elementIndex].HslSaturation16 = pLight_HslParam->PresentHslSaturation16;
+ /* Save target parameters if transition is available */
+ AppliHslSet[elementIndex].TargetHslLightness16 = pLight_HslParam->TargetHslLightness16;
+ AppliHslSet[elementIndex].TargetHslHueLightness16 = pLight_HslParam->TargetHslHueLightness16;
+ AppliHslSet[elementIndex].TargetHslSaturation16 = pLight_HslParam->TargetHslSaturation16;
+
/* Function to convert HSL values in RGB values */
- HSL2RGB_Conversion();
+ HSL2RGB_Conversion(elementIndex);
- 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);
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam[elementIndex].Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam[elementIndex].Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam[elementIndex].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();
+ NvmStatePowerFlag_Set(LIGHT_HSL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -829,19 +1004,24 @@ MOBLE_RESULT Appli_Light_Hsl_Set(Light_HslStatus_t* pLight_HslParam,
* when Light HSL status message is received
* @param pHsl_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_Hsl_Status callback received \r\n");
-
- TRACE_M(TF_SERIAL_CTRL,"#8278! \n\r");
+
+ TRACE_M(TF_LIGHT,"Light_Hsl_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8278!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2) || (i == 4))
@@ -850,29 +1030,35 @@ MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 p
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"HSL Lightness: %d \r\n",
- value << 8 | pHsl_status[i]);
+ TRACE_M(TF_LIGHT,"HSL Lightness: 0x%x (%d)\n\r",
+ value | pHsl_status[i] << 8,
+ value | pHsl_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"HSL Hue: %d \r\n",
- value << 8 | pHsl_status[i]);
+ TRACE_M(TF_LIGHT,"HSL Hue: 0x%x (%d)\n\r",
+ value | pHsl_status[i] << 8,
+ value | pHsl_status[i] << 8);
}
else if(i == 5)
{
- TRACE_M(TF_LIGHT,"HSL Saturation: %d \r\n",
- value << 8 | pHsl_status[i]);
+ TRACE_M(TF_LIGHT,"HSL Saturation: 0x%x (%d)\n\r",
+ value | pHsl_status[i] << 8,
+ value | pHsl_status[i] << 8);
}
else if(i == 6)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\n\r",
+ pHsl_status[i],
pHsl_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_HUE
/******************************************************************************/
@@ -882,28 +1068,32 @@ MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 p
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_HslHue_Set(Light_HslStatus_t* pLight_HslHueParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_SERIAL_CTRL,"#826F! \n\r");
+ TRACE_M(TF_LIGHT,"Light_HslHue_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#826F!\r\n");
- AppliHslSet.HslHueLightness16 = pLight_HslHueParam->PresentHslHueLightness16;
+ AppliHslSet[elementIndex].HslHueLightness16 = pLight_HslHueParam->PresentHslHueLightness16;
- HSL2RGB_Conversion();
+ HSL2RGB_Conversion(elementIndex);
- 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);
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam[elementIndex].Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam[elementIndex].Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam[elementIndex].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();
+ NvmStatePowerFlag_Set(LIGHT_HSL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
@@ -918,19 +1108,24 @@ MOBLE_RESULT Appli_Light_HslHue_Set(Light_HslStatus_t* pLight_HslHueParam,
* when Light HSL HUE status message is received
* @param pHslHue_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_HslHue_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8271! \n\r");
+ TRACE_M(TF_LIGHT,"Light_HslHue_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8271!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2))
@@ -939,24 +1134,29 @@ MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUI
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present Hue: %d \r\n",
- value << 8 | pHslHue_status[i]);
+ TRACE_M(TF_LIGHT,"Present Hue: 0x%x (%d)\n\r",
+ value | pHslHue_status[i] << 8,
+ value | pHslHue_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Target Hue: %d \r\n",
- value << 8 | pHslHue_status[i]);
+ TRACE_M(TF_LIGHT,"Target Hue: 0x%x (%d)\n\r",
+ value | pHslHue_status[i] << 8,
+ value | pHslHue_status[i] << 8);
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\n\r",
+ pHslHue_status[i],
pHslHue_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION
/******************************************************************************/
@@ -966,28 +1166,32 @@ MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUI
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_HslSaturation_Set(Light_HslStatus_t* pLight_HslSaturationParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_SERIAL_CTRL,"#8273! \n\r");
+ TRACE_M(TF_LIGHT,"Appli_Light_HslSaturation_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8273!\r\n");
- AppliHslSet.HslSaturation16 = pLight_HslSaturationParam->PresentHslSaturation16;
+ AppliHslSet[elementIndex].HslSaturation16 = pLight_HslSaturationParam->PresentHslSaturation16;
- HSL2RGB_Conversion();
+ HSL2RGB_Conversion(elementIndex);
- 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);
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam[elementIndex].Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam[elementIndex].Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam[elementIndex].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();
+ NvmStatePowerFlag_Set(LIGHT_HSL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -1001,19 +1205,24 @@ MOBLE_RESULT Appli_Light_HslSaturation_Set(Light_HslStatus_t* pLight_HslSaturati
* when Light HSL Saturation status message is received
* @param pHslSaturation_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_HslSaturation_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8275! \n\r");
-
-#ifdef CFG_DEBUG_TRACE
+ TRACE_M(TF_LIGHT,"Light_HslSaturation_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8275!\r\n");
+
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2))
@@ -1022,24 +1231,29 @@ MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_s
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present Saturation: %d \r\n",
- value << 8 | pHslSaturation_status[i]);
+ TRACE_M(TF_LIGHT,"Present Saturation: 0x%x (%d)\n\r",
+ value | pHslSaturation_status[i] << 8,
+ value | pHslSaturation_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Target Saturation: %d \r\n",
- value << 8 | pHslSaturation_status[i]);
+ TRACE_M(TF_LIGHT,"Target Saturation: 0x%x (%d)\n\r",
+ value | pHslSaturation_status[i] << 8,
+ value | pHslSaturation_status[i] << 8);
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\n\r",
+ pHslSaturation_status[i],
pHslSaturation_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP
/******************************************************************************/
@@ -1049,34 +1263,38 @@ MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_s
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_HslDefault_Set(Light_HslStatus_t* pLight_HslDefaultParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_SERIAL_CTRL,"#827F! \n\r");
+ TRACE_M(TF_LIGHT,"Appli_Light_HslDefault_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#827F!\r\n");
- Appli_HslDefaultSet.HslDefaultLightness16 = pLight_HslDefaultParam->PresentHslLightness16;
- Appli_HslDefaultSet.HslDefaultHueLightness16 = pLight_HslDefaultParam->PresentHslHueLightness16;
- Appli_HslDefaultSet.HslDefaultSaturation16 = pLight_HslDefaultParam->PresentHslSaturation16;
+ Appli_HslDefaultSet[elementIndex].HslDefaultLightness16 = pLight_HslDefaultParam->PresentHslLightness16;
+ Appli_HslDefaultSet[elementIndex].HslDefaultHueLightness16 = pLight_HslDefaultParam->PresentHslHueLightness16;
+ Appli_HslDefaultSet[elementIndex].HslDefaultSaturation16 = pLight_HslDefaultParam->PresentHslSaturation16;
- AppliHslSet.HslLightness16 = Appli_HslDefaultSet.HslDefaultLightness16;
- AppliHslSet.HslHueLightness16 = Appli_HslDefaultSet.HslDefaultHueLightness16;
- AppliHslSet.HslSaturation16 = Appli_HslDefaultSet.HslDefaultSaturation16;
+ AppliHslSet[elementIndex].HslLightness16 = Appli_HslDefaultSet[elementIndex].HslDefaultLightness16;
+ AppliHslSet[elementIndex].HslHueLightness16 = Appli_HslDefaultSet[elementIndex].HslDefaultHueLightness16;
+ AppliHslSet[elementIndex].HslSaturation16 = Appli_HslDefaultSet[elementIndex].HslDefaultSaturation16;
- HSL2RGB_Conversion();
+ HSL2RGB_Conversion(elementIndex);
- 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);
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam[elementIndex].Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam[elementIndex].Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam[elementIndex].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();
+ NvmStatePowerFlag_Set(LIGHT_HSL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -1092,17 +1310,18 @@ MOBLE_RESULT Appli_Light_HslDefault_Set(Light_HslStatus_t* pLight_HslDefaultPara
* @param pLength: length of data
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_HslDefault_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#827C! \n\r");
-
-#ifdef CFG_DEBUG_TRACE
+ TRACE_M(TF_LIGHT,"Light_HslDefault_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#827C!\r\n");
+
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2) || (i == 4))
@@ -1111,24 +1330,29 @@ MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status,
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Lightness: %d \r\n",
- value << 8 | pHslDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Lightness: 0x%x (%d)\n\r",
+ value | pHslDefault_status[i] << 8,
+ value | pHslDefault_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Hue: %d \r\n",
- value << 8 | pHslDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Hue: 0x%x (%d)\n\r",
+ value | pHslDefault_status[i] << 8,
+ value | pHslDefault_status[i] << 8);
}
- else if(i == 4)
+ else if(i == 5)
{
- TRACE_M(TF_LIGHT,"Saturation: %d \r\n",
- value << 8 | pHslDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Saturation: 0x%x (%d)\n\r",
+ value | pHslDefault_status[i] << 8,
+ value | pHslDefault_status[i] << 8);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP
/******************************************************************************/
@@ -1141,14 +1365,16 @@ MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status,
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_HslRange_Set(Light_HslRangeParam_t* pLight_HslRangeParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_SERIAL_CTRL,"#8281! \n\r");
+ TRACE_M(TF_LIGHT,"Light_HslRange_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8281!\r\n");
- AppliHslRangeSet.HslHueMinRange16 = pLight_HslRangeParam->HslHueMinRange16;
- AppliHslRangeSet.HslHueMaxRange16 = pLight_HslRangeParam->HslHueMaxRange16;
- AppliHslRangeSet.HslMinSaturation16 = pLight_HslRangeParam->HslMinSaturation16;
- AppliHslRangeSet.HslMaxSaturation16 = pLight_HslRangeParam->HslMaxSaturation16;
+ AppliHslRangeSet[elementIndex].HslHueMinRange16 = pLight_HslRangeParam->HslHueMinRange16;
+ AppliHslRangeSet[elementIndex].HslHueMaxRange16 = pLight_HslRangeParam->HslHueMaxRange16;
+ AppliHslRangeSet[elementIndex].HslMinSaturation16 = pLight_HslRangeParam->HslMinSaturation16;
+ AppliHslRangeSet[elementIndex].HslMaxSaturation16 = pLight_HslRangeParam->HslMaxSaturation16;
return MOBLE_RESULT_SUCCESS;
}
@@ -1162,24 +1388,31 @@ MOBLE_RESULT Appli_Light_HslRange_Set(Light_HslRangeParam_t* pLight_HslRangePara
* when Light HSL range status message is received
* @param pHslRange_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_HslRange_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#827E! \n\r");
+ TRACE_M(TF_LIGHT,"Light_HslRange_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#827E!\r\n");
+
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if(i == 0)
{
- TRACE_M(TF_LIGHT,"Status Code: %d \r\n",
+ TRACE_M(TF_LIGHT,"Status Code: 0x%x (%d)\n\r",
+ pHslRange_status[i],
pHslRange_status[i]);
}
else if((i == 1) || (i == 3) || (i == 5) || (i == 7))
@@ -1188,30 +1421,36 @@ MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status, MOB
}
else if(i == 2)
{
- TRACE_M(TF_LIGHT,"Hue Range Min: %d \r\n",
- value << 8 | pHslRange_status[i]);
+ TRACE_M(TF_LIGHT,"Hue Range Min: 0x%x (%d)\n\r",
+ value | pHslRange_status[i] << 8,
+ value | pHslRange_status[i] << 8);
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Hue Range Max: %d \r\n",
- value << 8 | pHslRange_status[i]);
+ TRACE_M(TF_LIGHT,"Hue Range Max: 0x%x (%d)\n\r",
+ value | pHslRange_status[i] << 8,
+ value | pHslRange_status[i] << 8);
}
else if(i == 6)
{
- TRACE_M(TF_LIGHT,"Saturation Range Min: %d \r\n",
- value << 8 | pHslRange_status[i]);
+ TRACE_M(TF_LIGHT,"Saturation Range Min: 0x%x (%d)\n\r",
+ value | pHslRange_status[i] << 8,
+ value | pHslRange_status[i] << 8);
}
else if(i == 8)
{
- TRACE_M(TF_LIGHT,"Saturation Range Max: %d \r\n",
- value << 8 | pHslRange_status[i]);
+ TRACE_M(TF_LIGHT,"Saturation Range Max: 0x%x (%d)\n\r",
+ value | pHslRange_status[i] << 8,
+ value | pHslRange_status[i] << 8);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/*******************************************************************************
Following Functions are used for the LIGHTING Lightness MODEL
*******************************************************************************/
@@ -1224,14 +1463,19 @@ Following Functions are used for the LIGHTING Lightness MODEL
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState)
+MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(lLightnessState) = ApplilightnessSet.PresentState16;
- *(lLightnessState+1) = ApplilightnessSet.PresentState16 >> 8;
- *(lLightnessState+2) = ApplilightnessSet.LastLightness16 ;
- *(lLightnessState+3) = ApplilightnessSet.LastLightness16 >> 8;
+ *(lLightnessState) = ApplilightnessSet[elementIndex].PresentState16;
+ *(lLightnessState+1) = ApplilightnessSet[elementIndex].PresentState16 >> 8;
+ *(lLightnessState+2) = ApplilightnessSet[elementIndex].LastLightness16 ;
+ *(lLightnessState+3) = ApplilightnessSet[elementIndex].LastLightness16 >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1241,17 +1485,19 @@ MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState)
+MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lLightnessState) = ApplilightnessLinearSet[elementIndex].PresentState16;
+ *(lLightnessState+1) = ApplilightnessLinearSet[elementIndex].PresentState16 >> 8;
+ *(lLightnessState+2) = ApplilightnessSet[elementIndex].LastLightness16 ;
+ *(lLightnessState+3) = ApplilightnessSet[elementIndex].LastLightness16 >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1261,14 +1507,17 @@ MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState)
+MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(lDefaultState) = ApplilightnessSet.LightnessDefault;
- *(lDefaultState+1) = ApplilightnessSet.LightnessDefault >> 8;
- TRACE_M(TF_SERIAL_CTRL,"Get Lighness Default Status: %d\n\r",
- ApplilightnessSet.LightnessDefault);
+ *(lDefaultState) = ApplilightnessSet[elementIndex].LightnessDefault;
+ *(lDefaultState+1) = ApplilightnessSet[elementIndex].LightnessDefault >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1280,13 +1529,11 @@ MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState)
* @param lLastState: Pointer to the status message
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState)
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(lLastState) = ApplilightnessSet.LastLightness16;
- *(lLastState+1) = ApplilightnessSet.LastLightness16 >> 8;
-
- TRACE_M(TF_SERIAL_CTRL,"Get Lighness Last Status: status: %d \n\r",
- ApplilightnessSet.LastLightness16);
+ *(lLastState) = ApplilightnessSet[elementIndex].LastLightness16;
+ *(lLastState+1) = ApplilightnessSet[elementIndex].LastLightness16 >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1295,19 +1542,20 @@ MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetLightnessRangeStatus(MOBLEUINT8* lRangeState)
+MOBLE_RESULT Appli_Light_GetLightnessRangeStatus(MOBLEUINT8* lRangeState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lRangeState) = ApplilightnessSet[elementIndex].StatusCode;
+ *(lRangeState+1) = ApplilightnessSet[elementIndex].RangeMin;
+ *(lRangeState+2) = ApplilightnessSet[elementIndex].RangeMin >> 8;
+ *(lRangeState+3) = ApplilightnessSet[elementIndex].RangeMax;
+ *(lRangeState+4) = ApplilightnessSet[elementIndex].RangeMax >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1328,40 +1576,67 @@ Following Functions are used for the LIGHTING CTL MODEL
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetCtlLightStatus(MOBLEUINT8* lCtlLightState)
+MOBLE_RESULT Appli_Light_GetCtlLightStatus(MOBLEUINT8* lCtlLightState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lCtlLightState) = AppliCtlSet[elementIndex].PresentLightness16;
+ *(lCtlLightState+1) = AppliCtlSet[elementIndex].PresentLightness16 >> 8;
+ *(lCtlLightState+2) = AppliCtlSet[elementIndex].PresentTemperature16;
+ *(lCtlLightState+3) = AppliCtlSet[elementIndex].PresentTemperature16 >>8;
+ *(lCtlLightState+4) = AppliCtlSet[elementIndex].PresentCtlDelta16;
+ *(lCtlLightState+5) = AppliCtlSet[elementIndex].PresentCtlDelta16 >>8;
return MOBLE_RESULT_SUCCESS;
}
/**
+* @brief Appli_Light_GetCtlTargetStatus: This function is callback for Application
+* to get the application values in middleware used for target state.
+* @param lCtlLightState: Pointer to the status message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetCtlTargetStatus(MOBLEUINT8* lCtlLightState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ *(lCtlLightState) = AppliCtlSet[elementIndex].TargetLightness16;
+ *(lCtlLightState+1) = AppliCtlSet[elementIndex].TargetLightness16 >> 8;
+ *(lCtlLightState+2) = AppliCtlSet[elementIndex].TargetTemperature16;
+ *(lCtlLightState+3) = AppliCtlSet[elementIndex].TargetTemperature16 >>8;
+ *(lCtlLightState+4) = AppliCtlSet[elementIndex].TargetCtlDelta16;
+ *(lCtlLightState+5) = AppliCtlSet[elementIndex].TargetCtlDelta16 >>8;
+
+ 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState)
+MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lCtlTempState) = AppliCtlSet[elementIndex].PresentTemperature16;
+ *(lCtlTempState+1) = AppliCtlSet[elementIndex].PresentTemperature16 >> 8;
+ *(lCtlTempState+2) = AppliCtlSet[elementIndex].PresentCtlDelta16;
+ *(lCtlTempState+3) = AppliCtlSet[elementIndex].PresentCtlDelta16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1371,19 +1646,20 @@ MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange)
+MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lCtlTempRange) = AppliCtlTemperatureRangeSet[elementIndex].StatusCode;
+ *(lCtlTempRange+1) = AppliCtlTemperatureRangeSet[elementIndex].RangeMin;
+ *(lCtlTempRange+2) = AppliCtlTemperatureRangeSet[elementIndex].RangeMin >> 8;
+ *(lCtlTempRange+3) = AppliCtlTemperatureRangeSet[elementIndex].RangeMax;
+ *(lCtlTempRange+4) = AppliCtlTemperatureRangeSet[elementIndex].RangeMax >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1393,20 +1669,21 @@ MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetCtlDefaultStatus(MOBLEUINT8* lCtlDefaultState)
+MOBLE_RESULT Appli_Light_GetCtlDefaultStatus(MOBLEUINT8* lCtlDefaultState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lCtlDefaultState) = AppliCtlDefaultSet[elementIndex].CtlDefaultLightness16;
+ *(lCtlDefaultState+1) = AppliCtlDefaultSet[elementIndex].CtlDefaultLightness16 >> 8;
+ *(lCtlDefaultState+2) = AppliCtlDefaultSet[elementIndex].CtlDefaultTemperature16;
+ *(lCtlDefaultState+3) = AppliCtlDefaultSet[elementIndex].CtlDefaultTemperature16 >>8;
+ *(lCtlDefaultState+4) = AppliCtlDefaultSet[elementIndex].CtlDefaultDeltaUv;
+ *(lCtlDefaultState+5) = AppliCtlDefaultSet[elementIndex].CtlDefaultDeltaUv >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1427,36 +1704,65 @@ Following Functions are used for the LIGHTING HSL MODEL
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslStatus(MOBLEUINT8* lHslState)
+MOBLE_RESULT Appli_Light_GetHslStatus(MOBLEUINT8* lHslState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lHslState) = AppliHslSet[elementIndex].HslLightness16;
+ *(lHslState+1) = AppliHslSet[elementIndex].HslLightness16 >> 8;
+ *(lHslState+2) = AppliHslSet[elementIndex].HslHueLightness16;
+ *(lHslState+3) = AppliHslSet[elementIndex].HslHueLightness16 >>8;
+ *(lHslState+4) = AppliHslSet[elementIndex].HslSaturation16;
+ *(lHslState+5) = AppliHslSet[elementIndex].HslSaturation16 >>8;
return MOBLE_RESULT_SUCCESS;
}
+
+/**
+* @brief Appli_Light_GetHslTargetStatus: This function is callback for Application
+* to get the application values in middleware used for target state.
+* @param lHslState: Pointer to the status message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetHslTargetStatus(MOBLEUINT8* lHslState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ *(lHslState) = AppliHslSet[elementIndex].TargetHslLightness16;
+ *(lHslState+1) = AppliHslSet[elementIndex].TargetHslLightness16 >> 8;
+ *(lHslState+2) = AppliHslSet[elementIndex].TargetHslHueLightness16;
+ *(lHslState+3) = AppliHslSet[elementIndex].TargetHslHueLightness16 >>8;
+ *(lHslState+4) = AppliHslSet[elementIndex].TargetHslSaturation16;
+ *(lHslState+5) = AppliHslSet[elementIndex].TargetHslSaturation16 >>8;
+
+ 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState)
+MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(lHslHueState) = AppliHslSet.HslHueLightness16;
- *(lHslHueState+1) = AppliHslSet.HslHueLightness16 >>8;
- TRACE_M(TF_SERIAL_CTRL,"Get Hsl Hue Status: %d\n\r",
- AppliHslSet.HslHueLightness16);
+ *(lHslHueState) = AppliHslSet[elementIndex].HslHueLightness16;
+ *(lHslHueState+1) = AppliHslSet[elementIndex].HslHueLightness16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1466,14 +1772,17 @@ MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState)
+MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(lHslSaturationState) = AppliHslSet.HslSaturation16;
- *(lHslSaturationState+1) = AppliHslSet.HslSaturation16 >>8;
- TRACE_M(TF_SERIAL_CTRL,"Get Hsl Saturation Status: %d\n\r",
- AppliHslSet.HslSaturation16);
+ *(lHslSaturationState) = AppliHslSet[elementIndex].HslSaturation16;
+ *(lHslSaturationState+1) = AppliHslSet[elementIndex].HslSaturation16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1482,16 +1791,21 @@ MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState)
+MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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;
+ *(lHslDefaultState) = Appli_HslDefaultSet[elementIndex].HslDefaultLightness16;
+ *(lHslDefaultState+1) = Appli_HslDefaultSet[elementIndex].HslDefaultLightness16 >> 8;
+ *(lHslDefaultState+2) = Appli_HslDefaultSet[elementIndex].HslDefaultHueLightness16;
+ *(lHslDefaultState+3) = Appli_HslDefaultSet[elementIndex].HslDefaultHueLightness16 >>8;
+ *(lHslDefaultState+4) = Appli_HslDefaultSet[elementIndex].HslDefaultSaturation16;
+ *(lHslDefaultState+5) = Appli_HslDefaultSet[elementIndex].HslDefaultSaturation16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1500,19 +1814,20 @@ MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange)
+MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lHslSatRange) = AppliHslRangeSet[elementIndex].StatusCode;
+ *(lHslSatRange+1) = AppliHslRangeSet[elementIndex].HslMinSaturation16;
+ *(lHslSatRange+2) = AppliHslRangeSet[elementIndex].HslMinSaturation16 >> 8;
+ *(lHslSatRange+3) = AppliHslRangeSet[elementIndex].HslMaxSaturation16;
+ *(lHslSatRange+4) = AppliHslRangeSet[elementIndex].HslMaxSaturation16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1521,19 +1836,20 @@ MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslHueRange(MOBLEUINT8* lHslHueRange)
+MOBLE_RESULT Appli_Light_GetHslHueRange(MOBLEUINT8* lHslHueRange, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lHslHueRange) = AppliHslRangeSet[elementIndex].StatusCode;
+ *(lHslHueRange+1) = AppliHslRangeSet[elementIndex].HslHueMinRange16;
+ *(lHslHueRange+2) = AppliHslRangeSet[elementIndex].HslHueMinRange16 >> 8;
+ *(lHslHueRange+3) = AppliHslRangeSet[elementIndex].HslHueMaxRange16;
+ *(lHslHueRange+4) = AppliHslRangeSet[elementIndex].HslHueMaxRange16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1563,21 +1879,24 @@ void Appli_Light_PwmInit()
* @param value1: This value corresponds to red led.
* @param value2: This value corresponds to green led .
* @param value3: This value corresponds to blue led .
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval void
*/
-void RgbF_Create(MOBLEUINT16 value1, MOBLEUINT16 value2, MOBLEUINT16 value3)
+void RgbF_Create(MOBLEUINT16 value1, MOBLEUINT16 value2, MOBLEUINT16 value3, MOBLEUINT8 elementIndex)
{
- Appli_RGBParam.Red_Value = (MOBLEUINT16)(65535 * value1/1000);
- Appli_RGBParam.Green_Value = (MOBLEUINT16)(65535 * value2/1000);
- Appli_RGBParam.Blue_Value = (MOBLEUINT16)(65535 * value3/1000);
+ Appli_RGBParam[elementIndex].Red_Value = (MOBLEUINT16)(65535 * value1/1000);
+ Appli_RGBParam[elementIndex].Green_Value = (MOBLEUINT16)(65535 * value2/1000);
+ Appli_RGBParam[elementIndex].Blue_Value = (MOBLEUINT16)(65535 * value3/1000);
}
/**
* @brief Function to convert the HSL values in RGB values.
-* @param void
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval void
*/
-void HSL2RGB_Conversion(void)
+void HSL2RGB_Conversion(MOBLEUINT8 elementIndex)
{
MOBLEUINT16 hueValue;
@@ -1587,24 +1906,24 @@ void HSL2RGB_Conversion(void)
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)
+ if(AppliHslSet[elementIndex].HslSaturation16 == 0)
{
- Appli_RGBParam.Red_Value = AppliHslSet.HslLightness16 ;
- Appli_RGBParam.Green_Value = AppliHslSet.HslLightness16 ;
- Appli_RGBParam.Blue_Value = AppliHslSet.HslLightness16 ;
+ Appli_RGBParam[elementIndex].Red_Value = AppliHslSet[elementIndex].HslLightness16 ;
+ Appli_RGBParam[elementIndex].Green_Value = AppliHslSet[elementIndex].HslLightness16 ;
+ Appli_RGBParam[elementIndex].Blue_Value = AppliHslSet[elementIndex].HslLightness16 ;
}
- else if((AppliHslSet.HslLightness16 == 0xFFFF) || (AppliHslSet.HslLightness16 == 0x00))
+ else if((AppliHslSet[elementIndex].HslLightness16 == 0xFFFF) || (AppliHslSet[elementIndex].HslLightness16 == 0x00))
{
- Appli_RGBParam.Red_Value = AppliHslSet.HslLightness16 ;
- Appli_RGBParam.Green_Value = AppliHslSet.HslLightness16 ;
- Appli_RGBParam.Blue_Value = AppliHslSet.HslLightness16 ;
+ Appli_RGBParam[elementIndex].Red_Value = AppliHslSet[elementIndex].HslLightness16 ;
+ Appli_RGBParam[elementIndex].Green_Value = AppliHslSet[elementIndex].HslLightness16 ;
+ Appli_RGBParam[elementIndex].Blue_Value = AppliHslSet[elementIndex].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;
+ hueValue = (MOBLEUINT16)(360 * (float)AppliHslSet[elementIndex].HslHueLightness16/65535);
+ lightnessvalue = (float)AppliHslSet[elementIndex].HslLightness16/65535;
+ saturationValue = (float)AppliHslSet[elementIndex].HslSaturation16/65535;
/* Formula to get the values used for RGB conversion */
cValue = (MOBLEUINT16)(((1- fabs(2 * lightnessvalue-1))*saturationValue) * 1000);
@@ -1614,33 +1933,33 @@ void HSL2RGB_Conversion(void)
/* Conditons applied for the different angle of hue value */
if (hueValue > 0 && hueValue < (HUE_UPPER_LIMIT / 6))
{
- RgbF_Create(cValue + mValue, xValue + mValue, mValue);
+ RgbF_Create(cValue + mValue, xValue + mValue, mValue, elementIndex);
}
else if (hueValue >= (HUE_UPPER_LIMIT / 6) && hueValue < (HUE_UPPER_LIMIT / 3))
{
- RgbF_Create(xValue + mValue, cValue + mValue, mValue);
+ RgbF_Create(xValue + mValue, cValue + mValue, mValue, elementIndex);
}
else if (hueValue >= (HUE_UPPER_LIMIT / 3) && hueValue < (HUE_UPPER_LIMIT / 2))
{
- RgbF_Create(mValue, cValue + mValue, xValue + mValue);
+ RgbF_Create(mValue, cValue + mValue, xValue + mValue, elementIndex);
}
else if (hueValue >= (HUE_UPPER_LIMIT / 2)
&& hueValue < (2 * HUE_UPPER_LIMIT / 3))
{
- RgbF_Create(mValue, xValue + mValue, cValue + mValue);
+ RgbF_Create(mValue, xValue + mValue, cValue + mValue, elementIndex);
}
else if (hueValue >= (2 * HUE_UPPER_LIMIT / 3)
&& hueValue < (5 * HUE_UPPER_LIMIT / 6))
{
- RgbF_Create(xValue + mValue, mValue, cValue + mValue);
+ RgbF_Create(xValue + mValue, mValue, cValue + mValue, elementIndex);
}
else if ((hueValue >= (5 * HUE_UPPER_LIMIT / 6) && hueValue <= HUE_UPPER_LIMIT) || (hueValue == 0))
{
- RgbF_Create(cValue + mValue, mValue, xValue + mValue);
+ RgbF_Create(cValue + mValue, mValue, xValue + mValue, elementIndex);
}
else
{
- RgbF_Create(mValue, mValue, mValue);
+ RgbF_Create(mValue, mValue, mValue, elementIndex);
}
}
}
@@ -1778,5 +2097,5 @@ void Light_UpdateLedValue(MOBLEUINT8 state ,Appli_LightPwmValue_t light_state)
/**
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light.h
index aaa600146..c5bb76ec0 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light.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
@@ -54,6 +54,9 @@ typedef struct
MOBLEUINT16 PresentLightness16;
MOBLEUINT16 PresentTemperature16;
MOBLEINT16 PresentCtlDelta16;
+ MOBLEUINT16 TargetLightness16;
+ MOBLEUINT16 TargetTemperature16;
+ MOBLEINT16 TargetCtlDelta16;
}Appli_Light_CtlSet;
/* Light Ctl Temperature Range Set */
@@ -78,6 +81,9 @@ typedef struct
MOBLEUINT16 HslLightness16;
MOBLEUINT16 HslHueLightness16;
MOBLEUINT16 HslSaturation16;
+ MOBLEUINT16 TargetHslLightness16;
+ MOBLEUINT16 TargetHslHueLightness16;
+ MOBLEUINT16 TargetHslSaturation16;
}Appli_Light_HslSet;
/* Light Hsl Hue set */
@@ -117,80 +123,225 @@ typedef struct
/* Exported Functions Prototypes ---------------------------------------------*/
-MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t*, MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t*,
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
-MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, MOBLEUINT32 pLength);
+MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
-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_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pLight_LightnessDefaultParam,
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Lightness_Last_Status(MOBLEUINT8 const *pLightnessDefault_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessLast_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Lightness_Last_Set(Light_LightnessStatus_t* pLight_LightnessParam,
+ MOBLEUINT8 elementIndex);
+
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetLightnessRangeStatus(MOBLEUINT8* lRangeState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetCtlLightStatus(MOBLEUINT8* lCtlLightState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetCtlTargetStatus(MOBLEUINT8* lCtlLightState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetCtlDefaultStatus(MOBLEUINT8* lCtlDefaultState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslStatus(MOBLEUINT8* lHslState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslTargetStatus(MOBLEUINT8* lHslState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslHueRange(MOBLEUINT8* lHslHueRange,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
void Appli_Light_PwmInit(void);
-void HSL2RGB_Conversion(void);
+void HSL2RGB_Conversion(MOBLEUINT8 elementIndex);
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);
+void RgbF_Create(MOBLEUINT16 value1,
+ MOBLEUINT16 value2,
+ MOBLEUINT16 value3,
+ MOBLEUINT8 elementIndex);
+void Light_UpdateLedValue(MOBLEUINT8 state,
+ Appli_LightPwmValue_t light_state);
+
+/******************************************************************************/
#endif /* __APPLI_LIGHT_H */
+/******************************************************************************/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/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 d7982080a..8556233b3 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_client.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_client.c
@@ -6,7 +6,8 @@
******************************************************************************
* @attention
*
-* <h2><center>&copy; COPYRIGHT(c) 20120 STMicroelectronics</center></h2>
+* <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
@@ -21,6 +22,7 @@
#include "types.h"
#include "appli_generic.h"
#include "appli_light.h"
+#include "appli_light_lc.h"
#include "common.h"
#include "mesh_cfg_usr.h"
#include "appli_nvm.h"
@@ -46,26 +48,392 @@
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
+* @brief Appli_LightClient_API: This function is a Wrapper to call Light Client API depending on opcode received in input
+* @param elementIndex: Index of the element
+* @param msg_opcode: opcode of the desired API
+* @param msg_params: buffer containing the desired API parameters
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_LightClient_Lightness_Set(void)
+MOBLE_RESULT Appli_LightClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8 *msg_params)
{
- MOBLE_ADDRESS elementAddr = 0;
- MOBLEUINT8 pLightnessParam[3];
-
- Appli_IntensityControlPublishing(pLightnessParam);
- LightClient_Lightness_Set_Unack(elementAddr,
- (_Light_LightnessParam*) pLightnessParam,
- sizeof(pLightnessParam) );
-
- return MOBLE_RESULT_SUCCESS;
-}
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+
+ switch(msg_opcode){
+/******************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS
+/******************************************************************************/
+ case LIGHT_LIGHTNESS_GET:
+ {
+ result = LightClient_Lightness_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LIGHTNESS_SET:
+ {
+ result = LightClient_Lightness_Set_Ack(elementIndex,
+ msg_params,
+ (sizeof(Light_LightnessParam_t)-2)); //Remove the size of Linear Lightness params
+ break;
+ }
+ case LIGHT_LIGHTNESS_SET_UNACK:
+ {
+ result = LightClient_Lightness_Set_Unack(elementIndex,
+ msg_params,
+ (sizeof(Light_LightnessParam_t)-2)); //Remove the size of Linear Lightness params
+ break;
+ }
+
+ case LIGHT_LIGHTNESS_LINEAR_GET:
+ {
+ result = LightClient_Lightness_Linear_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LIGHTNESS_LINEAR_SET:
+ {
+ result = LightClient_Lightness_Linear_Set_Ack(elementIndex,
+ msg_params,
+ (sizeof(Light_LightnessParam_t)-2)); //Remove the size of Lightness params
+ break;
+ }
+ case LIGHT_LIGHTNESS_LINEAR_SET_UNACK:
+ {
+ result = LightClient_Lightness_Linear_Set_Unack(elementIndex,
+ msg_params,
+ (sizeof(Light_LightnessParam_t)-2)); //Remove the size of Lightness params
+ break;
+ }
+
+ case LIGHT_LIGHTNESS_DEFAULT_GET:
+ {
+ result = LightClient_Lightness_Default_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LIGHTNESS_DEFAULT_SET:
+ {
+ result = LightClient_Lightness_Default_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_LightnessDefaultParam_t));
+ break;
+ }
+ case LIGHT_LIGHTNESS_DEFAULT_SET_UNACK:
+ {
+ result = LightClient_Lightness_Default_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_LightnessDefaultParam_t));
+ break;
+ }
+
+
+ case LIGHT_LIGHTNESS_RANGE_GET:
+ {
+ result = LightClient_Lightness_Range_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LIGHTNESS_RANGE_SET:
+ {
+ result = LightClient_Lightness_Range_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_LightnessRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+ case LIGHT_LIGHTNESS_RANGE_SET_UNACK:
+ {
+ result = LightClient_Lightness_Range_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_LightnessRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+
+
+/******************************************************************************/
+#endif /* #ifdef ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS */
+/******************************************************************************/
+
+/******************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_CTL
+/******************************************************************************/
+ case LIGHT_CTL_GET:
+ {
+ result = LightClient_Ctl_Get(elementIndex);
+ break;
+ }
+ case LIGHT_CTL_SET:
+ {
+ result = LightClient_Ctl_Set_Ack(elementIndex,
+ msg_params,
+ (sizeof(Light_CtlParam_t)-4) ); //Remove the size of Last_Lightness and Last_Temperature
+ break;
+ }
+ case LIGHT_CTL_SET_UNACK:
+ {
+ result = LightClient_Ctl_Set_Unack(elementIndex,
+ msg_params,
+ (sizeof(Light_CtlParam_t)-4) ); //Remove the size of Last_Lightness and Last_Temperature
+ break;
+ }
+
+ case LIGHT_CTL_TEMPERATURE_GET:
+ {
+ result = LightClient_Ctl_Temperature_Get(elementIndex);
+ break;
+ }
+ case LIGHT_CTL_TEMPERATURE_SET:
+ {
+ result = LightClient_Ctl_Temperature_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlTemperatureParam_t));
+ break;
+ }
+ case LIGHT_CTL_TEMPERATURE_SET_UNACK:
+ {
+ result = LightClient_Ctl_Temperature_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlTemperatureParam_t));
+ break;
+ }
+
+ case LIGHT_CTL_TEMPERATURE_RANGE_GET:
+ {
+ result = LightClient_Ctl_Temperature_Range_Get(elementIndex);
+ break;
+ }
+ case LIGHT_CTL_TEMPERATURE_RANGE_SET:
+ {
+ result = LightClient_Ctl_Temperature_Range_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlTemperatureRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+ case LIGHT_CTL_TEMPERATURE_RANGE_SET_UNACK:
+ {
+ result = LightClient_Ctl_Temperature_Range_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlTemperatureRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+
+ case LIGHT_CTL_DEFAULT_GET:
+ {
+ result = LightClient_Ctl_Default_Get(elementIndex);
+ break;
+ }
+ case LIGHT_CTL_DEFAULT_SET:
+ {
+ result = LightClient_Ctl_Default_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlDefaultParam_t));
+ break;
+ }
+ case LIGHT_CTL_DEFAULT_SET_UNACK:
+ {
+ result = LightClient_Ctl_Default_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlDefaultParam_t));
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_LIGHT_MODEL_CLIENT_CTL */
+/******************************************************************************/
+/******************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_HSL
+/******************************************************************************/
+ case LIGHT_HSL_GET:
+ {
+ result = LightClient_Hsl_Get(elementIndex);
+ break;
+ }
+ case LIGHT_HSL_SET:
+ {
+ result = LightClient_Hsl_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_HslParam_t) );
+ break;
+ }
+ case LIGHT_HSL_SET_UNACK:
+ {
+ result = LightClient_Hsl_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_HslParam_t) );
+ break;
+ }
+
+ case LIGHT_HSL_DEFAULT_GET:
+ {
+ result = LightClient_Hsl_Default_Get(elementIndex);
+ break;
+ }
+ case LIGHT_HSL_DEFAULT_SET:
+ {
+ result = LightClient_Hsl_Default_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_HslDefault_t) );
+ break;
+ }
+ case LIGHT_HSL_DEFAULT_SET_UNACK:
+ {
+ result = LightClient_Hsl_Default_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_HslDefault_t) );
+ break;
+ }
+
+ case LIGHT_HSL_RANGE_GET:
+ {
+ result = LightClient_Hsl_Range_Get(elementIndex);
+ break;
+ }
+ case LIGHT_HSL_RANGE_SET:
+ {
+ result = LightClient_Hsl_Range_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_HslRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+ case LIGHT_HSL_RANGE_SET_UNACK:
+ {
+ result = LightClient_Hsl_Range_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_HslRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+
+ case LIGHT_HSL_HUE_GET:
+ {
+ result = LightClient_Hsl_Hue_Get(elementIndex);
+ break;
+ }
+ case LIGHT_HSL_HUE_SET:
+ {
+ result = LightClient_Hsl_Hue_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_HslHueParam_t));
+ break;
+ }
+ case LIGHT_HSL_HUE_SET_UNACK:
+ {
+ result = LightClient_Hsl_Hue_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_HslHueParam_t));
+ break;
+ }
+
+ case LIGHT_HSL_SATURATION_GET:
+ {
+ result = LightClient_Hsl_Saturation_Get(elementIndex);
+ break;
+ }
+ case LIGHT_HSL_SATURATION_SET:
+ {
+ result = LightClient_Hsl_Saturation_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_HslSaturationParam_t));
+ break;
+ }
+ case LIGHT_HSL_SATURATION_SET_UNACK:
+ {
+ result = LightClient_Hsl_Saturation_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_HslSaturationParam_t));
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_LIGHT_MODEL_CLIENT_HSL */
+/******************************************************************************/
+
+/******************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_LC
+/******************************************************************************/
+ case LIGHT_LC_MODE_GET:
+ {
+ result = LightClient_LC_Mode_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LC_MODE_SET:
+ {
+ result = LightClient_LC_Mode_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_ModeParam_t));
+ break;
+ }
+ case LIGHT_LC_MODE_SET_UNACK:
+ {
+ result = LightClient_LC_Mode_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_ModeParam_t));
+ break;
+ }
+ case LIGHT_LC_OM_GET:
+ {
+ result = LightClient_LC_OM_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LC_OM_SET:
+ {
+ result = LightClient_LC_OM_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_OccupancyModeParam_t));
+ break;
+ }
+ case LIGHT_LC_OM_SET_UNACK:
+ {
+ result = LightClient_LC_OM_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_OccupancyModeParam_t));
+ break;
+ }
+ case LIGHT_LC_ON_OFF_GET:
+ {
+ result = LightClient_LC_OnOff_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LC_ON_OFF_SET:
+ {
+ result = LightClient_LC_OnOff_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_OnOffParam_t));
+ break;
+ }
+ case LIGHT_LC_ON_OFF_SET_UNACK:
+ {
+ result = LightClient_LC_OnOff_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_OnOffParam_t));
+ break;
+ }
+
+ case LIGHT_LC_PROPERTY_GET:
+ {
+ result = LightClient_LC_Property_Get(elementIndex, msg_params);
+ break;
+ }
+ case LIGHT_LC_PROPERTY_SET:
+ {
+ //TODO: Set dynamic data size depending on Property DATA LENTGH: length = 2 + PropertyDataLength
+ result = LightClient_LC_Property_Set_Ack(elementIndex,
+ msg_params,
+ 5);
+ break;
+ }
+ case LIGHT_LC_PROPERTY_SET_UNACK:
+ {
+ //TODO: Set dynamic data size depending on Property DATA LENTGH: length = 2 + PropertyDataLength
+ result = LightClient_LC_Property_Set_Unack(elementIndex,
+ msg_params,
+ 5);
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_LIGHT_MODEL_CLIENT_LC */
+/******************************************************************************/
+ default:
+ {
+ TRACE_M(TF_LIGHT, "OpCode value invalid %d \r\n", msg_opcode);
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+ return result;
+}
/**
* @}
@@ -75,5 +443,5 @@ MOBLE_RESULT Appli_LightClient_Lightness_Set(void)
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/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 a9e0fa708..ba977f2c8 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_client.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_client.h
@@ -31,10 +31,10 @@
/* Exported variables ------------------------------------------------------- */
/* Application Variable-------------------------------------------------------*/
/* Exported Functions Prototypes ---------------------------------------------*/
-MOBLE_RESULT Appli_LightClient_Lightness_Set(void);
+MOBLE_RESULT Appli_LightClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8* msg_params);
#endif /* __APPLI_LIGHT_CLIENT_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/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 a7d123c91..953e880bd 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_lc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_lc.c
@@ -39,138 +39,407 @@
/* Private macro -------------------------------------------------------------*/
/* Private variable ----------------------------------------------------------*/
-Appli_LightLC_Set_t Appli_LightLC_set;
-Appli_Light_LC_PropertySet_t Appli_LightLC_PropertySet;
+__attribute__((aligned(4)))const light_lc_cb_t AppliLightLc_cb =
+{
+ Appli_LightLCs_ModeGet,
+ Appli_LightLCs_ModeSet,
+ Appli_LightLCs_ModeSetUnack,
+ Appli_LightLCs_ModeStatus,
+ Appli_LightLCs_OmGet,
+ Appli_LightLCs_OmSet,
+ Appli_LightLCs_OmSetUnack,
+ Appli_LightLCs_OmStatus,
+ Appli_LightLCs_OnOffGet,
+ Appli_LightLCs_OnOffSet,
+ Appli_LightLCs_OnOffSetUnack,
+ Appli_LightLCs_OnOffStatus,
+ Appli_LightLCs_PropertyGet,
+ Appli_LightLCs_PropertySet,
+ Appli_LightLCs_PropertySetUnack,
+ Appli_LightLCs_PropertyStatus
+};
-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
+ * @brief Callback corresponding to LightLCs_ModeGet_cb
+ * @param Message parameters
+ * @retval None
*/
-MOBLE_RESULT Appli_LightLC_Mode_Set(Light_LC_Param_t* pLight_LC_Param,
- MOBLEUINT8 OptionalValid)
+void Appli_LightLCs_ModeGet(MODEL_MessageHeader_t *pmsgParam)
{
- 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;
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
}
+
/**
-* @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
+ * @brief Callback corresponding to LightLCs_ModeSet_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
*/
-MOBLE_RESULT Appli_LightLC_OM_Set(Light_LC_Param_t* pLight_LC_Param,
- MOBLEUINT8 OptionalValid)
+void Appli_LightLCs_ModeSet(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
{
- 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;
-}
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
+
/**
-* @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
+ * @brief Callback corresponding to LightLCs_ModeSetUnack_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
*/
-MOBLE_RESULT Appli_LightLC_OnOff_Set(Light_LC_Param_t* pLight_LC_Param,
- MOBLEUINT8 OptionalValid)
+void Appli_LightLCs_ModeSetUnack(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
{
- 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;
-}
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
+
/**
-* @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)
+ * @brief Callback corresponding to LightLCs_ModeSatus_cb
+ * @param Message parameters
+ * @retval None
+*/
+void Appli_LightLCs_ModeStatus(MOBLEUINT8 const* pLightLCMode_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+ TRACE_M(TF_LIGHT_LC,"LightLCs_ModeStatus callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8294!\r\n");
+
+ for(i = 0; i < plength; i++)
+ {
+ if(i == 0)
+ TRACE_M(TF_SERIAL_CTRL,"Light LC Mode value: %d\n\r",
+ pLightLCMode_status[i]);
+ }
+}
+
+
+/**
+ * @brief Callback corresponding to LightLCs_OmGet_cb
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_OmGet(MODEL_MessageHeader_t *pmsgParam)
{
- /* 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.
- */
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
- return AmbientLuxLevel;
+
+/**
+ * @brief Callback corresponding to LightLCs_OmSet_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_OmSet(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
+{
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
}
+
/**
-* @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)
+ * @brief Callback corresponding to LightLCs_OmSetUnack_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_OmSetUnack(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
{
- MOBLEUINT16 luxLevel = 0;
- /* User can write their code for the calculation */
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
+
+/**
+ * @brief Callback corresponding to LightLCs_OmStatus_cb
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_OmStatus(MOBLEUINT8 const* pLightLCOccupancyMode_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+ TRACE_M(TF_LIGHT_LC,"LightLCs_OmStatus callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8298!\r\n");
- return luxLevel;
+ for(i = 0; i < plength; i++)
+ {
+ if(i == 0)
+ TRACE_M(TF_SERIAL_CTRL,"Light LC OM value: %d\n\r",
+ pLightLCOccupancyMode_status[i]);
+ }
+}
+
+
+/**
+ * @brief Callback corresponding to LightLCs_OnOffGet_cb
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_OnOffGet(MODEL_MessageHeader_t *pmsgParam)
+{
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
}
+
/**
-* @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
+ * @brief Callback corresponding to LightLC_OnOffSet_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
*/
-MOBLE_RESULT Appli_LightLC_Get_ModeStatus(MOBLEUINT8* plcModeState)
+void Appli_LightLCs_OnOffSet(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
{
- *(plcModeState) = Appli_LightLC_set.LC_mode;
- TRACE_M(TF_SERIAL_CTRL,"Get Mode Status: %d\n\r",
- Appli_LightLC_set.LC_mode);
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
- return MOBLE_RESULT_SUCCESS;
+
+/**
+ * @brief Callback corresponding to LightLCs_OnOffSetUnack_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+*/
+void Appli_LightLCs_OnOffSetUnack(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
+{
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
}
+
/**
-* @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
+ * @brief Callback corresponding to LightLCs_OnOffStatus_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
*/
-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);
+void Appli_LightLCs_OnOffStatus(MOBLEUINT8 const* pLightLCOnOff_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+ TRACE_M(TF_LIGHT_LC,"LightLCs_OnOffStatus callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#829C!\r\n");
- return MOBLE_RESULT_SUCCESS;
+ for(i = 0; i < plength; i++)
+ {
+ if(i == 0)
+ TRACE_M(TF_SERIAL_CTRL,"Light LC OnOff status: %d\n\r",
+ pLightLCOnOff_status[i]);
+ }
+}
+
+
+/**
+ * @brief Callback corresponding to LightLCs_PropertyGet_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+*/
+void Appli_LightLCs_PropertyGet(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
+{
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
}
+
+/**
+ * @brief Callback corresponding to LightLCs_PropertySet_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_PropertySet(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
+{
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
+
+
+/**
+ * @brief Callback corresponding to LightLCs_PropertySetUnack_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_PropertySetUnack(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
+ {
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+ }
+
+
/**
-* @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
+ * @brief Callback corresponding to LightLCs_PropertyStatus_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
*/
-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);
+void Appli_LightLCs_PropertyStatus(MOBLEUINT8 const* pLightLCProperty_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+ TRACE_M(TF_LIGHT_LC,"LightLCs_PropertyStatus callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#64!\r\n");
- return MOBLE_RESULT_SUCCESS;
-}
+ for(i = 0; i < plength; i++)
+ {
+ if(i == 0)
+ TRACE_M(TF_SERIAL_CTRL,"Light LC Property status: %d\n\r",
+ pLightLCProperty_status[i]);
+ }
+}
+
+
+/**
+ * @brief
+ * @param
+ * @retval
+ */
+__weak MOBLE_RESULT Appli_Light_LCs_Init(void)
+ {
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+ MOBLEUINT8 lcsElementIndex = 0;
+
+ /* Extract element index of LC server */
+ result = ExtractLcServerElementIndex(&lcsElementIndex,
+#ifdef APPLICATION_NUMBER_OF_ELEMENTS
+ APPLICATION_NUMBER_OF_ELEMENTS,
+#else
+ 0,
+#endif
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+ ENABLE_LIGHT_MODEL_SERVER_LC,
+ ENABLE_LIGHT_MODEL_SERVER_LC_SETUP,
+#else
+ 0,
+ 0,
+#endif
+#ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF
+ ENABLE_GENERIC_MODEL_SERVER_ONOFF,
+#else
+ 0,
+#endif
+#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF
+ ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF,
+#else
+ 0,
+#endif
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
+ ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS);
+#else
+ 0);
+#endif
+
+ if(MOBLE_SUCCEEDED(result))
+ {
+ result = Light_LCs_Init(&BufferLcServer, lcsElementIndex, &AppliLightLc_cb, SIZE_OF_LC_SERVER_T);
+ }
+
+ if(MOBLE_FAILED(result))
+ {
+ TRACE_M(TF_LIGHT_LC, "Light LC Server init failed\r\n");
+ }
+
+ return result;
+}
+
+
+/**
+ * @brief
+ * @param
+ * @retval
+ */
+__weak MOBLE_RESULT Appli_Light_LC_SensorPropertyUpdate(MOBLEUINT8 elementIndex,
+ MOBLEUINT16 propertyId,
+ MOBLEUINT32 value)
+{
+ return Light_LC_SensorPropertyUpdate(elementIndex,
+ propertyId,
+ value);
+}
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+/**
+ * @brief Handling of serial inputs to LC model
+ * @param serial string
+ * @param serial string size
+ * @retval void
+ */
+void Appli_Light_LC_SerialCmd(char *rcvdStringBuff, uint16_t rcvdStringSize)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_INVALIDARG;
+
+ if (!strncmp(rcvdStringBuff+6, "TR0", 3))
+ {
+ if (rcvdStringSize == 9)
+ {
+ /* call to function corresponding MMDL/SR/LLC/BV-03-C */
+ result = Light_LC_SetTransitionTimeZero(1);
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ BLEMesh_PrintStringCb("Invalid size of string\r\n");
+ }
+ }
+ else if (!strncmp(rcvdStringBuff+6, "OCCUPANCY", 9)) /* occupancy detect */
+ {
+ if (rcvdStringSize == 15)
+ {
+ /* occupancy detected for element index 0 */
+ Appli_Light_LC_SensorPropertyUpdate(0,
+ PRESENCE_DETECTED_PID,
+ 1);
+ result = MOBLE_RESULT_SUCCESS;
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ BLEMesh_PrintStringCb("Invalid size of string\r\n");
+ }
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ /* Check the result of command processing */
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ BLEMesh_PrintStringCb("Success\r\n");
+ }
+ else if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ BLEMesh_PrintStringCb("Fail Out of memory\r\n");
+ }
+ else if(result == MOBLE_RESULT_INVALIDARG)
+ {
+ BLEMesh_PrintStringCb("Fail Invalid Argument\r\n");
+ }
+ else
+ {
+ BLEMesh_PrintStringCb("Fail\r\n");
+ }
+}
+#endif
/**
@@ -181,5 +450,5 @@ MOBLE_RESULT Appli_LightLC_Get_OnOffStatus(MOBLEUINT8* plcOnOffState)
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/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 e9893c5e8..7691992ed 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_lc.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_light_lc.h
@@ -25,43 +25,55 @@
#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);
+void Appli_LightLCs_ModeGet(MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_ModeSet(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_ModeSetUnack(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_ModeStatus(MOBLEUINT8 const* pLightLCMode_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_LightLCs_OmGet(MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OmSet(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OmSetUnack(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OmStatus(MOBLEUINT8 const* pLightLCOccupancyMode_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_LightLCs_OnOffGet(MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OnOffSet(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OnOffSetUnack(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OnOffStatus(MOBLEUINT8 const* pLightLCOnOff_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_LightLCs_PropertyGet(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_PropertySet(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_PropertySetUnack(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_PropertyStatus(MOBLEUINT8 const* pLightLCOccupancyMode_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Light_LCs_Init(void);
+MOBLE_RESULT Appli_Light_LC_SensorPropertyUpdate(MOBLEUINT8 elementIndex,
+ MOBLEUINT16 propertyId,
+ MOBLEUINT32 value);
+void Appli_Light_LC_SerialCmd(char *rcvdStringBuff,
+ uint16_t rcvdStringSize);
#endif /* __APPLI_LIGHT_LC_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_mesh.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_mesh.c
index 9c98a7ab6..f6e6223f9 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_mesh.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_mesh.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
@@ -20,15 +20,18 @@
#include "ble_common.h"
#include "app_conf.h"
#include "hal_common.h"
+#include "ble_mesh.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 "light.h"
+#include "light_lc.h"
+#include "sensors.h"
#include "common.h"
#include "serial_if.h"
#include "appli_nvm.h"
@@ -36,9 +39,16 @@
#include "appli_config_client.h"
#include "appli_generic_client.h"
#include "appli_light_client.h"
+#if ((ENABLE_SENSOR_MODEL_SERVER != 0)||(ENABLE_SENSOR_MODEL_CLIENT != 0))
+#include "appli_sensor.h"
+#include "appli_sensors_client.h"
+#endif
#include "stm32_seq.h"
+#if (( CFG_LPM_SUPPORTED == 0) && (ENABLE_PWM_SUPPORT == 1))
#include "PWM_config.h"
+#include "PWM_handlers.h"
+#endif
#include "mesh_cfg_usr.h"
/** @addtogroup ST_BLE_Mesh
@@ -90,6 +100,7 @@
/* Private variables ---------------------------------------------------------*/
+
enum ButtonState
{
BS_OFF,
@@ -100,12 +111,13 @@ enum ButtonState
enum ButtonState buttonState = BS_OFF;
tClockTime tBounce = 0;
+/*Will be an array aligned with number of elements*/
MOBLEUINT8 Appli_LedState = 0;
MOBLEUINT16 IntensityValue = INTENSITY_LEVEL_ZERO;
MOBLEUINT8 IntensityFlag = FALSE;
MOBLEUINT8 ProxyFlag = 0;
MOBLEUINT8 ProvisionFlag = 0;
-
+MOBLEUINT8 UnprovisionInProgress = 0;
#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
static MOBLEUINT8 PrvngInProcess = 0;
@@ -123,7 +135,7 @@ 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,
+const MOBLEUINT8 StaticOobBuff[SIZE_STATIC_OOB] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
#else
const MOBLEUINT8 StaticOobBuff[] = {0};
@@ -182,6 +194,8 @@ volatile uint8_t BleProcessInit = 0;
MOBLEUINT8 lowPowerNodeApiTimer_Id;
#endif
+MOBLEUINT8 pPropertyId[4];
+
/********************* Application configuration **************************/
#if defined(__GNUC__) || defined(__IAR_SYSTEMS_ICC__) || defined(__CC_ARM)
MOBLEUINT8 bdaddr[8];
@@ -198,7 +212,7 @@ const void *prvsnr_data;
#endif /* __GNUC__ || defined(__IAR_SYSTEMS_ICC__) || defined(__CC_ARM) */
/* Private function prototypes -----------------------------------------------*/
-//static void Appli_LongButtonPress(void);
+static void Appli_LongButtonPress(void);
static void Appli_ShortButtonPress(void);
#if USER_OUTPUT_OOB_APPLI_PROCESS
void Appli_OobAuthenticationProcess(void);
@@ -208,6 +222,9 @@ void Appli_LowPowerProcess(void);
#if (APPLI_OPTIM == 1)
static void AppliMeshTask(void);
#endif
+void Appli_GetPublicationParamsCb(model_publicationparams_t* pPubParameters);
+WEAK_FUNCTION (void SerialPrvn_ProvisioningStatusUpdateCb(uint8_t flagPrvningInProcess,
+ MOBLEUINT16 nodeAddress));
/* Private functions ---------------------------------------------------------*/
@@ -222,7 +239,7 @@ static void Appli_ShortButtonPress(void)
BLEMesh_ModelsCommand();
}
-#if 0
+
/**
* @brief Function calls when a button is pressed for Long duration
* @param void
@@ -230,9 +247,137 @@ static void Appli_ShortButtonPress(void)
*/
static void Appli_LongButtonPress(void)
{
- /* User Implementation */
-}
+ /** GENERIC ONOFF **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API ONOFF GET ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_ON_OFF_GET, NULL);
+
+ /** GENERIC LEVEL **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API LEVEL GET ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_LEVEL_GET, NULL);
+
+ /** GENERIC POWER ONOFF **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API POWER ON OFF GET ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_POWER_ON_OFF_GET, NULL);
+
+ /** GENERIC TRANSITION TIME **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API DEFAULT TRANSITION TIME GET ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_DEFAULT_TRANSITION_TIME_GET, NULL);
+
+ /** LIGHT LIGHTNESS **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_GET, NULL);
+
+ /** LIGHT LIGHTNESS LINEAR **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS LINEAR GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_LINEAR_GET, NULL);
+
+ /** LIGHT LIGHTNESS DEFAULT **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS DEFAULT GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_DEFAULT_GET, NULL);
+
+ /** LIGHT LIGHTNESS RANGE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS RANGE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_RANGE_GET, NULL);
+
+ /** LIGHT LIGHTNESS CTL **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_GET, NULL);
+
+ /** LIGHT LIGHTNESS CTL TEMPERATURE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_GET, NULL);
+
+ /** LIGHT LIGHTNESS CTL TEMPERATURE RANGE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE RANGE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_RANGE_GET, NULL);
+
+ /** LIGHT LIGHTNESS CTL DEFAULT **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL DEFAULT GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_DEFAULT_GET, NULL);
+
+ /** LIGHT LIGHTNESS HSL **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_GET, NULL);
+
+ /** LIGHT LIGHTNESS HSL DEFAULT **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL DEFAULT GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_DEFAULT_GET, NULL);
+
+ /** LIGHT LIGHTNESS HSL RANGE**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL RANGE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_RANGE_GET, NULL);
+
+ /** LIGHT LIGHTNESS HSL HUE**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL HUE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_HUE_GET, NULL);
+
+ /** LIGHT LIGHTNESS HSL SATURATION**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL SATURATION GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_SATURATION_GET, NULL);
+
+ /** LIGHT LC MODE**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC MODE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_MODE_GET, NULL);
+
+ /** LIGHT LC OM**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC OM GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_OM_GET, NULL);
+
+ /** LIGHT LC ON OFF**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC ON OFF GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_ON_OFF_GET, NULL);
+
+ /** LIGHT LC PROPERTY **/
+ //LIGHT_CONTROL_LUX_LEVEL_ON_ID : 0x202B
+ pPropertyId[0]= 0x2B; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pPropertyId[1]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC PROPERTY GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_PROPERTY_GET, pPropertyId);
+
+#if 1 /* Sensor APIs */
+ //PRESENT_AMBIENT_TEMPERATURE_PID : 0x004F
+ pPropertyId[0]= 0x4F; // Property ID byte 0 : Property ID for the sensor
+ pPropertyId[1]= 0x00; // Property ID byte 1 : Property ID for the sensor
+
+ /** SENSOR DESCRIPTOR**/
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR DESCRIPTOR GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_DESCRIPTOR_GET, pPropertyId);
+
+ /** SENSOR CADENCE**/
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR CADENCE GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_CADENCE_GET, pPropertyId);
+
+ /** SENSOR SETTINGS **/
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR SETTINGS GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_SETTINGS_GET, pPropertyId);
+
+ /** SENSOR SETTING **/
+ pPropertyId[2]= 0xAD; // Sensor Setting Property ID byte 0 : Property ID for the sensor setting
+ pPropertyId[3]= 0x00; // Sensor Setting Property ID byte 1 : Property ID for the sensor setting
+
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR SETTING GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_SETTING_GET, pPropertyId);
+
+ /** SENSOR GET **/
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_GET, pPropertyId);
+
+ /** SENSOR COLUMN **/
+// pPropertyId[2]= 0x01; // Raw Value X byte 0 : Raw value identifying a column
+// pPropertyId[3]= 0x00; // Raw Value X byte 1 : Raw value identifying a column
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR COLUMN GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_COLUMN_GET, pPropertyId);
+
+ /** SENSOR SERIES **/
+// pPropertyId[2]= 0x01; // Raw Value X1 byte 0 : Raw value identifying a starting column.
+// pPropertyId[3]= 0x02; // Raw Value X2 byte 0 : Raw value identifying an ending column.
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR SERIES GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_SERIES_GET, pPropertyId);
#endif
+
+ IntensityPublish();
+
+}
/**
* @brief Updates the button status
@@ -250,7 +395,7 @@ static void Appli_UpdateButtonState(int isPressed)
if((t1 - t0) > LONG_PRESS_THRESHOLD)
{
- IntensityPublish();
+ Appli_LongButtonPress();
}
else if((t1 - t0) > BOUNCE_THRESHOLD)
{
@@ -269,6 +414,25 @@ static void Mesh_Task()
BLEMesh_Process();
BLEMesh_ModelsProcess(); /* Models Processing */
+ if((UnprovisionInProgress > 0) &&
+ (!LL_FLASH_IsActiveFlag_OperationSuspended()))
+ {
+ UnprovisionInProgress = 0;
+ AppliNvm_ClearModelState();
+ PalNvmErase(NVM_BASE, 0);
+ PalNvmErase(NVM_BASE, 0x1000);
+ PalNvmErase(APP_NVM_BASE, 0);
+ PalNvmErase(PRVN_NVM_BASE_OFFSET, 0);
+ TRACE_M(TF_PROVISION,"NVM erased\r\n");
+ BLEMesh_Unprovision();
+ AppliNvm_ClearModelState();
+ TRACE_M(TF_PROVISION,"Device is unprovisioned by application \r\n");
+
+ BLEMesh_Process();
+
+ NVIC_SystemReset();
+ }
+
#if (APPLI_OPTIM == 0)
/* Set the task in the scheduler for the next execution */
#if (LOW_POWER_FEATURE == 0)
@@ -501,10 +665,10 @@ void Appli_BleUnprovisionedIdentifyCb(MOBLEUINT8 data)
*/
MOBLEUINT8 Appli_BleSetNumberOfElementsCb(void)
{
- if(NumberOfElements > MAX_NUMB_ELEMENTS)
+ if(NumberOfElements > BLEMesh_GetNumberOfElements())
{
- TRACE_M(TF_MISC,"In version 1.11.00x one Element per node is supported!\r\n");
- return MAX_NUMB_ELEMENTS;
+ TRACE_M(TF_MISC, "Number of Elements enabled in application exceeding from Library Capability!\r\n");
+ return BLEMesh_GetNumberOfElements();
}
else if(NumberOfElements == 0)
@@ -515,7 +679,7 @@ MOBLEUINT8 Appli_BleSetNumberOfElementsCb(void)
else
{
- return NumberOfElements;
+ return NumberOfElements;
}
}
@@ -593,6 +757,8 @@ MOBLEUINT8* Appli_BleInputOOBAuthCb(MOBLEUINT8 size)
while(1)
{
Serial_InterfaceProcess();
+ /* Enable Mesh process working in while loop */
+ BTLE_StackTick();
/* Check if input is completed or timeout */
if((inputOOBDataReady != 0x00) | (inputTimer > INPUT_OOB_TIMEOUT))
{
@@ -715,7 +881,7 @@ void Appli_Unprovision(void)
if(!ProxyFlag)
{
/* No GATT connection */
- BLEMesh_Unprovision();
+ BLEMesh_StopAdvScan();
PalNvmErase(NVM_BASE, 0);
PalNvmErase(NVM_BASE, 0x1000);
@@ -723,6 +889,7 @@ void Appli_Unprovision(void)
PalNvmErase(PRVN_NVM_BASE_OFFSET, 0);
TRACE_M(TF_PROVISION,"NVM erased\r\n");
+ BLEMesh_Unprovision();
AppliNvm_ClearModelState();
TRACE_M(TF_PROVISION,"Device is unprovisioned by application \r\n");
@@ -861,11 +1028,13 @@ SleepModes App_SleepMode_Check(SleepModes sleepMode)
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();
+ BLEMesh_StopAdvScan();
+ UnprovisionInProgress = 1; /* Wait release on FLASH PESD bit */
}
/**
@@ -1233,28 +1402,19 @@ void BLEMesh_CustomBeaconReceivedCallback(const MOBLEUINT8* bdAddr,
if (result == MOBLE_RESULT_SUCCESS)
{
- if ((length-1) < data[0])
+ if (data[1] == CUSTOM_BEACON_AD_TYPE)
{
- result = MOBLE_RESULT_FAIL;
- TRACE_M(TF_BEACON, "Length field does not match with message length \r\n");
- }
- }
+ TRACE_M(TF_BEACON, "Message length(%d), rssi(%d) \r\n", length, rssi);
- 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 */
+ if (TF_BEACON == 1)
+ {
+ TRACE_I(TF_BEACON, "Data: ");
+ for (MOBLEUINT8 count=0; count<length; count++)
+ {
+ TRACE_I(TF_BEACON, "%.2x ", data[count]);
+ }
+ TRACE_I(TF_BEACON, " \r\n");
+ }
}
}
}
@@ -1367,12 +1527,22 @@ void IntensityPublish(void)
{
#ifdef LIGHT_CLIENT_MODEL_PUBLISH
- Appli_LightClient_Lightness_Set();
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS
+ MOBLEUINT8 elementIndex = 0;
+ MOBLEUINT8 pLightnessParam[3];
+ Appli_IntensityControlPublishing(pLightnessParam);
+ Appli_LightClient_API(elementIndex, LIGHT_LIGHTNESS_SET, pLightnessParam);
#endif
+#else
#ifdef GENERIC_CLIENT_MODEL_PUBLISH
- Appli_GenericClient_Level_Set_Unack();
+ MOBLEUINT8 elementIndex = 0;
+ MOBLEUINT8 pGeneric_LevelParam[3];
+
+ Appli_IntensityControlPublishing(pGeneric_LevelParam);
+ Appli_GenericClient_API(elementIndex, GENERIC_LEVEL_SET_ACK, pGeneric_LevelParam);
#endif
+#endif
}
/**
@@ -1387,7 +1557,6 @@ void Appli_Process(void)
AppliNvm_Process();
#endif
- Appli_LowPowerProcess();
#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
if(PrvngInProcess)
{
@@ -1445,6 +1614,17 @@ static void AppliMeshSW1Task(void)
return;
}
+#if (ENABLE_SENSOR_MODEL_SERVER != 0)
+static void AppliMeshSW3Task(void)
+{
+ Sensor_UpdatePublishState(0, 1);
+
+ Appli_Sensor_Update(0, 1);
+
+ return;
+}
+#endif
+
#if (LOW_POWER_FEATURE == 1)
static void LowPowerNodeApiApp(void)
{
@@ -1497,7 +1677,7 @@ void Appli_Init(MOBLEUINT8 *flag)
{
#if 0
#ifdef ENABLE_UNPROVISIONING_BY_POWER_ONOFF_CYCLE
- /* Hardware Factory Restore implementation */
+/* Hardware Factory Restore implementation */
AppliNvm_FactorySettingReset();
#endif
#endif
@@ -1524,6 +1704,18 @@ void Appli_Init(MOBLEUINT8 *flag)
__HAL_RCC_TIM1_CLK_ENABLE();
__HAL_RCC_TIM2_CLK_ENABLE();
PWM_Init();
+#ifdef USER_BOARD_1LED
+ Modify_PWM(SINGLE_LED, 1);
+#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, 1);
+ Modify_PWM(GREEN_LED, 1);
+ Modify_PWM(BLUE_LED, 1);
+#endif
#endif
UTIL_SEQ_RegTask( 1<< CFG_TASK_MESH_SW1_REQ_ID, UTIL_SEQ_RFU, AppliMeshSW1Task );
@@ -1540,8 +1732,36 @@ void Appli_Init(MOBLEUINT8 *flag)
UTIL_SEQ_RegTask( 1<< CFG_TASK_MESH_LPN_REQ_ID, UTIL_SEQ_RFU, LowPowerNodeApiApp );
LPN_scan_enabled = MOBLE_FALSE;
#endif
+#if (ENABLE_SENSOR_MODEL_SERVER != 0)
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_MESH_SW3_REQ_ID, UTIL_SEQ_RFU, AppliMeshSW3Task );
+#endif
}
+/*****************************Config Model Callbacks***************************/
+/**
+* @brief Callback from Config Model to receive the Publication Parameters
+* @param Structure Pointer having parameters - modelID, elementAddress,
+* Publish Address, PublishPeriod, PublishTTL, Credential Flag,
+* Publish AppKeyIndex, Retransmit Count & Restransmit Interval Steps
+* @retval none
+*/
+void Appli_GetPublicationParamsCb(model_publicationparams_t* pPubParameters)
+{
+ if(pPubParameters->modelID == SENSOR_SERVER_MODEL_ID)
+ {
+ Sensor_ModelPublishSet(pPubParameters);
+ }
+}
+
+
+/************************************ Weak linking ***********************************
+If implemented in application, linker would replace weak linking in library */
+WEAK_FUNCTION (void SerialPrvn_ProvisioningStatusUpdateCb(uint8_t flagPrvningInProcess, MOBLEUINT16 nodeAddress))
+{
+
+}
+
+
/**
* @}
*/
@@ -1549,4 +1769,4 @@ void Appli_Init(MOBLEUINT8 *flag)
/**
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_mesh.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_mesh.h
index ad831f2cd..e37bf2ffa 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_mesh.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_mesh.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
@@ -114,13 +114,15 @@ 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);
+void Appli_GetPublicationParamsCb(model_publicationparams_t*);
+MOBLE_RESULT BLEMesh_ScanDevices(neighbor_params_t *unprovDeviceArray, MOBLEUINT8 *noOfUnprovDevices);
+MOBLE_RESULT BLEMesh_ProvisionDevice(neighbor_params_t *unprovDeviceArray, MOBLEUINT16 index);
#endif /* __APPLI_MESH_H */
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
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
index 9e0d28c75..a96a27bc5 100644
--- 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
@@ -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
@@ -77,6 +77,8 @@ extern const void* appNvmBase;
#define FLASH_EMPTY_SIGNATURE 0xFFFFFFFF
+#define RADIO_OFF_DELAY 1000
+
/* Private variables ---------------------------------------------------------*/
typedef struct
@@ -88,6 +90,7 @@ typedef struct
/* ALIGN(4) */
__attribute__((aligned(4))) APPLI_NVM_REQS AppliNvm_Reqs;
+MOBLEUINT16 StopRadioInProgress;
MOBLE_RESULT AppliNvm_EraseRestoreResvNvm(void);
MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
@@ -95,7 +98,8 @@ MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
MOBLEUINT32 totalSubPage,
MOBLEUINT32 nvmBaseOffset);
MOBLE_RESULT AppliNvm_MarkSubpageInvalid(void);
-MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size);
+MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset,
+ void const *buf, MOBLEUINT32 size);
#if 0
/**
@@ -133,7 +137,9 @@ MOBLE_RESULT AppliNvm_FlashErase(uint16_t PageNumber)
* @param Data: word to write
* @retval MOBLE_RESULT_SUCCESS on success
*/
-MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size)
+MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset,
+ void const *buf,
+ MOBLEUINT32 size)
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
@@ -159,7 +165,10 @@ MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUIN
}
else
{
- result = PalNvmWrite(APP_NVM_BASE, offset, buf, size);
+ result = PalNvmWrite(APP_NVM_BASE,
+ offset,
+ buf,
+ size);
}
return result;
@@ -296,8 +305,8 @@ MOBLE_RESULT AppliNvm_FactorySettingReset(void)
/* Load model data copy from nvm */
memcpy((void*)AppliNvm_Reqs.modelData,
- (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(currSubPageIdx) + APP_NVM_GENERIC_MODEL_OFFSET),
- APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE);
+ (void*)(APP_NVM_SUBPAGE_OFFSET(currSubPageIdx)+APP_NVM_GENERIC_MODEL_OFFSET),
+ APP_NVM_MODELDATA_PER_ELEMENT_SIZE);
result = AppliNvm_MarkSubpageInvalid();
@@ -341,7 +350,8 @@ MOBLE_RESULT AppliNvm_FactorySettingReset(void)
* @param model state buff size
* @retval MOBLE_RESULT_SUCCESS on success
*/
-MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state, uint8_t size)
+MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state,
+ uint16_t size)
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS; /* if save model state not defined, return MOBLE_RESULT_FAIL */
@@ -354,7 +364,9 @@ MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state, uint8_t size)
}
else
{
- memcpy(AppliNvm_Reqs.modelData, state, size);
+ memcpy(AppliNvm_Reqs.modelData,
+ state,
+ size);
AppliNvm_Reqs.writeReq = MOBLE_TRUE;
AppliNvm_Reqs.erasePageReq = MOBLE_FALSE;
@@ -379,13 +391,13 @@ MOBLE_RESULT AppliNvm_ClearModelState(void)
#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};
+ MOBLEUINT8 clearBuff[APP_NVM_MODELDATA_PER_ELEMENT_SIZE] = {0};
MOBLEUINT32 valid = 0;
result = AppliNvm_FindFirstEmptyPage(&subPageIdx,
APP_NVM_SUBPAGE_SIZE,
APP_NVM_MAX_SUBPAGE,
- (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
if (MOBLE_FAILED(result))
{
@@ -434,7 +446,8 @@ MOBLE_RESULT AppliNvm_ClearModelState(void)
* @param model state buff size
* @retval MOBLE_RESULT_SUCCESS on success
*/
-MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint8_t* size)
+MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[],
+ uint16_t* size)
{
#if (SAVE_MODEL_STATE_NVM == 1)
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
@@ -463,8 +476,10 @@ MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint8_t* size)
memcpy((void*)AppliNvm_Reqs.modelData,
(void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(currSubPageIdx-1) + APP_NVM_GENERIC_MODEL_OFFSET),
APP_NVM_GENERIC_MODEL_SIZE + APP_NVM_LIGHT_MODEL_SIZE);
- memcpy((void*)state, (void*)(AppliNvm_Reqs.modelData), APP_NVM_MODEL_SIZE);
- *size = APP_NVM_MODEL_SIZE;
+ memcpy((void*)state,
+ (void*)(AppliNvm_Reqs.modelData),
+ APP_NVM_MODEL_SIZE);
+ *size = APP_NVM_MODEL_SIZE;
}
}
return result;
@@ -487,41 +502,47 @@ void AppliNvm_Process(void)
uint8_t reserveAreaCopy[APP_NVM_RESERVED_SIZE];
/* Erase if required */
- if (AppliNvm_Reqs.erasePageReq == MOBLE_TRUE)
+ if ((AppliNvm_Reqs.erasePageReq == MOBLE_TRUE) &&
+ (!LL_FLASH_IsActiveFlag_OperationSuspended()))
{
- /* save reserve flash area */
- memcpy((void*)reserveAreaCopy, (void*)APP_NVM_BASE, APP_NVM_RESERVED_SIZE);
-
- result = PalNvmErase(APP_NVM_BASE, 0);
-
- if(result == MOBLE_RESULT_OUTOFMEMORY)
+ if(StopRadioInProgress == 0)
{
- AppliNvm_Reqs.erasePageReq = MOBLE_TRUE;
+ /* save reserve flash area */
+ memcpy((void*)reserveAreaCopy,
+ (void*)APP_NVM_BASE,
+ APP_NVM_RESERVED_SIZE);
+
+ TRACE_M(TF_PROVISION,"Erase flash page\r\n");
+ result = PalNvmErase(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);
+ 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;
+ }
+ 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);
+ 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;
+ result = AppliNvm_FlashProgram(0,
+ (uint32_t*)&reserveAreaCopy,
+ APP_NVM_RESERVED_SIZE);
+ BLEMesh_ResumeAdvScan();
}
}
+ else
+ StopRadioInProgress--;
}
- if (AppliNvm_Reqs.erasePageReq == MOBLE_FALSE
- && AppliNvm_Reqs.writeReq == MOBLE_TRUE)
+ if (AppliNvm_Reqs.erasePageReq == MOBLE_FALSE &&
+ AppliNvm_Reqs.writeReq == MOBLE_TRUE)
{
result = AppliNvm_FindFirstEmptyPage(&subPageIdx,
APP_NVM_SUBPAGE_SIZE,
@@ -530,11 +551,14 @@ void AppliNvm_Process(void)
if(result == MOBLE_RESULT_OUTOFMEMORY)
{
+ BLEMesh_SuspendAdvScan();
+ StopRadioInProgress = RADIO_OFF_DELAY;
+
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;
+ result = MOBLE_RESULT_SUCCESS;
}
else
{
@@ -637,6 +661,85 @@ MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
return result;
}
+#if 0
+MOBLE_RESULT AppliNVM_Save_FlashTesting(MOBLEUINT8 *buffer,
+ MOBLEUINT16 buffer_size)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+ uint8_t reserveAreaCopy[APP_NVM_RESERVED_SIZE];
+ MOBLEINT16 subPageIdx;
+
+ for(MOBLEUINT8 count = 0;count <= buffer_size;count++)
+ {
+ buffer[count] = count;
+ }
+
+ /* save reserve flash area */
+ memcpy((void*)reserveAreaCopy,
+ (void*)APP_NVM_BASE,
+ APP_NVM_RESERVED_SIZE);
+
+ result = AppliNvm_FlashErase((uint16_t)((APP_NVM_BASE - RESET_MANAGER_FLASH_BASE_ADDRESS) / PAGE_SIZE));
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ /* restore reserve area */
+// FLASH_ProgramWordBurst(APP_NVM_BASE, (uint32_t*)reserveAreaCopy);
+ result = AppliNvm_FlashProgram(0,
+ (uint32_t*)&reserveAreaCopy,
+ APP_NVM_RESERVED_SIZE);
+ }
+
+ result = AppliNvm_FindFirstEmptyPage(&subPageIdx,
+ APP_NVM_SUBPAGE_SIZE,
+ APP_NVM_MAX_SUBPAGE,
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
+
+ if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ TRACE_M(TF_PROVISION, "Flash sub page is full, preparing new subpage\r\n");
+ }
+ else
+ {
+ result = AppliNvm_FlashProgram(APP_NVM_SUBPAGE_OFFSET(subPageIdx)+APP_NVM_GENERIC_MODEL_OFFSET,
+ buffer,
+ buffer_size);
+ }
+ return result;
+}
+
+MOBLE_RESULT AppliNVM_Retrieve_FlashTesting(MOBLEUINT8 *buffer,
+ MOBLEUINT16 buffer_size)
+{
+ MOBLEINT16 currSubPageIdx;
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+
+ result = AppliNvm_FindFirstEmptyPage(&currSubPageIdx,
+ APP_NVM_SUBPAGE_SIZE,
+ APP_NVM_MAX_SUBPAGE,
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
+
+ if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ TRACE_M(TF_PROVISION," Can not find the empty page for testing flash \r\n");
+ }
+ else
+ {
+ memcpy((void*)buffer,
+ (void*)(APP_NVM_SUBPAGE_OFFSET(currSubPageIdx)+APP_NVM_GENERIC_MODEL_OFFSET),
+ buffer_size);
+
+ result = AppliNvm_MarkSubpageInvalid();
+
+ if (MOBLE_FAILED(result))
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+
+ return result;
+}
+#endif
/**
* @}
@@ -645,4 +748,4 @@ MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
/**
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 34667f26c..65fd789d7 100644
--- 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
@@ -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
@@ -55,9 +55,9 @@ typedef struct
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_SaveModelState(uint8_t* state, uint16_t size);
MOBLE_RESULT AppliNvm_ClearModelState(void);
-MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint8_t* size);
+MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint16_t* size);
void AppliNvm_Process(void);
void AppliNvm_SaveMessageParam (void);
MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
@@ -85,8 +85,13 @@ void AppliPrvnNvm_SaveProvisionerDevKey(MOBLEUINT8 *data ,
void AppliPrvnNvm_SaveKeys (MOBLEUINT8 status);
+MOBLE_RESULT AppliNVM_Save_FlashTesting(MOBLEUINT8 *buffer,
+ MOBLEUINT16 buffer_size);
+MOBLE_RESULT AppliNVM_Retrieve_FlashTesting(MOBLEUINT8 *buffer,
+ MOBLEUINT16 buffer_size);
+
#endif /* __APPLI_NVM_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensor.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensor.c
index 7c164b49e..c6bed93c0 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensor.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensor.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
@@ -21,9 +21,10 @@
#include "hal_common.h"
#include "types.h"
+#include "sensor_cfg_usr.h"
#include "sensors.h"
-#include "light_lc.h"
#include "appli_sensor.h"
+#include "appli_light_lc.h"
#include "mesh_cfg.h"
//#include "LPS25HB.h"
#include "string.h"
@@ -38,13 +39,49 @@
* @{
*/
-/* Private typedef -----------------------------------------------------------*/
-/* Private define ------------------------------------------------------------*/
+MOBLE_RESULT Appli_Sensor_ValueSet(MOBLEUINT8 sensorOffset,
+ MOBLEUINT32 value);
+
+/* Private variables ---------------------------------------------------------*/
+
+/* ALIGN(4) */
+__attribute__((aligned(4)))const sensor_server_init_params_t SensorServerInitParams = SENSOR_SERVER_INIT_PARAMS;
+
+/* ALIGN(4) */
+__attribute__((aligned(4)))const sensor_server_cb_t AppliSensor_cb =
+{
+ /* Sensor Model callbacks */
+ Appli_Sensor_CadenceGet,
+ Appli_Sensor_CadenceSet,
+ Appli_Sensor_CadenceSetUnack,
+ Appli_Sensor_SettingsGet,
+ Appli_Sensor_SettingGet,
+ Appli_Sensor_SettingSet,
+ Appli_Sensor_SettingSetUnack,
+ Appli_Sensor_DescriptorGet,
+ Appli_Sensor_Get,
+ Appli_Sensor_ColumnGet,
+ Appli_Sensor_SeriesGet,
+ Appli_Sensor_ReadDescriptor,
+ Appli_Sensor_ReadValue,
+ Appli_Sensor_ReadColumn,
+ Appli_Sensor_ReadSeries,
+ Appli_Sensor_IsFastCadence,
+ Appli_Sensor_IsStatusTrigger,
+ Appli_Sensor_Descriptor_Status,
+ Appli_Sensor_Cadence_Status,
+ Appli_Sensor_Settings_Status,
+ Appli_Sensor_Setting_Status,
+ Appli_Sensor_Status,
+ Appli_Sensor_Column_Status,
+ Appli_Sensor_Series_Status
+};
+
#if 0
/**
-* @brief PRESSURE init structure definition
-*/
-PRESSURE_InitTypeDef InitStructure =
+ * @brief Pressure sensor init
+ */
+__attribute__((aligned(4)))const PRESSURE_InitTypeDef Lps25InitParams =
{
LPS25HB_ODR_1Hz,
LPS25HB_BDU_READ,
@@ -55,44 +92,19 @@ PRESSURE_InitTypeDef InitStructure =
};
#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[3];
-
-/* By Default value used for cadence set for testing. */
-Sensor_CadenceSet_t Sensor_CadenceSet[NUMBER_OF_SENSOR];
-
-/*
-{
- {0x0071 , 0x2 , 2 , 2 ,2 ,1 ,0X05 , 0x64},
- {0x2A6D , 0x2 , 1 , 1 , 1, 1, 0X258 , 0x3ED},
- {0X2A7F ,0x2,1,1,1,0,0x10, 0x20}
-};*/
-
-
-#endif
-
-MODEL_Property_IDTableParam_t Property_ID_Table[NUMBER_OF_SENSOR] =
-{
- {TEMPERATURE_PID},
- {PRESSURE_PID},
- {TIME_OF_FLIGHT_PID}
-};
+/**
+ * @brief Variables for people
+ */
+MOBLEUINT8 AppliSensorReadFromSensor = 0; /* Used for PTS testing */
+MOBLEUINT8 PresentTemperatureValue = 0;
+MOBLEUINT8 PreviousTemperatureValue = 0;
MOBLEUINT8 Occupancy_Flag = MOBLE_FALSE;
extern MOBLEUINT8 NumberOfElements;
extern MOBLEUINT8 ProvisionFlag;
MOBLEUINT8 Sensor_Setting_Access = 0x01 ;
+MOBLEUINT32 PresentPeopleCount = 0;
+MOBLEUINT32 PreviousPeopleCount = 0;
-
-
-/* Temperature and Pressure init structure*/
-#if 0
- PRESSURE_DrvTypeDef* xLPS25HBDrv = &LPS25HBDrv;
-#endif
-
-/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/******************************************************************************/
@@ -101,792 +113,909 @@ MOBLEUINT8 Sensor_Setting_Access = 0x01 ;
/**
-* @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
+ * @brief Callback corresponding to Sensor_CadenceGet_cb
+ * @param Cadence parameters
+* @retval None
*/
-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 if( property_ID == (MOBLEUINT16) TIME_OF_FLIGHT_PID)
- {
- Sensor_CadenceSet[2].Property_ID = pCadence_param->Property_ID;
- Sensor_CadenceSet[2].FastCadenceDevisor = pCadence_param->FastCadenceDevisor ;
- Sensor_CadenceSet[2].StatusTriggerType = pCadence_param->StatusTriggerType ;
- Sensor_CadenceSet[2].triggerDeltaDown = pCadence_param->triggerDeltaDown;
- Sensor_CadenceSet[2].triggerDeltaUp = pCadence_param->triggerDeltaUp;
- Sensor_CadenceSet[2].StatusMinInterval = pCadence_param->StatusMinInterval;
- Sensor_CadenceSet[2].FastCadenceLow = pCadence_param->FastCadenceLow;
- Sensor_CadenceSet[2].FastCadenceHigh = pCadence_param->FastCadenceHigh;
- }
-
- return MOBLE_RESULT_SUCCESS;
+void Appli_Sensor_CadenceGet(sensor_CadenceCbParam_t* pCadenceParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pCadenceParam->property_ID, elementIndex, peerAddr, dstPeer);
}
+
/**
-* @brief Appli_Sensor_Cadence_Get: This function is callback for Application
-* when sensor cadence Set message is received
-* @param pCadence_get: 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
+ * @brief Callback corresponding to Sensor_CadenceSet_cb
+ * @param Cadence parameters
+* @retval None
*/
-
-MOBLE_RESULT Appli_Sensor_Cadence_Get(MOBLEUINT8* sensor_DataCadence,
- MOBLEUINT16 property_ID, MOBLEUINT32 length)
+void Appli_Sensor_CadenceSet(sensor_CadenceCbParam_t* pCadenceParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
- return MOBLE_RESULT_SUCCESS;
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pCadenceParam->property_ID, elementIndex, peerAddr, dstPeer);
}
-/**
-* @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,MOBLEUINT16 prop_ID)
-{
-
- for(int i=0;i< NUMBER_OF_SENSOR;i++)
- {
- if(prop_ID == Property_ID_Table[i].Property_ID)
- {
- Appli_Sensor_SettingSet[i].Property_ID = pSensor_SettingParam->Property_ID;
-
- Appli_Sensor_SettingSet[i].Sensor_Setting_ID = pSensor_SettingParam->Sensor_Setting_ID;
- Appli_Sensor_SettingSet[i].Sensor_Setting_Access = Sensor_Setting_Access;
- Appli_Sensor_SettingSet[i].Sensor_Setting_Value = pSensor_SettingParam->Sensor_Setting_Value;
- }
- }
- return MOBLE_RESULT_SUCCESS;
+/**
+ * @brief Callback corresponding to Sensor_CadenceSetUnack_cb
+ * @param Cadence parameters
+* @retval None
+*/
+void Appli_Sensor_CadenceSetUnack(sensor_CadenceCbParam_t* pCadenceParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pCadenceParam->property_ID, elementIndex, peerAddr, dstPeer);
}
-
/**
-* @brief Appli_Sensor_Data_Status: This function is callback for Application
-* when Sensor Get message is received
-* @param sensor_Data: Pointer to buffer to be updated with parameters
-* @param pLength: Length of the parameters to be sent in response
-* @param prop_ID: Property Id of requested sensor (optional)
-* @param length: Received data length
-* @retval MOBLE_RESULT
+ * @brief Callback corresponding to Sensor_SettingsGet_cb
+ * @param Setting parameters
+* @retval None
*/
-MOBLE_RESULT Appli_Sensor_Data_Status(MOBLEUINT8* sensor_Data ,
- MOBLEUINT32* pLength,
- MOBLEUINT16 prop_ID ,
- MOBLEUINT32 length)
+void Appli_Sensor_SettingsGet(sensor_SettingsCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
- MOBLE_RESULT result = MOBLE_RESULT_FALSE;
- MOBLEUINT32 temperatureData = 0;
- MOBLEUINT32 pressureData = 0;
- MOBLEUINT8 data_Length = 0x03;
- MOBLEUINT32 distance = 0x000000C8; // 200 cm
- MOBLEUINT8 data_Length_UnknownID;
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pSettingParam->propertyId, elementIndex, peerAddr, dstPeer);
+}
-#if 0
- LPS25HB_GetTemperature((float*)&temperatureData);
-
- LPS25HB_GetPressure((float*)&pressureData);
-#endif
-
- result = Check_Property_ID(Property_ID_Table , prop_ID);
-
- if(result == MOBLE_RESULT_SUCCESS && length > 0)
- {
- if((prop_ID == TEMPERATURE_PID )) /* format A */
- {
- /*(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))
- {
- /* 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))
- {
- /* 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(length == 0)
- {
- /*(prop_Id_Temp & 0x07) << 5) | (Len <<1) Format A
- Property calculation is done like above line
+/**
+ * @brief Callback corresponding to Sensor_SettingGet_cb
+ * @param Setting parameters
+* @retval None
*/
- *(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);
+void Appli_Sensor_SettingGet(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pSettingParam->property_ID, elementIndex, peerAddr, dstPeer);
+}
- *pLength =20;
- }
- else
- {
-// *(sensor_Data+0) = (MOBLEUINT8)prop_ID ;
-// *(sensor_Data+1) = (MOBLEUINT8)(prop_ID >> 8);
-//
-// *pLength =2;
-
- data_Length_UnknownID = 0x0F;
- if(prop_ID < 0x0800)
- {
- *(sensor_Data) = ((prop_ID & 0x07) << 5) | (data_Length_UnknownID << 1) ;
- *(sensor_Data+1) = (prop_ID >> 3) & 0xFF;
-
- *pLength=2;
- }
- else
- {
- *(sensor_Data+0) = 0xFF; //((data_Length <<1) | 0x01) & 0x00;
- *(sensor_Data+1) = (MOBLEUINT8)prop_ID ;
- *(sensor_Data+2) = (MOBLEUINT8)(prop_ID >> 8);
+/**
+ * @brief Callback corresponding to Sensor_SettingSet_cb
+ * @param Setting parameters
+* @retval None
+*/
+void Appli_Sensor_SettingSet(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pSettingParam->property_ID, elementIndex, peerAddr, dstPeer);
+}
- *pLength = 3;
- }
- }
- //*plength=0;
- }
-
- 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 Callback corresponding to Sensor_SettingSetUnack_cb
+ * @param Setting parameters
+* @retval None
+*/
+void Appli_Sensor_SettingSetUnack(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pSettingParam->property_ID, elementIndex, peerAddr, dstPeer);
}
/**
-* @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
+ * @brief Callback corresponding to Sensor_DescriptorGet_cb
+ * @param Descriptor parameters
+* @retval None
*/
-MOBLE_RESULT Appli_Sensor_Descriptor_Status(MOBLEUINT8* sensor_Descriptor ,
- MOBLEUINT32* pLength,MOBLEUINT16 prop_ID ,
- MOBLEUINT32 length)
+void Appli_Sensor_DescriptorGet(MOBLEUINT8 prop_ID,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
- Appli_Sensor_DescriptorStatus_t Appli_Sensor_DescriptorStatus1[] =
+ if(length == 0)
{
- {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;
- MOBLE_RESULT result = MOBLE_RESULT_FALSE;
- result = Check_Property_ID(Property_ID_Table , prop_ID);
-
- if (result != MOBLE_RESULT_FALSE )
+ TRACE_M(TF_SENSOR, "Sensor Descriptor data for all sensors on element index %X peer addr %X, dst peer %X\r\n",
+ elementIndex, peerAddr, dstPeer);
+ }
+ else
{
- if(prop_ID == TEMPERATURE_PID)
- {
- 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;
- *pLength = 8;
- }
- else if(prop_ID == PRESSURE_PID)
- {
- tolerance = Appli_Sensor_DescriptorStatus1[1].NegativeTolerance;
- tolerance = (tolerance << 12 ) | Appli_Sensor_DescriptorStatus1[1].PositiveTolerance ;
-
- *(sensor_Descriptor) = Appli_Sensor_DescriptorStatus1[1].Prop_ID;
- *(sensor_Descriptor+1) = Appli_Sensor_DescriptorStatus1[1].Prop_ID >> 8;
- *(sensor_Descriptor+2) = tolerance;
- *(sensor_Descriptor+3) = tolerance >> 8;
- *(sensor_Descriptor+4) = tolerance >> 16;
- *(sensor_Descriptor+5) = Appli_Sensor_DescriptorStatus1[1].SamplingFunction;
- *(sensor_Descriptor+6) = Appli_Sensor_DescriptorStatus1[1].MeasurementPeriod;
- *(sensor_Descriptor+7) = Appli_Sensor_DescriptorStatus1[1].UpdateInterval;
- *pLength =8;
- }
- else if(prop_ID == TIME_OF_FLIGHT_PID)
- {
- tolerance = Appli_Sensor_DescriptorStatus1[2].NegativeTolerance;
- tolerance = (tolerance << 12 ) | Appli_Sensor_DescriptorStatus1[2].PositiveTolerance ;
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X, dst peer %X\r\n",
+ prop_ID, elementIndex, peerAddr, dstPeer);
+ }
+}
- *(sensor_Descriptor) = Appli_Sensor_DescriptorStatus1[2].Prop_ID;
- *(sensor_Descriptor+1) = Appli_Sensor_DescriptorStatus1[2].Prop_ID >> 8;
- *(sensor_Descriptor+2) = tolerance;
- *(sensor_Descriptor+3) = tolerance >> 8;
- *(sensor_Descriptor+4) = tolerance >> 16;
- *(sensor_Descriptor+5) = Appli_Sensor_DescriptorStatus1[2].SamplingFunction;
- *(sensor_Descriptor+6) = Appli_Sensor_DescriptorStatus1[2].MeasurementPeriod;
- *(sensor_Descriptor+7) = Appli_Sensor_DescriptorStatus1[2].UpdateInterval;
- *pLength =8;
- }
+/**
+ * @brief Callback corresponding to Sensor_Get_cb
+ * @param Get parameters
+* @retval None
+*/
+void Appli_Sensor_Get(MOBLEUINT16 prop_ID,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ if(length == 0)
+ {
+ TRACE_M(TF_SENSOR, "Sensor Data for all sensors on element index %X peer addr %X dst peer %X\r\n",
+ elementIndex, peerAddr, dstPeer);
}
- else
+ else
{
- if(length ==0 )
- {
- 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;
- }
- else if(prop_ID != 0x0000)
- {
- *(sensor_Descriptor) = prop_ID >> 8;
- *(sensor_Descriptor+1) = prop_ID;
- *pLength = 2;
- }
- else
- {
-
- }
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X \r\n",
+ prop_ID, elementIndex, peerAddr, dstPeer);
}
+}
+
- // }
- //else if(result == MOBLE_RESULT_FALSE && length >0)
- //{
- // *(sensor_Descriptor) = prop_ID >> 8;
- // *(sensor_Descriptor+1) = prop_ID;
- // *pLength = 2;
- //}
- //else
- //{
- //
- //}
- return MOBLE_RESULT_SUCCESS;
+/**
+ * @brief Callback corresponding to Sensor_ColumnGet_cb
+ * @param Column parameters
+* @retval None
+*/
+void Appli_Sensor_ColumnGet(sensor_ColumnCbParams_t* pColumnParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pColumnParam->propertyId, elementIndex, peerAddr, dstPeer);
}
-MOBLE_RESULT Appli_Sensor_Column_Status(MOBLEUINT8* sensor_Column , MOBLEUINT32* pLength,MOBLEUINT16 prop_ID , MOBLEUINT32 length)
+/**
+ * @brief Callback corresponding to Sensor_SeriesGet_cb
+ * @param Series parameters
+* @retval None
+*/
+void Appli_Sensor_SeriesGet(sensor_SeriesCbParams_t* pSeriesParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
+ TRACE_M(TF_SENSOR, "Property ID %X Raw Value X1 %d Raw Value X2 %d\r\n",
+ pSeriesParam->propertyId,
+ pSeriesParam->rawValueX1,
+ pSeriesParam->rawValueX2);
+}
+
+
+/**
+ * @brief Callback corresponding to Sensor_ReadDescriptor_cb
+ * Update SENSORX descriptor identified by sensorOffset
+ * Read from application to optimize RAM
+ * @param Sensor offset in sensor init structure
+ * @param descriptor parameters
+ * @retval Fail if sensor doesn't exist or property ID mismatch occurrs
+ * else Success
+ */
+MOBLE_RESULT Appli_Sensor_ReadDescriptor(MOBLEUINT8 sensorOffset,
+ sensor_DescriptorCbParams_t* pDescriptorParams)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ const sensor_init_params_t* pSensorInitParams = NULL;
- Sensor_Column_param_t Appli_Sensor_ColumnStatus[]=
- {
- {PRESSURE_PID,0xD9AF,0xDE03,0x0405},
- {TEMPERATURE_PID,0xacd2,0x3456,0x6537},
- {TIME_OF_FLIGHT_PID,0x8248,0xDE03,0x0405}
- };
-
- MOBLEUINT8 flag = 0;
-
- for(int i=0;i< NUMBER_OF_SENSOR ;i++)
+ if (sensorOffset < SensorServerInitParams.sensorsCount)
{
- if(prop_ID == Appli_Sensor_ColumnStatus[i].Property_ID)
+ pSensorInitParams = &(SensorServerInitParams.sensorInitParams[sensorOffset]);
+
+ if (pSensorInitParams->propertyId != pDescriptorParams->propertyId)
{
- flag = 1;
- *sensor_Column= Appli_Sensor_ColumnStatus[i].Property_ID;
- *(sensor_Column+1) = Appli_Sensor_ColumnStatus[i].Property_ID>>8;
-
- *(sensor_Column+2)=Appli_Sensor_ColumnStatus[i].RawValueX;
- *(sensor_Column+3)=Appli_Sensor_ColumnStatus[i].RawValueX;
-
-
- *(sensor_Column+4)=Appli_Sensor_ColumnStatus[i].RawValueWidth;
- *(sensor_Column+5)=Appli_Sensor_ColumnStatus[i].RawValueWidth;
-
- *(sensor_Column+6)=Appli_Sensor_ColumnStatus[i].RawValueY;
- *(sensor_Column+7)=Appli_Sensor_ColumnStatus[i].RawValueY;
- *pLength = 8;
- break;
+ result = MOBLE_RESULT_FAIL;
+ }
+ else
+ {
+ /* */
}
}
-
- if(flag == 0)
+ else
{
- *pLength =4;
+ result = MOBLE_RESULT_FAIL;
}
- return MOBLE_RESULT_SUCCESS;
+ if (pSensorInitParams != NULL &&
+ pDescriptorParams != NULL)
+ {
+ pDescriptorParams->positiveTolerance = pSensorInitParams->positiveTolerance;
+ pDescriptorParams->negativeTolerance = pSensorInitParams->negativeTolerance;
+ pDescriptorParams->samplingFunction = pSensorInitParams->samplingFunction;
+ pDescriptorParams->measurementPeriod = pSensorInitParams->measurementPeriod;
+ pDescriptorParams->updateInterval = pSensorInitParams->updateInterval;
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ return result;
}
-MOBLE_RESULT Appli_Sensor_Series_Status(MOBLEUINT8* sensor_Series , MOBLEUINT32* pLength,MOBLEUINT16 prop_ID , MOBLEUINT32 length)
+/**
+ * @brief Callback corresponding to Sensor_ReadValue_cb
+ * Read sensor value and update buffer
+ * data length <= 128
+ * PreviousTemperatureValue, PresentTemperatureValue to be updated
+ * everytime sensor value is changed and call to Sensor_UpdateCadence
+ * @param Sensor offset in sensor init structure
+ * @param Value parameters
+ * @retval Fail if sensor doesn't exist
+ * else Success
+ */
+MOBLE_RESULT Appli_Sensor_ReadValue(MOBLEUINT8 sensorOffset,
+ sensor_ValueCbParams_t* pValueParams)
{
- Sensor_Series_param_t Appli_Sensor_SeriesStatus[NUMBER_OF_SENSOR]=
- {
- {PRESSURE_PID,{{0xabcd,0x73ac,0xcdef},{0xacd2,0x2345,0x1234}}},
- {TEMPERATURE_PID,{{0x00C1,0x0071,0x00DE},{0x0003,0x0004,0x0005}}},
- {TIME_OF_FLIGHT_PID,{{0x4528,0xbad3,0xdc12},{0xacd2,0x2345,0x1234}}}
- };
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+// PRESSURE_StatusTypeDef tempStatus = PRESSURE_OK;
+ MOBLEINT16 temp = 0;
+ MOBLEINT8 temperature8 = 0;
+ float pressure = 0;
- for(int i=0;i<NUMBER_OF_SENSOR;i++)
+ /* sensor offset exist */
+ if (sensorOffset < SensorServerInitParams.sensorsCount)
{
- if( prop_ID == Appli_Sensor_SeriesStatus[i].Property_ID )
+ if (sensorOffset == 0) /* Present Ambient Temperature */
{
+ if(AppliSensorReadFromSensor == 0) /* Normal mode */
+ {
+ /* Temperature, Temperature8 format, M=1, d=0, b=-1 */
+// tempStatus = LPS25HB_I2C_ReadRawTemperature(&temp);
+// if (tempStatus == PRESSURE_OK)
+ {
+ TRACE_M(TF_SENSOR, "Temperature sensor raw value %d\r\n" , temp);
+
+ /* Convert temperature raw value to Temperature8 format */
+ temp = (temp/240) + 85;
+
+ if (temp < -64*2)
+ {
+ temp = -64*2;
+ }
+ else if (temp > 63.5*2)
+ {
+ temp = 63.5*2;
+ }
+
+ temperature8 = temp;
+
+ pValueParams->data[0] = (MOBLEUINT8)temperature8;
+
+ if (pValueParams->data[0] == 0xFF)
+ {
+ /* 0xFF is unknown but here it is -1
+ -1 is approximated to 0 */
+ pValueParams->data[0] = 0x00;
+ }
+
+ TRACE_M(TF_SENSOR, "Temperature8 raw value %d, actual value %f\r\n",
+ temperature8, (float)temperature8/2);
+ }
+#if 0
+ else /* error */
+ {
+ pValueParams->data[0] = 0xFF;
+ }
+#endif
+ }
+ else /* Value not to be read from sensor */
+ {
+ pValueParams->data[0] = PresentTemperatureValue;
+ }
+ }
+ else if (sensorOffset == 1) /* Pressure */
+ {
+// tempStatus = LPS25HB_GetPressure(&pressure);
+// if (tempStatus == PRESSURE_OK)
+ {
+ TRACE_M(TF_SENSOR, "Pressure sensor value %f mbar\r\n" , pressure);
- *sensor_Series= Appli_Sensor_SeriesStatus[i].Property_ID;
- *(sensor_Series+1) = Appli_Sensor_SeriesStatus[i].Property_ID>>8;
- for(int y=0 ;y < SENSOR_SERIES_VALUE ;y++)
+ memcpy(pValueParams->data, (void*)&pressure, 4);
+ }
+#if 0
+ else /* error */
{
- *(sensor_Series+2+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawValueX>>8;
- *(sensor_Series+3+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawValueX;
- *(sensor_Series+4+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawColumnWidth>>8;
- *(sensor_Series+5+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawColumnWidth;
- *(sensor_Series+6+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawValueY>>8;
- *(sensor_Series+7+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawValueY;
+ memset(pValueParams->data, 0, 4);
}
- *pLength = 2 + 6*SENSOR_SERIES_VALUE ;
- break;
+#endif
}
}
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
-return MOBLE_RESULT_SUCCESS ;
-
+ return result;
}
-
+
#endif
+
/**
-* @brief Sensor Process Function will continuously monitor the sensors.
-* Function used for the Publishing, data monitoring..
-* @param void
-* @retval void
+ * @brief Callback corresponding to Appli_Sensor_Cadence_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
*/
-void Sensor_Process(void)
+void Appli_Sensor_Cadence_Status(const MOBLEUINT8 *pCadence,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
+ MOBLEUINT8 i;
-#ifdef ENABLE_SENSOR_PUBLICATION
- float sensorValue[NUMBER_OF_SENSOR];
- if(ProvisionFlag == 1)
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Cadence_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_CADENCE_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
{
- Read_Sensor_Data(&sensorValue[0]);
- Sensor_Publication_Process(&sensorValue[0], &Property_ID_Table[0]);
+ TRACE_M(TF_SERIAL_CTRL,"Cadence value: %d\n\r", pCadence[i]);
}
-#endif
+}
+
+
+/**
+ * @brief Callback corresponding to Appli_Sensor_Settings_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
+*/
+void Appli_Sensor_Settings_Status(const MOBLEUINT8 *pSettings,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Settings_Status callback received \r\n");
- /* 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)
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_SETTINGS_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
{
- 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;
- }
- }
+ TRACE_M(TF_SERIAL_CTRL,"Settings value: %d\n\r", pSettings[i]);
+ }
}
-
+
+
/**
-* @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)
+ * @brief Callback corresponding to Appli_Sensor_Setting_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
+*/
+void Appli_Sensor_Setting_Status(const MOBLEUINT8 *pSetting,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
- MOBLEUINT8 occupancyData = 0x1;
- MOBLEUINT8 sensor_Data[5];
- MOBLE_ADDRESS srcAdd;
- MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 i;
- sensor_Data[1] = (MOBLEUINT8)(PRESENCE_DETECTED_PROPERTY << 8);
- sensor_Data[0] = (MOBLEUINT8)PRESENCE_DETECTED_PROPERTY;
- sensor_Data[2] = occupancyData;
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Setting_Status callback received \r\n");
- srcAdd = BLEMesh_GetAddress();
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_SETTING_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
+ {
+ TRACE_M(TF_SERIAL_CTRL,"Setting value: %d\n\r", pSetting[i]);
+ }
+}
+
+
+/**
+ * @brief Callback corresponding to Appli_Sensor_Descriptor_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
+*/
+void Appli_Sensor_Descriptor_Status(const MOBLEUINT8 *pDescriptor,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
- result = BLEMesh_SetRemotePublication(SENSOR_SERVER_MODEL_ID, srcAdd ,
- SENSOR_STATUS ,
- sensor_Data,3,
- MOBLE_FALSE, MOBLE_FALSE);
-
- if(result)
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Descriptor_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_DESCRIPTOR_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
{
- TRACE_M(TF_LIGHT_LC,"Publication Error \r\n");
+ TRACE_M(TF_SERIAL_CTRL,"Descriptor value: %d\n\r", pDescriptor[i]);
}
-
}
-
-#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
+ * @brief Callback corresponding to Appli_Sensor_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
*/
-void Read_Sensor_Data(float *pSensorValue)
+void Appli_Sensor_Status(const MOBLEUINT8 *pStatus,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#if 0
- float temp,press;
- LPS25HB_GetTemperature(&temp);
- pSensorValue[0] = temp;
- LPS25HB_GetPressure(&press);
- pSensorValue[1] = press;
-#endif
+ MOBLEUINT8 i;
+
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
+ {
+ TRACE_M(TF_SERIAL_CTRL,"Status value: %d\n\r", pStatus[i]);
+ }
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+ Appli_Light_LC_SensorPropertyUpdate(elementIndex,
+ PRESENCE_DETECTED_PID,
+ (MOBLEUINT32) pStatus[length-1]);
+#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)
+ * @brief Callback corresponding to Appli_Sensor_Column_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
+*/
+void Appli_Sensor_Column_Status(const MOBLEUINT8 *pColumn,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
- 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};
+ MOBLEUINT8 i;
- floatToInt(pSensorData[sensor_Count], &out_value, 2);
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Column_Status callback received \r\n");
- /* Taking the timestamp for the cadence publication and making flag high */
- if(PublishingDataFlag[sensor_Count].CadenceDurationFlag == MOBLE_FALSE)
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_COLUMN_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
{
- cadenceDurationTick[sensor_Count] = Clock_Time();
- PublishingDataFlag[sensor_Count].CadenceDurationFlag = MOBLE_TRUE;
+ TRACE_M(TF_SERIAL_CTRL,"Column Status value: %d\n\r", pColumn[i]);
}
- /* 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))
+}
+
+
+/**
+ * @brief Callback corresponding to Appli_Sensor_Series_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
+*/
+void Appli_Sensor_Series_Status(const MOBLEUINT8 *pSeries,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Series_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_SERIES_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
{
- 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++;
- }
+ TRACE_M(TF_SERIAL_CTRL,"Series Status value: %d\n\r", pSeries[i]);
}
- else
+}
+
+
+/**
+ * @brief Callback corresponding to Sensor_ReadColumn_cb
+ * Fill column width and raw valye Y in data buffer
+ * data length <= 8
+ * @param Sensor offset in sensor init structure
+ * @param Series column parameters
+ * @retval Fail if sensor doesn't exist
+ * else Success
+*/
+MOBLE_RESULT Appli_Sensor_ReadColumn(MOBLEUINT8 sensorOffset,
+ MOBLEUINT8 columnOffset,
+ sensor_ColumnCbParams_t* pColumnParams)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ const sensor_init_params_t* pSensorInitParams = NULL;
+ MOBLEUINT8 dataLength = 0;
+ MOBLEUINT8* data = pColumnParams->data;
+
+ if (sensorOffset < SensorServerInitParams.sensorsCount)
{
- publishTime = SENSOR_PUBLISH_PERIOD ;
+ pSensorInitParams = &(SensorServerInitParams.sensorInitParams[sensorOffset]);
- 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)
+ /* fill sensor column data */
+ memcpy(data+dataLength,
+ &(pSensorInitParams->seriesColumn[columnOffset].columnWidth),
+ pSensorInitParams->dataLength);
+ dataLength = pSensorInitParams->dataLength;
+
+ memset(data+dataLength, 0xAA, pSensorInitParams->dataLength);
+ dataLength += pSensorInitParams->dataLength;
+
+ pColumnParams->dataLength = dataLength;
+ }
+ else
{
- sensor_Count = 0;
+ result = MOBLE_RESULT_FAIL;
}
-
+
+ return result;
}
+
/**
-* @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)
+ * @brief Callback corresponding to Sensor_ReadSeries_cb
+ * Fill sensor series state for all columns between and including X1 and X2
+ * Series data to be concatenated in triplet of raw value X, column width and raw value Y
+ * X[n] CW[n] Y[n] X[n+1] CW[n+1] Y[n+1] ...
+ * data length should be less than minimum of 379 or max application packet length supported
+ * @param Sensor offset in sensor init structure
+ * @param Series parameters
+ * @retval Fail if sensor doesn't exist
+ * else Success
+ */
+MOBLE_RESULT Appli_Sensor_ReadSeries(MOBLEUINT8 sensorOffset,
+ sensor_SeriesCbParams_t* pSeriesParams)
{
- MOBLEUINT32 length;
- MOBLEUINT8 sensor_Data[8];
- MOBLE_ADDRESS srcAdd;
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ const sensor_init_params_t* pSensorInitParams = NULL;
+ MOBLEUINT16 dataLength = 0;
+ MOBLEUINT8* data = pSeriesParams->data;
- srcAdd = BLEMesh_GetAddress();
-
- switch(*pProp_ID)
+ if (sensorOffset < SensorServerInitParams.sensorsCount)
{
- 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:
+ pSensorInitParams = &(SensorServerInitParams.sensorInitParams[sensorOffset]);
+
+ for (MOBLEUINT8 count=0; count<pSensorInitParams->seriesCount; count++)
+ {
+ /* fill sensor series data */
+ if (pSensorInitParams->seriesColumn[count].rawX >= pSeriesParams->rawValueX1 &&
+ pSensorInitParams->seriesColumn[count].rawX <= pSeriesParams->rawValueX2)
{
- /* 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(data+dataLength,
+ &(pSensorInitParams->seriesColumn[count].rawX),
+ pSensorInitParams->dataLength);
+ dataLength += pSensorInitParams->dataLength;
+ memcpy(data+dataLength,
+ &(pSensorInitParams->seriesColumn[count].columnWidth),
+ pSensorInitParams->dataLength);
+ dataLength += pSensorInitParams->dataLength;
+ memset(data+dataLength, 0xAA, pSensorInitParams->dataLength);
+ dataLength += pSensorInitParams->dataLength;
- memcpy(&sensor_Data[3],(void*)&pSensor_Value[0],4);
- length =7;
- break;
+ pSeriesParams->dataLength = dataLength;
}
- case TIME_OF_FLIGHT_PID:
+ else
{
- sensor_Data[0] = ((0x03 <<1) | 0x01);
- sensor_Data[1] = (MOBLEUINT8)TIME_OF_FLIGHT_PID ;
- sensor_Data[2] = (MOBLEUINT8)(TIME_OF_FLIGHT_PID >> 8);
-
- memcpy(&sensor_Data[3],(void*)&pSensor_Value[0],4);
- length =7;
- break;
+ /* */
}
- default:
- break;
+ }
}
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ return result;
+}
- result = BLEMesh_SetRemotePublication(SENSOR_SERVER_MODEL_ID, srcAdd,
- SENSOR_STATUS ,
- sensor_Data,length,
- MOBLE_FALSE, MOBLE_FALSE);
- if(result)
+/**
+ * @brief Callback corresponding to Sensor_IsFastCadence_cb
+ * To check if fast cadence to be used for current sensor state
+ * @param Sensor offset in sensor init structure
+ * @param Fast Cadence Low
+ * @param Fast Cadence High
+ * @retval Trigger status
+ */
+MOBLEUINT8 Appli_Sensor_IsFastCadence(MOBLEUINT8 sensorOffset,
+ void* pFastCadenceLow,
+ void* pFastCadenceHigh)
+{
+ MOBLEUINT8 fastCadenceStatus = 0;
+ MOBLEUINT32 fastCadenceLow = *((MOBLEUINT32*)pFastCadenceLow);
+ MOBLEUINT32 fastCadenceHigh = *((MOBLEUINT32*)pFastCadenceHigh);
+ MOBLEUINT32 sensorValue = PresentTemperatureValue;
+
+ if (sensorOffset == 0)
+ {
+ if (fastCadenceLow <= fastCadenceHigh)
+ {
+ fastCadenceStatus = sensorValue >= fastCadenceLow &&
+ sensorValue <= fastCadenceHigh;
+ }
+ else
+ {
+ fastCadenceStatus = sensorValue > fastCadenceLow ||
+ sensorValue < fastCadenceHigh;
+ }
+}
+ else
{
- TRACE_M(TF_SENSOR,"Publication Error \r\n");
+ /* Implmented only for sensor at offset 0 */
}
+ return fastCadenceStatus;
}
-#endif
-#ifdef ENABLE_SENSOR_MODEL_SERVER
-#if 0
/**
-* @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
+ * @brief Callback corresponding to Sensor_IsStatusTrigger_cb
+ * To check if sensor change in sensor state (delta) is more than
+ * given trigger state value
+ * delta up values
+ * @param Sensor offset in sensor init structure
+ * @param Trigger type -> value or percent change
+ * @param Status trigger delta down
+ * @param Status trigger delta up
+ * @retval Trigger status
*/
-/*
-MOBLE_RESULT Appli_Sensor_GetSettingStatus(MOBLEUINT8* pSetting_Status)
+MOBLEUINT8 Appli_Sensor_IsStatusTrigger(MOBLEUINT8 sensorOffset,
+ status_trigger_type_e triggerType,
+ void* pDeltaDown,
+ void* pDeltaUp)
{
+ const sensor_init_params_t* pSensorInitParams = NULL;
+ MOBLEUINT8 triggerStatus = 0;
+ MOBLEUINT32 deltaDown = *((MOBLEUINT32*)pDeltaDown);
+ MOBLEUINT32 deltaUp = *((MOBLEUINT32*)pDeltaUp);
+ status_trigger_delta_e statusTriggerDelta;
+ MOBLEUINT32 delta;
- *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;
-}*/
-#endif
+ if (sensorOffset == 0)
+ {
+ if (PresentTemperatureValue < PreviousTemperatureValue)
+ {
+ /* status trigger delta down */
+ statusTriggerDelta = STATUS_TRIGGER_DELTA_DOWN;
+ delta = PreviousTemperatureValue - PresentTemperatureValue;
-/**
-* @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
-*/
+ TRACE_M(TF_SENSOR, "Delta down value %ld\r\n", delta);
+ }
+ else
+ {
+ /* status trigger delta up */
+ statusTriggerDelta = STATUS_TRIGGER_DELTA_UP;
+ delta = PresentTemperatureValue - PreviousTemperatureValue;
-MOBLE_RESULT Appli_Sensor_GetSetting_IDStatus(MOBLEUINT8* pSetting_Status , MOBLEUINT16 prop_ID)
-{
- for(int i=0 ;i<NUMBER_OF_SENSOR;i++)
- {
- if(prop_ID == Appli_Sensor_SettingSet[i].Property_ID)
+ TRACE_M(TF_SENSOR, "Delta up value %ld\r\n", delta);
+ }
+
+ if (triggerType == STATUS_TRIGGER_TYPE_PC)
{
- *pSetting_Status = Appli_Sensor_SettingSet[i].Property_ID;
- *(pSetting_Status+1) = Appli_Sensor_SettingSet[i].Property_ID >> 8;
- *(pSetting_Status+2) = Appli_Sensor_SettingSet[i].Sensor_Setting_ID;
- *(pSetting_Status+3) = Appli_Sensor_SettingSet[i].Sensor_Setting_ID >> 8;
- *(pSetting_Status+4) = Appli_Sensor_SettingSet[i].Sensor_Setting_Access;
-
- if(Appli_Sensor_SettingSet[i].Sensor_Setting_Access == 0x03)
+ pSensorInitParams = &(SensorServerInitParams.sensorInitParams[sensorOffset]);
+
+ if (pSensorInitParams->valuesRange != 0)
{
- *(pSetting_Status+5) = Appli_Sensor_SettingSet[i].Sensor_Setting_Value;
- *(pSetting_Status+6) = Appli_Sensor_SettingSet[i].Sensor_Setting_Value >> 8;
+ /* change delta to percentage change (of 0.01 % steps) */
+ delta = (MOBLEUINT32)((delta*10000)/pSensorInitParams->valuesRange);
}
else
{
-
+ triggerStatus = 0;
}
}
- }
- return MOBLE_RESULT_SUCCESS;
+ if ((statusTriggerDelta == STATUS_TRIGGER_DELTA_DOWN && delta >= deltaDown) ||
+ (statusTriggerDelta == STATUS_TRIGGER_DELTA_UP && delta >= deltaUp))
+ {
+ triggerStatus = 1;
+ }
+ else
+ {
+ triggerStatus = 0;
+ }
+ }
+
+ return triggerStatus;
}
+
+
+/**
+* @brief Initialize hardware interfaces for sensors and mesh sensor model structures
+* Sensor init parameters to be defined in sensor_cfg_usr.h
+* Sensors are initialized in the order as defined in sensor_cfg_usr.h
+ * LPS25HB supports pressure and temperature sensor
+* @param void
+ * @retval
+ */
+MOBLE_RESULT Appli_Sensor_Init(void)
+ {
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+// PRESSURE_StatusTypeDef lps25Status;
+
+ /* Hardware interface initialization */
+#ifndef CUSTOM_BOARD_PWM_SELECTION
+// PRESSURE_StatusTypeDef tempStatus;
+// PRESSURE_StatusTypeDef pressStatus;
+// int16_t temperature;
+// int32_t pressure;
+
+#if 0
+ /* Initiallization of sensors */
+ lps25Status = LPS25HB_Init((PRESSURE_InitTypeDef*)(&Lps25InitParams));
+
+ if (lps25Status != PRESSURE_OK)
+ {
+ TRACE_M(TF_SENSOR, "Error initializing LPS25HB. status (%d)\r\n", lps25Status);
+ }
+
+ tempStatus = LPS25HB_I2C_ReadRawTemperature(&temperature);
+ pressStatus = LPS25HB_I2C_ReadRawPressure(&pressure);
+ if (tempStatus == PRESSURE_OK &&
+ pressStatus == PRESSURE_OK)
+ {
+ /* TRACE_M(TF_SENSOR, "Raw temperature (%d) and raw pressure (%d)\r\n",
+ temperature, pressure); */
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR, "Error reading LPS25HB at init\r\n");
+ }
+#endif
+
+#else
+ TRACE_M(TF_SENSOR, "LPS25HB not initialized\r\n");
#endif
+ /* initialize sensor server model */
+ result = SensorServer_Init(&BufferSensorServer,
+ &AppliSensor_cb,
+ TOTAL_SENSOR_SERVER_BUFF_SIZE,
+ &SensorServerInitParams);
+
+ if(MOBLE_FAILED(result))
+ {
+ TRACE_M(TF_SENSOR, "Sensor Server init failed\r\n");
+ }
+
+ return result;
+ }
+
+
/**
-* @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)
+ * @brief Handling of serial inputs to sensor model
+ * @param Sensor offset in sensor init structure
+ * @param Sensor value
+ * @retval void
+ */
+MOBLE_RESULT Appli_Sensor_Update(MOBLEUINT8 sensorOffset, MOBLEUINT32 value)
{
- MOBLE_RESULT result = MOBLE_RESULT_FALSE;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ AppliSensorReadFromSensor = 1;
+
+ /* Update previous with current and current with new */
+ PreviousTemperatureValue = PresentTemperatureValue;
+ PresentTemperatureValue = (MOBLEUINT8)value;
- for(MOBLEUINT8 i=0; i<NUMBER_OF_SENSOR; i++)
+ /* To update cadence parameters
+ results in either status trigger or (and) fast cadence based on change and present
+ Application may decide not to update cadence parameters if senosr value is changing
+ very frequently in some cases to save bandwidth */
+ if (PresentTemperatureValue != PreviousTemperatureValue)
{
- if(prop_ID_Table[i].Property_ID == prop_ID)
- {
- result = MOBLE_RESULT_SUCCESS;
- break;
- }
- }
+ result = Sensor_UpdateCadence(sensorOffset,
+ SensorServerInitParams.sensorInitParams[0].elementIdx,
+ SensorServerInitParams.sensorInitParams[0].propertyId);
+ }
return result;
-}
+ }
+
/**
-* @brief Appli_Sensor_Init: This function is callback for Initialisation of
-* Application interface
-* @param void
-* @retval MOBLE_RESULT
-*/
-MOBLE_RESULT Appli_Sensor_Init(void)
+ * @brief Handling of serial inputs to sensor model
+ * Appli_Sensor_SerialCmd can be used for testing periodic publishing and
+ * triggered publishing with PTS
+ * @param serial string
+ * @param serial string size
+ * @retval void
+ */
+void Appli_Sensor_SerialCmd(char *rcvdStringBuff, uint16_t rcvdStringSize)
{
-#if 0
- LPS25HB_Init(&InitStructure);
-#endif
- return MOBLE_RESULT_SUCCESS;
+ MOBLE_RESULT result = MOBLE_RESULT_INVALIDARG;
+ MOBLEUINT16 value = 0;
+ MOBLEUINT8 sensorOffset = 0;
+
+ if (!strncmp(rcvdStringBuff+6, "SETV", 4))
+ {
+ if (rcvdStringSize == 15)
+ {
+ sscanf(rcvdStringBuff+11, "%4hx", &value);
+
+ /* Set SENSOR1 value at offset 0 */
+ result = Appli_Sensor_Update(sensorOffset, value);
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ BLEMesh_PrintStringCb("Invalid size of string\r\n");
+ }
+ }
+ else if (!strncmp(rcvdStringBuff+6, "PUBLISH", 7))
+ {
+ if (rcvdStringSize == 17)
+ {
+ sscanf(rcvdStringBuff+14, "%1hx", &value);
+
+ sensorOffset = value;
+
+ sscanf(rcvdStringBuff+16, "%1hx", &value);
+
+ /* Enable / Disable publishing of sensor as identified by sensor offset */
+ if(value == 0) /* Disable */
+ {
+ result = Sensor_UpdatePublishState(sensorOffset, 0);
+ }
+ else /* Enable */
+ {
+ result = Sensor_UpdatePublishState(sensorOffset, 1);
+ }
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ BLEMesh_PrintStringCb("Invalid size of string\r\n");
+ }
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ /* Check the result of command processing */
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ BLEMesh_PrintStringCb("Success\r\n");
+ }
+ else if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ BLEMesh_PrintStringCb("Fail Out of memory\r\n");
+ }
+ else if(result == MOBLE_RESULT_INVALIDARG)
+ {
+ BLEMesh_PrintStringCb("Fail Invalid Argument\r\n");
+ }
+ else
+ {
+ BLEMesh_PrintStringCb("Fail\r\n");
+ }
}
@@ -898,5 +1027,5 @@ MOBLE_RESULT Appli_Sensor_Init(void)
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensor.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensor.h
index 5e94fc344..613d14df5 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensor.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensor.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
@@ -23,118 +23,118 @@
/* 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;
- MOBLEUINT8 FastCadenceLow;
- MOBLEUINT8 FastCadenceHigh;
- // float FastCadenceLow;
-// float FastCadenceHigh;
-}Sensor_CadenceSet_t;
-
-typedef struct
-{
- MOBLEUINT16 Property_ID;
- MOBLEUINT16 RawValueX;
- MOBLEUINT16 RawValueWidth;
- MOBLEUINT16 RawValueY;
-}Sensor_Column_param_t;
-
-/* Sensor Series */
-struct Sensor_SeriesData
-{
- MOBLEUINT16 RawValueX;
- MOBLEUINT16 RawColumnWidth;
- MOBLEUINT16 RawValueY;
-};
-
-typedef struct
-{
- MOBLEUINT16 Property_ID;
- struct Sensor_SeriesData SeriesData[SENSOR_SERIES_VALUE];
-}Sensor_Series_param_t ;
-
-#pragma pack(4)
-
-MOBLE_RESULT Appli_Sensor_Cadence_Set(Sensor_CadenceParam_t* pCadence_param,
- MOBLEUINT16 property_ID,
- MOBLEUINT32 length);
-MOBLE_RESULT Appli_Sensor_Cadence_Get(MOBLEUINT8* sensor_DataCadence,
- 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,
- MOBLEUINT16 prop_ID,
- MOBLEUINT32 length);
-MOBLE_RESULT Appli_Sensor_Setting_Set(Sensor_SettingParam_t* pSensor_SettingParam,
- MOBLEUINT8 OptionalValid,
- MOBLEUINT16 prop_ID);
-MOBLE_RESULT Appli_Sensor_Series_Status(MOBLEUINT8* sensor_Series,
- MOBLEUINT32* pLength,
- MOBLEUINT16 prop_ID,
- MOBLEUINT32 length);
-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,
- MOBLEUINT16 prop_ID);
+#include "sensors.h"
+#include "mesh_cfg.h"
+
+/* Exported functions ------------------------------------------------------- */
+void Appli_Sensor_CadenceGet(sensor_CadenceCbParam_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_CadenceSet(sensor_CadenceCbParam_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_CadenceSetUnack(sensor_CadenceCbParam_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_SettingsGet(sensor_SettingsCbParams_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_SettingGet(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_SettingSet(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_SettingSetUnack(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_DescriptorGet(MOBLEUINT8 pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Get (MOBLEUINT16 prop_ID,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_ColumnGet(sensor_ColumnCbParams_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_SeriesGet(sensor_SeriesCbParams_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Sensor_ReadDescriptor(MOBLEUINT8 sensorOffset,
+ sensor_DescriptorCbParams_t* pDescriptorParams);
+MOBLE_RESULT Appli_Sensor_ReadValue(MOBLEUINT8 sensorOffset,
+ sensor_ValueCbParams_t* pValueParams);
+MOBLE_RESULT Appli_Sensor_ReadColumn(MOBLEUINT8 sensorOffset,
+ MOBLEUINT8 columnOffset,
+ sensor_ColumnCbParams_t* pColumnParams);
+MOBLE_RESULT Appli_Sensor_ReadSeries(MOBLEUINT8 sensorOffset,
+ sensor_SeriesCbParams_t* pSeriesParams);
+MOBLEUINT8 Appli_Sensor_IsFastCadence(MOBLEUINT8 sensorOffset,
+ void* pFastCadenceLow,
+ void* pFastCadenceHigh);
+MOBLEUINT8 Appli_Sensor_IsStatusTrigger(MOBLEUINT8 sensorOffset,
+ status_trigger_type_e triggerType,
+ void* pDeltaDown,
+ void* pDeltaUp);
MOBLE_RESULT Appli_Sensor_Init(void);
-void Sensor_Process(void);
-void Sensor_LC_Light_Publish(void);
-
+//void Appli_Sensor_SerialCmd(char *rcvdStringBuff, uint16_t rcvdStringSize);
+MOBLE_RESULT Appli_Sensor_Update(MOBLEUINT8 sensorOffset, MOBLEUINT32 value);
+
+void Appli_Sensor_Descriptor_Status(const MOBLEUINT8 *pDescriptor,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Cadence_Status(const MOBLEUINT8 *pCadence,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Settings_Status(const MOBLEUINT8 *pSettings,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Setting_Status(const MOBLEUINT8 *pSetting,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Status(const MOBLEUINT8 *pStatus,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Column_Status(const MOBLEUINT8 *pColumn,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Series_Status(const MOBLEUINT8 *pSeries,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Sensor_Update(MOBLEUINT8 sensorOffset,
+ MOBLEUINT32 value);
+void Appli_Sensor_SerialCmd(char *rcvdStringBuff,
+ uint16_t rcvdStringSize);
#endif /* __APPLI_SENSOR_H */
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensors_client.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensors_client.c
new file mode 100644
index 000000000..aecf584d4
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensors_client.c
@@ -0,0 +1,153 @@
+/**
+******************************************************************************
+* @file appli_sensors_client.c
+* @author BLE Mesh Team
+* @brief Application interface for Generic Mesh Models
+******************************************************************************
+* @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 "hal_common.h"
+#include "types.h"
+#include "appli_sensor.h"
+#include "appli_light.h"
+#include "common.h"
+#include "mesh_cfg_usr.h"
+#include "appli_nvm.h"
+#include "appli_mesh.h"
+#include "sensors_client.h"
+#include "appli_sensors_client.h"
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+
+
+/* Private functions ---------------------------------------------------------*/
+/**
+* @brief Appli_SensorsClient_API: This function is a Wrapper to call Sensors Client API depending on opcode received in input
+* @param elementIndex: Index of the element
+* @param msg_opcode: opcode of the desired API
+* @param msg_params: buffer containing the desired API parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_SensorsClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8 *msg_params)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+ switch(msg_opcode){
+/******************************************************************************/
+#ifdef ENABLE_SENSOR_MODEL_CLIENT
+/******************************************************************************/
+ case SENSOR_DESCRIPTOR_GET:
+ {
+ result = SensorsClient_Descriptor_Get(elementIndex, msg_params);
+ break;
+ }
+ case SENSOR_CADENCE_GET:
+ {
+ result = SensorsClient_Cadence_Get(elementIndex, msg_params);
+ break;
+ }
+ case SENSOR_CADENCE_SET:
+ {
+ //TODO: Set dynamic data size depending on Sensor DATA LENTGH: length = 4 + 4 + 2* SensorDataLength
+ result = SensorsClient_Cadence_Set(elementIndex,
+ msg_params,
+ 10); //(sizeof(sensor_CadenceCbParam_t)-3));
+ break;
+ }
+ case SENSOR_CADENCE_SET_UNACK:
+ {
+ //TODO: Set dynamic data size depending on Sensor DATA LENTGH: length = 4 + 4 + 2 * SensorDataLength
+ result = SensorsClient_Cadence_Set_Unack(elementIndex,
+ msg_params,
+ 10); //(sizeof(sensor_CadenceCbParam_t)-3));
+ break;
+ }
+ case SENSOR_SETTINGS_GET:
+ {
+ result = SensorsClient_Settings_Get(elementIndex, msg_params);
+ break;
+ }
+
+ case SENSOR_SETTING_GET:
+ {
+ result = SensorsClient_Setting_Get(elementIndex, msg_params, sizeof(sensor_SettingsCbParams_t));
+ break;
+ }
+ case SENSOR_SETTING_SET:
+ {
+ //TODO: Set dynamic data size depending on Sensor DATA LENTGH: length = 4 + SensorDataLength
+ result = SensorsClient_Setting_Set(elementIndex,
+ msg_params,
+ 6);
+ break;
+ }
+ case SENSOR_SETTING_SET_UNACK:
+ {
+ //TODO: Set dynamic data size depending on Sensor DATA LENTGH: length = 4 + SensorDataLength
+ result = SensorsClient_Setting_Set_Unack(elementIndex,
+ msg_params,
+ 6);
+ break;
+ }
+ case SENSOR_GET:
+ {
+ result = SensorsClient_Get(elementIndex, msg_params);
+ break;
+ }
+ case SENSOR_COLUMN_GET:
+ {
+ result = SensorsClient_Column_Get(elementIndex, msg_params, 4);
+ break;
+ }
+ case SENSOR_SERIES_GET:
+ {
+ result = SensorsClient_Series_Get(elementIndex, msg_params, 4);
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_SENSOR_MODEL_CLIENT */
+/******************************************************************************/
+
+
+ default:
+ {
+ TRACE_M(TF_SENSOR, "OpCode value invalid %d \r\n", msg_opcode);
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+ return result;
+}
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensors_client.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensors_client.h
new file mode 100644
index 000000000..431b5c691
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensors_client.h
@@ -0,0 +1,42 @@
+/**
+******************************************************************************
+* @file appli_sensor_client.h
+* @author BLE Mesh Team
+* @brief Application interface for Sensor Mesh Models
+******************************************************************************
+* @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 __APPLI_SENSOR_CLIENT_H
+#define __APPLI_SENSOR_CLIENT_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "sensors.h"
+#include "mesh_cfg.h"
+
+
+/* Exported macro ------------------------------------------------------------*/
+/* Exported variables ------------------------------------------------------- */
+/* Application Variable-------------------------------------------------------*/
+/* Exported Functions Prototypes ---------------------------------------------*/
+MOBLE_RESULT Appli_ConfigClient_Set(void);
+MOBLE_RESULT Appli_SensorsClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8 *msg_params);
+
+
+
+
+#endif /* __APPLI_SENSOR_CLIENT_H */
+
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_vendor.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_vendor.c
index 38004a61d..55a67d8a2 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_vendor.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_vendor.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
@@ -30,23 +30,34 @@
#include "mesh_cfg.h"
#include <string.h>
-
-/** @addtogroup MODEL_VENDOR
+/** @addtogroup ST_BLE_Mesh
* @{
*/
-/** @addtogroup Vendor_Model_Callbacks
+/** @addtogroup Application_Mesh_Models
* @{
*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
+typedef struct
+{
+ MOBLE_ADDRESS dst;
+ MOBLEUINT8 data[VENDOR_DATA_BUFFER_SIZE];
+ MOBLEUINT32 length;
+ MOBLEUINT8 elementIndex;
+} APPLI_SEND_BIG_DATA_PACKET;
+
/* Private variables ---------------------------------------------------------*/
-MOBLEUINT8 ResponseBuffer[VENDOR_DATA_BYTE];
+MOBLEUINT8 ResponseBuffer[VENDOR_DATA_BUFFER_SIZE];
MOBLEUINT16 BuffLength;
+APPLI_SEND_BIG_DATA_PACKET Appli_VendorBigData;
+
+/*Variable to enable OTA for received vendor command*/
extern MOBLEUINT8 Appli_LedState;
extern uint16_t DUTY;
+extern MOBLEUINT8 NumberOfElements;
MOBLEUINT32 TestHitCounter = 0;
extern Appli_LightPwmValue_t Appli_LightPwmValue;
@@ -268,18 +279,17 @@ MOBLE_RESULT Appli_Vendor_Test(MOBLEUINT8 const *data, MOBLEUINT32 length)
* @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
+* @param elementIndex : selected element where '0' is first element
* @retval MOBLE_RESULT status of result
*/
MOBLE_RESULT Appli_Vendor_LEDControl( MOBLEUINT8 const *data, MOBLEUINT32 length,
- MOBLEUINT8 elementNumber , MOBLE_ADDRESS dst_peer)
+ MOBLEUINT8 elementIndex , 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,"#03-%02hx!\n\r",data[0]);
switch(subCommand)
@@ -291,139 +301,102 @@ MOBLE_RESULT Appli_Vendor_LEDControl( MOBLEUINT8 const *data, MOBLEUINT32 length
*/
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 Need to write the commands as per the element selected*/
+
+ TRACE_M(TF_VENDOR,"Appli_LED_Control callback received for elementIndex %d \r\n", elementIndex);
+ Appli_LedState = *(data+1); /* Toggle the state of the Blue LED */
+ if( Appli_LedState == 1)
{
- /* user application code */
+ BSP_LED_On(LED_BLUE);
}
- else if(elementNumber == THIRD_ELEMENT)
+ else
{
- /* user application code */
- }
+ BSP_LED_Off(LED_BLUE);
+ }
break;
}
/* Toggle Command */
case APPLI_CMD_TOGGLE:
{
- if(elementNumber == FIRST_ELEMENT)
+ /*User Need to write the commands as per the element selected*/
+
+ TRACE_M(TF_VENDOR,"Appli_LED_Toggle callback received for elementIndex %d \r\n", elementIndex);
+ if(Appli_LedState == 1)
{
- if(Appli_LedState == 1)
- {
- Appli_LightPwmValue.IntensityValue = LED_OFF_VALUE;
+ 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) */
+ 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) */
+ 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 */
+ Appli_LedState = 0;
+ BSP_LED_Off(LED_BLUE);
}
- else if(elementNumber == THIRD_ELEMENT)
+ else
{
- /* user application code */
+ Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ Appli_LedState = 1;
+ BSP_LED_On(LED_BLUE);
}
+
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 */
- }
+ /*User Need to write the commands as per the element selected*/
+
+ TRACE_M(TF_VENDOR,"Appli_LED_ON callback received for elementIndex %d \r\n", elementIndex);
+ 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;
+
break;
}
/* Off Command */
case APPLI_CMD_OFF:
{
- if(elementNumber == FIRST_ELEMENT)
- {
- Appli_LightPwmValue.IntensityValue = LED_OFF_VALUE;
+ /*User Need to write the commands as per the element selected*/
+
+ TRACE_M(TF_VENDOR,"Appli_LED_OFF callback received for elementIndex %d \r\n", elementIndex);
+ 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) */
+ 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) */
+ 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 */
- }
+ Appli_LedState = 0;
+ BSP_LED_Off(LED_BLUE);
break;
}
/* intensity command */
case APPLI_CMD_LED_INTENSITY:
{
- if(elementNumber == FIRST_ELEMENT)
- {
- intensityValue = data[2] << 8;
- intensityValue |= data[1];
+ /*User Need to write the commands as per the element selected*/
+
+ TRACE_M(TF_VENDOR,"Appli_LED_Intensity callback received for elementIndex %d \r\n", elementIndex);
+ 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)
+ duty = PwmValueMapping(intensityValue , 0x7FFF ,0);
+ Appli_LightPwmValue.IntensityValue = duty;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ if(duty > 16000)
{
- /* user application code */
+ BSP_LED_On(LED_BLUE);
}
- else if(elementNumber == THIRD_ELEMENT)
+ else
{
- /* user application code */
+ BSP_LED_Off(LED_BLUE);
}
- break;
- }
+ break;
+ }
/* Default case - Not valid command */
default:
{
@@ -457,26 +430,32 @@ MOBLE_RESULT Appli_Vendor_LEDControl( MOBLEUINT8 const *data, MOBLEUINT32 length
*/
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,"#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;
+ MOBLE_RESULT status = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 subCmd = data[0];
+ /*First Byte is sending the Sub Command*/
+ ResponseBuffer[0]=subCmd;
+
+ TRACE_M(TF_VENDOR, "#0E-%02hx %02lx! \n\r",data[0], length);
+ for(MOBLEUINT16 i=0; i<length; i++)
+ {
+ TRACE_I(TF_VENDOR,"%02hx ",data[i]);
+ }
+ TRACE_I(TF_VENDOR,"\n\r");
+ switch(subCmd)
+ {
+ case APPLI_STRING_WRITE:
+ {
+ memcpy(&ResponseBuffer,data,length);
+ BuffLength = length;
+ break;
+ }
+ default:
+ {
+ status = MOBLE_RESULT_FALSE;
+ break;
+ }
+ }
+ return status;
}
/**
@@ -494,6 +473,58 @@ void Appli_GetTestValue (MOBLEUINT8 *responseValue)
TestHitCounter = 0;
}
/**
+* @brief Process the Vendor LED Control Command
+* @param data: Pointer to the data received from peer_addr
+* @param length: Length of the data
+* @param elementIndex : selected element where '0' is first element
+* @param dst_peer : Destination address
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_Vendor_SetBigDataPacket(MOBLEUINT8 *data, MOBLEUINT32 length,
+ MOBLEUINT8 elementIndex , MOBLE_ADDRESS dst_peer)
+{
+ MOBLE_RESULT status = MOBLE_RESULT_SUCCESS;
+
+ if (length > VENDOR_DATA_BUFFER_SIZE)
+ {
+ status = MOBLE_RESULT_INVALIDARG;
+ }
+ memmove(Appli_VendorBigData.data, data, length);
+ Appli_VendorBigData.dst = dst_peer;
+ Appli_VendorBigData.length = length;
+ Appli_VendorBigData.elementIndex = elementIndex;
+ return status;
+}
+/**
+* @brief Send Vendor big data packet
+* @param void
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_Vendor_SendBigDataPacket(void)
+{
+ MOBLE_RESULT status = MOBLE_RESULT_SUCCESS;
+
+ if(BLEMesh_TrsptIsBusyState())
+ {
+ BSP_LED_On(LED_BLUE);
+ status = MOBLE_RESULT_FALSE;
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+ status = BLEMesh_SetRemoteData(Appli_VendorBigData.dst,
+ Appli_VendorBigData.elementIndex,
+ 0x000E,
+ Appli_VendorBigData.data,
+ Appli_VendorBigData.length,
+ MOBLE_FALSE,
+ MOBLE_TRUE);
+
+ }
+ return status;
+}
+
+/**
* @}
*/
@@ -501,5 +532,5 @@ void Appli_GetTestValue (MOBLEUINT8 *responseValue)
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_vendor.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_vendor.h
index 2b9390099..8b8e60aa6 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_vendor.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_vendor.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
@@ -36,8 +36,10 @@ 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);
-
+MOBLE_RESULT Appli_Vendor_SendBigDataPacket(void);
+MOBLE_RESULT Appli_Vendor_SetBigDataPacket(MOBLEUINT8 *data, MOBLEUINT32 length,
+ MOBLEUINT8 elementIndex , MOBLE_ADDRESS dst_peer);
#endif /* __APPLI_VENDOR_H */
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/hal_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/hal_common.h
index 730c40219..704a08d80 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/hal_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/hal_common.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
@@ -44,12 +44,10 @@
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****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/mesh_cfg.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/mesh_cfg.h
deleted file mode 100644
index d668eae80..000000000
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/mesh_cfg.h
+++ /dev/null
@@ -1,273 +0,0 @@
-/**
- ******************************************************************************
- * @file mesh_cfg.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_H
-#define __MESH_CFG_H
-
-/* Includes ------------------------------------------------------------------*/
-#include "mesh_cfg_usr.h"
-#include "app_conf.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
-
-/*
-* TRACE_M includes function name and clock
-*/
-void TraceHeader(const char* func_name, int mode);
-#define TraceB0(func_name, ...)
-#if ( CFG_DEBUG_TRACE != 0 )
-#define TraceB1(func_name, ...) do {TraceHeader(func_name, 0); printf( __VA_ARGS__);} while(0)
-#else
-#define TraceB1(func_name, ...)
-#endif
-#define TraceBX(flags, func_name, ...) TraceB ##flags(func_name, ##__VA_ARGS__)
-#define TRACE_M(flag, ...) TraceBX(flag, __func__, ##__VA_ARGS__)
-
-/*
-* TRACE_I does not include function name and clock
-*/
-#define TraceC0(...)
-#if ( CFG_DEBUG_TRACE != 0 )
-#define TraceC1(...) do { printf( __VA_ARGS__);} while(0)
-#else
-#define TraceC1(...)
-#endif
-//#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 DEVICE_NAME_PARAMS \
-{ \
- DEVICE_NAME_SIZE, \
- Device_Name \
-}
-
-#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 device_name_params_t DeviceNameParams;
-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_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
index 0441f0d0a..a0c240594 100644
--- 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
@@ -3,11 +3,11 @@
******************************************************************************
* @file mesh_cfg_usr.h
* @author BLE Mesh Team
- * @brief Header file for mesh_usr_cfg.c
+ * @brief user configurable settings
******************************************************************************
* @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,6 +34,42 @@
*/
#define ENABLE_LOW_POWER_FEATURE
+/*
+* 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_NO_OOB
+//#define ENABLE_AUTH_TYPE_STATIC_OOB
+//#define ENABLE_AUTH_TYPE_OUTPUT_OOB
+//#define ENABLE_AUTH_TYPE_INPUT_OOB
+
+/* Static OOB Configurations */
+#define STATIC_OOB_SIZE 16U
+
+/* Output OOB Configurations */
+#define OUTPUT_OOB_SIZE 1U
+#define OUTPUT_OOB_ACTION OUTPUT_OOB_ACTION_BIT_BLINK
+
+/* Input OOB Configurations */
+#define INPUT_OOB_SIZE 1U
+#define INPUT_OOB_ACTION INPUT_OOB_ACTION_BIT_PUSH
+
+/******************************************************************************/
+/* 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_SIG_MODELS_AT_COMMANDS 1
+#define ENABLE_VENDOR_MODELS_AT_COMMANDS 0
+#define ENABLE_UT 1
+
/* Macros Used for user defined serial print data for models.
Either use 0 to disable or 1 to enable
@ TF_GENERIC -> Generic server
@@ -81,6 +117,7 @@ Either use 0 to disable or 1 to enable
#define TF_GENERIC_M 0
#define TF_GENERIC_CLIENT_M 0
#define TF_SENSOR_M 0
+#define TF_SENSOR_CLIENT_M 0
#define TF_LIGHT_M 0
#define TF_LIGHT_CLIENT_M 0
#define TF_LIGHT_LC_M 0
@@ -90,6 +127,7 @@ Either use 0 to disable or 1 to enable
#define TF_MEMORY 0
#define TF_BEACON 0
#define TF_SERIAL_CTRL 0
+#define TF_VENDOR_APPLI_TEST 0 /* Vendor commands testing */
/*******************************************************************************
*** Following section helps to define Device Name during Provisioning *********
@@ -112,12 +150,11 @@ Either use 0 to disable or 1 to enable
/* Define the following Macros to enable the usage of the Server Generic Models */
#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
+//#define ENABLE_GENERIC_MODEL_SERVER_LEVEL (1)
+//#define ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF (1)
+//#define ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF_SETUP (1)
+//#define ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME (1)
-/* 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_GENERIC_MODEL_CLIENT_POWER_ONOFF (1)
@@ -148,14 +185,14 @@ Either use 0 to disable or 1 to enable
/******************************************************************************/
#define ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS (1)
-//#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
+//#define ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP (1)
+//#define ENABLE_LIGHT_MODEL_SERVER_CTL (1)
+//#define ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP (1)
+//#define ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE (1)
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL (1)
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP (1)
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL_HUE (1)
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION (1)
//#define ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS (1)
//#define ENABLE_LIGHT_MODEL_CLIENT_CTL (1)
@@ -164,8 +201,7 @@ Either use 0 to disable or 1 to enable
/*
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 ENABLE_LIGHT_MODEL_SERVER_LC (1)
//#define ENABLE_LIGHT_MODEL_CLIENT_LC (1)
@@ -177,8 +213,7 @@ Either use 0 to disable or 1 to enable
/* 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 (1)
//#define ENABLE_SENSOR_MODEL_CLIENT (1)
@@ -203,29 +238,23 @@ 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 (1)
#define GENERIC_SERVER_MODEL_PUBLISH
-/* Define the following Macros to enable the usage of the Client Generic Models */
-//#define ENABLE_CONFIG_MODEL_CLIENT (1)
-
/******************************************************************************/
/*
-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 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
-//#define ENABLE_MODEL_BINDING
-
/* Define the macros for the numbers of sensor present.*/
-#define NUMBER_OF_SENSOR 3
+//#define NUMBER_OF_SENSOR 1
//#define ENABLE_OCCUPANCY_SENSOR
/*
Macro is responsible for enabling and desabling the sensor publication.
@@ -266,12 +295,16 @@ this should be avoided to ensure flash longevity
//#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.
+
+/* Macros defined for the number of bytes saved, number of bytes dedicated for ganeric
+ model and light model.
*/
#define APP_NVM_GENERIC_MODEL_SIZE 16U
-#define APP_NVM_LIGHT_MODEL_SIZE 32U
-#define APP_NVM_MODEL_SIZE 50U
+#define APP_NVM_LIGHT_MODEL_SIZE 48U/*32U*/
+#define APP_NVM_MODELDATA_PER_ELEMENT_SIZE (APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE)
+//#define APP_NVM_MODEL_SIZE 50U
+#define APP_NVM_MODEL_SIZE (APP_NVM_MODELDATA_PER_ELEMENT_SIZE * APPLICATION_NUMBER_OF_ELEMENTS)
+//#define APP_NVM_MODEL_ALL_ELEMENTS_SIZE
/*Macros are defined for the selection of the number of led and type of lighting
@@ -293,23 +326,15 @@ this should be avoided to ensure flash longevity
/* 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
+/* Max SIG Models per element */
+#define USER_SIG_MODELS_MAX_COUNT 17
+/* Max Vendor Models per element */
+#define USER_VENDOR_MODELS_MAX_COUNT 1
/* Contains a 16-bit company identifier assigned by the Bluetooth SIG
@@ -360,43 +385,6 @@ For STMicroelectronics : it is 0x0030 */
/*
-* 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
*/
@@ -577,100 +565,6 @@ For STMicroelectronics : it is 0x0030 */
#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_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
-
-#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 ---------------------------------------------*/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/models_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/models_if.c
index ce2370722..3cc324edd 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/models_if.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/models_if.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
@@ -42,7 +42,9 @@
#include "config_client.h"
#include "generic_client.h"
#include "light_client.h"
+#include "sensors_client.h"
#include "appli_light_client.h"
+#include "appli_sensors_client.h"
/** @addtogroup ST_BLE_Mesh
* @{
@@ -59,6 +61,9 @@ typedef struct
MOBLE_ADDRESS peer;
MOBLE_ADDRESS dst;
MOBLEUINT8 command;
+ MOBLEUINT8 elementIndex;
+ MOBLEUINT8 appKeyOffset;
+ MOBLEUINT8 netKeyOffset;
MOBLEUINT8 data[DATA_BUFFER_LENGTH]; /* 8-Bytes response packet */
MOBLEUINT32 length;
} APPLI_SEND_RESPONSE_MODULE;
@@ -78,18 +83,48 @@ typedef struct
/* Private variables ---------------------------------------------------------*/
+MOBLEUINT8 Led_Value = 0;
+
+MOBLEUINT8 ButtonIndex_Value = 0;
+
APPLI_PENDING_PACKETS Appli_PendingPackets = {0};
-__attribute__((aligned(4)))
-const MOBLE_VENDOR_CB_MAP vendor_cb =
+MOBLEUINT8 pGeneric_OnOffParam[sizeof(Generic_OnOffParam_t)];
+MOBLEUINT8 pGeneric_LevelParam[sizeof(Generic_LevelParam_t)];
+MOBLEUINT8 pGeneric_DeltaLevelParam[sizeof(Generic_DeltaLevelParam_t)];
+MOBLEUINT8 pGeneric_MoveLevelParam[sizeof(Generic_LevelMoveParam_t)];
+MOBLEUINT8 pGeneric_PowerOnOffParam[sizeof(Generic_PowerOnOffParam_t)];
+MOBLEUINT8 pGeneric_DefaultTransitionTimeParam[sizeof(Generic_DefaultTransitionParam_t)];
+
+MOBLEUINT8 pLightnessParam[sizeof(Light_LightnessParam_t)];
+MOBLEUINT8 pLightnessRangeParam[sizeof(Light_LightnessRangeParam_t)];
+
+MOBLEUINT8 pLightCtlParam[sizeof(Light_CtlParam_t)];
+MOBLEUINT8 pLightCtlTemperatureParam[sizeof(Light_CtlTemperatureParam_t)];
+MOBLEUINT8 pLightCtlTemperatureRangeParam[sizeof(Light_CtlTemperatureRangeParam_t)];
+MOBLEUINT8 pLightCtlDefaultParam[sizeof(Light_CtlDefaultParam_t)];
+
+MOBLEUINT8 pLightHslParam[sizeof(Light_HslParam_t)];
+MOBLEUINT8 pLightHslRangeParam[sizeof(Light_HslRangeParam_t)];
+MOBLEUINT8 pLightHslHueParam[sizeof(Light_HslHueParam_t)];
+MOBLEUINT8 pLightHslSaturationParam[sizeof(Light_HslSaturationParam_t)];
+
+MOBLEUINT8 pLightLCModeParam[sizeof(Light_LC_ModeParam_t)];
+MOBLEUINT8 pLightLCOccupancyModeParam[sizeof(Light_LC_ModeParam_t)];
+MOBLEUINT8 pLightLCOnOffParam[sizeof(Light_LC_OnOffParam_t)];
+MOBLEUINT8 pLightLCPropertyParam[6];
+
+MOBLEUINT8 pSensorsCadenceParam[sizeof(sensor_CadenceCbParam_t)];
+MOBLEUINT8 pSensorsSettingParam[sizeof(sensor_SettingCbParams_t)];
+
+__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 =
+__attribute__((aligned(4)))const Appli_Vendor_cb_t VendorAppli_cb =
{
/*Vendor Commads*/
Appli_Vendor_LEDControl,
@@ -100,8 +135,7 @@ const Appli_Vendor_cb_t VendorAppli_cb =
Appli_Vendor_Data_write
};
-__attribute__((aligned(4)))
-const Appli_Generic_cb_t GenericAppli_cb =
+__attribute__((aligned(4)))const Appli_Generic_cb_t GenericAppli_cb =
{
/* Generic OnOff callbacks */
Appli_Generic_OnOff_Set,
@@ -124,8 +158,7 @@ const Appli_Generic_cb_t GenericAppli_cb =
Appli_Generic_DefaultTransitionTime_Status
};
-__attribute__((aligned(4)))
-const Appli_Generic_State_cb_t Appli_GenericState_cb =
+__attribute__((aligned(4)))const Appli_Generic_State_cb_t Appli_GenericState_cb =
{
/* Generic Get On Off status */
@@ -139,8 +172,7 @@ const Appli_Generic_State_cb_t Appli_GenericState_cb =
Appli_Generic_GetDefaultTransitionStatus
};
-__attribute__((aligned(4)))
-const Appli_Light_GetStatus_cb_t Appli_Light_GetStatus_cb =
+__attribute__((aligned(4)))const Appli_Light_GetStatus_cb_t Appli_Light_GetStatus_cb =
{
Appli_Light_GetLightnessStatus,
Appli_Light_GetLightnessLinearStatus,
@@ -148,10 +180,12 @@ const Appli_Light_GetStatus_cb_t Appli_Light_GetStatus_cb =
Appli_Light_GetLightnessLastStatus,
Appli_Light_GetLightnessRangeStatus,
Appli_Light_GetCtlLightStatus,
+ Appli_Light_GetCtlTargetStatus,
Appli_Light_GetCtlTemperatureStatus,
Appli_Light_GetCtlTemperatureRange,
Appli_Light_GetCtlDefaultStatus,
Appli_Light_GetHslStatus,
+ Appli_Light_GetHslTargetStatus,
Appli_Light_GetHslHueStatus,
Appli_Light_GetHslSaturationStatus,
Appli_Light_GetHslHueRange,
@@ -160,8 +194,7 @@ const Appli_Light_GetStatus_cb_t Appli_Light_GetStatus_cb =
};
-__attribute__((aligned(4)))
-const Appli_Light_cb_t LightAppli_cb =
+__attribute__((aligned(4)))const Appli_Light_cb_t LightAppli_cb =
{
/* Light Lightness callbacks */
Appli_Light_Lightness_Set,
@@ -173,6 +206,9 @@ const Appli_Light_cb_t LightAppli_cb =
Appli_Light_Lightness_Default_Set,
Appli_Light_Lightness_Default_Status,
+ Appli_Light_Lightness_Last_Set,
+ Appli_Light_Lightness_Last_Status,
+
Appli_Light_Lightness_Range_Set,
Appli_Light_Lightness_Range_Status,
@@ -205,17 +241,19 @@ const Appli_Light_cb_t LightAppli_cb =
};
-__attribute__((aligned(4)))
-const Appli_Light_Ctrl_cb_t LightLCAppli_cb =
+#if 0
+__attribute__((aligned(4)))const Appli_Light_Ctrl_cb_t LightLCAppli_cb =
{
/* Light LC mode set callbacks */
Appli_LightLC_Mode_Set,
+ Appli_LightLC_Mode_Status,
Appli_LightLC_OM_Set,
+ Appli_LightLC_OM_Status,
Appli_LightLC_OnOff_Set,
+ Appli_LightLC_OnOff_Status,
};
-__attribute__((aligned(4)))
-const Appli_LightLC_GetStatus_cb_t Appli_LightLC_GetStatus_cb =
+__attribute__((aligned(4)))const Appli_LightLC_GetStatus_cb_t Appli_LightLC_GetStatus_cb =
{
Appli_LightLC_Get_ModeStatus,
Appli_LightLC_Get_OMModeStatus,
@@ -223,33 +261,44 @@ const Appli_LightLC_GetStatus_cb_t Appli_LightLC_GetStatus_cb =
Appli_LightLC_Get_AmbientLuxLevelOutput,
Appli_Light_LC_PIRegulatorOutput,
};
+#endif
-#ifdef ENABLE_SENSOR_MODEL_SERVER
-
-__attribute__((aligned(4)))
-const Appli_Sensor_cb_t SensorAppli_cb =
+__attribute__((aligned(4)))const sensor_server_cb_t SensorAppli_cb =
{
- /* Sensor Model callbacks */
- Appli_Sensor_Cadence_Set,
- Appli_Sensor_Data_Status,
- Appli_Sensor_Descriptor_Status ,
- Appli_Sensor_Setting_Set,
+ Appli_Sensor_CadenceGet,
+ Appli_Sensor_CadenceSet,
+ Appli_Sensor_CadenceSetUnack,
+ Appli_Sensor_SettingsGet,
+ Appli_Sensor_SettingGet,
+ Appli_Sensor_SettingSet,
+ Appli_Sensor_SettingSetUnack,
+ Appli_Sensor_DescriptorGet,
+ Appli_Sensor_Get,
+ Appli_Sensor_ColumnGet,
+ Appli_Sensor_SeriesGet,
+ Appli_Sensor_ReadDescriptor,
+ Appli_Sensor_ReadValue,
+ Appli_Sensor_ReadColumn,
+ Appli_Sensor_ReadSeries,
+ Appli_Sensor_IsFastCadence,
+ Appli_Sensor_IsStatusTrigger,
+ Appli_Sensor_Descriptor_Status,
+ Appli_Sensor_Cadence_Status,
+ Appli_Sensor_Settings_Status,
+ Appli_Sensor_Setting_Status,
+ Appli_Sensor_Status,
Appli_Sensor_Column_Status,
Appli_Sensor_Series_Status
};
-__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 Appli_Sensor_GetStatus_cb_t Appli_Sensor_GetStatus_cb =
+//{
+// // Appli_Sensor_GetSettingStatus,
+// Appli_Sensor_GetSetting_IDStatus,
+//};
-__attribute__((aligned(4)))
-const MODEL_SIG_cb_t Model_SIG_cb[] =
+__attribute__((aligned(4)))const MODEL_SIG_cb_t Model_SIG_cb[] =
{
#ifdef ENABLE_GENERIC_MODEL_SERVER
{
@@ -266,6 +315,7 @@ const MODEL_SIG_cb_t Model_SIG_cb[] =
LightModelServer_ProcessMessageCb
},
#endif
+
#ifdef ENABLE_SENSOR_MODEL_SERVER
{
SensorModelServer_GetOpcodeTableCb,
@@ -273,6 +323,7 @@ const MODEL_SIG_cb_t Model_SIG_cb[] =
SensorModelServer_ProcessMessageCb
},
#endif
+
#ifdef ENABLE_TIME_SCENE_MODEL_SERVER
{
Time_SceneModelServer_GetOpcodeTableCb,
@@ -280,13 +331,15 @@ const MODEL_SIG_cb_t Model_SIG_cb[] =
Time_SceneModelServer_ProcessMessageCb
},
#endif
+
#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
{
- Light_LC_ModelServer_GetOpcodeTableCb,
- Light_LC_ModelServer_GetStatusRequestCb,
- Light_LC_ModelServer_ProcessMessageCb
+ LightLcServer_GetOpcodeTableCb,
+ LightLcServer_GetStatusRequestCb,
+ LightLcServer_ProcessMessageCb
},
#endif
+
#ifdef ENABLE_GENERIC_MODEL_CLIENT
{
GenericModelClient_GetOpcodeTableCb,
@@ -294,6 +347,7 @@ const MODEL_SIG_cb_t Model_SIG_cb[] =
GenericModelClient_ProcessMessageCb
},
#endif
+
#ifdef ENABLE_CONFIG_MODEL_CLIENT
{
ConfigClientModel_GetOpcodeTableCb,
@@ -309,15 +363,29 @@ const MODEL_SIG_cb_t Model_SIG_cb[] =
},
#endif
- { 0, 0,0 }
+#ifdef ENABLE_SENSOR_MODEL_CLIENT
+ {
+ SensorsModelClient_GetOpcodeTableCb,
+ SensorsModelClient_GetStatusRequestCb,
+ SensorsModelClient_ProcessMessageCb
+ },
+#endif
+
+ {
+ 0, 0, 0
+ }
};
__attribute__((aligned(4))) const APPLI_SAVE_MODEL_STATE_CB SaveModelState_cb = AppliNvm_SaveModelState;
+#if 0
+__attribute__((aligned(4))) const APPLI_SAVE_MODEL_TEST_STATE_CB SaveModelTestState_cb = AppliNVM_Save_FlashTesting;
+__attribute__((aligned(4))) const APPLI_RETRIEVE_MODEL_TEST_STATE_CB RetrieveModelTestState_cb = AppliNVM_Retrieve_FlashTesting;
+#endif
+
#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[] =
+__attribute__((aligned(4))) const MODEL_Vendor_cb_t Model_Vendor_cb[] =
{
#ifdef ENABLE_VENDOR_MODEL_SERVER
{
@@ -341,7 +409,7 @@ void GetApplicationVendorModels(const MODEL_Vendor_cb_t** pModelsTable, MOBLEUIN
*pModelsTable = Model_Vendor_cb ;
*VendorModelscount = MODEL_VENDOR_COUNT;
- TRACE_M(TF_VENDOR,"GetApplicationVendorModels \r\n");
+ TRACE_M(TF_VENDOR_M, "GetApplicationVendorModels \r\n");
}
/**
@@ -354,7 +422,7 @@ void BLEMesh_ModelsInit(void)
#ifdef ENABLE_SAVE_MODEL_STATE_NVM
- MOBLEUINT8 modelStateLoad_Size;
+ MOBLEUINT16 modelStateLoad_Size;
MOBLEUINT8 modelStateLoadBuff[APP_NVM_MODEL_SIZE];
#ifdef CLIENT
@@ -362,28 +430,39 @@ void BLEMesh_ModelsInit(void)
MOBLEUINT8 PrvnlStateLoadBuff[16];
#endif
+#if 0
+#ifdef ENABLE_NVM_TEST
+ /* Testing of flash code */
+ Device_FlashTesting();
+#endif
+#endif
+
+ /* Inintialise the light model range states with default values */
+ Light_ModelRangeInit();
+
/* 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);
+#if defined ENABLE_SENSOR_MODEL_SERVER && !defined CUSTOM_BOARD_PWM_SELECTION
+ /* Initialization of sensors */
+ Appli_Sensor_Init();
+#endif
+
+ Appli_Light_LCs_Init();
#endif
+ /* Load generic model states from nvm */
+ AppliNvm_LoadModelState(modelStateLoadBuff, &modelStateLoad_Size);
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
+#ifdef CLIENT
+ AppliPrvnNvm_LoadData(PrvnlStateLoadBuff,&PrvnStateLoad_Size);
+#endif
+
}
/**
@@ -418,7 +497,7 @@ void BLEMesh_ModelsProcess(void)
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
- Light_control_Process();
+ Light_LC_Process();
#endif
}
@@ -433,23 +512,498 @@ void BLEMesh_ModelsCommand(void)
Vendor_Publish(BLEMesh_GetAddress());
#endif
+#if defined(GENERIC_CLIENT_MODEL_PUBLISH) || defined(LIGHT_CLIENT_MODEL_PUBLISH)
+ Led_Value ^= APPLI_LED_ON;
+ pGeneric_OnOffParam[0] = Led_Value; // OnOff parameter byte 0 : The target value of the Generic Onoff state
+
+ pLightLCModeParam[0] = Led_Value;
+ pLightLCOccupancyModeParam[0] = Led_Value;
+ pLightLCOnOffParam[0] = Led_Value;
+
+ //This Switch-case allows to quickly set the different Models Messages parameters in order to demonstrate Client APIs functionning
+ switch (ButtonIndex_Value){
+ case 0:
+ ButtonIndex_Value=0x1;
+
+ pGeneric_LevelParam[0]= 0xE8; // Level parameter byte 0 : The target value of the Generic Level state
+ pGeneric_LevelParam[1]= 0x03; // Level parameter byte 1 : The target value of the Generic Level state
+
+ pGeneric_DeltaLevelParam[0]= 0xE8; // Delta Level parameter byte 0 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[1]= 0x03; // Delta Level parameter byte 1 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[2]= 0x00; // Delta Level parameter byte 2 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[3]= 0x00; // Delta Level parameter byte 3 : The Delta change of the Generic Level state
+
+ pGeneric_MoveLevelParam[0]= 0xE8; //Move Delta Level parameter byte 0 : The Delta Level step to calculate Move speed for the Generic Level state
+ pGeneric_MoveLevelParam[1]= 0x03; //Move Delta Level parameter byte 1 : The Delta Level step to calculate Move speed for the Generic Level state
+
+ pGeneric_DefaultTransitionTimeParam[0]=0x0F; //Transition time parameter byte 0 : The value of the Generic Default Transition Time state
+
+ pGeneric_PowerOnOffParam[0]=0x1; //OnPowerUp parameter byte 0 : The value of the Generic OnPowerUp state.
+
+ pLightnessParam[0] = 0xE8; //Lightness parameter byte 0 : The target value of the Light Lightness Actual/Linear/Default state
+ pLightnessParam[1] = 0x03; //Lightness parameter byte 1 : The target value of the Light Lightness Actual/Linear/Default state
+
+ pLightnessRangeParam[0] = 0xE8; //Lightness Range Min parameter byte 0 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[1] = 0x03; //Lightness Range Min parameter byte 1 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[2] = 0x88; //Lightness Range Max parameter byte 0 : The value of the Lightness Range Max field of the Light Lightness Range state
+ pLightnessRangeParam[3] = 0x13; //Lightness Range Max parameter byte 1 : The value of the Lightness Range Max field of the Light Lightness Range state
+
+ pLightCtlParam[0] = 0xE8; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness state
+ pLightCtlParam[1] = 0x03; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness state
+ pLightCtlParam[2] = 0xE8; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlParam[3] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlParam[4] = 0xE8; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlParam[5] = 0x03; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureParam[0] = 0xE8; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[1] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[2] = 0xE8; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlTemperatureParam[3] = 0x03; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureRangeParam[0] = 0xE8; //Temperature Range Min parameter byte 0 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[1] = 0x03; //Temperature Range Min parameter byte 1 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[2] = 0x88; //Temperature Range Max parameter byte 0 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[3] = 0x13; //Temperature Range Max parameter byte 1 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+
+ pLightCtlDefaultParam[0] = 0xE8; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[1] = 0x03; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[2] = 0xE8; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[3] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[4] = 0xE8; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV Default state
+ pLightCtlDefaultParam[5] = 0x03; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV Default state
+
+ pLightHslParam[0] = 0xE8; //HSL Lightness parameter byte 0 : The target value of the Light HSL Lightness state
+ pLightHslParam[1] = 0x03; //HSL Lightness parameter byte 1 : The target value of the Light HSL Lightness state
+ pLightHslParam[2] = 0xE8; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslParam[3] = 0x03; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+ pLightHslParam[4] = 0xE8; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslParam[5] = 0x03; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ pLightHslRangeParam[0] = 0xE8; //HSL Hue Range Min parameter byte 0 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[1] = 0x03; //HSL Hue Range Min parameter byte 1 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[2] = 0x88; //HSL Hue Range Max parameter byte 0 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[3] = 0x13; //HSL Hue Range Max parameter byte 1 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[4] = 0x88; //HSL Saturation Min parameter byte 0 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[5] = 0x13; //HSL Saturation Min parameter byte 1 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[6] = 0x70; //HSL Saturation Max parameter byte 0 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+ pLightHslRangeParam[7] = 0x17; //HSL Saturation Max parameter byte 1 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+
+ pLightHslHueParam[0] = 0xE8; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslHueParam[1] = 0x03; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+
+ pLightHslSaturationParam[0] = 0xE8; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslSaturationParam[1] = 0x03; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ //LIGHT_CONTROL_LUX_LEVEL_ON_ID : 0x202B
+ pLightLCPropertyParam[0]= 0x2B; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[1]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[2]= 0x44; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[3]= 0x44; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[4]= 0x44; // Property ID byte 2 : Property ID identifying a Light LC Property.
+ break;
+
+ case 1:
+ ButtonIndex_Value=0x2;
+
+ pGeneric_LevelParam[0]= 0xff; // Level parameter byte 0 : The target value of the Generic Level state
+ pGeneric_LevelParam[1]= 0x7f; // Level parameter byte 1 : The target value of the Generic Level state
+
+ pGeneric_DeltaLevelParam[0]= 0x10; // Delta Level parameter byte 0 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[1]= 0x27; // Delta Level parameter byte 1 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[2]= 0x00; // Delta Level parameter byte 2 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[3]= 0x00; // Delta Level parameter byte 3 : The Delta change of the Generic Level state
+
+ pGeneric_MoveLevelParam[0]= 0xff; //Move Delta Level parameter byte 0 : The Delta Level step to calculate Move speed for the Generic Level state
+ pGeneric_MoveLevelParam[1]= 0x7f; //Move Delta Level parameter byte 1 : The Delta Level step to calculate Move speed for the Generic Level state
+
+ pGeneric_DefaultTransitionTimeParam[0]=0x10; //Transition time parameter byte 0 : The value of the Generic Default Transition Time state
+
+ pGeneric_PowerOnOffParam[0]=0x2; //OnPowerUp parameter byte 0 : The value of the Generic OnPowerUp state.
+
+ pLightnessParam[0] = 0xff; //Lightness parameter byte 0 : The target value of the Light Lightness Actual/Linear/Default state
+ pLightnessParam[1] = 0xff; //Lightness parameter byte 1 : The target value of the Light Lightness Actual/Linear/Default state
+
+ pLightnessRangeParam[0] = 0x00; //Lightness Range Min parameter byte 0 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[1] = 0x00; //Lightness Range Min parameter byte 1 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[2] = 0xff; //Lightness Range Max parameter byte 0 : The value of the Lightness Range Max field of the Light Lightness Range state
+ pLightnessRangeParam[3] = 0xff; //Lightness Range Max parameter byte 1 : The value of the Lightness Range Max field of the Light Lightness Range state
+
+ pLightCtlParam[0] = 0xff; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness state
+ pLightCtlParam[1] = 0xff; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness state
+ pLightCtlParam[2] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlParam[3] = 0x4e; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlParam[4] = 0xff; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlParam[5] = 0x7f; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureParam[0] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[1] = 0x4e; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[2] = 0xff; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlTemperatureParam[3] = 0x7f; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureRangeParam[0] = 0x19; //Temperature Range Min parameter byte 0 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[1] = 0x4e; //Temperature Range Min parameter byte 1 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[2] = 0x20; //Temperature Range Max parameter byte 0 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[3] = 0x4e; //Temperature Range Max parameter byte 1 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+
+ pLightCtlDefaultParam[0] = 0xff; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[1] = 0xff; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[2] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[3] = 0x4e; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[4] = 0xff; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV Default state
+ pLightCtlDefaultParam[5] = 0x7f; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV Default state
+
+ pLightHslParam[0] = 0xff; //HSL Lightness parameter byte 0 : The target value of the Light HSL Lightness state
+ pLightHslParam[1] = 0xff; //HSL Lightness parameter byte 1 : The target value of the Light HSL Lightness state
+ pLightHslParam[2] = 0xee; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslParam[3] = 0xee; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+ pLightHslParam[4] = 0xdd; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslParam[5] = 0xdd; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ pLightHslRangeParam[0] = 0x00; //HSL Hue Range Min parameter byte 0 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[1] = 0xf0; //HSL Hue Range Min parameter byte 1 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[2] = 0xff; //HSL Hue Range Max parameter byte 0 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[3] = 0xff; //HSL Hue Range Max parameter byte 1 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[4] = 0x00; //HSL Saturation Min parameter byte 0 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[5] = 0xe0; //HSL Saturation Min parameter byte 1 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[6] = 0xff; //HSL Saturation Max parameter byte 0 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+ pLightHslRangeParam[7] = 0xef; //HSL Saturation Max parameter byte 1 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+
+ pLightHslHueParam[0] = 0xff; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslHueParam[1] = 0xff; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+
+ pLightHslSaturationParam[0] = 0xff; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslSaturationParam[1] = 0xff; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ //LIGHT_CONTROL_LUX_LEVEL_ON_ID : 0x202B
+ pLightLCPropertyParam[0]= 0x2B; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[1]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[2]= 0x01; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[3]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[4]= 0x10; // Property ID byte 2 : Property ID identifying a Light LC Property.
+ break;
+
+ case 2:
+ ButtonIndex_Value=0x0;
+
+ pGeneric_LevelParam[0]= 0x00; // Level parameter byte 0 : The target value of the Generic Level state
+ pGeneric_LevelParam[1]= 0x00; // Level parameter byte 1 : The target value of the Generic Level state
+
+ pGeneric_DeltaLevelParam[0]= 0x00; // Delta Level parameter byte 0 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[1]= 0x00; // Delta Level parameter byte 1 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[2]= 0x00; // Delta Level parameter byte 2 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[3]= 0x00; // Delta Level parameter byte 3 : The Delta change of the Generic Level state
+
+ pGeneric_MoveLevelParam[0]= 0x00; //Move Delta Level parameter byte 0 : The Delta Level step to calculate Move speed for the Generic Level state
+ pGeneric_MoveLevelParam[1]= 0x00; //Move Delta Level parameter byte 1 : The Delta Level step to calculate Move speed for the Generic Level state
+
+ pGeneric_DefaultTransitionTimeParam[0]=0x00; //Transition time parameter byte 0 : The value of the Generic Default Transition Time state
+
+ pGeneric_PowerOnOffParam[0]=0x0; //OnPowerUp parameter byte 0 : The value of the Generic OnPowerUp state.
+
+ pLightnessParam[0] = 0x00; //Lightness parameter byte 0 : The target value of the Light Lightness Actual/Linear/Default state
+ pLightnessParam[1] = 0x00; //Lightness parameter byte 1 : The target value of the Light Lightness Actual/Linear/Default state
+
+ pLightnessRangeParam[0] = 0x00; //Lightness Range Min parameter byte 0 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[1] = 0x00; //Lightness Range Min parameter byte 1 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[2] = 0x00; //Lightness Range Max parameter byte 0 : The value of the Lightness Range Max field of the Light Lightness Range state
+ pLightnessRangeParam[3] = 0x10; //Lightness Range Max parameter byte 1 : The value of the Lightness Range Max field of the Light Lightness Range state
+
+ pLightCtlParam[0] = 0x00; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness state
+ pLightCtlParam[1] = 0x00; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness state
+ pLightCtlParam[2] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlParam[3] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlParam[4] = 0x00; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlParam[5] = 0x00; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureParam[0] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[1] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[2] = 0x00; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlTemperatureParam[3] = 0x00; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureRangeParam[0] = 0x20; //Temperature Range Min parameter byte 0 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[1] = 0x03; //Temperature Range Min parameter byte 1 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[2] = 0x21; //Temperature Range Max parameter byte 0 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[3] = 0x03; //Temperature Range Max parameter byte 1 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+
+ pLightCtlDefaultParam[0] = 0x00; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[1] = 0x00; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[2] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[3] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[4] = 0x00; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV Default state
+ pLightCtlDefaultParam[5] = 0x00; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV Default state
+
+ pLightHslParam[0] = 0x00; //HSL Lightness parameter byte 0 : The target value of the Light HSL Lightness state
+ pLightHslParam[1] = 0x00; //HSL Lightness parameter byte 1 : The target value of the Light HSL Lightness state
+ pLightHslParam[2] = 0x00; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslParam[3] = 0x00; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+ pLightHslParam[4] = 0x00; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslParam[5] = 0x00; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ pLightHslRangeParam[0] = 0x00; //HSL Hue Range Min parameter byte 0 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[1] = 0x00; //HSL Hue Range Min parameter byte 1 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[2] = 0x00; //HSL Hue Range Max parameter byte 0 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[3] = 0x10; //HSL Hue Range Max parameter byte 1 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[4] = 0x00; //HSL Saturation Min parameter byte 0 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[5] = 0x00; //HSL Saturation Min parameter byte 1 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[6] = 0x00; //HSL Saturation Max parameter byte 0 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+ pLightHslRangeParam[7] = 0x20; //HSL Saturation Max parameter byte 1 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+
+ pLightHslHueParam[0] = 0x00; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslHueParam[1] = 0x00; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+
+ pLightHslSaturationParam[0] = 0x00; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslSaturationParam[1] = 0x00; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ //LIGHT_CONTROL_LUX_LEVEL_ON_ID : 0x202B
+ pLightLCPropertyParam[0]= 0x2B; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[1]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[2]= 0x00; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[3]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[4]= 0x00; // Property ID byte 2 : Property ID identifying a Light LC Property.
+ break;
+
+ default:
+ break;
+ }
+
+
#ifdef GENERIC_CLIENT_MODEL_PUBLISH
- Appli_GenericClient_OnOff_Set();
+ /** GENERIC ONOFF **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API ONOFF SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_ON_OFF_SET_ACK, pGeneric_OnOffParam);
+
+ TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API ONOFF SET UNACK ------------- \r\n");
+ Appli_GenericClient_API(0, GENERIC_ON_OFF_SET_UNACK, pGeneric_OnOffParam);
+
+ /** GENERIC LEVEL **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API LEVEL SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_LEVEL_SET_ACK, pGeneric_LevelParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API LEVEL SET UNACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_LEVEL_SET_UNACK, pGeneric_LevelParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API DELTA LEVEL SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_DELTA_SET, pGeneric_DeltaLevelParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API DELTA LEVEL SET UNACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_DELTA_SET_UNACK, pGeneric_DeltaLevelParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API MOVE DELTA LEVEL SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_MOVE_SET, pGeneric_MoveLevelParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API MOVE DELTA LEVEL SET UNACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_MOVE_SET_UNACK, pGeneric_MoveLevelParam);
+
+ /** GENERIC POWER ONOFF **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API POWER ON OFF SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_POWER_ON_OFF_SET, pGeneric_PowerOnOffParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API POWER ON OFF SET UNACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_POWER_ON_OFF_SET_UNACK, pGeneric_PowerOnOffParam);
+
+ /** GENERIC TRANSITION TIME **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API DEFAULT TRANSITION TIME SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_DEFAULT_TRANSITION_TIME_SET, pGeneric_DefaultTransitionTimeParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API DEFAULT TRANSITION TIME SET UNACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_DEFAULT_TRANSITION_TIME_SET_UNACK, pGeneric_DefaultTransitionTimeParam);
+
+
+
+#if 1 /* TODO FAGOTV: Initialize Present Ambient Temparature Sensor in sensor_cfg_usr.h */
+ //PRESENT_AMBIENT_TEMPERATURE_PID : 0x004F
+ pSensorsCadenceParam[0]= 0x4F; // Property ID byte 0 : Property ID for the sensor.
+ pSensorsCadenceParam[1]= 0x00; // Property ID byte 1 : Property ID for the sensor.
+
+ pSensorsCadenceParam[2]= 0x81; // Fast Cadence Period Divisor bits 0-7: Divisor for the Publish Period.
+ // Status Trigger Type bit 8 : Defines the unit and format of the Status Trigger Delta fields.
+ pSensorsCadenceParam[3]= 0x11; // Status Trigger Delta Down byte 0 : Delta down value that triggers a status message.
+ pSensorsCadenceParam[4]= 0x11; // Status Trigger Delta Down byte 1 : Delta down value that triggers a status message.
+
+ pSensorsCadenceParam[5]= 0x22; // Status Trigger Delta Up byte 0 : Delta down value that triggers a status message.
+ pSensorsCadenceParam[6]= 0x22; // Status Trigger Delta Up byte 1 : Delta down value that triggers a status message.
+
+ pSensorsCadenceParam[7]= 0x10; // Status Min Interval byte 0 : Minimum interval between two consecutive Status messages.
+
+ pSensorsCadenceParam[8]= 0x33; // Fast Cadence Low byte 0 : Low value for the fast cadence range.
+
+ pSensorsCadenceParam[9]= 0x44; // Fast Cadence High byte 0 : High value for the fast cadence range.
+
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR CADENCE SET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_CADENCE_SET, pSensorsCadenceParam);
+
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR CADENCE SET UNACK ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_CADENCE_SET_UNACK, pSensorsCadenceParam);
+
+ /** SENSOR SETTING**/
+ /*
+ PRESENT_AMBIENT_TEMPERATURE_PID : 0x004F
+ Second Property PID : 0x00AD
+ */
+ pSensorsSettingParam[0]= 0x4F; // Property ID byte 0 : Property ID for the sensor
+ pSensorsSettingParam[1]= 0x00; // Property ID byte 1 : Property ID for the sensor
+ pSensorsSettingParam[2]= 0xAD; // Sensor Setting Property ID byte 0 : Property ID for the sensor setting
+ pSensorsSettingParam[3]= 0x00; // Sensor Setting Property ID byte 1 : Property ID for the sensor setting
+
+ switch (ButtonIndex_Value){
+ case 0:
+ pSensorsSettingParam[4]= 0x10; // Sensor Setting Property ID byte 0 : Property ID for the sensor setting
+ //pSensorsSettingParam[5]= 0x10; // Sensor Setting Property ID byte 1 : Property ID for the sensor setting
+ break;
+ case 1:
+ pSensorsSettingParam[4]= 0x20; // Sensor Setting Property ID byte 0 : Property ID for the sensor setting
+ //pSensorsSettingParam[5]= 0x20; // Sensor Setting Property ID byte 1 : Property ID for the sensor setting
+ break;
+ case 2:
+ pSensorsSettingParam[4]= 0x0F; // Sensor Setting Property ID byte 0 : Property ID for the sensor setting
+ //pSensorsSettingParam[5]= 0x00; // Sensor Setting Property ID byte 1 : Property ID for the sensor setting
+ break;
+ default:
+ break;
+ }
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR SETTING SET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_SETTING_SET, pSensorsSettingParam);
+
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR SETTING SET UNACK ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_SETTING_SET_UNACK, pSensorsSettingParam);
+#endif
+
+#endif
+
+#ifdef LIGHT_CLIENT_MODEL_PUBLISH
+ /** LIGHT LIGHTNESS **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_SET, pLightnessParam);
+//
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_SET_UNACK, pLightnessParam);
+
+ /** LIGHT LIGHTNESS LINEAR **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS SET LINEAR ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_LINEAR_SET, pLightnessParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS SET LINEAR UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_LINEAR_SET_UNACK, pLightnessParam);
+
+ /** LIGHT LIGHTNESS DEFAULT **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS DEFAULT SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_DEFAULT_SET, pLightnessParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS DEFAULT SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_DEFAULT_SET_UNACK, pLightnessParam);
+
+ /** LIGHT LIGHTNESS RANGE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS RANGE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_RANGE_SET, pLightnessRangeParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS RANGE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_RANGE_SET_UNACK, pLightnessRangeParam);
+
+ /** LIGHT LIGHTNESS CTL **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_SET, pLightCtlParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_SET_UNACK, pLightCtlParam);
+
+ /** LIGHT LIGHTNESS CTL TEMPERATURE**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_SET, pLightCtlTemperatureParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_SET_UNACK, pLightCtlTemperatureParam);
+
+ /** LIGHT LIGHTNESS CTL TEMPERATURE RANGE**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE RANGE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_RANGE_SET, pLightCtlTemperatureRangeParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE RANGE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_RANGE_SET_UNACK, pLightCtlTemperatureRangeParam);
+
+ /** LIGHT LIGHTNESS CTL DEFAULT**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL DEFAULT SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_DEFAULT_SET, pLightCtlDefaultParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL DEFAULT SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_DEFAULT_SET_UNACK, pLightCtlDefaultParam);
+
+ /** LIGHT LIGHTNESS HSL **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_SET, pLightHslParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_SET_UNACK, pLightHslParam);
+
+ /** LIGHT LIGHTNESS HSL DEFAULT **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL DEFAULT SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_DEFAULT_SET, pLightHslParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL DEFAULT SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_DEFAULT_SET_UNACK, pLightHslParam);
+
+ /** LIGHT LIGHTNESS HSL RANGE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL RANGE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_RANGE_SET, pLightHslRangeParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL RANGE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_RANGE_SET_UNACK, pLightHslRangeParam);
+
+ /** LIGHT LIGHTNESS HSL HUE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL HUE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_HUE_SET, pLightHslHueParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL HUE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_HUE_SET_UNACK, pLightHslHueParam);
+
+ /** LIGHT LIGHTNESS HSL SATURATION **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL SATURATION SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_SATURATION_SET, pLightHslSaturationParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL SATURATION SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_SATURATION_SET_UNACK, pLightHslSaturationParam);
+
+ /** LIGHT LC MODE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC MODE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_MODE_SET, pLightLCModeParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC MODE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_MODE_SET_UNACK, pLightLCModeParam);
+
+ /** LIGHT LC OM **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC OM SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_OM_SET, pLightLCOccupancyModeParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC OM SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_OM_SET_UNACK, pLightLCOccupancyModeParam);
+
+ /** LIGHT LC ONOFF **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC ONOFF SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_ON_OFF_SET, pLightLCOnOffParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC ONOFF SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_ON_OFF_SET_UNACK, pLightLCOnOffParam);
+
+ /** LIGHT LC PROPERTY **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC PROPERTY SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_PROPERTY_SET, pLightLCPropertyParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC PROPERTY SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_PROPERTY_SET_UNACK, pLightLCPropertyParam);
+#endif
#endif
-#ifndef CLIENT
/* if CLIENT and SERVER => Publish is already done in CLIENT */
#ifdef GENERIC_SERVER_MODEL_PUBLISH
+#ifndef GENERIC_CLIENT_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
+* @retval MOBLEUINT8 : elementNumber
*/
MOBLEUINT8 BLEMesh_ModelsGetElementNumber(MOBLE_ADDRESS dst_peer)
{
@@ -464,46 +1018,35 @@ MOBLEUINT8 BLEMesh_ModelsGetElementNumber(MOBLE_ADDRESS dst_peer)
}
/**
-* @brief Check Subscription of Elements for Group Address for selected Model
+* @brief Get the Element Index for selected Model
* @param dst_peer : Destination Address received
-* @param elementNumber : Number of element to check Subscription
-* @retval MOBLE_RESULT status of result
+* @retval MOBLEUINT8 : elementIndex
*/
-MOBLE_RESULT BLEMesh_ModelsCheckSubscription(MOBLE_ADDRESS dst_peer, \
- MOBLEUINT8 elementNumber)
+MOBLEUINT8 BLEMesh_ModelsGetElementIndex(MOBLE_ADDRESS dst_peer)
{
- 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);
+ MOBLE_ADDRESS nodeAddress;
+ MOBLEUINT8 elementIndex;
- for(uint8_t list=0; list<length; list++)
- {
- if(dst_peer == subscriptionList[list])
- {
- status = MOBLE_RESULT_SUCCESS;
- break;
- }
- }
+ nodeAddress = BLEMesh_GetAddress();
+ elementIndex =(dst_peer - nodeAddress);
- return status;
+ return elementIndex;
}
+
/**
* @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 *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* @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,
+void BLEMesh_ModelsDelayPacket(MODEL_MessageHeader_t *pmsgParams,
MOBLEUINT8 command,
MOBLEUINT8 const * data,
MOBLEUINT32 length)
@@ -541,8 +1084,11 @@ void BLEMesh_ModelsDelayPacket(MOBLE_ADDRESS peer,
}
}
- Appli_PendingPackets.head->peer = peer;
- Appli_PendingPackets.head->dst = dst;
+ Appli_PendingPackets.head->peer = pmsgParams->peer_addr;
+ Appli_PendingPackets.head->dst = pmsgParams->dst_peer;
+ Appli_PendingPackets.head->elementIndex = pmsgParams->elementIndex;
+ Appli_PendingPackets.head->appKeyOffset = pmsgParams->rcvdAppKeyOffset;
+ Appli_PendingPackets.head->netKeyOffset = pmsgParams->rcvdNetKeyOffset;
Appli_PendingPackets.head->command = command;
Appli_PendingPackets.head->length = length;
for (MOBLEUINT8 count=0; count<length; count++)
@@ -558,6 +1104,7 @@ void BLEMesh_ModelsDelayPacket(MOBLE_ADDRESS peer,
void BLEMesh_ModelsSendDelayedPacket(void)
{
APPLI_SEND_RESPONSE_MODULE* ptr;
+ MODEL_MessageHeader_t msgParam;
MOBLEUINT8 temp_index;
if ((Appli_PendingPackets.packet_count != 0) &&
@@ -571,9 +1118,17 @@ void BLEMesh_ModelsSendDelayedPacket(void)
-count)%MAX_PENDING_PACKETS_QUE_SIZE;
ptr = Appli_PendingPackets.packet + temp_index;
+ /* Initialize the messageParam*/
+ msgParam.dst_peer = ptr->dst;
+ msgParam.peer_addr = ptr->peer;
+ msgParam.elementIndex = 0;
+ msgParam.rcvdAppKeyOffset = 0;
+ msgParam.rcvdNetKeyOffset = 0;
+ msgParam.rssi = 0;
+ msgParam.ttl = 0;
+
VendorModel_SendResponse(VENDOR_STMICRO_CID,
- ptr->peer,
- ptr->dst,
+ &msgParam,
ptr->command,
ptr->data,
ptr->length);
@@ -587,14 +1142,14 @@ void BLEMesh_ModelsSendDelayedPacket(void)
* 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 elementIdx element index
* @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,
+MOBLE_RESULT MeshClient_SetRemotePublication(MOBLEUINT32 modelId, MOBLEUINT8 elementIdx,
MOBLEUINT16 msg_opcode, MOBLEUINT8 const *msg_buff,
MOBLEUINT32 length, MOBLEBOOL ack_flag,
MOBLEUINT8 isVendor)
@@ -604,7 +1159,7 @@ MOBLE_RESULT MeshClient_SetRemotePublication(MOBLEUINT32 modelId, MOBLEUINT16 el
srcAddress = BLEMesh_GetAddress();
srcAddress += elementIdx; /* Get the Address to send in the message */
- return BLEMesh_SetRemotePublication(GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
+ return BLEMesh_SetRemotePublication(modelId,
srcAddress ,
msg_opcode ,
msg_buff, length,
@@ -634,4 +1189,4 @@ __weak void Test_Process(void)
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/models_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/models_if.h
index 486e0bcec..f00d2d28d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/models_if.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/models_if.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
@@ -33,18 +33,19 @@
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 BLEMesh_ModelsGetElementIndex(MOBLE_ADDRESS dst_peer);
+void BLEMesh_ModelsDelayPacket(MODEL_MessageHeader_t *pmsgParams, 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,
+MOBLE_RESULT MeshClient_SetRemotePublication(MOBLEUINT32 modelId, MOBLEUINT8 elementIdx,
MOBLEUINT16 msg_opcode, MOBLEUINT8 const *msg_buff,
MOBLEUINT32 length, MOBLEBOOL ack_flag,
MOBLEUINT8 isVendor);
#endif /* __MODELS_H */
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/pal_nvm.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/pal_nvm.c
index c297d228c..12df6a87f 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/pal_nvm.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/pal_nvm.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
@@ -30,7 +30,7 @@
#include "hw_flash.h"
/* Private define ------------------------------------------------------------*/
-#define FLASH_SECTOR_SIZE 0x1000
+#define FLASH_SECTOR_SIZE 0x1000
/* Private variables ---------------------------------------------------------*/
@@ -168,7 +168,7 @@ MOBLE_RESULT PalNvmCompare(MOBLEUINT32 address,
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
MOBLEUINT32 i;
-
+
#ifdef ENABLE_SAVE_MODEL_STATE_NVM
// printf("MoblePalNvmCompare >>>\r\n");
@@ -228,7 +228,7 @@ MOBLE_RESULT PalNvmCompare(MOBLEUINT32 address,
* @retval Result
*/
MOBLE_RESULT PalNvmErase(MOBLEUINT32 address,
- MOBLEUINT32 offset)
+ MOBLEUINT32 offset)
{
HAL_StatusTypeDef status = HAL_OK;
@@ -272,9 +272,9 @@ MOBLE_RESULT PalNvmErase(MOBLEUINT32 address,
* @retval Result
*/
MOBLE_RESULT PalNvmWrite(MOBLEUINT32 address,
- MOBLEUINT32 offset,
- void const *buf,
- MOBLEUINT32 size)
+ MOBLEUINT32 offset,
+ void const *buf,
+ MOBLEUINT32 size)
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
@@ -436,8 +436,8 @@ static MOBLE_RESULT PalNvmBackupProcess(void)
*/
MOBLE_RESULT PalNvmProcess(void)
{
- /* do nothing */
- return MOBLE_RESULT_SUCCESS;
+ /* do nothing */
+ return MOBLE_RESULT_SUCCESS;
}
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/sensor_cfg_usr.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/sensor_cfg_usr.h
new file mode 100644
index 000000000..e7a4df96a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/sensor_cfg_usr.h
@@ -0,0 +1,685 @@
+/**
+******************************************************************************
+* @file sensor_cfg_usr.h
+* @author BLE Mesh Team
+* @brief sensor server initialization parameters
+******************************************************************************
+* @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 __SENSOR_USR_CFG_H
+#define __SENSOR_USR_CFG_H
+
+/**
+* Maximum count of settings that can be supported by a sensor
+* E.g., 5 sensors
+* 1st sensor has 2 settings
+* 2nd sensor has 3 settings
+* 3rd sensor has 2 settings
+* 4th sensor has 1 setting
+* 5th sensor has 2 settings
+* This value is max(2, 3, 2, 1, 2) = 3
+* value is >=1
+*/
+#define SENSOR_MAX_SETTINGS_COUNT 2
+
+/**
+* Maximum count of series column that is supported by a sensor
+* E.g., 2 sensors supporting series column
+* One sensor supports 2 columns while other sensor supports 20 columns
+* This value is max(2, 20) = 20
+* value is >=1
+*/
+#define SENSOR_MAX_SERIES_COUNT 1
+
+/**
+* Total sensors count on all elements
+* It is sum of sensors count on all elements
+* Sensor init fails in case of mismatch with sensor server initialization parameters
+*/
+#define TOTAL_SENSORS_COUNT 2
+
+/**
+* Sum of sensor settings on all sensors on all elements
+* Sensor init fails in case of mismatch with sensor server initialization parameters
+*/
+#define TOTAL_SENSOR_SETTINGS_COUNT 4
+
+/**
+* Sum of sensor series columns on all sensors on all elements
+* Sensor init fails in case of mismatch with sensor server initialization parameters
+*/
+#define TOTAL_SENSOR_SERIES_COLUMN_COUNT 0
+
+
+/**
+* This structure contains sensor setting initialization parameters
+*/
+typedef struct
+{
+ uint16_t settingPropertyId;
+ uint8_t settingAccess;
+ uint32_t settingRaw;
+}sensor_settings_init_params_t;
+
+
+/**
+* This structure contains sensor series column initialization parameters
+*/
+typedef struct
+{
+ uint32_t rawX;
+ uint32_t columnWidth;
+}sensor_series_column_init_params_t;
+
+
+/**
+* This structure contains sensor initialization parameters
+*/
+typedef struct
+{
+ uint8_t elementIdx;
+ uint16_t propertyId;
+ uint16_t positiveTolerance;
+ uint16_t negativeTolerance;
+ uint8_t samplingFunction;
+ uint8_t measurementPeriod;
+ uint8_t updateInterval;
+ uint8_t dataLength;
+ uint8_t cadenceState;
+ uint32_t valuesRange;
+ uint8_t settingsCount;
+ sensor_settings_init_params_t settings[SENSOR_MAX_SETTINGS_COUNT];
+ uint16_t seriesCount;
+ sensor_series_column_init_params_t seriesColumn[SENSOR_MAX_SERIES_COUNT];
+}sensor_init_params_t;
+
+
+/**
+* This structure contains sensor server initialization parameters
+*/
+typedef struct
+{
+ uint8_t sensorsCount;
+ sensor_init_params_t sensorInitParams[TOTAL_SENSORS_COUNT];
+} sensor_server_init_params_t;
+
+
+/**
+* Below section represents initialization parameters of sensors supported
+* Define sensors in ascending order of element index followed by ascending
+* order of Property IDs else initialization of sensor structure would fail
+* Single element can support one instance of sensor PID, there can't be multiple
+* instances of same PID on same element
+* For e.g. 10 sensors with PID (PID1 < PIDn ... < PID7) supported on 3 elements
+* with element index (0, 1 and 2) in below fashion
+* Element index 0 supports sensors corresponding to PID3, PID4, PID6 and PID7
+* Element index 1 supports sensors corresponding to PID2, PID4, PID5 and PID6
+* Element index 2 supports sensors corresponding to PID1, PID5
+* Corrector order of naming sensors (SENSORX) is
+* Element index 0 -> SENSOR1(PID3), SENSOR2(PID4), SENSOR3(PID6) and SENSOR4(PID7)
+* Element index 1 -> SENSOR5(PID2), SENSOR6(PID4), SENSOR7(PID5), and SENSOR8(PID6)
+* Element index 2 -> SENSOR9(PID1), and SENSOR10(PID5)
+*/
+
+/* Sensor 1 initialization */
+
+#define SENSOR1_ELEMENT_IDX 0
+#define SENSOR1_PROPERTY_ID PRESENT_AMBIENT_TEMPERATURE_PID
+#define SENSOR1_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR1_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR1_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR1_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR1_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR1_DATA_LENGTH 1
+#define SENSOR1_CADENCE_STATE SENSOR_CADENCE_SUPPORTED
+#define SENSOR1_VALUES_RANGE 254
+#define SENSOR1_SETTINGS_COUNT 2
+#define SENSOR1_SETTING1_PROPERTY_ID 0x00BB
+#define SENSOR1_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR1_SETTING1_RAW 0
+#define SENSOR1_SETTING2_PROPERTY_ID 0x00AD
+#define SENSOR1_SETTING2_ACCESS SENSOR_SETTING_ACCESS_READ_WRITE
+#define SENSOR1_SETTING2_RAW 0
+#define SENSOR1_SERIES_COUNT 0
+
+#define SENSOR1_SETTINGS1_INIT_PARAMS \
+{\
+ SENSOR1_SETTING1_PROPERTY_ID,\
+ SENSOR1_SETTING1_ACCESS,\
+ SENSOR1_SETTING1_RAW \
+}
+
+#define SENSOR1_SETTINGS2_INIT_PARAMS \
+{\
+ SENSOR1_SETTING2_PROPERTY_ID,\
+ SENSOR1_SETTING2_ACCESS,\
+ SENSOR1_SETTING2_RAW \
+}
+
+#define SENSOR1_INIT_PARAMS \
+{\
+ SENSOR1_ELEMENT_IDX,\
+ SENSOR1_PROPERTY_ID,\
+ SENSOR1_POSITIVE_TOLERANCE,\
+ SENSOR1_NEGATIVE_TOLERANCE,\
+ SENSOR1_SAMPLING_FUNCTION,\
+ SENSOR1_MEASUREMENT_PERIOD,\
+ SENSOR1_UPDATE_INTERVAL,\
+ SENSOR1_DATA_LENGTH,\
+ SENSOR1_CADENCE_STATE,\
+ SENSOR1_VALUES_RANGE,\
+ SENSOR1_SETTINGS_COUNT,\
+ {\
+ SENSOR1_SETTINGS1_INIT_PARAMS,\
+ SENSOR1_SETTINGS2_INIT_PARAMS\
+ },\
+ SENSOR1_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+/* Sensor 2 initialization */
+
+#define SENSOR2_ELEMENT_IDX 0
+#define SENSOR2_PROPERTY_ID PRESSURE_PID
+#define SENSOR2_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR2_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR2_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR2_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR2_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR2_DATA_LENGTH 4
+#define SENSOR2_CADENCE_STATE SENSOR_CADENCE_NOT_SUPPORTED
+#define SENSOR2_VALUES_RANGE 500
+#define SENSOR2_SETTINGS_COUNT 2
+#define SENSOR2_SETTING1_PROPERTY_ID 0x0AAA
+#define SENSOR2_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR2_SETTING1_RAW 35666
+#define SENSOR2_SETTING2_PROPERTY_ID 0x0AAC
+#define SENSOR2_SETTING2_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR2_SETTING2_RAW 33666
+#define SENSOR2_SERIES_COUNT 0
+
+#define SENSOR2_SETTINGS1_INIT_PARAMS \
+{\
+ SENSOR2_SETTING1_PROPERTY_ID,\
+ SENSOR2_SETTING1_ACCESS,\
+ SENSOR2_SETTING1_RAW\
+}
+
+#define SENSOR2_SETTINGS2_INIT_PARAMS \
+{\
+ SENSOR2_SETTING2_PROPERTY_ID,\
+ SENSOR2_SETTING2_ACCESS,\
+ SENSOR2_SETTING2_RAW\
+}
+
+#define SENSOR2_INIT_PARAMS \
+{\
+ SENSOR2_ELEMENT_IDX,\
+ SENSOR2_PROPERTY_ID,\
+ SENSOR2_POSITIVE_TOLERANCE,\
+ SENSOR2_NEGATIVE_TOLERANCE,\
+ SENSOR2_SAMPLING_FUNCTION,\
+ SENSOR2_MEASUREMENT_PERIOD,\
+ SENSOR2_UPDATE_INTERVAL,\
+ SENSOR2_DATA_LENGTH,\
+ SENSOR2_CADENCE_STATE,\
+ SENSOR2_VALUES_RANGE,\
+ SENSOR2_SETTINGS_COUNT,\
+ {\
+ SENSOR2_SETTINGS1_INIT_PARAMS,\
+ SENSOR2_SETTINGS2_INIT_PARAMS\
+ },\
+ SENSOR2_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+/**
+* Combined defined of all sensors intialization parameters
+*/
+
+#define SENSOR_SERVER_INIT_PARAMS \
+{\
+ TOTAL_SENSORS_COUNT,\
+ {\
+ SENSOR1_INIT_PARAMS,\
+ SENSOR2_INIT_PARAMS,\
+ }\
+}
+#endif /* __SENSOR_USR_CFG_H */
+
+/*
+
+Example for multiple sensors with series column support
+
+#define SENSOR_MAX_SETTINGS_COUNT 3
+#define SENSOR_MAX_SERIES_COUNT 20
+#define TOTAL_SENSORS_COUNT 5
+#define TOTAL_SENSOR_SETTINGS_COUNT 9
+#define TOTAL_SENSOR_SERIES_COLUMN_COUNT 22
+
+#define SENSOR1_ELEMENT_IDX 0
+#define SENSOR1_PROPERTY_ID PEOPLE_COUNT_PID
+#define SENSOR1_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR1_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR1_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR1_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR1_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR1_DATA_LENGTH 2
+#define SENSOR1_CADENCE_STATE SENSOR_CADENCE_SUPPORTED
+#define SENSOR1_VALUES_RANGE 1000
+#define SENSOR1_SETTINGS_COUNT 3
+#define SENSOR1_SETTING1_PROPERTY_ID 0x000A
+#define SENSOR1_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR1_SETTING1_RAW 234
+#define SENSOR1_SETTING2_PROPERTY_ID 0x000C
+#define SENSOR1_SETTING2_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR1_SETTING2_RAW 246
+#define SENSOR1_SETTING3_PROPERTY_ID 0x0010
+#define SENSOR1_SETTING3_ACCESS SENSOR_SETTING_ACCESS_READ_WRITE
+#define SENSOR1_SETTING3_RAW 278
+#define SENSOR1_SERIES_COUNT 0
+
+#define SENSOR1_SETTINGS1_INIT_PARAMS \
+{\
+ SENSOR1_SETTING1_PROPERTY_ID,\
+ SENSOR1_SETTING1_ACCESS,\
+ SENSOR1_SETTING1_RAW\
+}
+
+#define SENSOR1_SETTINGS2_INIT_PARAMS \
+{\
+ SENSOR1_SETTING2_PROPERTY_ID,\
+ SENSOR1_SETTING2_ACCESS,\
+ SENSOR1_SETTING2_RAW\
+}
+
+#define SENSOR1_SETTINGS3_INIT_PARAMS \
+{\
+ SENSOR1_SETTING3_PROPERTY_ID,\
+ SENSOR1_SETTING3_ACCESS,\
+ SENSOR1_SETTING3_RAW\
+}
+
+#define SENSOR1_INIT_PARAMS \
+{\
+ SENSOR1_ELEMENT_IDX,\
+ SENSOR1_PROPERTY_ID,\
+ SENSOR1_POSITIVE_TOLERANCE,\
+ SENSOR1_NEGATIVE_TOLERANCE,\
+ SENSOR1_SAMPLING_FUNCTION,\
+ SENSOR1_MEASUREMENT_PERIOD,\
+ SENSOR1_UPDATE_INTERVAL,\
+ SENSOR1_DATA_LENGTH,\
+ SENSOR1_CADENCE_STATE,\
+ SENSOR1_VALUES_RANGE,\
+ SENSOR1_SETTINGS_COUNT,\
+ {\
+ SENSOR1_SETTINGS1_INIT_PARAMS,\
+ SENSOR1_SETTINGS2_INIT_PARAMS,\
+ SENSOR1_SETTINGS3_INIT_PARAMS\
+ },\
+ SENSOR1_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+#define SENSOR2_ELEMENT_IDX 0
+#define SENSOR2_PROPERTY_ID DESIRED_AMBIENT_TEMPERATURE_PID
+#define SENSOR2_POSITIVE_TOLERANCE 0xabc
+#define SENSOR2_NEGATIVE_TOLERANCE 0xdef
+#define SENSOR2_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_RMS
+#define SENSOR2_MEASUREMENT_PERIOD 0x04
+#define SENSOR2_UPDATE_INTERVAL 0x05
+#define SENSOR2_DATA_LENGTH 1
+#define SENSOR2_CADENCE_STATE SENSOR_CADENCE_SUPPORTED
+#define SENSOR2_VALUES_RANGE 100
+#define SENSOR2_SETTINGS_COUNT 2
+#define SENSOR2_SETTING1_PROPERTY_ID 0x00BB
+#define SENSOR2_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR2_SETTING1_RAW 345
+#define SENSOR2_SETTING2_PROPERTY_ID 0x00AD
+#define SENSOR2_SETTING2_ACCESS SENSOR_SETTING_ACCESS_READ_WRITE
+#define SENSOR2_SETTING2_RAW 435
+#define SENSOR2_SERIES_COUNT 0
+
+#define SENSOR2_SETTINGS1_INIT_PARAMS \
+{\
+ SENSOR2_SETTING1_PROPERTY_ID,\
+ SENSOR2_SETTING1_ACCESS,\
+ SENSOR2_SETTING1_RAW\
+}
+
+#define SENSOR2_SETTINGS2_INIT_PARAMS \
+{\
+ SENSOR2_SETTING2_PROPERTY_ID,\
+ SENSOR2_SETTING2_ACCESS,\
+ SENSOR2_SETTING2_RAW \
+}
+
+#define SENSOR2_INIT_PARAMS \
+{\
+ SENSOR2_ELEMENT_IDX,\
+ SENSOR2_PROPERTY_ID,\
+ SENSOR2_POSITIVE_TOLERANCE,\
+ SENSOR2_NEGATIVE_TOLERANCE,\
+ SENSOR2_SAMPLING_FUNCTION,\
+ SENSOR2_MEASUREMENT_PERIOD,\
+ SENSOR2_UPDATE_INTERVAL,\
+ SENSOR2_DATA_LENGTH,\
+ SENSOR2_CADENCE_STATE,\
+ SENSOR2_VALUES_RANGE,\
+ SENSOR2_SETTINGS_COUNT,\
+ {\
+ SENSOR2_SETTINGS1_INIT_PARAMS,\
+ SENSOR2_SETTINGS2_INIT_PARAMS\
+ },\
+ SENSOR2_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+#define SENSOR3_ELEMENT_IDX 0
+#define SENSOR3_PROPERTY_ID PRESSURE_PID
+#define SENSOR3_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR3_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR3_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR3_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR3_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR3_DATA_LENGTH 2
+#define SENSOR3_CADENCE_STATE SENSOR_CADENCE_NOT_SUPPORTED
+#define SENSOR3_VALUES_RANGE 500
+#define SENSOR3_SETTINGS_COUNT 2
+#define SENSOR3_SETTING1_PROPERTY_ID 0x0AAA
+#define SENSOR3_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR3_SETTING1_RAW 35666
+#define SENSOR3_SETTING2_PROPERTY_ID 0x0AAC
+#define SENSOR3_SETTING2_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR3_SETTING2_RAW 33666
+#define SENSOR3_SERIES_COUNT 20
+#define SENSOR3_SERIES1_RAWX 0
+#define SENSOR3_SERIES1_CW 10
+#define SENSOR3_SERIES2_RAWX 23
+#define SENSOR3_SERIES2_CW 10
+#define SENSOR3_SERIES3_RAWX 34
+#define SENSOR3_SERIES3_CW 10
+#define SENSOR3_SERIES4_RAWX 35
+#define SENSOR3_SERIES4_CW 10
+#define SENSOR3_SERIES5_RAWX 36
+#define SENSOR3_SERIES5_CW 10
+#define SENSOR3_SERIES6_RAWX 40
+#define SENSOR3_SERIES6_CW 10
+#define SENSOR3_SERIES7_RAWX 41
+#define SENSOR3_SERIES7_CW 10
+#define SENSOR3_SERIES8_RAWX 42
+#define SENSOR3_SERIES8_CW 10
+#define SENSOR3_SERIES9_RAWX 43
+#define SENSOR3_SERIES9_CW 10
+#define SENSOR3_SERIES10_RAWX 45
+#define SENSOR3_SERIES10_CW 10
+#define SENSOR3_SERIES11_RAWX 46
+#define SENSOR3_SERIES11_CW 10
+#define SENSOR3_SERIES12_RAWX 47
+#define SENSOR3_SERIES12_CW 10
+#define SENSOR3_SERIES13_RAWX 48
+#define SENSOR3_SERIES13_CW 10
+#define SENSOR3_SERIES14_RAWX 49
+#define SENSOR3_SERIES14_CW 10
+#define SENSOR3_SERIES15_RAWX 50
+#define SENSOR3_SERIES15_CW 10
+#define SENSOR3_SERIES16_RAWX 51
+#define SENSOR3_SERIES16_CW 10
+#define SENSOR3_SERIES17_RAWX 52
+#define SENSOR3_SERIES17_CW 10
+#define SENSOR3_SERIES18_RAWX 53
+#define SENSOR3_SERIES18_CW 10
+#define SENSOR3_SERIES19_RAWX 55
+#define SENSOR3_SERIES19_CW 10
+#define SENSOR3_SERIES20_RAWX 89
+#define SENSOR3_SERIES20_CW 10
+
+#define SENSOR3_SETTINGS1_INIT_PARAMS \
+{\
+ SENSOR3_SETTING1_PROPERTY_ID,\
+ SENSOR3_SETTING1_ACCESS,\
+ SENSOR3_SETTING1_RAW\
+}
+
+#define SENSOR3_SETTINGS2_INIT_PARAMS \
+{\
+ SENSOR3_SETTING2_PROPERTY_ID,\
+ SENSOR3_SETTING2_ACCESS,\
+ SENSOR3_SETTING2_RAW\
+}
+
+#define SENSOR3_COLUMN1_INIT_PARAMS {SENSOR3_SERIES1_RAWX,SENSOR3_SERIES1_CW}
+#define SENSOR3_COLUMN2_INIT_PARAMS {SENSOR3_SERIES2_RAWX,SENSOR3_SERIES2_CW}
+#define SENSOR3_COLUMN3_INIT_PARAMS {SENSOR3_SERIES3_RAWX,SENSOR3_SERIES3_CW}
+#define SENSOR3_COLUMN4_INIT_PARAMS {SENSOR3_SERIES4_RAWX,SENSOR3_SERIES4_CW}
+#define SENSOR3_COLUMN5_INIT_PARAMS {SENSOR3_SERIES5_RAWX,SENSOR3_SERIES5_CW}
+#define SENSOR3_COLUMN6_INIT_PARAMS {SENSOR3_SERIES6_RAWX,SENSOR3_SERIES6_CW}
+#define SENSOR3_COLUMN7_INIT_PARAMS {SENSOR3_SERIES7_RAWX,SENSOR3_SERIES7_CW}
+#define SENSOR3_COLUMN8_INIT_PARAMS {SENSOR3_SERIES8_RAWX,SENSOR3_SERIES8_CW}
+#define SENSOR3_COLUMN9_INIT_PARAMS {SENSOR3_SERIES9_RAWX,SENSOR3_SERIES9_CW}
+#define SENSOR3_COLUMN10_INIT_PARAMS {SENSOR3_SERIES10_RAWX,SENSOR3_SERIES10_CW}
+#define SENSOR3_COLUMN11_INIT_PARAMS {SENSOR3_SERIES11_RAWX,SENSOR3_SERIES11_CW}
+#define SENSOR3_COLUMN12_INIT_PARAMS {SENSOR3_SERIES12_RAWX,SENSOR3_SERIES12_CW}
+#define SENSOR3_COLUMN13_INIT_PARAMS {SENSOR3_SERIES13_RAWX,SENSOR3_SERIES13_CW}
+#define SENSOR3_COLUMN14_INIT_PARAMS {SENSOR3_SERIES14_RAWX,SENSOR3_SERIES14_CW}
+#define SENSOR3_COLUMN15_INIT_PARAMS {SENSOR3_SERIES15_RAWX,SENSOR3_SERIES15_CW}
+#define SENSOR3_COLUMN16_INIT_PARAMS {SENSOR3_SERIES16_RAWX,SENSOR3_SERIES16_CW}
+#define SENSOR3_COLUMN17_INIT_PARAMS {SENSOR3_SERIES17_RAWX,SENSOR3_SERIES17_CW}
+#define SENSOR3_COLUMN18_INIT_PARAMS {SENSOR3_SERIES18_RAWX,SENSOR3_SERIES18_CW}
+#define SENSOR3_COLUMN19_INIT_PARAMS {SENSOR3_SERIES19_RAWX,SENSOR3_SERIES19_CW}
+#define SENSOR3_COLUMN20_INIT_PARAMS {SENSOR3_SERIES20_RAWX,SENSOR3_SERIES20_CW}
+
+#define SENSOR3_INIT_PARAMS \
+{\
+ SENSOR3_ELEMENT_IDX,\
+ SENSOR3_PROPERTY_ID,\
+ SENSOR3_POSITIVE_TOLERANCE,\
+ SENSOR3_NEGATIVE_TOLERANCE,\
+ SENSOR3_SAMPLING_FUNCTION,\
+ SENSOR3_MEASUREMENT_PERIOD,\
+ SENSOR3_UPDATE_INTERVAL,\
+ SENSOR3_DATA_LENGTH,\
+ SENSOR3_CADENCE_STATE,\
+ SENSOR3_VALUES_RANGE,\
+ SENSOR3_SETTINGS_COUNT,\
+ {\
+ SENSOR3_SETTINGS1_INIT_PARAMS,\
+ SENSOR3_SETTINGS2_INIT_PARAMS\
+ },\
+ SENSOR3_SERIES_COUNT,\
+ {\
+ SENSOR3_COLUMN1_INIT_PARAMS,\
+ SENSOR3_COLUMN2_INIT_PARAMS,\
+ SENSOR3_COLUMN3_INIT_PARAMS,\
+ SENSOR3_COLUMN4_INIT_PARAMS,\
+ SENSOR3_COLUMN5_INIT_PARAMS,\
+ SENSOR3_COLUMN6_INIT_PARAMS,\
+ SENSOR3_COLUMN7_INIT_PARAMS,\
+ SENSOR3_COLUMN8_INIT_PARAMS,\
+ SENSOR3_COLUMN9_INIT_PARAMS,\
+ SENSOR3_COLUMN10_INIT_PARAMS,\
+ SENSOR3_COLUMN11_INIT_PARAMS,\
+ SENSOR3_COLUMN12_INIT_PARAMS,\
+ SENSOR3_COLUMN13_INIT_PARAMS,\
+ SENSOR3_COLUMN14_INIT_PARAMS,\
+ SENSOR3_COLUMN15_INIT_PARAMS,\
+ SENSOR3_COLUMN16_INIT_PARAMS,\
+ SENSOR3_COLUMN17_INIT_PARAMS,\
+ SENSOR3_COLUMN18_INIT_PARAMS,\
+ SENSOR3_COLUMN19_INIT_PARAMS,\
+ SENSOR3_COLUMN20_INIT_PARAMS}\
+}
+
+#define SENSOR4_ELEMENT_IDX 0
+#define SENSOR4_PROPERTY_ID HUMIDITY_PID
+#define SENSOR4_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR4_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR4_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR4_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR4_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR4_DATA_LENGTH 2
+#define SENSOR4_CADENCE_STATE SENSOR_CADENCE_SUPPORTED
+#define SENSOR4_VALUES_RANGE 200
+#define SENSOR4_SETTINGS_COUNT 1
+#define SENSOR4_SETTING1_PROPERTY_ID 0xAAAA
+#define SENSOR4_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ_WRITE
+#define SENSOR4_SETTING1_RAW 35666
+#define SENSOR4_SERIES_COUNT 0
+
+#define SENSOR4_SETTINGS_INIT_PARAMS \
+{\
+ SENSOR4_SETTING1_PROPERTY_ID,\
+ SENSOR4_SETTING1_ACCESS,\
+ SENSOR4_SETTING1_RAW\
+}
+
+#define SENSOR4_INIT_PARAMS \
+{\
+ SENSOR4_ELEMENT_IDX,\
+ SENSOR4_PROPERTY_ID,\
+ SENSOR4_POSITIVE_TOLERANCE,\
+ SENSOR4_NEGATIVE_TOLERANCE,\
+ SENSOR4_SAMPLING_FUNCTION,\
+ SENSOR4_MEASUREMENT_PERIOD,\
+ SENSOR4_UPDATE_INTERVAL,\
+ SENSOR4_DATA_LENGTH,\
+ SENSOR4_CADENCE_STATE,\
+ SENSOR4_VALUES_RANGE,\
+ SENSOR4_SETTINGS_COUNT,\
+ {\
+ SENSOR4_SETTINGS_INIT_PARAMS\
+ },\
+ SENSOR4_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+#define SENSOR5_ELEMENT_IDX 0
+#define SENSOR5_PROPERTY_ID TIME_OF_FLIGHT_PID
+#define SENSOR5_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR5_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR5_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR5_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR5_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR5_DATA_LENGTH 2
+#define SENSOR5_CADENCE_STATE SENSOR_CADENCE_NOT_SUPPORTED
+#define SENSOR5_VALUES_RANGE 0
+#define SENSOR5_SETTINGS_COUNT 1
+#define SENSOR5_SETTING1_PROPERTY_ID 0xAAFA
+#define SENSOR5_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR5_SETTING1_RAW 35666
+#define SENSOR5_SERIES_COUNT 2
+#define SENSOR5_SERIES1_RAWX 20
+#define SENSOR5_SERIES1_CW 30
+#define SENSOR5_SERIES2_RAWX 50
+#define SENSOR5_SERIES2_CW 40
+
+#define SENSOR5_SETTINGS_INIT_PARAMS \
+{\
+ SENSOR5_SETTING1_PROPERTY_ID,\
+ SENSOR5_SETTING1_ACCESS,\
+ SENSOR5_SETTING1_RAW\
+}
+
+#define SENSOR5_COLUMN1_INIT_PARAMS {SENSOR5_SERIES1_RAWX,SENSOR5_SERIES1_CW}
+#define SENSOR5_COLUMN2_INIT_PARAMS {SENSOR5_SERIES2_RAWX,SENSOR5_SERIES2_CW}
+
+#define SENSOR5_INIT_PARAMS \
+{\
+ SENSOR5_ELEMENT_IDX,\
+ SENSOR5_PROPERTY_ID,\
+ SENSOR5_POSITIVE_TOLERANCE,\
+ SENSOR5_NEGATIVE_TOLERANCE,\
+ SENSOR5_SAMPLING_FUNCTION,\
+ SENSOR5_MEASUREMENT_PERIOD,\
+ SENSOR5_UPDATE_INTERVAL,\
+ SENSOR5_DATA_LENGTH,\
+ SENSOR5_CADENCE_STATE,\
+ SENSOR5_VALUES_RANGE,\
+ SENSOR5_SETTINGS_COUNT,\
+ {\
+ SENSOR5_SETTINGS_INIT_PARAMS\
+ },\
+ SENSOR5_SERIES_COUNT,\
+ {\
+ SENSOR5_COLUMN1_INIT_PARAMS,\
+ SENSOR5_COLUMN2_INIT_PARAMS\
+ }\
+}
+
+#define SENSOR6_ELEMENT_IDX 0
+#define SENSOR6_PROPERTY_ID PRESENCE_PID
+#define SENSOR6_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR6_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR6_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR6_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR6_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR6_DATA_LENGTH 1
+#define SENSOR6_CADENCE_STATE SENSOR_CADENCE_NOT_SUPPORTED
+#define SENSOR6_VALUES_RANGE 0
+#define SENSOR6_SETTINGS_COUNT 0
+#define SENSOR6_SERIES_COUNT 0
+
+#define SENSOR6_SETTINGS_INIT_PARAMS \
+{\
+ {\
+ {0}\
+ }\
+}
+
+#define SENSOR6_INIT_PARAMS \
+{\
+ SENSOR6_ELEMENT_IDX,\
+ SENSOR6_PROPERTY_ID,\
+ SENSOR6_POSITIVE_TOLERANCE,\
+ SENSOR6_NEGATIVE_TOLERANCE,\
+ SENSOR6_SAMPLING_FUNCTION,\
+ SENSOR6_MEASUREMENT_PERIOD,\
+ SENSOR6_UPDATE_INTERVAL,\
+ SENSOR6_DATA_LENGTH,\
+ SENSOR6_CADENCE_STATE,\
+ SENSOR6_VALUES_RANGE,\
+ SENSOR6_SETTINGS_COUNT,\
+ {\
+ {0}\
+ },\
+ SENSOR6_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+#define SENSOR_SERVER_INIT_PARAMS \
+{\
+ TOTAL_SENSORS_COUNT,\
+ {\
+ SENSOR1_INIT_PARAMS,\
+ SENSOR2_INIT_PARAMS,\
+ SENSOR3_INIT_PARAMS,\
+ SENSOR4_INIT_PARAMS,\
+ SENSOR5_INIT_PARAMS\
+ }\
+}
+*/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/tl_dbg_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/tl_dbg_conf.h
new file mode 100644
index 000000000..b468b2863
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/tl_dbg_conf.h
@@ -0,0 +1,126 @@
+/**
+ ******************************************************************************
+ * File Name : tl_dbg_conf.h
+ * Description : Debug configuration file for stm32wpan transport layer 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
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __TL_DBG_CONF_H
+#define __TL_DBG_CONF_H
+
+/* USER CODE BEGIN Tl_Conf */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_conf.h" /* required as some configuration used in dbg_trace.h are set there */
+#include "dbg_trace.h"
+#include "hw_if.h"
+
+/**
+ * Enable or Disable traces
+ * The raw data output is the hci binary packet format as specified by the BT specification *
+ */
+#define TL_SHCI_CMD_DBG_EN 0 /* Reports System commands sent to CPU2 and the command response */
+#define TL_SHCI_CMD_DBG_RAW_EN 0 /* Reports raw data System commands sent to CPU2 and the command response */
+#define TL_SHCI_EVT_DBG_EN 0 /* Reports System Asynchronous Events received from CPU2 */
+#define TL_SHCI_EVT_DBG_RAW_EN 0 /* Reports raw data System Asynchronous Events received from CPU2 */
+
+#define TL_HCI_CMD_DBG_EN 0 /* Reports BLE command sent to CPU2 and the command response */
+#define TL_HCI_CMD_DBG_RAW_EN 0 /* Reports raw data BLE command sent to CPU2 and the command response */
+#define TL_HCI_EVT_DBG_EN 0 /* Reports BLE Asynchronous Events received from CPU2 */
+#define TL_HCI_EVT_DBG_RAW_EN 0 /* Reports raw data BLE Asynchronous Events received from CPU2 */
+
+#define TL_MM_DBG_EN 0 /* Reports the informations of the buffer released to CPU2 */
+
+/**
+ * Macro definition
+ */
+
+/**
+ * System Transport Layer
+ */
+#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_CMD_DBG_RAW_EN != 0)
+#define TL_SHCI_CMD_DBG_RAW(_PDATA_, _SIZE_) HW_UART_Transmit(hw_uart1, (uint8_t*)_PDATA_, _SIZE_, (~0))
+#else
+#define TL_SHCI_CMD_DBG_RAW(...)
+#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
+
+#if (TL_SHCI_EVT_DBG_RAW_EN != 0)
+#define TL_SHCI_EVT_DBG_RAW(_PDATA_, _SIZE_) HW_UART_Transmit(hw_uart1, (uint8_t*)_PDATA_, _SIZE_, (~0))
+#else
+#define TL_SHCI_EVT_DBG_RAW(...)
+#endif
+
+/**
+ * BLE Transport Layer
+ */
+#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_CMD_DBG_RAW_EN != 0)
+#define TL_HCI_CMD_DBG_RAW(_PDATA_, _SIZE_) HW_UART_Transmit(hw_uart1, (uint8_t*)_PDATA_, _SIZE_, (~0))
+#else
+#define TL_HCI_CMD_DBG_RAW(...)
+#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
+
+#if (TL_HCI_EVT_DBG_RAW_EN != 0)
+#define TL_HCI_EVT_DBG_RAW(_PDATA_, _SIZE_) HW_UART_Transmit(hw_uart1, (uint8_t*)_PDATA_, _SIZE_, (~0))
+#else
+#define TL_HCI_EVT_DBG_RAW(...)
+#endif
+
+/**
+ * Memory Manager - Released buffer tracing
+ */
+#if (TL_MM_DBG_EN != 0)
+#define TL_MM_DBG_MSG PRINT_MESG_DBG
+#else
+#define TL_MM_DBG_MSG(...)
+#endif
+
+/* USER CODE END Tl_Conf */
+
+#endif /*__TL_DBG_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/target/hw_ipcc.c
index a58b95cad..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/target/hw_ipcc.c
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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_MeshLightingPRFNode/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_common.h
index 9dbfbba05..7e66ee35a 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_common.h
@@ -67,9 +67,13 @@ extern "C"
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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
index 0d66c0b14..32de9fdc1 100644
--- 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
@@ -51,7 +51,7 @@
*/
#define CFG_BONDING_MODE (1)
#define CFG_FIXED_PIN (111111)
-#define CFG_USED_FIXED_PIN (0)
+#define CFG_USED_FIXED_PIN (1)
#define CFG_ENCRYPTION_KEY_SIZE_MAX (16)
#define CFG_ENCRYPTION_KEY_SIZE_MIN (8)
@@ -74,6 +74,28 @@
#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_NOT_SUPPORTED
+
+/**
+ * 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)
/**
* Define PHY
@@ -142,7 +164,7 @@
* Maximum number of simultaneous connections that the device will support.
* Valid values are from 1 to 8
*/
-#define CFG_BLE_NUM_LINK 8
+#define CFG_BLE_NUM_LINK 2
/**
* Maximum number of Services that can be stored in the GATT database.
@@ -487,6 +509,7 @@ typedef enum
CFG_TASK_MESH_UART_RX_REQ_ID,
CFG_TASK_APPLI_REQ_ID,
CFG_TASK_MESH_SW1_REQ_ID,
+ CFG_TASK_MESH_SW3_REQ_ID,
CFG_TASK_MESH_LPN_REQ_ID,
CFG_LAST_TASK_ID_WITH_HCICMD, /**< Shall be LAST in the list */
@@ -496,7 +519,7 @@ typedef enum
typedef enum
{
CFG_FIRST_TASK_ID_WITH_NO_HCICMD = CFG_LAST_TASK_ID_WITH_HCICMD - 1, /**< Shall be FIRST in the list */
-
+ CFG_TASK_SW1_BUTTON_PUSHED_ID,
CFG_TASK_SYSTEM_HCI_ASYNCH_EVT_ID,
CFG_LAST_TASK_ID_WITHO_NO_HCICMD /**< Shall be LAST in the list */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_conf.h
index 1e2d7a616..b703e7393 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/hw_conf.h
@@ -1,36 +1,39 @@
+/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file hw_conf.h
* @author MCD Application Team
* @brief Configuration of hardware interface
- ******************************************************************************
- * @attention
- *
+ ******************************************************************************
+ * @attention
+ *
* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under Ultimate Liberty license
- * SLA0044, the "License"; You may not use this file except in compliance with
- * the License. You may obtain a copy of the License at:
- * www.st.com/SLA0044
- *
- ******************************************************************************
- */
-
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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
+#ifndef HW_CONF_H
+#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
* 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.
+* Once the Semaphore has been released, there shall be at least 1us before it can be taken again. This is required
+* to give the opportunity to CPU2 to take it.
* 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()
@@ -69,7 +72,6 @@
/* Index of the semaphore used to access the RNG */
#define CFG_HW_RNG_SEMID 0
-
/******************************************************************************
* HW TIMER SERVER
*****************************************************************************/
@@ -84,7 +86,7 @@
* wakeup timer.
* This setting is the preemptpriority part of the NVIC.
*/
-#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+#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
@@ -92,7 +94,7 @@
* 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 CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
/**
* Define a critical section in the Timer server
@@ -108,35 +110,35 @@
* 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
+#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
- */
+ * 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_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
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
/**
* LPUART1
@@ -242,6 +244,6 @@
#define CFG_HW_USART1_TX_DMA_IRQn DMA2_Channel4_IRQn
#define CFG_HW_USART1_DMA_TX_IRQHandler DMA2_Channel4_IRQHandler
-#endif /*__HW_CONF_H */
+#endif /*HW_CONF_H */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/main.h
index 3de57ae3e..0dfed68a8 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/main.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/main.h
@@ -31,6 +31,8 @@
extern RTC_HandleTypeDef hrtc; /**< RTC handler declaration */
/* Exported macro ------------------------------------------------------------*/
+/* Exported functions prototypes ---------------------------------------------*/
+void Error_Handler(void);
/* Exported functions ------------------------------------------------------- */
#endif /* __MAIN_H */
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
index ca974416b..8dd4a7e3b 100644
--- 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
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "main.h"
@@ -172,7 +173,7 @@ void APPE_Init( void )
* @param None
* @retval None
*/
-static void SystemPower_Config(void)
+static void SystemPower_Config( void )
{
/**
@@ -181,7 +182,7 @@ static void SystemPower_Config(void)
LL_RCC_SetClkAfterWakeFromStop(LL_RCC_STOP_WAKEUPCLOCK_HSI);
/* Initialize low power manager */
- UTIL_LPM_Init();
+ UTIL_LPM_Init( );
/* Initialize the CPU2 reset value before starting CPU2 with C2BOOT */
LL_C2_PWR_SetPowerMode(LL_PWR_MODE_SHUTDOWN);
@@ -232,7 +233,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
@@ -373,37 +374,14 @@ void HAL_GPIO_EXTI_Callback( uint16_t GPIO_Pin )
break;
#ifdef ENABLE_OCCUPANCY_SENSOR
- case BUTTON_SW2_PIN:
+ case BUTTON_SW3_PIN:
{
Occupancy_Flag = 1;
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_SW3_REQ_ID, CFG_SCH_PRIO_0);
}
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;
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/main.c
index 34c013a8e..95537ac98 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/Core/Src/main.c
@@ -327,11 +327,10 @@ void SystemClock_Config(void)
/** Configure LSE Drive Capability
*/
__HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
- /** Configure the main internal regulator output voltage
+ /** Configure the main internal regulator output voltage
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
- /** Initializes the RCC Oscillators according to the specified parameters
- * in the RCC_OscInitTypeDef structure.
+ /** Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
|RCC_OSCILLATORTYPE_LSE;
@@ -344,7 +343,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
@@ -364,7 +363,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Initializes the peripherals clocks
+ /** Initializes the peripherals clocks
*/
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
|RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
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
index 79163e084..04c4aff3a 100644
--- 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
@@ -833,7 +833,6 @@
<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>
@@ -1120,6 +1119,9 @@
<name>$PROJ_DIR$\..\STM32_WPAN\app\appli_sensor.c</name>
</file>
<file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\appli_sensors_client.c</name>
+ </file>
+ <file>
<name>$PROJ_DIR$\..\STM32_WPAN\app\appli_vendor.c</name>
</file>
<file>
@@ -1260,6 +1262,9 @@
<name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\sensors.c</name>
</file>
<file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\sensors_client.c</name>
+ </file>
+ <file>
<name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\svc\Src\svc_ctl.c</name>
</file>
<file>
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
index d2af01aca..8b007eeb0 100644
--- 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
@@ -479,6 +479,18 @@
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>25</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\STM32_WPAN\app\appli_sensors_client.c</PathWithFileName>
+ <FilenameWithoutPath>appli_sensors_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
</Group>
<Group>
@@ -489,7 +501,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>4</GroupNumber>
- <FileNumber>25</FileNumber>
+ <FileNumber>26</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -509,7 +521,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>5</GroupNumber>
- <FileNumber>26</FileNumber>
+ <FileNumber>27</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -529,7 +541,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>6</GroupNumber>
- <FileNumber>27</FileNumber>
+ <FileNumber>28</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -549,7 +561,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>7</GroupNumber>
- <FileNumber>28</FileNumber>
+ <FileNumber>29</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -569,7 +581,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>29</FileNumber>
+ <FileNumber>30</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -581,7 +593,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>30</FileNumber>
+ <FileNumber>31</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -593,7 +605,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>31</FileNumber>
+ <FileNumber>32</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -605,7 +617,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>32</FileNumber>
+ <FileNumber>33</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -617,7 +629,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>33</FileNumber>
+ <FileNumber>34</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -629,7 +641,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>34</FileNumber>
+ <FileNumber>35</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -641,7 +653,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>35</FileNumber>
+ <FileNumber>36</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -653,7 +665,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>36</FileNumber>
+ <FileNumber>37</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -665,7 +677,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>37</FileNumber>
+ <FileNumber>38</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -677,7 +689,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>38</FileNumber>
+ <FileNumber>39</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -689,7 +701,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>39</FileNumber>
+ <FileNumber>40</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -701,7 +713,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>40</FileNumber>
+ <FileNumber>41</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -713,7 +725,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>41</FileNumber>
+ <FileNumber>42</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -725,7 +737,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>42</FileNumber>
+ <FileNumber>43</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -737,7 +749,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>43</FileNumber>
+ <FileNumber>44</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -749,7 +761,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>44</FileNumber>
+ <FileNumber>45</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -761,7 +773,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>45</FileNumber>
+ <FileNumber>46</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -773,7 +785,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>46</FileNumber>
+ <FileNumber>47</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -793,7 +805,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>47</FileNumber>
+ <FileNumber>48</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -805,7 +817,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>48</FileNumber>
+ <FileNumber>49</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -817,7 +829,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>49</FileNumber>
+ <FileNumber>50</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -829,7 +841,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>50</FileNumber>
+ <FileNumber>51</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -841,7 +853,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>51</FileNumber>
+ <FileNumber>52</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -853,7 +865,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>52</FileNumber>
+ <FileNumber>53</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -865,7 +877,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>53</FileNumber>
+ <FileNumber>54</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -877,7 +889,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>54</FileNumber>
+ <FileNumber>55</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -889,7 +901,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>55</FileNumber>
+ <FileNumber>56</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -901,7 +913,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>56</FileNumber>
+ <FileNumber>57</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -913,7 +925,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>57</FileNumber>
+ <FileNumber>58</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -925,7 +937,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>58</FileNumber>
+ <FileNumber>59</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -935,6 +947,18 @@
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
+ <File>
+ <GroupNumber>9</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\sensors_client.c</PathWithFileName>
+ <FilenameWithoutPath>sensors_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
</Group>
<Group>
@@ -945,7 +969,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>59</FileNumber>
+ <FileNumber>61</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -957,7 +981,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>60</FileNumber>
+ <FileNumber>62</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -969,7 +993,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>61</FileNumber>
+ <FileNumber>63</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -981,7 +1005,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>62</FileNumber>
+ <FileNumber>64</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -993,7 +1017,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>63</FileNumber>
+ <FileNumber>65</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1005,7 +1029,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>64</FileNumber>
+ <FileNumber>66</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1025,7 +1049,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>11</GroupNumber>
- <FileNumber>65</FileNumber>
+ <FileNumber>67</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1045,7 +1069,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>12</GroupNumber>
- <FileNumber>66</FileNumber>
+ <FileNumber>68</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1057,7 +1081,7 @@
</File>
<File>
<GroupNumber>12</GroupNumber>
- <FileNumber>67</FileNumber>
+ <FileNumber>69</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1069,7 +1093,7 @@
</File>
<File>
<GroupNumber>12</GroupNumber>
- <FileNumber>68</FileNumber>
+ <FileNumber>70</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1081,7 +1105,7 @@
</File>
<File>
<GroupNumber>12</GroupNumber>
- <FileNumber>69</FileNumber>
+ <FileNumber>71</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1093,7 +1117,7 @@
</File>
<File>
<GroupNumber>12</GroupNumber>
- <FileNumber>70</FileNumber>
+ <FileNumber>72</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1113,7 +1137,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>71</FileNumber>
+ <FileNumber>73</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1125,7 +1149,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>72</FileNumber>
+ <FileNumber>74</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1137,7 +1161,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>73</FileNumber>
+ <FileNumber>75</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1149,7 +1173,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>74</FileNumber>
+ <FileNumber>76</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1161,7 +1185,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>75</FileNumber>
+ <FileNumber>77</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1173,7 +1197,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>76</FileNumber>
+ <FileNumber>78</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1193,7 +1217,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>14</GroupNumber>
- <FileNumber>77</FileNumber>
+ <FileNumber>79</FileNumber>
<FileType>4</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1206,26 +1230,6 @@
</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>78</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>
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
index a334fdf9d..cdceef7fe 100644
--- 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
@@ -512,6 +512,11 @@
<FileType>1</FileType>
<FilePath>..\STM32_WPAN\app\appli_light_client.c</FilePath>
</File>
+ <File>
+ <FileName>appli_sensors_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\STM32_WPAN\app\appli_sensors_client.c</FilePath>
+ </File>
</Files>
</Group>
<Group>
@@ -712,6 +717,11 @@
<FileType>1</FileType>
<FilePath>..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\light_client.c</FilePath>
</File>
+ <File>
+ <FileName>sensors_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\sensors_client.c</FilePath>
+ </File>
</Files>
</Group>
<Group>
@@ -835,16 +845,6 @@
</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>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32CubeIDE/.cproject b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32CubeIDE/.cproject
index 65eaffa79..81cfd885f 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32CubeIDE/.cproject
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32CubeIDE/.cproject
@@ -79,11 +79,9 @@
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script.1160295639" name="Linker Script (-T)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" useByScannerDiscovery="false" value="${workspace_loc:/${ProjName}/STM32WB55RGVX_FLASH.ld}" valueType="string"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.libraries.1475678999" name="Libraries (-l)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.libraries" 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 IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.directories.1949808647" name="Library search path (-L)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.directories" 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>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input.1043008791" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input">
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
@@ -132,8 +130,8 @@
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.332691187" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.softfp" valueType="enumerated"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.2078497587" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="genericBoard" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.1091131758" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.3 || Release || false || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32 || STM32WB55RGVx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../../../../../../../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 || || || USE_HAL_DRIVER | STM32 | USE_STM32WBXX_NUCLEO | TRACE_ENABLE_NO_FUNCTION | SERVER | CORE_CM4 | ENABLE_USART | STM32WB55xx || || || || || ${workspace_loc:/${ProjName}/STM32WB55RGVX_FLASH.ld} || true || NonSecure || Size || || " valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.converthex.428746191" name="Convert to Intel Hex file (-O ihex)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.converthex" value="true" valueType="boolean"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.convertbinary.1477607624" name="Convert to binary file (-O binary)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.convertbinary" value="false" valueType="boolean"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.converthex.428746191" name="Convert to Intel Hex file (-O ihex)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.converthex" useByScannerDiscovery="false" value="true" valueType="boolean"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.convertbinary.1477607624" name="Convert to binary file (-O binary)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.convertbinary" useByScannerDiscovery="false" value="false" valueType="boolean"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.819601127" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/>
<builder buildPath="${workspace_loc:/BLE_MeshLightingPRFNode}/Release" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.1372415875" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.1030601993" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler">
@@ -142,7 +140,7 @@
</tool>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.1134200041" name="MCU GCC Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler">
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.274323287" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.value.g0" valueType="enumerated"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.221684725" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.value.os" valueType="enumerated"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.221684725" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.value.o3" valueType="enumerated"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols.705938647" name="Define symbols (-D)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols" useByScannerDiscovery="false" valueType="definedSymbols">
<listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
<listOptionValue builtIn="false" value="STM32"/>
@@ -184,11 +182,9 @@
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script.1816151850" name="Linker Script (-T)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" useByScannerDiscovery="false" value="${workspace_loc:/${ProjName}/STM32WB55RGVX_FLASH.ld}" valueType="string"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.libraries.2094974091" name="Libraries (-l)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.libraries" 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 IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.directories.739856649" name="Library search path (-L)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.directories" 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>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input.1670498835" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input">
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32CubeIDE/.project b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32CubeIDE/.project
index 913f44205..1907c1eb3 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32CubeIDE/.project
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32CubeIDE/.project
@@ -232,6 +232,11 @@
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/app/appli_sensor.c</locationURI>
</link>
<link>
+ <name>Application/STM32_WPAN/app/appli_sensors_client.c</name>
+ <type>1</type>
+ <locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/app/appli_sensors_client.c</locationURI>
+ </link>
+ <link>
<name>Application/STM32_WPAN/app/appli_vendor.c</name>
<type>1</type>
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/app/appli_vendor.c</locationURI>
@@ -332,6 +337,11 @@
<locationURI>$%7BPARENT-6-PROJECT_LOC%7D/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors.c</locationURI>
</link>
<link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/sensors_client.c</name>
+ <type>1</type>
+ <locationURI>$%7BPARENT-6-PROJECT_LOC%7D/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors_client.c</locationURI>
+ </link>
+ <link>
<name>Middlewares/STM32_WPAN/ble/blesvc/svc_ctl.c</name>
<type>1</type>
<locationURI>$%7BPARENT-6-PROJECT_LOC%7D/Middlewares/ST/STM32_WPAN/ble/svc/Src/svc_ctl.c</locationURI>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/app_ble.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/app_ble.c
index 2550466f7..494040ca2 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/app_ble.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/app_ble.c
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
@@ -35,7 +36,7 @@
#include "types.h"
#include "ble_mesh.h"
-#include "appli_mesh.h"
+//#include "appli_mesh.h"
#include "mesh_cfg.h"
/* Private includes ----------------------------------------------------------*/
@@ -296,7 +297,10 @@ void APP_BLE_Init( void )
/**
* Starts the BLE Stack on CPU2
*/
- SHCI_C2_BLE_Init( &ble_init_cmd_packet );
+ if (SHCI_C2_BLE_Init( &ble_init_cmd_packet ) != SHCI_Success)
+ {
+ Error_Handler();
+ }
/**
* Initialization of HCI & GATT & GAP layer
@@ -329,6 +333,7 @@ void APP_BLE_Init( void )
SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
{
+ /* callback of mesh Library to receive all GAP/GATT events*/
HCI_Event_CB(pckt);
#if (LOW_POWER_FEATURE == 1)
@@ -480,11 +485,11 @@ static void Ble_Hci_Gap_Gatt_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;
@@ -492,13 +497,13 @@ static void Ble_Hci_Gap_Gatt_Init(void){
aci_gap_set_authentication_requirement(BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode,
BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode,
- 0,
- 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
);
/**
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/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 578a6f4bf..3b7fce7a2 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_config_client.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_config_client.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
@@ -24,6 +24,7 @@
#include "appli_generic.h"
#include "appli_light.h"
#include "common.h"
+#include "mesh_cfg.h"
#include "mesh_cfg_usr.h"
#include "appli_nvm.h"
#include "config_client.h"
@@ -58,6 +59,10 @@
#define NUM_VENDOR_MODELS_TO_PUBLISH 0
#define NUM_VENDOR_MODELS_TO_BIND_APP 0
+/******************************************************************************/
+#if defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER)
+/******************************************************************************/
+
const MOBLEUINT8 aConfigAppKeyDefault[19]=
{ /* NetKeyIndexAndAppKeyIndex : 3B
Index of the NetKey and index of the AppKey*/
@@ -88,51 +93,6 @@ 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,
@@ -618,7 +578,7 @@ const MODEL_CONFIG_CLIENT_OpcodeTableParam_t ConfigClient_MessageOpcodes_Table[]
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
+ /* { OPCODE_HEALTH_PERIOD_STATUS 0x8037 */
@@ -732,6 +692,8 @@ 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 ---------------------------------------------------------*/
/**
@@ -1478,10 +1440,10 @@ MOBLE_RESULT AppliConfigClient_SelfPublicationSetDefault (void)
MOBLEUINT8 elementIndex;
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
- for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ for (elementIndex=0; elementIndex < APPLICATION_NUMBER_OF_ELEMENTS; elementIndex++ )
{
/*Checking for SIG Models*/
- for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
+ for (MOBLEUINT8 index=0; index < APPLICATION_SIG_MODELS_MAX_COUNT; index++)
{
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1492,6 +1454,14 @@ MOBLE_RESULT AppliConfigClient_SelfPublicationSetDefault (void)
{
break;
}
+ else if (MODEL_IS_FOUNDATION_MODEL(modelIdentifier))
+ {
+ /* If Model is Foundation Model, then it doesnt need to be
+ added for Publishing */
+
+ /* Do NOTHING, let the next Model be picked */
+ }
+
else
{
ConfigClient_PublicationSet(elementAddress,
@@ -1507,7 +1477,7 @@ MOBLE_RESULT AppliConfigClient_SelfPublicationSetDefault (void)
}
/*Checking for VENDOR Models*/
- for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
+ for (MOBLEUINT8 index=0; index < APPLICATION_VENDOR_MODELS_MAX_COUNT; index++)
{
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1551,10 +1521,10 @@ MOBLE_RESULT AppliConfigClient_SelfSubscriptionSetDefault (void)
MOBLEUINT16 address = DEFAULT_GROUP_ADDR;
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
- for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ for (elementIndex=0; elementIndex < APPLICATION_NUMBER_OF_ELEMENTS; elementIndex++ )
{
/*Checking for SIG Models*/
- for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
+ for (MOBLEUINT8 index=0; index < APPLICATION_SIG_MODELS_MAX_COUNT; index++)
{
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1566,6 +1536,13 @@ MOBLE_RESULT AppliConfigClient_SelfSubscriptionSetDefault (void)
{
break;
}
+ else if (MODEL_IS_FOUNDATION_MODEL(modelIdentifier))
+ {
+ /* If Model is Foundation Model, then it doesnt need to be
+ Subscribed */
+
+ /* Do NOTHING, let the next Model be picked */
+ }
else
{
ConfigClient_SubscriptionAdd (elementAddress, address, modelIdentifier);
@@ -1573,7 +1550,7 @@ MOBLE_RESULT AppliConfigClient_SelfSubscriptionSetDefault (void)
}
/*Checking for Vendor Models*/
- for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
+ for (MOBLEUINT8 index=0; index < APPLICATION_VENDOR_MODELS_MAX_COUNT; index++)
{
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1610,10 +1587,10 @@ MOBLE_RESULT Appli_ConfigClient_SelfDefaultAppKeyBind (void)
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
appKeyIndex = DEFAULT_APPKEY_INDEX;
- for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ for (elementIndex=0; elementIndex < APPLICATION_NUMBER_OF_ELEMENTS; elementIndex++ )
{
/*Checking for SIG Models*/
- for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
+ for (MOBLEUINT8 index=0; index < APPLICATION_SIG_MODELS_MAX_COUNT; index++)
{
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1624,6 +1601,13 @@ MOBLE_RESULT Appli_ConfigClient_SelfDefaultAppKeyBind (void)
{
break;
}
+ else if (MODEL_IS_FOUNDATION_MODEL(modelIdentifier))
+ {
+ /* If Model is Foundation Model, then it doesnt need to be binded
+ with AppKey */
+
+ /* Do NOTHING, let the next Model be picked */
+ }
else
{
ConfigClient_ModelAppBind (elementAddress, appKeyIndex, modelIdentifier);
@@ -1631,7 +1615,7 @@ MOBLE_RESULT Appli_ConfigClient_SelfDefaultAppKeyBind (void)
}
/*Checking for VENDOR Models*/
- for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
+ for (MOBLEUINT8 index=0; index < APPLICATION_VENDOR_MODELS_MAX_COUNT; index++)
{
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1741,7 +1725,6 @@ MOBLEUINT16 GetSIGModelToBindApp(MOBLEUINT8 elementIndex,
MOBLEUINT8 numberOfModels)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
MOBLEUINT16 model_id;
MOBLEUINT8 index;
MOBLEUINT8 idxSIG = *pModelIndex;
@@ -1762,9 +1745,7 @@ MOBLEUINT16 GetSIGModelToBindApp(MOBLEUINT8 elementIndex,
*pModelIndex = index;
return model_id;
-#else
- return aSigModelsToBind[idxSIG][elementIdx] ;
-#endif
+
}
@@ -1777,11 +1758,7 @@ MOBLEUINT16 GetSIGModelToBindApp(MOBLEUINT8 elementIndex,
*/
MOBLEUINT32 GetVendorModelToBindApp(MOBLEUINT8 elementIndex, MOBLEUINT8 indexModels)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].aVendorModels[indexModels];
-#else
- return VENDORMODEL_STMICRO_ID1 ;
-#endif
}
/**
@@ -1792,11 +1769,7 @@ MOBLEUINT32 GetVendorModelToBindApp(MOBLEUINT8 elementIndex, MOBLEUINT8 indexMod
*/
MOBLEUINT8 GetCountSIGModelToBindApp(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumSIGmodels;
-#else
- return sizeof(aSigModelsToBind)/sizeof(MOBLEUINT16);
-#endif
}
@@ -1807,11 +1780,7 @@ MOBLEUINT8 GetCountSIGModelToBindApp(MOBLEUINT8 elementIndex)
*/
MOBLEUINT8 GetCountVendorModelToBindApp(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumVendorModels;
-#else
- return NUM_VENDOR_MODELS_TO_BIND_APP;
-#endif
}
@@ -1827,13 +1796,9 @@ MOBLEUINT16 GetSIGModelToPublish(MOBLEUINT8 elementIndex,
MOBLEUINT8 numberOfModels)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return GetSIGModelToBindApp(elementIndex,
pModelIndex,
numberOfModels);
-#else
- return aPublishModels[idxSIG] ;
-#endif
}
@@ -1845,11 +1810,7 @@ MOBLEUINT16 GetSIGModelToPublish(MOBLEUINT8 elementIndex,
*/
MOBLEUINT32 GetVendorModelToPublish(MOBLEUINT8 elementIndex, MOBLEUINT8 idxSIG)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].aVendorModels[idxSIG];
-#else
- return VENDORMODEL_STMICRO_ID1 ;
-#endif
}
@@ -1860,11 +1821,7 @@ MOBLEUINT32 GetVendorModelToPublish(MOBLEUINT8 elementIndex, MOBLEUINT8 idxSIG)
*/
MOBLEUINT8 GetCountSIGModelToPublish(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumSIGmodels;
-#else
- return sizeof(aPublishModels)/sizeof(MOBLEUINT16);
-#endif
}
@@ -1875,11 +1832,7 @@ MOBLEUINT8 GetCountSIGModelToPublish(MOBLEUINT8 elementIndex)
*/
MOBLEUINT8 GetCountVendorModelToPublish(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumVendorModels;
-#else
- return NUM_VENDOR_MODELS_TO_PUBLISH;
-#endif
}
@@ -1894,13 +1847,9 @@ MOBLEUINT16 GetSIGModelToSubscribe(MOBLEUINT8 elementIndex,
MOBLEUINT8 *pModelIndex,
MOBLEUINT8 numberOfModels)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return GetSIGModelToBindApp(elementIndex,
pModelIndex,
numberOfModels);
-#else
- return aSubscribeModels[idxSIG] ;
-#endif
}
@@ -1914,11 +1863,7 @@ MOBLEUINT16 GetSIGModelToSubscribe(MOBLEUINT8 elementIndex,
MOBLEUINT32 GetVendorModelToSubscribe(MOBLEUINT8 elementIndex,
MOBLEUINT8 idxSIG)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].aVendorModels[idxSIG];
-#else
- return VENDORMODEL_STMICRO_ID1 ;
-#endif
}
@@ -1929,11 +1874,7 @@ MOBLEUINT32 GetVendorModelToSubscribe(MOBLEUINT8 elementIndex,
*/
MOBLEUINT8 GetCountSIGModelToSubscribe(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumSIGmodels;
-#else
- return sizeof(aSubscribeModels)/sizeof(MOBLEUINT16);
-#endif
}
@@ -1945,11 +1886,7 @@ MOBLEUINT8 GetCountSIGModelToSubscribe(MOBLEUINT8 elementIndex)
*/
MOBLEUINT8 GetCountVendorModelToSubscribe(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumVendorModels;
-#else
- return NUM_VENDOR_MODELS_TO_SUBSCRIBE;
-#endif
}
@@ -1965,6 +1902,9 @@ MOBLEUINT8 AppliConfigClient_SendMessageDefault(MOBLEUINT8 elementIdx)
return NUM_VENDOR_MODELS_TO_SUBSCRIBE;
}
+/******************************************************************************/
+#endif /* defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER) */
+/******************************************************************************/
/**
* @}
@@ -1974,5 +1914,5 @@ MOBLEUINT8 AppliConfigClient_SendMessageDefault(MOBLEUINT8 elementIdx)
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/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 34169448c..b380cf636 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_config_client.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_config_client.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
@@ -26,7 +26,7 @@
#include "generic.h"
#include "mesh_cfg.h"
#include "config_client.h"
-
+#include "mesh_cfg_usr.h"
/* Exported macro ------------------------------------------------------------*/
#define MAX_CONFIG_PARAM_SIZE 22
@@ -35,6 +35,9 @@
/* Exported variables ------------------------------------------------------- */
/* Application Variable-------------------------------------------------------*/
/* Exported Functions Prototypes ---------------------------------------------*/
+
+#if defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER)
+
MOBLE_RESULT Appli_ConfigClient_Init(void);
MOBLE_RESULT Appli_ConfigClient_Process(void);
MOBLE_RESULT Appli_ConfigClient_ConfigureNode(void);
@@ -82,8 +85,9 @@ MOBLEUINT8 GetCountSIGModelToPublish(MOBLEUINT8 elementIdx);
MOBLEUINT8 GetCountVendorModelToPublish(MOBLEUINT8 elementIdx);
+#endif /*defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER) */
#endif /* __APPLI_CONFIG_CLIENT_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic.c
index 0ecaea465..c5d21b225 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic.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
@@ -50,16 +50,21 @@ 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;
+
+Appli_Generic_OnOffSet AppliOnOffSet[APPLICATION_NUMBER_OF_ELEMENTS];
+Appli_Generic_LevelSet AppliLevelSet[APPLICATION_NUMBER_OF_ELEMENTS];
+Appli_Generic_PowerOnOffSet AppliPowerOnSet[APPLICATION_NUMBER_OF_ELEMENTS];
+Appli_Generic_DefaultTransitionSet AppliDefaultTransitionSet[APPLICATION_NUMBER_OF_ELEMENTS];
/* 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);
+MOBLE_RESULT Appli_Generic_LevelDelta_Set(Generic_LevelStatus_t* pdeltalevelParam,
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_LevelMove_Set(Generic_LevelStatus_t* pdeltaMoveParam,
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
/* Private functions ---------------------------------------------------------*/
/******************************************************************************/
@@ -71,43 +76,57 @@ MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t* pdeltalevelParam,
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t* pGeneric_OnOffParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- AppliOnOffSet.Present_OnOff = pGeneric_OnOffParam->Present_OnOff_State;
- AppliOnOffSet.Present_OnOffValue = pGeneric_OnOffParam->Present_OnOff_Value;
-
+ /*User need to modify the parameters as per the number of elements per node*/
+ AppliOnOffSet[elementIndex].Present_OnOff = pGeneric_OnOffParam->Present_OnOff_State;
+ AppliOnOffSet[elementIndex].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.
- */
+ /* 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;
+ Appli_LightPwmValue.IntensityValue = AppliOnOffSet[elementIndex].Present_OnOffValue;
Light_UpdateLedValue(LOAD_STATE ,Appli_LightPwmValue);
- if(AppliOnOffSet.Present_OnOff == APPLI_LED_ON)
+
+ #if 0 /* EME */
+ if(AppliOnOffSet[elementIndex].Present_OnOff == APPLI_LED_ON)
{
- AppliOnOffSet.TargetValue = PWM_TIME_PERIOD;
+ AppliOnOffSet[elementIndex].TargetValue = PWM_TIME_PERIOD;
}
else
{
- AppliOnOffSet.TargetValue = APPLI_LED_OFF;
+ AppliOnOffSet[elementIndex].TargetValue = APPLI_LED_OFF;
}
+ #else
+ AppliOnOffSet[elementIndex].TargetValue = pGeneric_OnOffParam->Target_OnOff;
+ #endif /* EME */
- if(AppliOnOffSet.Present_OnOffValue > 16000)
- {
- BSP_LED_On(LED_BLUE);
- }
- else
+ if(AppliOnOffSet[elementIndex].Present_OnOffValue == AppliOnOffSet[elementIndex].TargetValue)
{
- BSP_LED_Off(LED_BLUE);
+ if(AppliOnOffSet[elementIndex].Present_OnOffValue > 0)
+ {
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+ }
}
}
else
{
- if((AppliOnOffSet.Present_OnOff == APPLI_LED_ON) && (OptionalValid == NO_TRANSITION))
+ if((AppliOnOffSet[elementIndex].Present_OnOff == APPLI_LED_ON) && (OptionalValid == NO_TRANSITION))
{
Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
@@ -120,18 +139,15 @@ MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t* pGeneric_OnOffParam,
BSP_LED_Off(LED_BLUE);
}
}
+
+ TRACE_M(TF_GENERIC,"Generic_OnOff_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8202%02hx!\n\r",AppliOnOffSet[elementIndex].Present_OnOff);
- TRACE_M(TF_SERIAL_CTRL,"#8202%02hx!\n\r",AppliOnOffSet.Present_OnOff);
+ NvmStatePowerFlag_Set(GENERIC_ON_OFF_NVM_FLAG, elementIndex);
- /* set the flag value for NVM store */
- RestoreFlag = GENERIC_ON_OFF_NVM_FLAG;
-
- AppliNvm_SaveMessageParam();
-
return MOBLE_RESULT_SUCCESS;
}
-
/******************************************************************************/
#endif /* #ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF */
/******************************************************************************/
@@ -142,15 +158,20 @@ MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t* pGeneric_OnOffParam,
* when Generic OnOff message is received
* @param pOnOff_status: Pointer to the parameters received for message
* @param plength: length of the data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUINT32 plength)
+MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
MOBLEUINT8 i;
- TRACE_M(TF_GENERIC,"Appli_Generic_OnOff_Status callback received \r\n");
+ TRACE_M(TF_GENERIC,"Generic_OnOff_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8204!\r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8204! \n\r");
for(i = 0; i < plength; i++)
{
if(i == 0)
@@ -164,6 +185,7 @@ MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUI
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_GENERIC_MODEL_SERVER_LEVEL
/******************************************************************************/
@@ -173,21 +195,26 @@ MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUI
* when Generic Level message is received
* @param plevelParam: Pointer to the parameters message
* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t* plevelParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid,MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
MOBLEUINT16 duty;
static MOBLEUINT16 previousIntensity = 0;
- AppliLevelSet.Present_Level16= plevelParam->Present_Level16;
- if(AppliLevelSet.Present_Level16 <= 0)
+ AppliLevelSet[elementIndex].Present_Level16= plevelParam->Present_Level16;
+ if(AppliLevelSet[elementIndex].Present_Level16 <= 0)
{
- AppliLevelSet.Present_Level16 = 0;
+ AppliLevelSet[elementIndex].Present_Level16 = 0;
}
- IntensityValue = AppliLevelSet.Present_Level16;
+ IntensityValue = AppliLevelSet[elementIndex].Present_Level16;
if(((IntensityValue > previousIntensity) && (IntensityValue <PWM_TIME_PERIOD)) ||
IntensityValue == INTENSITY_LEVEL_ZERO)
@@ -200,49 +227,42 @@ MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t* plevelParam,
}
previousIntensity = IntensityValue;
- if(AppliLevelSet.Present_Level16 < 0x00)
+ if(AppliLevelSet[elementIndex].Present_Level16 < 0x00)
{
- AppliLevelSet.Present_Level16 = 0;
+ AppliLevelSet[elementIndex].Present_Level16 = 0;
}
- duty = PwmValueMapping(AppliLevelSet.Present_Level16 , 0x7FFF ,0x0000);
+ duty = PwmValueMapping(AppliLevelSet[elementIndex].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);
- }
+ TRACE_M(TF_GENERIC,"Generic_Level_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8206!\r\n");
+ NvmStatePowerFlag_Set(GENERIC_LEVEL_NVM_FLAG, elementIndex);
+
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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t* pdeltalevelParam,
- MOBLEUINT8 OptionalValid)
+MOBLE_RESULT Appli_Generic_LevelDelta_Set(Generic_LevelStatus_t* pdeltalevelParam,
+ MOBLEUINT8 OptionalValid,MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-
- AppliLevelSet.Present_Level16 = pdeltalevelParam->Present_Level16;
+ AppliLevelSet[elementIndex].Present_Level16 = pdeltalevelParam->Present_Level16;
/* For demo, if Level is more than 50, switch ON the LED */
- if (AppliLevelSet.Present_Level16 >= 50)
+ if (AppliLevelSet[elementIndex].Present_Level16 >= 50)
{
Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
@@ -253,32 +273,43 @@ MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t* pdeltalevelParam,
Light_UpdateLedValue(RESET_STATE , Appli_LightPwmValue);
BSP_LED_Off(LED_BLUE);
}
- TRACE_M(TF_SERIAL_CTRL,"#8206!\n\r");
+
+ TRACE_M(TF_GENERIC,"Generic_LevelDelta_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8209!\r\n");
+
return MOBLE_RESULT_SUCCESS;
}
/**
-* @brief Appli_Generic_Move_Set: This function is callback for Application
+* @brief Appli_Generic_LevelMove_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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
- MOBLEUINT8 OptionalValid)
+MOBLE_RESULT Appli_Generic_LevelMove_Set(Generic_LevelStatus_t* pdeltaMoveParam,
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- AppliLevelSet.Last_delta_level = pdeltaMoveParam->Last_delta_level;
- AppliLevelSet.Last_Level_TID = pdeltaMoveParam->Last_Level_TID;
- AppliLevelSet.Last_Present_Level16 = pdeltaMoveParam->Last_Present_Level16;
- AppliLevelSet.Present_Level16 = pdeltaMoveParam->Present_Level16;
- AppliLevelSet.RemainingTime = pdeltaMoveParam->RemainingTime;
- AppliLevelSet.Target_Level16 = pdeltaMoveParam->Target_Level16;
+// if(OptionalValid == 1)
+// {
+ AppliLevelSet[elementIndex].Last_delta_level = pdeltaMoveParam->Last_delta_level;
+ AppliLevelSet[elementIndex].Last_Level_TID = pdeltaMoveParam->Last_Level_TID;
+ AppliLevelSet[elementIndex].Last_Present_Level16 = pdeltaMoveParam->Last_Present_Level16;
+ AppliLevelSet[elementIndex].Present_Level16 = pdeltaMoveParam->Present_Level16;
+ AppliLevelSet[elementIndex].RemainingTime = pdeltaMoveParam->RemainingTime;
+ AppliLevelSet[elementIndex].Target_Level16 = pdeltaMoveParam->Target_Level16;
+// }
- TRACE_M(TF_SERIAL_CTRL,"#8206!\n\r");
-
- return MOBLE_RESULT_SUCCESS;
+ TRACE_M(TF_GENERIC,"Generic_LevelMove_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#820B! \r\n");
+ return MOBLE_RESULT_SUCCESS;
}
@@ -291,39 +322,45 @@ MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
* when Generic Level Move message is received
* @param plevel_status: Pointer to the parameters message
* @param plength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Generic_Level_Status(MOBLEUINT8 const *plevel_status,
- MOBLEUINT32 plength)
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT8 i;
MOBLEUINT8 level = 0;
-#endif
-
- TRACE_M(TF_GENERIC,"Generic_Level_Status callback received \r\n");
+#endif
- TRACE_M(TF_SERIAL_CTRL,"#8208! \n\r");
+ TRACE_M(TF_GENERIC,"Generic_Level_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8208! \r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < plength; i++)
{
if((i == 0) || (i == 2))
level = plevel_status[i];
else if(i == 1)
- TRACE_M(TF_GENERIC,"Present Level value: %d\n\r",
+ TRACE_M(TF_SERIAL_CTRL,"Present Level value: %d\n\r",
(plevel_status[i]<<8)|level);
else if(i == 3)
- TRACE_M(TF_GENERIC,"Target Level value: %d\n\r",
+ TRACE_M(TF_SERIAL_CTRL,"Target Level value: %d\n\r",
(plevel_status[i]<<8)|level);
else if(i == 4)
- TRACE_M(TF_GENERIC,"Remaining Time value: %d\n\r", plevel_status[i]);
+ TRACE_M(TF_SERIAL_CTRL,"Remaining Time value: %d\n\r", plevel_status[i]);
}
-#endif
+#endif
+
return MOBLE_RESULT_SUCCESS;
}
-
+
/******************************************************************************/
#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF
/******************************************************************************/
@@ -333,17 +370,26 @@ MOBLE_RESULT Appli_Generic_Level_Status(MOBLEUINT8 const *plevel_status,
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Generic_PowerOnOff_Set(Generic_PowerOnOffParam_t* pPowerOnOffParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- AppliPowerOnSet.PowerOnState = pPowerOnOffParam->PowerOnOffState;
-
- TRACE_M(TF_SERIAL_CTRL,"#8213!\n\r");
+ AppliPowerOnSet[elementIndex].PowerOnState = pPowerOnOffParam->PowerOnOffState;
+
+ TRACE_M(TF_GENERIC,"Generic_PowerOnOff_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8213!\r\n");
- /* set the flag value for NVM store */
- //RestoreFlag = GENERIC_ON_OFF_NVM_FLAG;
+ if(AppliPowerOnSet[elementIndex].PowerOnState == GENERIC_POWER_ON_STATE)
+ {
+ /* set the flag value for NVM store */
+ RestoreFlag = GENERIC_ON_OFF_NVM_FLAG;
+ }
AppliNvm_SaveMessageParam();
@@ -359,17 +405,20 @@ MOBLE_RESULT Appli_Generic_PowerOnOff_Set(Generic_PowerOnOffParam_t* pPowerOnOff
* when Generic Power on off set message is received
* @param powerOnOff_status: Pointer to the parameters message
* @param plength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status ,
- MOBLEUINT32 plength)
+MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status,\
+ MOBLEUINT32 plength, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
MOBLEUINT8 i;
- TRACE_M(TF_GENERIC,"Generic_PowerOnOff_Status callback received \r\n");
+ TRACE_M(TF_GENERIC,"Generic_PowerOnOff_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8212!\r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8212! \n\r");
-
for(i = 0; i < plength; i++)
{
if(i == 0)
@@ -390,37 +439,43 @@ MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Set(Generic_DefaultTransitionParam_t* pDefaultTimeParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- AppliDefaultTransitionSet.DefaultTransitionTime = pDefaultTimeParam->DefaultTransitionTime;
+ AppliDefaultTransitionSet[elementIndex].DefaultTransitionTime = pDefaultTimeParam->DefaultTransitionTime;
+ TRACE_M(TF_GENERIC,"Generic_DefaultTransitionTime_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#820E!\r\n");
return MOBLE_RESULT_SUCCESS;
}
-
/******************************************************************************/
#endif /* ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME */
/******************************************************************************/
-
/**
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status ,
- MOBLEUINT32 plength)
+MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status , MOBLEUINT32 plength,MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_GENERIC,"Generic_DefaultTransitionTime_Status callback received \r\n");
-
- TRACE_M(TF_SERIAL_CTRL,"#8210! \n\r");
+ TRACE_M(TF_GENERIC,"Generic_DefaultTransitionTime_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8210!\r\n");
return MOBLE_RESULT_SUCCESS;
}
@@ -431,83 +486,99 @@ MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTrans
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_GetOnOffStatus(MOBLEUINT8* pOnOff_Status)
+MOBLE_RESULT Appli_Generic_GetOnOffStatus(MOBLEUINT8* pOnOff_Status,MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- *pOnOff_Status = AppliOnOffSet.Present_OnOff;
- TRACE_M(TF_SERIAL_CTRL,"Generic Get OnOff Status: Status %d!\n\r",
- AppliOnOffSet.Present_OnOff);
-
+ *pOnOff_Status = AppliOnOffSet[elementIndex].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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_GetOnOffValue(MOBLEUINT8* pOnOff_Value)
+MOBLE_RESULT Appli_Generic_GetOnOffValue(MOBLEUINT8* pOnOff_Value, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- *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);
+ *pOnOff_Value = AppliOnOffSet[elementIndex].Present_OnOffValue;
+ *(pOnOff_Value+1) = AppliOnOffSet[elementIndex].Present_OnOffValue >> 8;
+ *(pOnOff_Value+2) = AppliOnOffSet[elementIndex].TargetValue;
+ *(pOnOff_Value+3) = AppliOnOffSet[elementIndex].TargetValue >> 8;
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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_GetLevelStatus(MOBLEUINT8* pLevel_Status)
+MOBLE_RESULT Appli_Generic_GetLevelStatus(MOBLEUINT8* pLevel_Status, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- *pLevel_Status = AppliLevelSet.Present_Level16;
- *(pLevel_Status+1) = AppliLevelSet.Present_Level16 >> 8;
- *(pLevel_Status+2) = AppliLevelSet.Target_Level16;
- *(pLevel_Status+3) = AppliLevelSet.Target_Level16 >> 8;
-// TRACE_M(TF_SERIAL_CTRL,"Generic Get Level Status: Value %d!\n\r",
-// *pLevel_Status);
+ *pLevel_Status = AppliLevelSet[elementIndex].Present_Level16;
+ *(pLevel_Status+1) = AppliLevelSet[elementIndex].Present_Level16 >> 8;
+ *(pLevel_Status+2) = AppliLevelSet[elementIndex].Target_Level16;
+ *(pLevel_Status+3) = AppliLevelSet[elementIndex].Target_Level16 >> 8;
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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_GetPowerOnOffStatus(MOBLEUINT8* pPower_Status)
+MOBLE_RESULT Appli_Generic_GetPowerOnOffStatus(MOBLEUINT8* pPower_Status, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- *pPower_Status = AppliPowerOnSet.PowerOnState;
- TRACE_M(TF_SERIAL_CTRL,"Generic Get OnOff Status: Status %d!\n\r",
- AppliPowerOnSet.PowerOnState);
+
+ *pPower_Status = AppliPowerOnSet[elementIndex].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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_Status)
+MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_Status,MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- *pTransition_Status = AppliDefaultTransitionSet.DefaultTransitionTime;
- TRACE_M(TF_SERIAL_CTRL,"Get Default Transition Status: Status %d!\n\r",
- AppliDefaultTransitionSet.DefaultTransitionTime);
+
+ *pTransition_Status = AppliDefaultTransitionSet[elementIndex].DefaultTransitionTime;
return MOBLE_RESULT_SUCCESS;
}
+
/**
* @}
*/
@@ -516,5 +587,5 @@ MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_St
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic.h
index 992baad9b..370769608 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic.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
@@ -86,35 +86,72 @@ typedef struct
/* Exported Functions Prototypes ---------------------------------------------*/
-MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t*, MOBLEUINT8);
+MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t*,
+ MOBLEUINT8,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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 );
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t*,
+ MOBLEUINT8,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t*,
+ MOBLEUINT8,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
- MOBLEUINT8 OptionalValid);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_Level_Status(MOBLEUINT8 const *plevel_status,
- MOBLEUINT32 plength);
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_PowerOnOff_Set(Generic_PowerOnOffParam_t* pPowerOnOffParam,
- MOBLEUINT8 OptionalValid);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status ,
- MOBLEUINT32 plength);
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Set(Generic_DefaultTransitionParam_t* pDefaultTimeParam,
- MOBLEUINT8 OptionalValid);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status ,
- MOBLEUINT32 plength);
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
-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_GetOnOffStatus(MOBLEUINT8* pOnOff_Status,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_GetOnOffValue(MOBLEUINT8* pOnOff_Value,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_GetLevelStatus(MOBLEUINT8* pLevel_Status,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_GetPowerOnOffStatus(MOBLEUINT8* pLevel_Status,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Generic_Restore_PowerOn_Value(MOBLEUINT8 restoreValue,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_Status,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status,
- MOBLEUINT32 plength);
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
#endif /* __APPLI_GENERIC_H */
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/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 aecd5575e..317071a1c 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic_client.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic_client.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
@@ -41,58 +41,166 @@
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
-
-MOBLEUINT8 Led_Value;
/* Private function prototypes -----------------------------------------------*/
-MOBLE_RESULT Appli_GenericClient_OnOff_Set(void);
-/* Private functions ---------------------------------------------------------*/
+
+/* Private functions ---------------------------------------------------------*/
/**
-* @brief Appli_Generic_OnOff_Set: This function is callback for Application
-* when Generic OnOff message is called
-* @param void
+* @brief Appli_GenericClient_API: This function is a Wrapper to call Generic Client API depending on opcode received in input
+* @param elementIndex: Index of the element
+* @param msg_opcode: opcode of the desired API
+* @param msg_params: buffer containing the desired API parameters
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_GenericClient_OnOff_Set(void)
+MOBLE_RESULT Appli_GenericClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8 *msg_params)
{
- 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;
-}
-
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+ switch(msg_opcode){
/******************************************************************************/
-#ifdef ENABLE_GENERIC_MODEL_CLIENT_LEVEL
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_ONOFF
/******************************************************************************/
-
-/**
-* @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));
+ case GENERIC_ON_OFF_GET:
+ {
+ result = GenericClient_OnOff_Get(elementIndex);
+ break;
+ }
+ case GENERIC_ON_OFF_SET_ACK:
+ {
+ result = GenericClient_OnOff_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_OnOffParam_t) );
+ break;
+ }
+ case GENERIC_ON_OFF_SET_UNACK:
+ {
+ result = GenericClient_OnOff_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_OnOffParam_t) );
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_GENERIC_MODEL_CLIENT_ONOFF */
+/******************************************************************************/
- return MOBLE_RESULT_SUCCESS;
-}
+/******************************************************************************/
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_LEVEL
+/******************************************************************************/
+ case GENERIC_LEVEL_GET:
+ {
+ result = GenericClient_Level_Get(elementIndex);
+ break;
+ }
+ case GENERIC_LEVEL_SET_ACK:
+ {
+ result = GenericClient_Level_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_LevelParam_t));
+ break;
+ }
+ case GENERIC_LEVEL_SET_UNACK:
+ {
+ result = GenericClient_Level_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_LevelParam_t));
+ break;
+ }
+ case GENERIC_DELTA_SET:
+ {
+
+ result = GenericClient_Delta_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_DeltaLevelParam_t));
+ break;
+ }
+ case GENERIC_DELTA_SET_UNACK:
+ {
+ result = GenericClient_Delta_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_DeltaLevelParam_t));
+ break;
+ }
+ case GENERIC_MOVE_SET:
+ {
+ result = GenericClient_Move_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_LevelMoveParam_t));
+ break;
+ }
+ case GENERIC_MOVE_SET_UNACK:
+ {
+ result = GenericClient_Move_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_LevelMoveParam_t));
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_GENERIC_MODEL_CLIENT_LEVEL */
+/******************************************************************************/
/******************************************************************************/
-#endif /* #ifdef ENABLE_GENERIC_MODEL_CLIENT_LEVEL */
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_POWER_ONOFF
/******************************************************************************/
+ case GENERIC_POWER_ON_OFF_GET:
+ {
+ GenericClient_PowerOnOff_Get(elementIndex);
+ break;
+ }
+ case GENERIC_POWER_ON_OFF_SET:
+ {
+ result = GenericClient_PowerOnOff_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_PowerOnOffParam_t));
+ break;
+ }
+ case GENERIC_POWER_ON_OFF_SET_UNACK:
+ {
+ result = GenericClient_PowerOnOff_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_PowerOnOffParam_t));
+ break;
+ }
+
+/******************************************************************************/
+#endif /* #ifdef ENABLE_GENERIC_MODEL_CLIENT_POWER_ONOFF */
+/******************************************************************************/
+
+/******************************************************************************/
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_DEFAULT_TRANSITION_TIME
+/******************************************************************************/
+ case GENERIC_DEFAULT_TRANSITION_TIME_GET:
+ {
+ result = GenericClient_DefaultTransitionTime_Get(elementIndex);
+ break;
+ }
+
+ case GENERIC_DEFAULT_TRANSITION_TIME_SET:
+ {
+ result = GenericClient_DefaultTransitionTime_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_DefaultTransitionParam_t));
+ break;
+ }
+
+ case GENERIC_DEFAULT_TRANSITION_TIME_SET_UNACK:
+ {
+ result = GenericClient_DefaultTransitionTime_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_DefaultTransitionParam_t));
+ break;
+ }
+
+/******************************************************************************/
+#endif /* #ifdef ENABLE_GENERIC_MODEL_CLIENT_DEFAULT_TRANSITION_TIME */
+/******************************************************************************/
+
+ default:
+ {
+ TRACE_M(TF_GENERIC, "OpCode value invalid %d \r\n", msg_opcode);
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+ return result;
+}
/**
* @}
@@ -102,5 +210,5 @@ MOBLE_RESULT Appli_GenericClient_Level_Set_Unack(void)
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/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 742fd1e68..c56fd5a9e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic_client.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_generic_client.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
@@ -32,12 +32,12 @@
/* 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);
+MOBLE_RESULT Appli_GenericClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8 *msg_params);
+
#endif /* __APPLI_GENERIC_CLIENT_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light.c
index 318929ffc..19face0da 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light.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
@@ -41,7 +41,9 @@
* @{
*/
-MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState);
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
@@ -55,9 +57,8 @@ 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;
+Appli_Light_lightnessSet ApplilightnessSet[APPLICATION_NUMBER_OF_ELEMENTS] = {{1,0,0,0,0,0}};
+Appli_Light_lightnessLinearSet ApplilightnessLinearSet[APPLICATION_NUMBER_OF_ELEMENTS];
/******************************************************************************/
#endif /* #ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS */
@@ -70,10 +71,9 @@ 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;
+ Appli_Light_CtlSet AppliCtlSet[APPLICATION_NUMBER_OF_ELEMENTS];
+ Appli_Light_CtlTemperatureRangeSet AppliCtlTemperatureRangeSet[APPLICATION_NUMBER_OF_ELEMENTS];
+ Appli_Light_CtlDefaultSet AppliCtlDefaultSet[APPLICATION_NUMBER_OF_ELEMENTS];
/******************************************************************************/
#endif /* #ifdef ENABLE_LIGHT_MODEL_SERVER_CTL */
@@ -83,14 +83,11 @@ Appli_Light_CtlDefaultSet AppliCtlDefaultSet;
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;
+ Appli_Light_HslSet AppliHslSet[APPLICATION_NUMBER_OF_ELEMENTS];
+ Appli_Light_HslDefaultSet Appli_HslDefaultSet[APPLICATION_NUMBER_OF_ELEMENTS] = {{0x7FFF,0x7FFF,0x7FFF}};
+ Appli_Light_RGBSet Appli_RGBParam[APPLICATION_NUMBER_OF_ELEMENTS];
+ Appli_Light_HslRangeSet AppliHslRangeSet[APPLICATION_NUMBER_OF_ELEMENTS];
/*******************************************************************************/
#endif /*End of the LIGHTING HSL MODEL variables */
@@ -117,22 +114,28 @@ extern MOBLEUINT16 IntensityValue;
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_LightnessParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
MOBLEUINT16 duty;
static MOBLEUINT16 previousIntensity = 0;
- TRACE_M(TF_SERIAL_CTRL,"#824C!\n\r");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#824C!\r\n");
- ApplilightnessSet.PresentState16 = pLight_LightnessParam->LightnessPresentValue16;
- ApplilightnessSet.LastLightness16 = pLight_LightnessParam->LightnessLastStatus;
+ ApplilightnessSet[elementIndex].PresentState16 = pLight_LightnessParam->LightnessPresentValue16;
+ ApplilightnessSet[elementIndex].LastLightness16 = pLight_LightnessParam->LightnessLastStatus;
if(pLight_LightnessParam->LightnessPresentValue16 != 0x00)
{
- ApplilightnessSet.LastLightness16 = pLight_LightnessParam->LightnessPresentValue16;
+ ApplilightnessSet[elementIndex].LastLightness16 = pLight_LightnessParam->LightnessPresentValue16;
}
if(((IntensityValue > previousIntensity) && (IntensityValue <PWM_TIME_PERIOD)) ||
@@ -146,6 +149,7 @@ MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_Lightness
}
previousIntensity = IntensityValue;
+#if 0
/* For demo, if Level is more than 100, switch ON the LED */
if(pLight_LightnessParam->LightnessPresentValue16 >= 0x8000)
{
@@ -155,16 +159,17 @@ MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_Lightness
{
BSP_LED_Off(LED_BLUE);
}
- TRACE_M(TF_SERIAL_CTRL,"#8206%04hx!\n\r",ApplilightnessSet.PresentState16);
+#endif
+
+ TRACE_M(TF_SERIAL_CTRL,"#8206%04hx!\n\r",
+ ApplilightnessSet[elementIndex].PresentState16);
- duty = PwmValueMapping(ApplilightnessSet.PresentState16 , 0xfFFF ,0);
+ duty = PwmValueMapping(ApplilightnessSet[elementIndex].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();
+ NvmStatePowerFlag_Set(LIGHT_LIGHTNESS_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
@@ -181,18 +186,18 @@ MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_Lightness
* @param pLength: length of data
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_Lightness_Status callback received \r\n");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#824E!\r\n");
- TRACE_M(TF_SERIAL_CTRL,"#824E! \n\r");
-
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2))
@@ -201,28 +206,33 @@ MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, M
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present Lightness: %d \r\n",
- value << 8 | pLightness_status[i]);
+ TRACE_M(TF_LIGHT,"Present Lightness: 0x%x (%d)\r\n",
+ value | pLightness_status[i] << 8,
+ value | pLightness_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Target Lightness: %d \r\n",
- value << 8 | pLightness_status[i]);
+ TRACE_M(TF_LIGHT,"Target Lightness: 0x%x (%d)\r\n",
+ value | pLightness_status[i] << 8,
+ value | pLightness_status[i] << 8);
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\r\n",
+ pLightness_status[i],
pLightness_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#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
@@ -231,11 +241,13 @@ MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, M
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Lightness_Linear_Set(Light_LightnessStatus_t* pLight_LightnessLinearParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- ApplilightnessLinearSet.PresentState16 = pLight_LightnessLinearParam->LinearPresentValue16;
+ ApplilightnessLinearSet[elementIndex].PresentState16 = pLight_LightnessLinearParam->LinearPresentValue16;
- TRACE_M(TF_SERIAL_CTRL,"#8250!\n\r");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Linear_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8250!\r\n");
return MOBLE_RESULT_SUCCESS;
}
@@ -248,20 +260,25 @@ MOBLE_RESULT Appli_Light_Lightness_Linear_Set(Light_LightnessStatus_t* pLight_Li
* @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 dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @param pLength: length of data
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_Lightness_Linear_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8252! \n\r");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Linear_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8252!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2))
@@ -270,24 +287,29 @@ MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLin
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present Lightness: %d \r\n",
- value << 8 | pLightnessLinear_status[i]);
+ TRACE_M(TF_LIGHT,"Present Lightness: 0x%x (%d)\r\n",
+ value | pLightnessLinear_status[i] << 8,
+ value | pLightnessLinear_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Target Lightness: %d \r\n",
- value << 8 | pLightnessLinear_status[i]);
+ TRACE_M(TF_LIGHT,"Target Lightness: 0x%x (%d)\r\n",
+ value | pLightnessLinear_status[i] << 8,
+ value | pLightnessLinear_status[i] << 8);
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\r\n",
+ pLightnessLinear_status[i],
pLightnessLinear_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP
/******************************************************************************/
@@ -297,11 +319,17 @@ MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLin
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pLight_LightnessDefaultParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
+#if 0
if(pLight_LightnessDefaultParam->LightnessDefaultStatus > 0)
{
BSP_LED_On(LED_BLUE);
@@ -310,14 +338,16 @@ MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pL
{
BSP_LED_Off(LED_BLUE);
}
- ApplilightnessSet.LightnessDefault = pLight_LightnessDefaultParam->LightnessDefaultStatus;
+#endif
+
+ ApplilightnessSet[elementIndex].LightnessDefault =
+ pLight_LightnessDefaultParam->LightnessDefaultStatus;
+
+ TRACE_M(TF_LIGHT,"Light_Lightness_Default_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8259! \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8259!\n\r");
-
/* set the flag value for NVM store */
- RestoreFlag = LIGHT_LIGHTNESS_NVM_FLAG;
-
- AppliNvm_SaveMessageParam();
+ NvmStatePowerFlag_Set(LIGHT_LIGHTNESS_NVM_FLAG,elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -331,19 +361,25 @@ MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pL
* when Light Lightness Default status message is received
* @param pLightnessDefault_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDefault_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDefault_status, MOBLEUINT32 pLength
+ , MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
- MOBLEUINT16 value = 0;
- #endif
- TRACE_M(TF_LIGHT,"Light_Lightness_Default_Status callback received \r\n");
+ MOBLEUINT16 value;
+#endif
- TRACE_M(TF_SERIAL_CTRL,"#8256! \n\r");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Default_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8256!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if(i == 0)
@@ -352,14 +388,61 @@ MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDe
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Lightness: %d \r\n",
- value << 8 | pLightnessDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Lightness Default: 0x%x (%d)\r\n",
+ value | pLightnessDefault_status[i] << 8,
+ value | pLightnessDefault_status[i] << 8);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
+/**
+* @brief Appli_Light_Lightness_Last_Status: This function is callback for Application
+* when Light Lightness Last status message is received
+* @param pLightnessDefault_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Lightness_Last_Status(MOBLEUINT8 const *pLightnessLast_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+#if ( CFG_DEBUG_TRACE != 0 )
+ MOBLEUINT32 i;
+ MOBLEUINT16 value;
+#endif
+
+ TRACE_M(TF_LIGHT,"Light_Lightness_Last_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8256!\r\n");
+
+#if ( CFG_DEBUG_TRACE != 0 )
+ for(i = 0; i < pLength; i++)
+ {
+ if(i == 0)
+ {
+ value = pLightnessLast_status[i];
+ }
+ else if(i == 1)
+ {
+ TRACE_M(TF_LIGHT,"Lightness Last: 0x%x (%d)\r\n",
+ value | pLightnessLast_status[i] << 8,
+ value | pLightnessLast_status[i] << 8);
+ }
+ }
+#endif
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP
/******************************************************************************/
@@ -369,16 +452,22 @@ MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDe
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Lightness_Range_Set(Light_LightnessRangeParam_t* pLight_LightnessRangeParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- ApplilightnessSet.StatusCode = pLight_LightnessRangeParam->StatusCode;
- ApplilightnessSet.RangeMin = pLight_LightnessRangeParam->MinRangeStatus;
- ApplilightnessSet.RangeMax = pLight_LightnessRangeParam->MaxRangeStatus;
+ ApplilightnessSet[elementIndex].StatusCode = pLight_LightnessRangeParam->StatusCode;
+ ApplilightnessSet[elementIndex].RangeMin = pLight_LightnessRangeParam->MinRangeStatus;
+ ApplilightnessSet[elementIndex].RangeMax = pLight_LightnessRangeParam->MaxRangeStatus;
- TRACE_M(TF_SERIAL_CTRL,"#825B! \n\r");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Range_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#825B!\r\n");
return MOBLE_RESULT_SUCCESS;
}
@@ -392,45 +481,56 @@ MOBLE_RESULT Appli_Light_Lightness_Range_Set(Light_LightnessRangeParam_t* pLight
* when Light Lightness range ststus message is received
* @param pLightnessRange_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status, MOBLEUINT32 pLength
+ , MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
- MOBLEUINT16 value = 0;
+ MOBLEUINT16 value;
#endif
- TRACE_M(TF_LIGHT,"Light_Lightness_Range_Status callback received \r\n");
-
- TRACE_M(TF_SERIAL_CTRL,"#8258! \n\r");
-#ifdef CFG_DEBUG_TRACE
+ TRACE_M(TF_LIGHT,"Light_Lightness_Range_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8258!\r\n");
+
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if(i == 0)
{
- TRACE_M(TF_LIGHT,"Status Code: %d \r\n",
- value << 8 | pLightnessRange_status[i]);
+ TRACE_M(TF_LIGHT,"Status Code: 0x%x (%d)\r\n",
+ pLightnessRange_status[i],
+ pLightnessRange_status[i]);
}
else if((i == 1) || (i == 3))
{
value = pLightnessRange_status[i];
}
- else if(i == 1)
+ else if(i == 2)
{
- TRACE_M(TF_LIGHT,"Range Min: %d \r\n",
- value << 8 | pLightnessRange_status[i]);
+ TRACE_M(TF_LIGHT,"Range Min: 0x%x (%d)\r\n",
+ value | pLightnessRange_status[i] << 8,
+ value | pLightnessRange_status[i] << 8);
}
- else if(i == 3)
+ else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Range Max: %d \r\n",
- value << 8 | pLightnessRange_status[i]);
+ TRACE_M(TF_LIGHT,"Range Max: 0x%x (%d)\r\n",
+ value | pLightnessRange_status[i] << 8,
+ value | pLightnessRange_status[i] << 8);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL
/******************************************************************************/
@@ -440,22 +540,34 @@ MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRang
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Ctl_Set(Light_CtlStatus_t* pLight_CtlParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
float colourRatio;
float brightRatio;
- TRACE_M(TF_SERIAL_CTRL,"#825E! \n\r");
+ TRACE_M(TF_LIGHT,"Appli_Light_Ctl_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#825E!\r\n");
- 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);
+ AppliCtlSet[elementIndex].PresentLightness16 = pLight_CtlParam->PresentCtlLightness16;
+ AppliCtlSet[elementIndex].PresentTemperature16 = pLight_CtlParam->PresentCtlTemperature16;
+ AppliCtlSet[elementIndex].PresentCtlDelta16 = pLight_CtlParam->PresentCtlDelta16;
- brightRatio = Ratio_CalculateValue(AppliCtlSet.PresentLightness16 ,0XFFFF ,0);
+ /* Save target parameters if transition is available */
+ AppliCtlSet[elementIndex].TargetLightness16 = pLight_CtlParam->TargetCtlLightness16;
+ AppliCtlSet[elementIndex].TargetTemperature16 = pLight_CtlParam->TargetCtlTemperature16;
+ AppliCtlSet[elementIndex].TargetCtlDelta16 = pLight_CtlParam->TargetCtlDeltaUv16;
+
+ colourRatio = Ratio_CalculateValue(AppliCtlSet[elementIndex].PresentTemperature16 ,MAX_CTL_TEMP_RANGE ,MIN_CTL_TEMP_RANGE);
+
+ brightRatio = Ratio_CalculateValue(AppliCtlSet[elementIndex].PresentLightness16 ,0XFFFF ,0);
Appli_LightPwmValue.PwmCoolValue = PWM_CoolValue(colourRatio , brightRatio);
Appli_LightPwmValue.PwmWarmValue = PWM_WarmValue(colourRatio , brightRatio);
@@ -464,15 +576,8 @@ MOBLE_RESULT Appli_Light_Ctl_Set(Light_CtlStatus_t* pLight_CtlParam,
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();
+ NvmStatePowerFlag_Set(LIGHT_CTL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -488,18 +593,18 @@ MOBLE_RESULT Appli_Light_Ctl_Set(Light_CtlStatus_t* pLight_CtlParam,
* @param pLength: length of data
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status,
- MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_Ctl_Status callback received \r\n");
-
- TRACE_M(TF_SERIAL_CTRL,"#8260! \n\r");
+
+ TRACE_M(TF_LIGHT,"Light_Ctl_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8260!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2) || (i == 4) || (i == 6))
@@ -508,34 +613,41 @@ MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status,
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present CTL Lightness: %d \r\n",
- value << 8 | pLightCtl_status[i]);
+ TRACE_M(TF_LIGHT,"Present CTL Lightness: 0x%x (%d)\r\n",
+ value | pLightCtl_status[i] << 8,
+ value | pLightCtl_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Present CTL Temperature: %d \r\n",
- value << 8 | pLightCtl_status[i]);
+ TRACE_M(TF_LIGHT,"Present CTL Temperature: 0x%x (%d)\r\n",
+ value | pLightCtl_status[i] << 8,
+ value | pLightCtl_status[i] << 8);
}
else if(i == 5)
{
- TRACE_M(TF_LIGHT,"Target CTL Lightness: %d \r\n",
- value << 8 | pLightCtl_status[i]);
+ TRACE_M(TF_LIGHT,"Target CTL Lightness: 0x%x (%d)\r\n",
+ value | pLightCtl_status[i] << 8,
+ value | pLightCtl_status[i] << 8);
}
else if(i == 7)
{
- TRACE_M(TF_LIGHT,"Target CTL Temperature: %d \r\n",
- value << 8 | pLightCtl_status[i]);
+ TRACE_M(TF_LIGHT,"Target CTL Temperature: 0x%x (%d)\r\n",
+ value | pLightCtl_status[i] << 8,
+ value | pLightCtl_status[i] << 8);
}
else if(i == 8)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time:0x%x (%d)\r\n",
+ pLightCtl_status[i],
pLightCtl_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE
/******************************************************************************/
@@ -545,21 +657,32 @@ MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status,
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_CtlTemperature_Set(Light_CtlStatus_t* pLight_CtltempParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
float colourRatio;
float brightRatio;
- TRACE_M(TF_SERIAL_CTRL,"#8264!\n\r");
- AppliCtlSet.PresentTemperature16 = pLight_CtltempParam->PresentCtlTemperature16;
- AppliCtlSet.PresentCtlDelta16 = pLight_CtltempParam->PresentCtlDelta16;
+ TRACE_M(TF_LIGHT,"Appli_Light_CtlTemperature_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8264!\r\n");
+
+ AppliCtlSet[elementIndex].PresentTemperature16 = pLight_CtltempParam->PresentCtlTemperature16;
+ AppliCtlSet[elementIndex].PresentCtlDelta16 = pLight_CtltempParam->PresentCtlDelta16;
- colourRatio = Ratio_CalculateValue(AppliCtlSet.PresentTemperature16 ,MAX_CTL_TEMP_RANGE ,MIN_CTL_TEMP_RANGE);
+ /* Made a copy of target in case of transition values change */
+ AppliCtlSet[elementIndex].TargetTemperature16 = pLight_CtltempParam->TargetCtlTemperature16;
+ AppliCtlSet[elementIndex].TargetCtlDelta16 = pLight_CtltempParam->TargetCtlDeltaUv16;
- brightRatio = Ratio_CalculateValue(AppliCtlSet.PresentLightness16 ,0XFFFF ,0);
+ colourRatio = Ratio_CalculateValue(AppliCtlSet[elementIndex].PresentTemperature16 ,MAX_CTL_TEMP_RANGE ,MIN_CTL_TEMP_RANGE);
+
+ brightRatio = Ratio_CalculateValue(AppliCtlSet[elementIndex].PresentLightness16 ,0XFFFF ,0);
Appli_LightPwmValue.PwmCoolValue = PWM_CoolValue(colourRatio , brightRatio);
Appli_LightPwmValue.PwmWarmValue = PWM_WarmValue(colourRatio , brightRatio);
@@ -568,9 +691,7 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Set(Light_CtlStatus_t* pLight_CtltempPar
Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
/* set the flag value for NVM store */
- RestoreFlag = LIGHT_CTL_NVM_FLAG;
-
- AppliNvm_SaveMessageParam();
+ NvmStatePowerFlag_Set(LIGHT_CTL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -584,19 +705,25 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Set(Light_CtlStatus_t* pLight_CtltempPar
* when Light CTL temperature status message is received
* @param pLightCtlTemp_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status, MOBLEUINT32 pLength
+ , MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_CtlTemperature_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8266! \n\r");
+ TRACE_M(TF_LIGHT,"Light_CtlTemperature_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8266!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2) || (i == 4) || (i == 6))
@@ -605,35 +732,42 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_s
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present CTL Temperature: %d \r\n",
- value << 8 | pLightCtlTemp_status[i]);
+ TRACE_M(TF_LIGHT,"Present CTL Temperature: 0x%x (%d)\r\n",
+ value | pLightCtlTemp_status[i] << 8,
+ value | pLightCtlTemp_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Present CTL Delta UV: %d \r\n",
- value << 8 | pLightCtlTemp_status[i]);
+ TRACE_M(TF_LIGHT,"Present CTL Delta UV: 0x%x (%d)\r\n",
+ value | pLightCtlTemp_status[i] << 8,
+ value | pLightCtlTemp_status[i] << 8);
}
else if(i == 5)
{
- TRACE_M(TF_LIGHT,"Target CTL Temperature: %d \r\n",
- value << 8 | pLightCtlTemp_status[i]);
+ TRACE_M(TF_LIGHT,"Target CTL Temperature: 0x%x (%d)\r\n",
+ value | pLightCtlTemp_status[i] << 8,
+ value | pLightCtlTemp_status[i] << 8);
}
else if(i == 7)
{
- TRACE_M(TF_LIGHT,"Target CTL Delta UV: %d \r\n",
- value << 8 | pLightCtlTemp_status[i]);
+ TRACE_M(TF_LIGHT,"Target CTL Delta UV: 0x%x (%d)\r\n",
+ value | pLightCtlTemp_status[i] << 8,
+ value | pLightCtlTemp_status[i] << 8);
}
else if(i == 8)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\r\n",
+ pLightCtlTemp_status[i],
pLightCtlTemp_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP
/******************************************************************************/
@@ -643,16 +777,22 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_s
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_CtlTemperature_Range_Set(Light_CtlTemperatureRangeParam_t* pLight_CtlTempRangeParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- AppliCtlTemperatureRangeSet.RangeMin = pLight_CtlTempRangeParam->MinRangeStatus;
- AppliCtlTemperatureRangeSet.RangeMax = pLight_CtlTempRangeParam->MaxRangeStatus;
- AppliCtlTemperatureRangeSet.StatusCode = pLight_CtlTempRangeParam->StatusCode;
+ AppliCtlTemperatureRangeSet[elementIndex].RangeMin = pLight_CtlTempRangeParam->MinRangeStatus;
+ AppliCtlTemperatureRangeSet[elementIndex].RangeMax = pLight_CtlTempRangeParam->MaxRangeStatus;
+ AppliCtlTemperatureRangeSet[elementIndex].StatusCode = pLight_CtlTempRangeParam->StatusCode;
- TRACE_M(TF_SERIAL_CTRL,"#826B!\n\r");
+ TRACE_M(TF_LIGHT,"Light_CtlTemperature_Range_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#826B!\r\n");
return MOBLE_RESULT_SUCCESS;
}
@@ -667,28 +807,34 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Range_Set(Light_CtlTemperatureRangeParam
* when Light CTL temperature range status message is received
* @param pCtlTempRange_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
- MOBLEUINT16 value = 0;
+ MOBLEUINT16 value;
#endif
- TRACE_M(TF_LIGHT,"Light_CtlTemperature_Range_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8263! \n\r");
+ TRACE_M(TF_LIGHT,"Light_CtlTemperature_Range_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8263!\r\n");
- RestoreFlag = LIGHT_CTL_NVM_FLAG;
+ RestoreFlag = LIGHT_CTL_NVM_FLAG;
AppliNvm_SaveMessageParam();
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if(i == 0)
{
- TRACE_M(TF_LIGHT,"Status Code: %d \r\n",
+ TRACE_M(TF_LIGHT,"Status Code: 0x%x (%d)\r\n",
+ pCtlTempRange_status[i],
pCtlTempRange_status[i]);
}
else if((i == 1) || (i == 3))
@@ -697,19 +843,23 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempR
}
else if(i == 2)
{
- TRACE_M(TF_LIGHT,"Range Min: %d \r\n",
- value << 8 | pCtlTempRange_status[i]);
+ TRACE_M(TF_LIGHT,"Range Min: 0x%x (%d)\r\n",
+ value | pCtlTempRange_status[i] << 8,
+ value | pCtlTempRange_status[i] << 8 );
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Range Max: %d \r\n",
- value << 8 | pCtlTempRange_status[i]);
+ TRACE_M(TF_LIGHT,"Range Max: 0x%x (%d)\r\n",
+ value | pCtlTempRange_status[i] << 8,
+ value | pCtlTempRange_status[i] << 8 );
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP
/******************************************************************************/
@@ -719,16 +869,22 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempR
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_CtlDefault_Set(Light_CtlDefaultParam_t* pLight_CtlDefaultParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- AppliCtlDefaultSet.CtlDefaultLightness16 = pLight_CtlDefaultParam->CtlDefaultLightness16;
- AppliCtlDefaultSet.CtlDefaultTemperature16 = pLight_CtlDefaultParam->CtlDefaultTemperature16;
- AppliCtlDefaultSet.CtlDefaultDeltaUv = pLight_CtlDefaultParam->CtlDefaultDeltaUv;
+ AppliCtlDefaultSet[elementIndex].CtlDefaultLightness16 = pLight_CtlDefaultParam->CtlDefaultLightness16;
+ AppliCtlDefaultSet[elementIndex].CtlDefaultTemperature16 = pLight_CtlDefaultParam->CtlDefaultTemperature16;
+ AppliCtlDefaultSet[elementIndex].CtlDefaultDeltaUv = pLight_CtlDefaultParam->CtlDefaultDeltaUv;
- TRACE_M(TF_SERIAL_CTRL,"#8269!\n\r");
+ TRACE_M(TF_LIGHT,"Light_CtlDefault_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8269!\r\n");
return MOBLE_RESULT_SUCCESS;
}
@@ -742,19 +898,24 @@ MOBLE_RESULT Appli_Light_CtlDefault_Set(Light_CtlDefaultParam_t* pLight_CtlDefau
* when Light CTL Default status message is received
* @param pCtlDefault_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_Ctl_DefaultStatus callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8268! \n\r");
+ TRACE_M(TF_LIGHT,"Light_Ctl_DefaultStatus callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8268!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2) || (i == 4))
@@ -763,24 +924,29 @@ MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status,
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Lightness: %d \r\n",
- value << 8 | pCtlDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Lightness: 0x%x (%d)\n\r",
+ value | pCtlDefault_status[i] << 8,
+ value | pCtlDefault_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Temperature: %d \r\n",
- value << 8 | pCtlDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Temperature: 0x%x (%d)\n\r",
+ value | pCtlDefault_status[i] << 8,
+ value | pCtlDefault_status[i] << 8);
}
else if(i == 5)
{
- TRACE_M(TF_LIGHT,"Delta UV: %d \r\n",
- value << 8 | pCtlDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Delta UV: 0x%x (%d)\n\r",
+ value | pCtlDefault_status[i] << 8,
+ value | pCtlDefault_status[i] << 8);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL
/******************************************************************************/
@@ -790,32 +956,41 @@ MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status,
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Hsl_Set(Light_HslStatus_t* pLight_HslParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_SERIAL_CTRL,"#8276!\n\r");
+ TRACE_M(TF_LIGHT,"Appli_Light_Hsl_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8276!\r\n");
- AppliHslSet.HslLightness16 = pLight_HslParam->PresentHslLightness16;
- AppliHslSet.HslHueLightness16 = pLight_HslParam->PresentHslHueLightness16;
- AppliHslSet.HslSaturation16 = pLight_HslParam->PresentHslSaturation16;
+ AppliHslSet[elementIndex].HslLightness16 = pLight_HslParam->PresentHslLightness16;
+ AppliHslSet[elementIndex].HslHueLightness16 = pLight_HslParam->PresentHslHueLightness16;
+ AppliHslSet[elementIndex].HslSaturation16 = pLight_HslParam->PresentHslSaturation16;
+ /* Save target parameters if transition is available */
+ AppliHslSet[elementIndex].TargetHslLightness16 = pLight_HslParam->TargetHslLightness16;
+ AppliHslSet[elementIndex].TargetHslHueLightness16 = pLight_HslParam->TargetHslHueLightness16;
+ AppliHslSet[elementIndex].TargetHslSaturation16 = pLight_HslParam->TargetHslSaturation16;
+
/* Function to convert HSL values in RGB values */
- HSL2RGB_Conversion();
+ HSL2RGB_Conversion(elementIndex);
- 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);
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam[elementIndex].Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam[elementIndex].Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam[elementIndex].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();
+ NvmStatePowerFlag_Set(LIGHT_HSL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -829,19 +1004,24 @@ MOBLE_RESULT Appli_Light_Hsl_Set(Light_HslStatus_t* pLight_HslParam,
* when Light HSL status message is received
* @param pHsl_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_Hsl_Status callback received \r\n");
-
- TRACE_M(TF_SERIAL_CTRL,"#8278! \n\r");
+
+ TRACE_M(TF_LIGHT,"Light_Hsl_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8278!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2) || (i == 4))
@@ -850,29 +1030,35 @@ MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 p
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"HSL Lightness: %d \r\n",
- value << 8 | pHsl_status[i]);
+ TRACE_M(TF_LIGHT,"HSL Lightness: 0x%x (%d)\n\r",
+ value | pHsl_status[i] << 8,
+ value | pHsl_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"HSL Hue: %d \r\n",
- value << 8 | pHsl_status[i]);
+ TRACE_M(TF_LIGHT,"HSL Hue: 0x%x (%d)\n\r",
+ value | pHsl_status[i] << 8,
+ value | pHsl_status[i] << 8);
}
else if(i == 5)
{
- TRACE_M(TF_LIGHT,"HSL Saturation: %d \r\n",
- value << 8 | pHsl_status[i]);
+ TRACE_M(TF_LIGHT,"HSL Saturation: 0x%x (%d)\n\r",
+ value | pHsl_status[i] << 8,
+ value | pHsl_status[i] << 8);
}
else if(i == 6)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\n\r",
+ pHsl_status[i],
pHsl_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_HUE
/******************************************************************************/
@@ -882,28 +1068,32 @@ MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 p
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_HslHue_Set(Light_HslStatus_t* pLight_HslHueParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_SERIAL_CTRL,"#826F! \n\r");
+ TRACE_M(TF_LIGHT,"Light_HslHue_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#826F!\r\n");
- AppliHslSet.HslHueLightness16 = pLight_HslHueParam->PresentHslHueLightness16;
+ AppliHslSet[elementIndex].HslHueLightness16 = pLight_HslHueParam->PresentHslHueLightness16;
- HSL2RGB_Conversion();
+ HSL2RGB_Conversion(elementIndex);
- 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);
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam[elementIndex].Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam[elementIndex].Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam[elementIndex].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();
+ NvmStatePowerFlag_Set(LIGHT_HSL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
@@ -918,19 +1108,24 @@ MOBLE_RESULT Appli_Light_HslHue_Set(Light_HslStatus_t* pLight_HslHueParam,
* when Light HSL HUE status message is received
* @param pHslHue_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_HslHue_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8271! \n\r");
+ TRACE_M(TF_LIGHT,"Light_HslHue_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8271!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2))
@@ -939,24 +1134,29 @@ MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUI
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present Hue: %d \r\n",
- value << 8 | pHslHue_status[i]);
+ TRACE_M(TF_LIGHT,"Present Hue: 0x%x (%d)\n\r",
+ value | pHslHue_status[i] << 8,
+ value | pHslHue_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Target Hue: %d \r\n",
- value << 8 | pHslHue_status[i]);
+ TRACE_M(TF_LIGHT,"Target Hue: 0x%x (%d)\n\r",
+ value | pHslHue_status[i] << 8,
+ value | pHslHue_status[i] << 8);
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\n\r",
+ pHslHue_status[i],
pHslHue_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION
/******************************************************************************/
@@ -966,28 +1166,32 @@ MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUI
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_HslSaturation_Set(Light_HslStatus_t* pLight_HslSaturationParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_SERIAL_CTRL,"#8273! \n\r");
+ TRACE_M(TF_LIGHT,"Appli_Light_HslSaturation_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8273!\r\n");
- AppliHslSet.HslSaturation16 = pLight_HslSaturationParam->PresentHslSaturation16;
+ AppliHslSet[elementIndex].HslSaturation16 = pLight_HslSaturationParam->PresentHslSaturation16;
- HSL2RGB_Conversion();
+ HSL2RGB_Conversion(elementIndex);
- 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);
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam[elementIndex].Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam[elementIndex].Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam[elementIndex].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();
+ NvmStatePowerFlag_Set(LIGHT_HSL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -1001,19 +1205,24 @@ MOBLE_RESULT Appli_Light_HslSaturation_Set(Light_HslStatus_t* pLight_HslSaturati
* when Light HSL Saturation status message is received
* @param pHslSaturation_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_HslSaturation_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8275! \n\r");
-
-#ifdef CFG_DEBUG_TRACE
+ TRACE_M(TF_LIGHT,"Light_HslSaturation_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8275!\r\n");
+
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2))
@@ -1022,24 +1231,29 @@ MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_s
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present Saturation: %d \r\n",
- value << 8 | pHslSaturation_status[i]);
+ TRACE_M(TF_LIGHT,"Present Saturation: 0x%x (%d)\n\r",
+ value | pHslSaturation_status[i] << 8,
+ value | pHslSaturation_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Target Saturation: %d \r\n",
- value << 8 | pHslSaturation_status[i]);
+ TRACE_M(TF_LIGHT,"Target Saturation: 0x%x (%d)\n\r",
+ value | pHslSaturation_status[i] << 8,
+ value | pHslSaturation_status[i] << 8);
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\n\r",
+ pHslSaturation_status[i],
pHslSaturation_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP
/******************************************************************************/
@@ -1049,34 +1263,38 @@ MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_s
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_HslDefault_Set(Light_HslStatus_t* pLight_HslDefaultParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_SERIAL_CTRL,"#827F! \n\r");
+ TRACE_M(TF_LIGHT,"Appli_Light_HslDefault_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#827F!\r\n");
- Appli_HslDefaultSet.HslDefaultLightness16 = pLight_HslDefaultParam->PresentHslLightness16;
- Appli_HslDefaultSet.HslDefaultHueLightness16 = pLight_HslDefaultParam->PresentHslHueLightness16;
- Appli_HslDefaultSet.HslDefaultSaturation16 = pLight_HslDefaultParam->PresentHslSaturation16;
+ Appli_HslDefaultSet[elementIndex].HslDefaultLightness16 = pLight_HslDefaultParam->PresentHslLightness16;
+ Appli_HslDefaultSet[elementIndex].HslDefaultHueLightness16 = pLight_HslDefaultParam->PresentHslHueLightness16;
+ Appli_HslDefaultSet[elementIndex].HslDefaultSaturation16 = pLight_HslDefaultParam->PresentHslSaturation16;
- AppliHslSet.HslLightness16 = Appli_HslDefaultSet.HslDefaultLightness16;
- AppliHslSet.HslHueLightness16 = Appli_HslDefaultSet.HslDefaultHueLightness16;
- AppliHslSet.HslSaturation16 = Appli_HslDefaultSet.HslDefaultSaturation16;
+ AppliHslSet[elementIndex].HslLightness16 = Appli_HslDefaultSet[elementIndex].HslDefaultLightness16;
+ AppliHslSet[elementIndex].HslHueLightness16 = Appli_HslDefaultSet[elementIndex].HslDefaultHueLightness16;
+ AppliHslSet[elementIndex].HslSaturation16 = Appli_HslDefaultSet[elementIndex].HslDefaultSaturation16;
- HSL2RGB_Conversion();
+ HSL2RGB_Conversion(elementIndex);
- 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);
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam[elementIndex].Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam[elementIndex].Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam[elementIndex].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();
+ NvmStatePowerFlag_Set(LIGHT_HSL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -1092,17 +1310,18 @@ MOBLE_RESULT Appli_Light_HslDefault_Set(Light_HslStatus_t* pLight_HslDefaultPara
* @param pLength: length of data
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_HslDefault_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#827C! \n\r");
-
-#ifdef CFG_DEBUG_TRACE
+ TRACE_M(TF_LIGHT,"Light_HslDefault_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#827C!\r\n");
+
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2) || (i == 4))
@@ -1111,24 +1330,29 @@ MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status,
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Lightness: %d \r\n",
- value << 8 | pHslDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Lightness: 0x%x (%d)\n\r",
+ value | pHslDefault_status[i] << 8,
+ value | pHslDefault_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Hue: %d \r\n",
- value << 8 | pHslDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Hue: 0x%x (%d)\n\r",
+ value | pHslDefault_status[i] << 8,
+ value | pHslDefault_status[i] << 8);
}
- else if(i == 4)
+ else if(i == 5)
{
- TRACE_M(TF_LIGHT,"Saturation: %d \r\n",
- value << 8 | pHslDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Saturation: 0x%x (%d)\n\r",
+ value | pHslDefault_status[i] << 8,
+ value | pHslDefault_status[i] << 8);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP
/******************************************************************************/
@@ -1141,14 +1365,16 @@ MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status,
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_HslRange_Set(Light_HslRangeParam_t* pLight_HslRangeParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_SERIAL_CTRL,"#8281! \n\r");
+ TRACE_M(TF_LIGHT,"Light_HslRange_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8281!\r\n");
- AppliHslRangeSet.HslHueMinRange16 = pLight_HslRangeParam->HslHueMinRange16;
- AppliHslRangeSet.HslHueMaxRange16 = pLight_HslRangeParam->HslHueMaxRange16;
- AppliHslRangeSet.HslMinSaturation16 = pLight_HslRangeParam->HslMinSaturation16;
- AppliHslRangeSet.HslMaxSaturation16 = pLight_HslRangeParam->HslMaxSaturation16;
+ AppliHslRangeSet[elementIndex].HslHueMinRange16 = pLight_HslRangeParam->HslHueMinRange16;
+ AppliHslRangeSet[elementIndex].HslHueMaxRange16 = pLight_HslRangeParam->HslHueMaxRange16;
+ AppliHslRangeSet[elementIndex].HslMinSaturation16 = pLight_HslRangeParam->HslMinSaturation16;
+ AppliHslRangeSet[elementIndex].HslMaxSaturation16 = pLight_HslRangeParam->HslMaxSaturation16;
return MOBLE_RESULT_SUCCESS;
}
@@ -1162,24 +1388,31 @@ MOBLE_RESULT Appli_Light_HslRange_Set(Light_HslRangeParam_t* pLight_HslRangePara
* when Light HSL range status message is received
* @param pHslRange_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_HslRange_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#827E! \n\r");
+ TRACE_M(TF_LIGHT,"Light_HslRange_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#827E!\r\n");
+
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if(i == 0)
{
- TRACE_M(TF_LIGHT,"Status Code: %d \r\n",
+ TRACE_M(TF_LIGHT,"Status Code: 0x%x (%d)\n\r",
+ pHslRange_status[i],
pHslRange_status[i]);
}
else if((i == 1) || (i == 3) || (i == 5) || (i == 7))
@@ -1188,30 +1421,36 @@ MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status, MOB
}
else if(i == 2)
{
- TRACE_M(TF_LIGHT,"Hue Range Min: %d \r\n",
- value << 8 | pHslRange_status[i]);
+ TRACE_M(TF_LIGHT,"Hue Range Min: 0x%x (%d)\n\r",
+ value | pHslRange_status[i] << 8,
+ value | pHslRange_status[i] << 8);
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Hue Range Max: %d \r\n",
- value << 8 | pHslRange_status[i]);
+ TRACE_M(TF_LIGHT,"Hue Range Max: 0x%x (%d)\n\r",
+ value | pHslRange_status[i] << 8,
+ value | pHslRange_status[i] << 8);
}
else if(i == 6)
{
- TRACE_M(TF_LIGHT,"Saturation Range Min: %d \r\n",
- value << 8 | pHslRange_status[i]);
+ TRACE_M(TF_LIGHT,"Saturation Range Min: 0x%x (%d)\n\r",
+ value | pHslRange_status[i] << 8,
+ value | pHslRange_status[i] << 8);
}
else if(i == 8)
{
- TRACE_M(TF_LIGHT,"Saturation Range Max: %d \r\n",
- value << 8 | pHslRange_status[i]);
+ TRACE_M(TF_LIGHT,"Saturation Range Max: 0x%x (%d)\n\r",
+ value | pHslRange_status[i] << 8,
+ value | pHslRange_status[i] << 8);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/*******************************************************************************
Following Functions are used for the LIGHTING Lightness MODEL
*******************************************************************************/
@@ -1224,14 +1463,19 @@ Following Functions are used for the LIGHTING Lightness MODEL
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState)
+MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(lLightnessState) = ApplilightnessSet.PresentState16;
- *(lLightnessState+1) = ApplilightnessSet.PresentState16 >> 8;
- *(lLightnessState+2) = ApplilightnessSet.LastLightness16 ;
- *(lLightnessState+3) = ApplilightnessSet.LastLightness16 >> 8;
+ *(lLightnessState) = ApplilightnessSet[elementIndex].PresentState16;
+ *(lLightnessState+1) = ApplilightnessSet[elementIndex].PresentState16 >> 8;
+ *(lLightnessState+2) = ApplilightnessSet[elementIndex].LastLightness16 ;
+ *(lLightnessState+3) = ApplilightnessSet[elementIndex].LastLightness16 >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1241,17 +1485,19 @@ MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState)
+MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lLightnessState) = ApplilightnessLinearSet[elementIndex].PresentState16;
+ *(lLightnessState+1) = ApplilightnessLinearSet[elementIndex].PresentState16 >> 8;
+ *(lLightnessState+2) = ApplilightnessSet[elementIndex].LastLightness16 ;
+ *(lLightnessState+3) = ApplilightnessSet[elementIndex].LastLightness16 >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1261,14 +1507,17 @@ MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState)
+MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(lDefaultState) = ApplilightnessSet.LightnessDefault;
- *(lDefaultState+1) = ApplilightnessSet.LightnessDefault >> 8;
- TRACE_M(TF_SERIAL_CTRL,"Get Lighness Default Status: %d\n\r",
- ApplilightnessSet.LightnessDefault);
+ *(lDefaultState) = ApplilightnessSet[elementIndex].LightnessDefault;
+ *(lDefaultState+1) = ApplilightnessSet[elementIndex].LightnessDefault >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1280,13 +1529,11 @@ MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState)
* @param lLastState: Pointer to the status message
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState)
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(lLastState) = ApplilightnessSet.LastLightness16;
- *(lLastState+1) = ApplilightnessSet.LastLightness16 >> 8;
-
- TRACE_M(TF_SERIAL_CTRL,"Get Lighness Last Status: status: %d \n\r",
- ApplilightnessSet.LastLightness16);
+ *(lLastState) = ApplilightnessSet[elementIndex].LastLightness16;
+ *(lLastState+1) = ApplilightnessSet[elementIndex].LastLightness16 >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1295,19 +1542,20 @@ MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetLightnessRangeStatus(MOBLEUINT8* lRangeState)
+MOBLE_RESULT Appli_Light_GetLightnessRangeStatus(MOBLEUINT8* lRangeState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lRangeState) = ApplilightnessSet[elementIndex].StatusCode;
+ *(lRangeState+1) = ApplilightnessSet[elementIndex].RangeMin;
+ *(lRangeState+2) = ApplilightnessSet[elementIndex].RangeMin >> 8;
+ *(lRangeState+3) = ApplilightnessSet[elementIndex].RangeMax;
+ *(lRangeState+4) = ApplilightnessSet[elementIndex].RangeMax >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1328,40 +1576,67 @@ Following Functions are used for the LIGHTING CTL MODEL
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetCtlLightStatus(MOBLEUINT8* lCtlLightState)
+MOBLE_RESULT Appli_Light_GetCtlLightStatus(MOBLEUINT8* lCtlLightState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lCtlLightState) = AppliCtlSet[elementIndex].PresentLightness16;
+ *(lCtlLightState+1) = AppliCtlSet[elementIndex].PresentLightness16 >> 8;
+ *(lCtlLightState+2) = AppliCtlSet[elementIndex].PresentTemperature16;
+ *(lCtlLightState+3) = AppliCtlSet[elementIndex].PresentTemperature16 >>8;
+ *(lCtlLightState+4) = AppliCtlSet[elementIndex].PresentCtlDelta16;
+ *(lCtlLightState+5) = AppliCtlSet[elementIndex].PresentCtlDelta16 >>8;
return MOBLE_RESULT_SUCCESS;
}
/**
+* @brief Appli_Light_GetCtlTargetStatus: This function is callback for Application
+* to get the application values in middleware used for target state.
+* @param lCtlLightState: Pointer to the status message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetCtlTargetStatus(MOBLEUINT8* lCtlLightState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ *(lCtlLightState) = AppliCtlSet[elementIndex].TargetLightness16;
+ *(lCtlLightState+1) = AppliCtlSet[elementIndex].TargetLightness16 >> 8;
+ *(lCtlLightState+2) = AppliCtlSet[elementIndex].TargetTemperature16;
+ *(lCtlLightState+3) = AppliCtlSet[elementIndex].TargetTemperature16 >>8;
+ *(lCtlLightState+4) = AppliCtlSet[elementIndex].TargetCtlDelta16;
+ *(lCtlLightState+5) = AppliCtlSet[elementIndex].TargetCtlDelta16 >>8;
+
+ 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState)
+MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lCtlTempState) = AppliCtlSet[elementIndex].PresentTemperature16;
+ *(lCtlTempState+1) = AppliCtlSet[elementIndex].PresentTemperature16 >> 8;
+ *(lCtlTempState+2) = AppliCtlSet[elementIndex].PresentCtlDelta16;
+ *(lCtlTempState+3) = AppliCtlSet[elementIndex].PresentCtlDelta16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1371,19 +1646,20 @@ MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange)
+MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lCtlTempRange) = AppliCtlTemperatureRangeSet[elementIndex].StatusCode;
+ *(lCtlTempRange+1) = AppliCtlTemperatureRangeSet[elementIndex].RangeMin;
+ *(lCtlTempRange+2) = AppliCtlTemperatureRangeSet[elementIndex].RangeMin >> 8;
+ *(lCtlTempRange+3) = AppliCtlTemperatureRangeSet[elementIndex].RangeMax;
+ *(lCtlTempRange+4) = AppliCtlTemperatureRangeSet[elementIndex].RangeMax >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1393,20 +1669,21 @@ MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetCtlDefaultStatus(MOBLEUINT8* lCtlDefaultState)
+MOBLE_RESULT Appli_Light_GetCtlDefaultStatus(MOBLEUINT8* lCtlDefaultState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lCtlDefaultState) = AppliCtlDefaultSet[elementIndex].CtlDefaultLightness16;
+ *(lCtlDefaultState+1) = AppliCtlDefaultSet[elementIndex].CtlDefaultLightness16 >> 8;
+ *(lCtlDefaultState+2) = AppliCtlDefaultSet[elementIndex].CtlDefaultTemperature16;
+ *(lCtlDefaultState+3) = AppliCtlDefaultSet[elementIndex].CtlDefaultTemperature16 >>8;
+ *(lCtlDefaultState+4) = AppliCtlDefaultSet[elementIndex].CtlDefaultDeltaUv;
+ *(lCtlDefaultState+5) = AppliCtlDefaultSet[elementIndex].CtlDefaultDeltaUv >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1427,36 +1704,65 @@ Following Functions are used for the LIGHTING HSL MODEL
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslStatus(MOBLEUINT8* lHslState)
+MOBLE_RESULT Appli_Light_GetHslStatus(MOBLEUINT8* lHslState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lHslState) = AppliHslSet[elementIndex].HslLightness16;
+ *(lHslState+1) = AppliHslSet[elementIndex].HslLightness16 >> 8;
+ *(lHslState+2) = AppliHslSet[elementIndex].HslHueLightness16;
+ *(lHslState+3) = AppliHslSet[elementIndex].HslHueLightness16 >>8;
+ *(lHslState+4) = AppliHslSet[elementIndex].HslSaturation16;
+ *(lHslState+5) = AppliHslSet[elementIndex].HslSaturation16 >>8;
return MOBLE_RESULT_SUCCESS;
}
+
+/**
+* @brief Appli_Light_GetHslTargetStatus: This function is callback for Application
+* to get the application values in middleware used for target state.
+* @param lHslState: Pointer to the status message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetHslTargetStatus(MOBLEUINT8* lHslState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ *(lHslState) = AppliHslSet[elementIndex].TargetHslLightness16;
+ *(lHslState+1) = AppliHslSet[elementIndex].TargetHslLightness16 >> 8;
+ *(lHslState+2) = AppliHslSet[elementIndex].TargetHslHueLightness16;
+ *(lHslState+3) = AppliHslSet[elementIndex].TargetHslHueLightness16 >>8;
+ *(lHslState+4) = AppliHslSet[elementIndex].TargetHslSaturation16;
+ *(lHslState+5) = AppliHslSet[elementIndex].TargetHslSaturation16 >>8;
+
+ 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState)
+MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(lHslHueState) = AppliHslSet.HslHueLightness16;
- *(lHslHueState+1) = AppliHslSet.HslHueLightness16 >>8;
- TRACE_M(TF_SERIAL_CTRL,"Get Hsl Hue Status: %d\n\r",
- AppliHslSet.HslHueLightness16);
+ *(lHslHueState) = AppliHslSet[elementIndex].HslHueLightness16;
+ *(lHslHueState+1) = AppliHslSet[elementIndex].HslHueLightness16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1466,14 +1772,17 @@ MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState)
+MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(lHslSaturationState) = AppliHslSet.HslSaturation16;
- *(lHslSaturationState+1) = AppliHslSet.HslSaturation16 >>8;
- TRACE_M(TF_SERIAL_CTRL,"Get Hsl Saturation Status: %d\n\r",
- AppliHslSet.HslSaturation16);
+ *(lHslSaturationState) = AppliHslSet[elementIndex].HslSaturation16;
+ *(lHslSaturationState+1) = AppliHslSet[elementIndex].HslSaturation16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1482,16 +1791,21 @@ MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState)
+MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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;
+ *(lHslDefaultState) = Appli_HslDefaultSet[elementIndex].HslDefaultLightness16;
+ *(lHslDefaultState+1) = Appli_HslDefaultSet[elementIndex].HslDefaultLightness16 >> 8;
+ *(lHslDefaultState+2) = Appli_HslDefaultSet[elementIndex].HslDefaultHueLightness16;
+ *(lHslDefaultState+3) = Appli_HslDefaultSet[elementIndex].HslDefaultHueLightness16 >>8;
+ *(lHslDefaultState+4) = Appli_HslDefaultSet[elementIndex].HslDefaultSaturation16;
+ *(lHslDefaultState+5) = Appli_HslDefaultSet[elementIndex].HslDefaultSaturation16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1500,19 +1814,20 @@ MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange)
+MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lHslSatRange) = AppliHslRangeSet[elementIndex].StatusCode;
+ *(lHslSatRange+1) = AppliHslRangeSet[elementIndex].HslMinSaturation16;
+ *(lHslSatRange+2) = AppliHslRangeSet[elementIndex].HslMinSaturation16 >> 8;
+ *(lHslSatRange+3) = AppliHslRangeSet[elementIndex].HslMaxSaturation16;
+ *(lHslSatRange+4) = AppliHslRangeSet[elementIndex].HslMaxSaturation16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1521,19 +1836,20 @@ MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslHueRange(MOBLEUINT8* lHslHueRange)
+MOBLE_RESULT Appli_Light_GetHslHueRange(MOBLEUINT8* lHslHueRange, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lHslHueRange) = AppliHslRangeSet[elementIndex].StatusCode;
+ *(lHslHueRange+1) = AppliHslRangeSet[elementIndex].HslHueMinRange16;
+ *(lHslHueRange+2) = AppliHslRangeSet[elementIndex].HslHueMinRange16 >> 8;
+ *(lHslHueRange+3) = AppliHslRangeSet[elementIndex].HslHueMaxRange16;
+ *(lHslHueRange+4) = AppliHslRangeSet[elementIndex].HslHueMaxRange16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1563,21 +1879,24 @@ void Appli_Light_PwmInit()
* @param value1: This value corresponds to red led.
* @param value2: This value corresponds to green led .
* @param value3: This value corresponds to blue led .
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval void
*/
-void RgbF_Create(MOBLEUINT16 value1, MOBLEUINT16 value2, MOBLEUINT16 value3)
+void RgbF_Create(MOBLEUINT16 value1, MOBLEUINT16 value2, MOBLEUINT16 value3, MOBLEUINT8 elementIndex)
{
- Appli_RGBParam.Red_Value = (MOBLEUINT16)(65535 * value1/1000);
- Appli_RGBParam.Green_Value = (MOBLEUINT16)(65535 * value2/1000);
- Appli_RGBParam.Blue_Value = (MOBLEUINT16)(65535 * value3/1000);
+ Appli_RGBParam[elementIndex].Red_Value = (MOBLEUINT16)(65535 * value1/1000);
+ Appli_RGBParam[elementIndex].Green_Value = (MOBLEUINT16)(65535 * value2/1000);
+ Appli_RGBParam[elementIndex].Blue_Value = (MOBLEUINT16)(65535 * value3/1000);
}
/**
* @brief Function to convert the HSL values in RGB values.
-* @param void
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval void
*/
-void HSL2RGB_Conversion(void)
+void HSL2RGB_Conversion(MOBLEUINT8 elementIndex)
{
MOBLEUINT16 hueValue;
@@ -1587,24 +1906,24 @@ void HSL2RGB_Conversion(void)
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)
+ if(AppliHslSet[elementIndex].HslSaturation16 == 0)
{
- Appli_RGBParam.Red_Value = AppliHslSet.HslLightness16 ;
- Appli_RGBParam.Green_Value = AppliHslSet.HslLightness16 ;
- Appli_RGBParam.Blue_Value = AppliHslSet.HslLightness16 ;
+ Appli_RGBParam[elementIndex].Red_Value = AppliHslSet[elementIndex].HslLightness16 ;
+ Appli_RGBParam[elementIndex].Green_Value = AppliHslSet[elementIndex].HslLightness16 ;
+ Appli_RGBParam[elementIndex].Blue_Value = AppliHslSet[elementIndex].HslLightness16 ;
}
- else if((AppliHslSet.HslLightness16 == 0xFFFF) || (AppliHslSet.HslLightness16 == 0x00))
+ else if((AppliHslSet[elementIndex].HslLightness16 == 0xFFFF) || (AppliHslSet[elementIndex].HslLightness16 == 0x00))
{
- Appli_RGBParam.Red_Value = AppliHslSet.HslLightness16 ;
- Appli_RGBParam.Green_Value = AppliHslSet.HslLightness16 ;
- Appli_RGBParam.Blue_Value = AppliHslSet.HslLightness16 ;
+ Appli_RGBParam[elementIndex].Red_Value = AppliHslSet[elementIndex].HslLightness16 ;
+ Appli_RGBParam[elementIndex].Green_Value = AppliHslSet[elementIndex].HslLightness16 ;
+ Appli_RGBParam[elementIndex].Blue_Value = AppliHslSet[elementIndex].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;
+ hueValue = (MOBLEUINT16)(360 * (float)AppliHslSet[elementIndex].HslHueLightness16/65535);
+ lightnessvalue = (float)AppliHslSet[elementIndex].HslLightness16/65535;
+ saturationValue = (float)AppliHslSet[elementIndex].HslSaturation16/65535;
/* Formula to get the values used for RGB conversion */
cValue = (MOBLEUINT16)(((1- fabs(2 * lightnessvalue-1))*saturationValue) * 1000);
@@ -1614,33 +1933,33 @@ void HSL2RGB_Conversion(void)
/* Conditons applied for the different angle of hue value */
if (hueValue > 0 && hueValue < (HUE_UPPER_LIMIT / 6))
{
- RgbF_Create(cValue + mValue, xValue + mValue, mValue);
+ RgbF_Create(cValue + mValue, xValue + mValue, mValue, elementIndex);
}
else if (hueValue >= (HUE_UPPER_LIMIT / 6) && hueValue < (HUE_UPPER_LIMIT / 3))
{
- RgbF_Create(xValue + mValue, cValue + mValue, mValue);
+ RgbF_Create(xValue + mValue, cValue + mValue, mValue, elementIndex);
}
else if (hueValue >= (HUE_UPPER_LIMIT / 3) && hueValue < (HUE_UPPER_LIMIT / 2))
{
- RgbF_Create(mValue, cValue + mValue, xValue + mValue);
+ RgbF_Create(mValue, cValue + mValue, xValue + mValue, elementIndex);
}
else if (hueValue >= (HUE_UPPER_LIMIT / 2)
&& hueValue < (2 * HUE_UPPER_LIMIT / 3))
{
- RgbF_Create(mValue, xValue + mValue, cValue + mValue);
+ RgbF_Create(mValue, xValue + mValue, cValue + mValue, elementIndex);
}
else if (hueValue >= (2 * HUE_UPPER_LIMIT / 3)
&& hueValue < (5 * HUE_UPPER_LIMIT / 6))
{
- RgbF_Create(xValue + mValue, mValue, cValue + mValue);
+ RgbF_Create(xValue + mValue, mValue, cValue + mValue, elementIndex);
}
else if ((hueValue >= (5 * HUE_UPPER_LIMIT / 6) && hueValue <= HUE_UPPER_LIMIT) || (hueValue == 0))
{
- RgbF_Create(cValue + mValue, mValue, xValue + mValue);
+ RgbF_Create(cValue + mValue, mValue, xValue + mValue, elementIndex);
}
else
{
- RgbF_Create(mValue, mValue, mValue);
+ RgbF_Create(mValue, mValue, mValue, elementIndex);
}
}
}
@@ -1778,5 +2097,5 @@ void Light_UpdateLedValue(MOBLEUINT8 state ,Appli_LightPwmValue_t light_state)
/**
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light.h
index aaa600146..c5bb76ec0 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light.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
@@ -54,6 +54,9 @@ typedef struct
MOBLEUINT16 PresentLightness16;
MOBLEUINT16 PresentTemperature16;
MOBLEINT16 PresentCtlDelta16;
+ MOBLEUINT16 TargetLightness16;
+ MOBLEUINT16 TargetTemperature16;
+ MOBLEINT16 TargetCtlDelta16;
}Appli_Light_CtlSet;
/* Light Ctl Temperature Range Set */
@@ -78,6 +81,9 @@ typedef struct
MOBLEUINT16 HslLightness16;
MOBLEUINT16 HslHueLightness16;
MOBLEUINT16 HslSaturation16;
+ MOBLEUINT16 TargetHslLightness16;
+ MOBLEUINT16 TargetHslHueLightness16;
+ MOBLEUINT16 TargetHslSaturation16;
}Appli_Light_HslSet;
/* Light Hsl Hue set */
@@ -117,80 +123,225 @@ typedef struct
/* Exported Functions Prototypes ---------------------------------------------*/
-MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t*, MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t*,
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
-MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, MOBLEUINT32 pLength);
+MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
-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_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pLight_LightnessDefaultParam,
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Lightness_Last_Status(MOBLEUINT8 const *pLightnessDefault_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessLast_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Lightness_Last_Set(Light_LightnessStatus_t* pLight_LightnessParam,
+ MOBLEUINT8 elementIndex);
+
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetLightnessRangeStatus(MOBLEUINT8* lRangeState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetCtlLightStatus(MOBLEUINT8* lCtlLightState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetCtlTargetStatus(MOBLEUINT8* lCtlLightState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetCtlDefaultStatus(MOBLEUINT8* lCtlDefaultState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslStatus(MOBLEUINT8* lHslState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslTargetStatus(MOBLEUINT8* lHslState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslHueRange(MOBLEUINT8* lHslHueRange,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
void Appli_Light_PwmInit(void);
-void HSL2RGB_Conversion(void);
+void HSL2RGB_Conversion(MOBLEUINT8 elementIndex);
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);
+void RgbF_Create(MOBLEUINT16 value1,
+ MOBLEUINT16 value2,
+ MOBLEUINT16 value3,
+ MOBLEUINT8 elementIndex);
+void Light_UpdateLedValue(MOBLEUINT8 state,
+ Appli_LightPwmValue_t light_state);
+
+/******************************************************************************/
#endif /* __APPLI_LIGHT_H */
+/******************************************************************************/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/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 d7982080a..8556233b3 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_client.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_client.c
@@ -6,7 +6,8 @@
******************************************************************************
* @attention
*
-* <h2><center>&copy; COPYRIGHT(c) 20120 STMicroelectronics</center></h2>
+* <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
@@ -21,6 +22,7 @@
#include "types.h"
#include "appli_generic.h"
#include "appli_light.h"
+#include "appli_light_lc.h"
#include "common.h"
#include "mesh_cfg_usr.h"
#include "appli_nvm.h"
@@ -46,26 +48,392 @@
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
+* @brief Appli_LightClient_API: This function is a Wrapper to call Light Client API depending on opcode received in input
+* @param elementIndex: Index of the element
+* @param msg_opcode: opcode of the desired API
+* @param msg_params: buffer containing the desired API parameters
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_LightClient_Lightness_Set(void)
+MOBLE_RESULT Appli_LightClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8 *msg_params)
{
- MOBLE_ADDRESS elementAddr = 0;
- MOBLEUINT8 pLightnessParam[3];
-
- Appli_IntensityControlPublishing(pLightnessParam);
- LightClient_Lightness_Set_Unack(elementAddr,
- (_Light_LightnessParam*) pLightnessParam,
- sizeof(pLightnessParam) );
-
- return MOBLE_RESULT_SUCCESS;
-}
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+
+ switch(msg_opcode){
+/******************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS
+/******************************************************************************/
+ case LIGHT_LIGHTNESS_GET:
+ {
+ result = LightClient_Lightness_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LIGHTNESS_SET:
+ {
+ result = LightClient_Lightness_Set_Ack(elementIndex,
+ msg_params,
+ (sizeof(Light_LightnessParam_t)-2)); //Remove the size of Linear Lightness params
+ break;
+ }
+ case LIGHT_LIGHTNESS_SET_UNACK:
+ {
+ result = LightClient_Lightness_Set_Unack(elementIndex,
+ msg_params,
+ (sizeof(Light_LightnessParam_t)-2)); //Remove the size of Linear Lightness params
+ break;
+ }
+
+ case LIGHT_LIGHTNESS_LINEAR_GET:
+ {
+ result = LightClient_Lightness_Linear_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LIGHTNESS_LINEAR_SET:
+ {
+ result = LightClient_Lightness_Linear_Set_Ack(elementIndex,
+ msg_params,
+ (sizeof(Light_LightnessParam_t)-2)); //Remove the size of Lightness params
+ break;
+ }
+ case LIGHT_LIGHTNESS_LINEAR_SET_UNACK:
+ {
+ result = LightClient_Lightness_Linear_Set_Unack(elementIndex,
+ msg_params,
+ (sizeof(Light_LightnessParam_t)-2)); //Remove the size of Lightness params
+ break;
+ }
+
+ case LIGHT_LIGHTNESS_DEFAULT_GET:
+ {
+ result = LightClient_Lightness_Default_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LIGHTNESS_DEFAULT_SET:
+ {
+ result = LightClient_Lightness_Default_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_LightnessDefaultParam_t));
+ break;
+ }
+ case LIGHT_LIGHTNESS_DEFAULT_SET_UNACK:
+ {
+ result = LightClient_Lightness_Default_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_LightnessDefaultParam_t));
+ break;
+ }
+
+
+ case LIGHT_LIGHTNESS_RANGE_GET:
+ {
+ result = LightClient_Lightness_Range_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LIGHTNESS_RANGE_SET:
+ {
+ result = LightClient_Lightness_Range_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_LightnessRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+ case LIGHT_LIGHTNESS_RANGE_SET_UNACK:
+ {
+ result = LightClient_Lightness_Range_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_LightnessRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+
+
+/******************************************************************************/
+#endif /* #ifdef ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS */
+/******************************************************************************/
+
+/******************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_CTL
+/******************************************************************************/
+ case LIGHT_CTL_GET:
+ {
+ result = LightClient_Ctl_Get(elementIndex);
+ break;
+ }
+ case LIGHT_CTL_SET:
+ {
+ result = LightClient_Ctl_Set_Ack(elementIndex,
+ msg_params,
+ (sizeof(Light_CtlParam_t)-4) ); //Remove the size of Last_Lightness and Last_Temperature
+ break;
+ }
+ case LIGHT_CTL_SET_UNACK:
+ {
+ result = LightClient_Ctl_Set_Unack(elementIndex,
+ msg_params,
+ (sizeof(Light_CtlParam_t)-4) ); //Remove the size of Last_Lightness and Last_Temperature
+ break;
+ }
+
+ case LIGHT_CTL_TEMPERATURE_GET:
+ {
+ result = LightClient_Ctl_Temperature_Get(elementIndex);
+ break;
+ }
+ case LIGHT_CTL_TEMPERATURE_SET:
+ {
+ result = LightClient_Ctl_Temperature_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlTemperatureParam_t));
+ break;
+ }
+ case LIGHT_CTL_TEMPERATURE_SET_UNACK:
+ {
+ result = LightClient_Ctl_Temperature_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlTemperatureParam_t));
+ break;
+ }
+
+ case LIGHT_CTL_TEMPERATURE_RANGE_GET:
+ {
+ result = LightClient_Ctl_Temperature_Range_Get(elementIndex);
+ break;
+ }
+ case LIGHT_CTL_TEMPERATURE_RANGE_SET:
+ {
+ result = LightClient_Ctl_Temperature_Range_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlTemperatureRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+ case LIGHT_CTL_TEMPERATURE_RANGE_SET_UNACK:
+ {
+ result = LightClient_Ctl_Temperature_Range_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlTemperatureRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+
+ case LIGHT_CTL_DEFAULT_GET:
+ {
+ result = LightClient_Ctl_Default_Get(elementIndex);
+ break;
+ }
+ case LIGHT_CTL_DEFAULT_SET:
+ {
+ result = LightClient_Ctl_Default_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlDefaultParam_t));
+ break;
+ }
+ case LIGHT_CTL_DEFAULT_SET_UNACK:
+ {
+ result = LightClient_Ctl_Default_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlDefaultParam_t));
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_LIGHT_MODEL_CLIENT_CTL */
+/******************************************************************************/
+/******************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_HSL
+/******************************************************************************/
+ case LIGHT_HSL_GET:
+ {
+ result = LightClient_Hsl_Get(elementIndex);
+ break;
+ }
+ case LIGHT_HSL_SET:
+ {
+ result = LightClient_Hsl_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_HslParam_t) );
+ break;
+ }
+ case LIGHT_HSL_SET_UNACK:
+ {
+ result = LightClient_Hsl_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_HslParam_t) );
+ break;
+ }
+
+ case LIGHT_HSL_DEFAULT_GET:
+ {
+ result = LightClient_Hsl_Default_Get(elementIndex);
+ break;
+ }
+ case LIGHT_HSL_DEFAULT_SET:
+ {
+ result = LightClient_Hsl_Default_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_HslDefault_t) );
+ break;
+ }
+ case LIGHT_HSL_DEFAULT_SET_UNACK:
+ {
+ result = LightClient_Hsl_Default_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_HslDefault_t) );
+ break;
+ }
+
+ case LIGHT_HSL_RANGE_GET:
+ {
+ result = LightClient_Hsl_Range_Get(elementIndex);
+ break;
+ }
+ case LIGHT_HSL_RANGE_SET:
+ {
+ result = LightClient_Hsl_Range_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_HslRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+ case LIGHT_HSL_RANGE_SET_UNACK:
+ {
+ result = LightClient_Hsl_Range_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_HslRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+
+ case LIGHT_HSL_HUE_GET:
+ {
+ result = LightClient_Hsl_Hue_Get(elementIndex);
+ break;
+ }
+ case LIGHT_HSL_HUE_SET:
+ {
+ result = LightClient_Hsl_Hue_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_HslHueParam_t));
+ break;
+ }
+ case LIGHT_HSL_HUE_SET_UNACK:
+ {
+ result = LightClient_Hsl_Hue_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_HslHueParam_t));
+ break;
+ }
+
+ case LIGHT_HSL_SATURATION_GET:
+ {
+ result = LightClient_Hsl_Saturation_Get(elementIndex);
+ break;
+ }
+ case LIGHT_HSL_SATURATION_SET:
+ {
+ result = LightClient_Hsl_Saturation_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_HslSaturationParam_t));
+ break;
+ }
+ case LIGHT_HSL_SATURATION_SET_UNACK:
+ {
+ result = LightClient_Hsl_Saturation_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_HslSaturationParam_t));
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_LIGHT_MODEL_CLIENT_HSL */
+/******************************************************************************/
+
+/******************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_LC
+/******************************************************************************/
+ case LIGHT_LC_MODE_GET:
+ {
+ result = LightClient_LC_Mode_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LC_MODE_SET:
+ {
+ result = LightClient_LC_Mode_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_ModeParam_t));
+ break;
+ }
+ case LIGHT_LC_MODE_SET_UNACK:
+ {
+ result = LightClient_LC_Mode_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_ModeParam_t));
+ break;
+ }
+ case LIGHT_LC_OM_GET:
+ {
+ result = LightClient_LC_OM_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LC_OM_SET:
+ {
+ result = LightClient_LC_OM_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_OccupancyModeParam_t));
+ break;
+ }
+ case LIGHT_LC_OM_SET_UNACK:
+ {
+ result = LightClient_LC_OM_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_OccupancyModeParam_t));
+ break;
+ }
+ case LIGHT_LC_ON_OFF_GET:
+ {
+ result = LightClient_LC_OnOff_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LC_ON_OFF_SET:
+ {
+ result = LightClient_LC_OnOff_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_OnOffParam_t));
+ break;
+ }
+ case LIGHT_LC_ON_OFF_SET_UNACK:
+ {
+ result = LightClient_LC_OnOff_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_OnOffParam_t));
+ break;
+ }
+
+ case LIGHT_LC_PROPERTY_GET:
+ {
+ result = LightClient_LC_Property_Get(elementIndex, msg_params);
+ break;
+ }
+ case LIGHT_LC_PROPERTY_SET:
+ {
+ //TODO: Set dynamic data size depending on Property DATA LENTGH: length = 2 + PropertyDataLength
+ result = LightClient_LC_Property_Set_Ack(elementIndex,
+ msg_params,
+ 5);
+ break;
+ }
+ case LIGHT_LC_PROPERTY_SET_UNACK:
+ {
+ //TODO: Set dynamic data size depending on Property DATA LENTGH: length = 2 + PropertyDataLength
+ result = LightClient_LC_Property_Set_Unack(elementIndex,
+ msg_params,
+ 5);
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_LIGHT_MODEL_CLIENT_LC */
+/******************************************************************************/
+ default:
+ {
+ TRACE_M(TF_LIGHT, "OpCode value invalid %d \r\n", msg_opcode);
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+ return result;
+}
/**
* @}
@@ -75,5 +443,5 @@ MOBLE_RESULT Appli_LightClient_Lightness_Set(void)
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/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 a9e0fa708..ba977f2c8 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_client.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_client.h
@@ -31,10 +31,10 @@
/* Exported variables ------------------------------------------------------- */
/* Application Variable-------------------------------------------------------*/
/* Exported Functions Prototypes ---------------------------------------------*/
-MOBLE_RESULT Appli_LightClient_Lightness_Set(void);
+MOBLE_RESULT Appli_LightClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8* msg_params);
#endif /* __APPLI_LIGHT_CLIENT_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
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
index a7d123c91..29efc487d 100644
--- 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
@@ -39,138 +39,407 @@
/* Private macro -------------------------------------------------------------*/
/* Private variable ----------------------------------------------------------*/
-Appli_LightLC_Set_t Appli_LightLC_set;
-Appli_Light_LC_PropertySet_t Appli_LightLC_PropertySet;
+__attribute__((aligned(4)))const light_lc_cb_t AppliLightLc_cb =
+{
+ Appli_LightLCs_ModeGet,
+ Appli_LightLCs_ModeSet,
+ Appli_LightLCs_ModeSetUnack,
+ Appli_LightLCs_ModeStatus,
+ Appli_LightLCs_OmGet,
+ Appli_LightLCs_OmSet,
+ Appli_LightLCs_OmSetUnack,
+ Appli_LightLCs_OmStatus,
+ Appli_LightLCs_OnOffGet,
+ Appli_LightLCs_OnOffSet,
+ Appli_LightLCs_OnOffSetUnack,
+ Appli_LightLCs_OnOffStatus,
+ Appli_LightLCs_PropertyGet,
+ Appli_LightLCs_PropertySet,
+ Appli_LightLCs_PropertySetUnack,
+ Appli_LightLCs_PropertyStatus
+};
-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
+ * @brief Callback corresponding to LightLCs_ModeGet_cb
+ * @param Message parameters
+ * @retval None
*/
-MOBLE_RESULT Appli_LightLC_Mode_Set(Light_LC_Param_t* pLight_LC_Param,
- MOBLEUINT8 OptionalValid)
+void Appli_LightLCs_ModeGet(MODEL_MessageHeader_t *pmsgParam)
{
- 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;
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
}
+
/**
-* @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
+ * @brief Callback corresponding to LightLCs_ModeSet_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
*/
-MOBLE_RESULT Appli_LightLC_OM_Set(Light_LC_Param_t* pLight_LC_Param,
- MOBLEUINT8 OptionalValid)
+void Appli_LightLCs_ModeSet(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
{
- 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;
-}
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
+
/**
-* @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
+ * @brief Callback corresponding to LightLCs_ModeSetUnack_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
*/
-MOBLE_RESULT Appli_LightLC_OnOff_Set(Light_LC_Param_t* pLight_LC_Param,
- MOBLEUINT8 OptionalValid)
+void Appli_LightLCs_ModeSetUnack(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
{
- 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;
-}
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
+
/**
-* @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)
+ * @brief Callback corresponding to LightLCs_ModeSatus_cb
+ * @param Message parameters
+ * @retval None
+*/
+void Appli_LightLCs_ModeStatus(MOBLEUINT8 const* pLightLCMode_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+ TRACE_M(TF_LIGHT_LC,"LightLCs_ModeStatus callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8294!\r\n");
+
+ for(i = 0; i < plength; i++)
+ {
+ if(i == 0)
+ TRACE_M(TF_SERIAL_CTRL,"Light LC Mode value: %d\n\r",
+ pLightLCMode_status[i]);
+ }
+}
+
+
+/**
+ * @brief Callback corresponding to LightLCs_OmGet_cb
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_OmGet(MODEL_MessageHeader_t *pmsgParam)
{
- /* 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.
- */
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
- return AmbientLuxLevel;
+
+/**
+ * @brief Callback corresponding to LightLCs_OmSet_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_OmSet(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
+{
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
}
+
/**
-* @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)
+ * @brief Callback corresponding to LightLCs_OmSetUnack_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_OmSetUnack(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
{
- MOBLEUINT16 luxLevel = 0;
- /* User can write their code for the calculation */
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
+
+/**
+ * @brief Callback corresponding to LightLCs_OmStatus_cb
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_OmStatus(MOBLEUINT8 const* pLightLCOccupancyMode_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+ TRACE_M(TF_LIGHT_LC,"LightLCs_OmStatus callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8298!\r\n");
- return luxLevel;
+ for(i = 0; i < plength; i++)
+ {
+ if(i == 0)
+ TRACE_M(TF_SERIAL_CTRL,"Light LC OM value: %d\n\r",
+ pLightLCOccupancyMode_status[i]);
+ }
+}
+
+
+/**
+ * @brief Callback corresponding to LightLCs_OnOffGet_cb
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_OnOffGet(MODEL_MessageHeader_t *pmsgParam)
+{
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
}
+
/**
-* @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
+ * @brief Callback corresponding to LightLC_OnOffSet_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
*/
-MOBLE_RESULT Appli_LightLC_Get_ModeStatus(MOBLEUINT8* plcModeState)
+void Appli_LightLCs_OnOffSet(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
{
- *(plcModeState) = Appli_LightLC_set.LC_mode;
- TRACE_M(TF_SERIAL_CTRL,"Get Mode Status: %d\n\r",
- Appli_LightLC_set.LC_mode);
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
- return MOBLE_RESULT_SUCCESS;
+
+/**
+ * @brief Callback corresponding to LightLCs_OnOffSetUnack_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+*/
+void Appli_LightLCs_OnOffSetUnack(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
+{
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
}
+
/**
-* @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
+ * @brief Callback corresponding to LightLCs_OnOffStatus_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
*/
-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);
+void Appli_LightLCs_OnOffStatus(MOBLEUINT8 const* pLightLCOnOff_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+ TRACE_M(TF_LIGHT_LC,"LightLCs_OnOffStatus callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#829C!\r\n");
- return MOBLE_RESULT_SUCCESS;
+ for(i = 0; i < plength; i++)
+ {
+ if(i == 0)
+ TRACE_M(TF_SERIAL_CTRL,"Light LC OnOff status: %d\n\r",
+ pLightLCOnOff_status[i]);
+ }
+}
+
+
+/**
+ * @brief Callback corresponding to LightLCs_PropertyGet_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+*/
+void Appli_LightLCs_PropertyGet(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
+{
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
}
+
/**
-* @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
+ * @brief Callback corresponding to LightLCs_PropertySet_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_PropertySet(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
+{
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
+
+
+/**
+ * @brief Callback corresponding to LightLCs_PropertySetUnack_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_PropertySetUnack(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
+ {
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+ }
+
+
+/**
+ * @brief Callback corresponding to LightLCs_PropertyStatus_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
*/
-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);
+void Appli_LightLCs_PropertyStatus(MOBLEUINT8 const* pLightLCProperty_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+ TRACE_M(TF_LIGHT_LC,"LightLCs_PropertyStatus callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#64!\r\n");
- return MOBLE_RESULT_SUCCESS;
-}
+ for(i = 0; i < plength; i++)
+ {
+ if(i == 0)
+ TRACE_M(TF_SERIAL_CTRL,"Light LC Property status: %d\n\r",
+ pLightLCProperty_status[i]);
+ }
+}
+
+
+/**
+ * @brief
+ * @param
+ * @retval
+ */
+__weak MOBLE_RESULT Appli_Light_LCs_Init(void)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+ MOBLEUINT8 lcsElementIndex = 0;
+
+ /* Extract element index of LC server */
+ result = ExtractLcServerElementIndex(&lcsElementIndex,
+#ifdef APPLICATION_NUMBER_OF_ELEMENTS
+ APPLICATION_NUMBER_OF_ELEMENTS,
+#else
+ 0,
+#endif
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+ ENABLE_LIGHT_MODEL_SERVER_LC,
+ ENABLE_LIGHT_MODEL_SERVER_LC_SETUP,
+#else
+ 0,
+ 0,
+#endif
+#ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF
+ ENABLE_GENERIC_MODEL_SERVER_ONOFF,
+#else
+ 0,
+#endif
+#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF
+ ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF,
+#else
+ 0,
+#endif
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
+ ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS);
+#else
+ 0);
+#endif
+
+ if(MOBLE_SUCCEEDED(result))
+ {
+ result = Light_LCs_Init(&BufferLcServer, lcsElementIndex, &AppliLightLc_cb, SIZE_OF_LC_SERVER_T);
+ }
+
+ if(MOBLE_FAILED(result))
+ {
+ TRACE_M(TF_LIGHT_LC, "Light LC Server init failed\r\n");
+ }
+
+ return result;
+}
+
+
+/**
+ * @brief
+ * @param
+ * @retval
+ */
+__weak MOBLE_RESULT Appli_Light_LC_SensorPropertyUpdate(MOBLEUINT8 elementIndex,
+ MOBLEUINT16 propertyId,
+ MOBLEUINT32 value)
+{
+ return Light_LC_SensorPropertyUpdate(elementIndex,
+ propertyId,
+ value);
+}
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+/**
+ * @brief Handling of serial inputs to LC model
+ * @param serial string
+ * @param serial string size
+ * @retval void
+ */
+void Appli_Light_LC_SerialCmd(char *rcvdStringBuff, uint16_t rcvdStringSize)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_INVALIDARG;
+
+ if (!strncmp(rcvdStringBuff+6, "TR0", 3))
+ {
+ if (rcvdStringSize == 9)
+ {
+ /* call to function corresponding MMDL/SR/LLC/BV-03-C */
+ result = Light_LC_SetTransitionTimeZero(1);
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ BLEMesh_PrintStringCb("Invalid size of string\r\n");
+ }
+ }
+ else if (!strncmp(rcvdStringBuff+6, "OCCUPANCY", 9)) /* occupancy detect */
+ {
+ if (rcvdStringSize == 15)
+ {
+ /* occupancy detected for element index 0 */
+ Appli_Light_LC_SensorPropertyUpdate(0,
+ PRESENCE_DETECTED_PID,
+ 1);
+ result = MOBLE_RESULT_SUCCESS;
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ BLEMesh_PrintStringCb("Invalid size of string\r\n");
+ }
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ /* Check the result of command processing */
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ BLEMesh_PrintStringCb("Success\r\n");
+ }
+ else if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ BLEMesh_PrintStringCb("Fail Out of memory\r\n");
+ }
+ else if(result == MOBLE_RESULT_INVALIDARG)
+ {
+ BLEMesh_PrintStringCb("Fail Invalid Argument\r\n");
+ }
+ else
+ {
+ BLEMesh_PrintStringCb("Fail\r\n");
+ }
+}
+#endif
/**
@@ -181,5 +450,5 @@ MOBLE_RESULT Appli_LightLC_Get_OnOffStatus(MOBLEUINT8* plcOnOffState)
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/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 e9893c5e8..7691992ed 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_lc.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_light_lc.h
@@ -25,43 +25,55 @@
#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);
+void Appli_LightLCs_ModeGet(MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_ModeSet(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_ModeSetUnack(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_ModeStatus(MOBLEUINT8 const* pLightLCMode_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_LightLCs_OmGet(MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OmSet(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OmSetUnack(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OmStatus(MOBLEUINT8 const* pLightLCOccupancyMode_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_LightLCs_OnOffGet(MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OnOffSet(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OnOffSetUnack(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OnOffStatus(MOBLEUINT8 const* pLightLCOnOff_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_LightLCs_PropertyGet(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_PropertySet(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_PropertySetUnack(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_PropertyStatus(MOBLEUINT8 const* pLightLCOccupancyMode_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Light_LCs_Init(void);
+MOBLE_RESULT Appli_Light_LC_SensorPropertyUpdate(MOBLEUINT8 elementIndex,
+ MOBLEUINT16 propertyId,
+ MOBLEUINT32 value);
+void Appli_Light_LC_SerialCmd(char *rcvdStringBuff,
+ uint16_t rcvdStringSize);
#endif /* __APPLI_LIGHT_LC_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_mesh.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_mesh.c
index 9c862a508..f6e6223f9 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_mesh.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_mesh.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
@@ -20,15 +20,18 @@
#include "ble_common.h"
#include "app_conf.h"
#include "hal_common.h"
+#include "ble_mesh.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 "light.h"
+#include "light_lc.h"
+#include "sensors.h"
#include "common.h"
#include "serial_if.h"
#include "appli_nvm.h"
@@ -36,9 +39,16 @@
#include "appli_config_client.h"
#include "appli_generic_client.h"
#include "appli_light_client.h"
+#if ((ENABLE_SENSOR_MODEL_SERVER != 0)||(ENABLE_SENSOR_MODEL_CLIENT != 0))
+#include "appli_sensor.h"
+#include "appli_sensors_client.h"
+#endif
#include "stm32_seq.h"
+#if (( CFG_LPM_SUPPORTED == 0) && (ENABLE_PWM_SUPPORT == 1))
#include "PWM_config.h"
+#include "PWM_handlers.h"
+#endif
#include "mesh_cfg_usr.h"
/** @addtogroup ST_BLE_Mesh
@@ -90,6 +100,7 @@
/* Private variables ---------------------------------------------------------*/
+
enum ButtonState
{
BS_OFF,
@@ -100,12 +111,13 @@ enum ButtonState
enum ButtonState buttonState = BS_OFF;
tClockTime tBounce = 0;
+/*Will be an array aligned with number of elements*/
MOBLEUINT8 Appli_LedState = 0;
MOBLEUINT16 IntensityValue = INTENSITY_LEVEL_ZERO;
MOBLEUINT8 IntensityFlag = FALSE;
MOBLEUINT8 ProxyFlag = 0;
MOBLEUINT8 ProvisionFlag = 0;
-
+MOBLEUINT8 UnprovisionInProgress = 0;
#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
static MOBLEUINT8 PrvngInProcess = 0;
@@ -123,7 +135,7 @@ 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,
+const MOBLEUINT8 StaticOobBuff[SIZE_STATIC_OOB] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
#else
const MOBLEUINT8 StaticOobBuff[] = {0};
@@ -182,6 +194,8 @@ volatile uint8_t BleProcessInit = 0;
MOBLEUINT8 lowPowerNodeApiTimer_Id;
#endif
+MOBLEUINT8 pPropertyId[4];
+
/********************* Application configuration **************************/
#if defined(__GNUC__) || defined(__IAR_SYSTEMS_ICC__) || defined(__CC_ARM)
MOBLEUINT8 bdaddr[8];
@@ -198,7 +212,7 @@ const void *prvsnr_data;
#endif /* __GNUC__ || defined(__IAR_SYSTEMS_ICC__) || defined(__CC_ARM) */
/* Private function prototypes -----------------------------------------------*/
-//static void Appli_LongButtonPress(void);
+static void Appli_LongButtonPress(void);
static void Appli_ShortButtonPress(void);
#if USER_OUTPUT_OOB_APPLI_PROCESS
void Appli_OobAuthenticationProcess(void);
@@ -208,6 +222,9 @@ void Appli_LowPowerProcess(void);
#if (APPLI_OPTIM == 1)
static void AppliMeshTask(void);
#endif
+void Appli_GetPublicationParamsCb(model_publicationparams_t* pPubParameters);
+WEAK_FUNCTION (void SerialPrvn_ProvisioningStatusUpdateCb(uint8_t flagPrvningInProcess,
+ MOBLEUINT16 nodeAddress));
/* Private functions ---------------------------------------------------------*/
@@ -222,7 +239,7 @@ static void Appli_ShortButtonPress(void)
BLEMesh_ModelsCommand();
}
-#if 0
+
/**
* @brief Function calls when a button is pressed for Long duration
* @param void
@@ -230,9 +247,137 @@ static void Appli_ShortButtonPress(void)
*/
static void Appli_LongButtonPress(void)
{
- /* User Implementation */
-}
+ /** GENERIC ONOFF **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API ONOFF GET ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_ON_OFF_GET, NULL);
+
+ /** GENERIC LEVEL **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API LEVEL GET ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_LEVEL_GET, NULL);
+
+ /** GENERIC POWER ONOFF **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API POWER ON OFF GET ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_POWER_ON_OFF_GET, NULL);
+
+ /** GENERIC TRANSITION TIME **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API DEFAULT TRANSITION TIME GET ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_DEFAULT_TRANSITION_TIME_GET, NULL);
+
+ /** LIGHT LIGHTNESS **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_GET, NULL);
+
+ /** LIGHT LIGHTNESS LINEAR **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS LINEAR GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_LINEAR_GET, NULL);
+
+ /** LIGHT LIGHTNESS DEFAULT **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS DEFAULT GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_DEFAULT_GET, NULL);
+
+ /** LIGHT LIGHTNESS RANGE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS RANGE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_RANGE_GET, NULL);
+
+ /** LIGHT LIGHTNESS CTL **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_GET, NULL);
+
+ /** LIGHT LIGHTNESS CTL TEMPERATURE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_GET, NULL);
+
+ /** LIGHT LIGHTNESS CTL TEMPERATURE RANGE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE RANGE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_RANGE_GET, NULL);
+
+ /** LIGHT LIGHTNESS CTL DEFAULT **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL DEFAULT GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_DEFAULT_GET, NULL);
+
+ /** LIGHT LIGHTNESS HSL **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_GET, NULL);
+
+ /** LIGHT LIGHTNESS HSL DEFAULT **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL DEFAULT GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_DEFAULT_GET, NULL);
+
+ /** LIGHT LIGHTNESS HSL RANGE**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL RANGE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_RANGE_GET, NULL);
+
+ /** LIGHT LIGHTNESS HSL HUE**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL HUE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_HUE_GET, NULL);
+
+ /** LIGHT LIGHTNESS HSL SATURATION**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL SATURATION GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_SATURATION_GET, NULL);
+
+ /** LIGHT LC MODE**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC MODE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_MODE_GET, NULL);
+
+ /** LIGHT LC OM**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC OM GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_OM_GET, NULL);
+
+ /** LIGHT LC ON OFF**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC ON OFF GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_ON_OFF_GET, NULL);
+
+ /** LIGHT LC PROPERTY **/
+ //LIGHT_CONTROL_LUX_LEVEL_ON_ID : 0x202B
+ pPropertyId[0]= 0x2B; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pPropertyId[1]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC PROPERTY GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_PROPERTY_GET, pPropertyId);
+
+#if 1 /* Sensor APIs */
+ //PRESENT_AMBIENT_TEMPERATURE_PID : 0x004F
+ pPropertyId[0]= 0x4F; // Property ID byte 0 : Property ID for the sensor
+ pPropertyId[1]= 0x00; // Property ID byte 1 : Property ID for the sensor
+
+ /** SENSOR DESCRIPTOR**/
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR DESCRIPTOR GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_DESCRIPTOR_GET, pPropertyId);
+
+ /** SENSOR CADENCE**/
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR CADENCE GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_CADENCE_GET, pPropertyId);
+
+ /** SENSOR SETTINGS **/
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR SETTINGS GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_SETTINGS_GET, pPropertyId);
+
+ /** SENSOR SETTING **/
+ pPropertyId[2]= 0xAD; // Sensor Setting Property ID byte 0 : Property ID for the sensor setting
+ pPropertyId[3]= 0x00; // Sensor Setting Property ID byte 1 : Property ID for the sensor setting
+
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR SETTING GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_SETTING_GET, pPropertyId);
+
+ /** SENSOR GET **/
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_GET, pPropertyId);
+
+ /** SENSOR COLUMN **/
+// pPropertyId[2]= 0x01; // Raw Value X byte 0 : Raw value identifying a column
+// pPropertyId[3]= 0x00; // Raw Value X byte 1 : Raw value identifying a column
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR COLUMN GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_COLUMN_GET, pPropertyId);
+
+ /** SENSOR SERIES **/
+// pPropertyId[2]= 0x01; // Raw Value X1 byte 0 : Raw value identifying a starting column.
+// pPropertyId[3]= 0x02; // Raw Value X2 byte 0 : Raw value identifying an ending column.
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR SERIES GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_SERIES_GET, pPropertyId);
#endif
+
+ IntensityPublish();
+
+}
/**
* @brief Updates the button status
@@ -250,7 +395,7 @@ static void Appli_UpdateButtonState(int isPressed)
if((t1 - t0) > LONG_PRESS_THRESHOLD)
{
- IntensityPublish();
+ Appli_LongButtonPress();
}
else if((t1 - t0) > BOUNCE_THRESHOLD)
{
@@ -269,6 +414,25 @@ static void Mesh_Task()
BLEMesh_Process();
BLEMesh_ModelsProcess(); /* Models Processing */
+ if((UnprovisionInProgress > 0) &&
+ (!LL_FLASH_IsActiveFlag_OperationSuspended()))
+ {
+ UnprovisionInProgress = 0;
+ AppliNvm_ClearModelState();
+ PalNvmErase(NVM_BASE, 0);
+ PalNvmErase(NVM_BASE, 0x1000);
+ PalNvmErase(APP_NVM_BASE, 0);
+ PalNvmErase(PRVN_NVM_BASE_OFFSET, 0);
+ TRACE_M(TF_PROVISION,"NVM erased\r\n");
+ BLEMesh_Unprovision();
+ AppliNvm_ClearModelState();
+ TRACE_M(TF_PROVISION,"Device is unprovisioned by application \r\n");
+
+ BLEMesh_Process();
+
+ NVIC_SystemReset();
+ }
+
#if (APPLI_OPTIM == 0)
/* Set the task in the scheduler for the next execution */
#if (LOW_POWER_FEATURE == 0)
@@ -501,10 +665,10 @@ void Appli_BleUnprovisionedIdentifyCb(MOBLEUINT8 data)
*/
MOBLEUINT8 Appli_BleSetNumberOfElementsCb(void)
{
- if(NumberOfElements > MAX_NUMB_ELEMENTS)
+ if(NumberOfElements > BLEMesh_GetNumberOfElements())
{
- TRACE_M(TF_MISC,"In version 1.11.00x one Element per node is supported!\r\n");
- return MAX_NUMB_ELEMENTS;
+ TRACE_M(TF_MISC, "Number of Elements enabled in application exceeding from Library Capability!\r\n");
+ return BLEMesh_GetNumberOfElements();
}
else if(NumberOfElements == 0)
@@ -515,7 +679,7 @@ MOBLEUINT8 Appli_BleSetNumberOfElementsCb(void)
else
{
- return NumberOfElements;
+ return NumberOfElements;
}
}
@@ -593,6 +757,8 @@ MOBLEUINT8* Appli_BleInputOOBAuthCb(MOBLEUINT8 size)
while(1)
{
Serial_InterfaceProcess();
+ /* Enable Mesh process working in while loop */
+ BTLE_StackTick();
/* Check if input is completed or timeout */
if((inputOOBDataReady != 0x00) | (inputTimer > INPUT_OOB_TIMEOUT))
{
@@ -715,7 +881,7 @@ void Appli_Unprovision(void)
if(!ProxyFlag)
{
/* No GATT connection */
- BLEMesh_Unprovision();
+ BLEMesh_StopAdvScan();
PalNvmErase(NVM_BASE, 0);
PalNvmErase(NVM_BASE, 0x1000);
@@ -723,6 +889,7 @@ void Appli_Unprovision(void)
PalNvmErase(PRVN_NVM_BASE_OFFSET, 0);
TRACE_M(TF_PROVISION,"NVM erased\r\n");
+ BLEMesh_Unprovision();
AppliNvm_ClearModelState();
TRACE_M(TF_PROVISION,"Device is unprovisioned by application \r\n");
@@ -861,11 +1028,13 @@ SleepModes App_SleepMode_Check(SleepModes sleepMode)
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();
+ BLEMesh_StopAdvScan();
+ UnprovisionInProgress = 1; /* Wait release on FLASH PESD bit */
}
/**
@@ -1233,28 +1402,19 @@ void BLEMesh_CustomBeaconReceivedCallback(const MOBLEUINT8* bdAddr,
if (result == MOBLE_RESULT_SUCCESS)
{
- if ((length-1) < data[0])
+ if (data[1] == CUSTOM_BEACON_AD_TYPE)
{
- result = MOBLE_RESULT_FAIL;
- TRACE_M(TF_BEACON, "Length field does not match with message length \r\n");
- }
- }
+ TRACE_M(TF_BEACON, "Message length(%d), rssi(%d) \r\n", length, rssi);
- 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 */
+ if (TF_BEACON == 1)
+ {
+ TRACE_I(TF_BEACON, "Data: ");
+ for (MOBLEUINT8 count=0; count<length; count++)
+ {
+ TRACE_I(TF_BEACON, "%.2x ", data[count]);
+ }
+ TRACE_I(TF_BEACON, " \r\n");
+ }
}
}
}
@@ -1367,12 +1527,22 @@ void IntensityPublish(void)
{
#ifdef LIGHT_CLIENT_MODEL_PUBLISH
- Appli_LightClient_Lightness_Set();
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS
+ MOBLEUINT8 elementIndex = 0;
+ MOBLEUINT8 pLightnessParam[3];
+ Appli_IntensityControlPublishing(pLightnessParam);
+ Appli_LightClient_API(elementIndex, LIGHT_LIGHTNESS_SET, pLightnessParam);
#endif
+#else
#ifdef GENERIC_CLIENT_MODEL_PUBLISH
- Appli_GenericClient_Level_Set_Unack();
+ MOBLEUINT8 elementIndex = 0;
+ MOBLEUINT8 pGeneric_LevelParam[3];
+
+ Appli_IntensityControlPublishing(pGeneric_LevelParam);
+ Appli_GenericClient_API(elementIndex, GENERIC_LEVEL_SET_ACK, pGeneric_LevelParam);
#endif
+#endif
}
/**
@@ -1387,7 +1557,6 @@ void Appli_Process(void)
AppliNvm_Process();
#endif
- Appli_LowPowerProcess();
#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
if(PrvngInProcess)
{
@@ -1445,6 +1614,17 @@ static void AppliMeshSW1Task(void)
return;
}
+#if (ENABLE_SENSOR_MODEL_SERVER != 0)
+static void AppliMeshSW3Task(void)
+{
+ Sensor_UpdatePublishState(0, 1);
+
+ Appli_Sensor_Update(0, 1);
+
+ return;
+}
+#endif
+
#if (LOW_POWER_FEATURE == 1)
static void LowPowerNodeApiApp(void)
{
@@ -1524,6 +1704,18 @@ void Appli_Init(MOBLEUINT8 *flag)
__HAL_RCC_TIM1_CLK_ENABLE();
__HAL_RCC_TIM2_CLK_ENABLE();
PWM_Init();
+#ifdef USER_BOARD_1LED
+ Modify_PWM(SINGLE_LED, 1);
+#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, 1);
+ Modify_PWM(GREEN_LED, 1);
+ Modify_PWM(BLUE_LED, 1);
+#endif
#endif
UTIL_SEQ_RegTask( 1<< CFG_TASK_MESH_SW1_REQ_ID, UTIL_SEQ_RFU, AppliMeshSW1Task );
@@ -1540,8 +1732,36 @@ void Appli_Init(MOBLEUINT8 *flag)
UTIL_SEQ_RegTask( 1<< CFG_TASK_MESH_LPN_REQ_ID, UTIL_SEQ_RFU, LowPowerNodeApiApp );
LPN_scan_enabled = MOBLE_FALSE;
#endif
+#if (ENABLE_SENSOR_MODEL_SERVER != 0)
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_MESH_SW3_REQ_ID, UTIL_SEQ_RFU, AppliMeshSW3Task );
+#endif
}
+/*****************************Config Model Callbacks***************************/
+/**
+* @brief Callback from Config Model to receive the Publication Parameters
+* @param Structure Pointer having parameters - modelID, elementAddress,
+* Publish Address, PublishPeriod, PublishTTL, Credential Flag,
+* Publish AppKeyIndex, Retransmit Count & Restransmit Interval Steps
+* @retval none
+*/
+void Appli_GetPublicationParamsCb(model_publicationparams_t* pPubParameters)
+{
+ if(pPubParameters->modelID == SENSOR_SERVER_MODEL_ID)
+ {
+ Sensor_ModelPublishSet(pPubParameters);
+ }
+}
+
+
+/************************************ Weak linking ***********************************
+If implemented in application, linker would replace weak linking in library */
+WEAK_FUNCTION (void SerialPrvn_ProvisioningStatusUpdateCb(uint8_t flagPrvningInProcess, MOBLEUINT16 nodeAddress))
+{
+
+}
+
+
/**
* @}
*/
@@ -1549,4 +1769,4 @@ void Appli_Init(MOBLEUINT8 *flag)
/**
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_mesh.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_mesh.h
index ad831f2cd..e37bf2ffa 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_mesh.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_mesh.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
@@ -114,13 +114,15 @@ 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);
+void Appli_GetPublicationParamsCb(model_publicationparams_t*);
+MOBLE_RESULT BLEMesh_ScanDevices(neighbor_params_t *unprovDeviceArray, MOBLEUINT8 *noOfUnprovDevices);
+MOBLE_RESULT BLEMesh_ProvisionDevice(neighbor_params_t *unprovDeviceArray, MOBLEUINT16 index);
#endif /* __APPLI_MESH_H */
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
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
index 9e0d28c75..a96a27bc5 100644
--- 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
@@ -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
@@ -77,6 +77,8 @@ extern const void* appNvmBase;
#define FLASH_EMPTY_SIGNATURE 0xFFFFFFFF
+#define RADIO_OFF_DELAY 1000
+
/* Private variables ---------------------------------------------------------*/
typedef struct
@@ -88,6 +90,7 @@ typedef struct
/* ALIGN(4) */
__attribute__((aligned(4))) APPLI_NVM_REQS AppliNvm_Reqs;
+MOBLEUINT16 StopRadioInProgress;
MOBLE_RESULT AppliNvm_EraseRestoreResvNvm(void);
MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
@@ -95,7 +98,8 @@ MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
MOBLEUINT32 totalSubPage,
MOBLEUINT32 nvmBaseOffset);
MOBLE_RESULT AppliNvm_MarkSubpageInvalid(void);
-MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size);
+MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset,
+ void const *buf, MOBLEUINT32 size);
#if 0
/**
@@ -133,7 +137,9 @@ MOBLE_RESULT AppliNvm_FlashErase(uint16_t PageNumber)
* @param Data: word to write
* @retval MOBLE_RESULT_SUCCESS on success
*/
-MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size)
+MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset,
+ void const *buf,
+ MOBLEUINT32 size)
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
@@ -159,7 +165,10 @@ MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUIN
}
else
{
- result = PalNvmWrite(APP_NVM_BASE, offset, buf, size);
+ result = PalNvmWrite(APP_NVM_BASE,
+ offset,
+ buf,
+ size);
}
return result;
@@ -296,8 +305,8 @@ MOBLE_RESULT AppliNvm_FactorySettingReset(void)
/* Load model data copy from nvm */
memcpy((void*)AppliNvm_Reqs.modelData,
- (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(currSubPageIdx) + APP_NVM_GENERIC_MODEL_OFFSET),
- APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE);
+ (void*)(APP_NVM_SUBPAGE_OFFSET(currSubPageIdx)+APP_NVM_GENERIC_MODEL_OFFSET),
+ APP_NVM_MODELDATA_PER_ELEMENT_SIZE);
result = AppliNvm_MarkSubpageInvalid();
@@ -341,7 +350,8 @@ MOBLE_RESULT AppliNvm_FactorySettingReset(void)
* @param model state buff size
* @retval MOBLE_RESULT_SUCCESS on success
*/
-MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state, uint8_t size)
+MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state,
+ uint16_t size)
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS; /* if save model state not defined, return MOBLE_RESULT_FAIL */
@@ -354,7 +364,9 @@ MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state, uint8_t size)
}
else
{
- memcpy(AppliNvm_Reqs.modelData, state, size);
+ memcpy(AppliNvm_Reqs.modelData,
+ state,
+ size);
AppliNvm_Reqs.writeReq = MOBLE_TRUE;
AppliNvm_Reqs.erasePageReq = MOBLE_FALSE;
@@ -379,13 +391,13 @@ MOBLE_RESULT AppliNvm_ClearModelState(void)
#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};
+ MOBLEUINT8 clearBuff[APP_NVM_MODELDATA_PER_ELEMENT_SIZE] = {0};
MOBLEUINT32 valid = 0;
result = AppliNvm_FindFirstEmptyPage(&subPageIdx,
APP_NVM_SUBPAGE_SIZE,
APP_NVM_MAX_SUBPAGE,
- (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
if (MOBLE_FAILED(result))
{
@@ -434,7 +446,8 @@ MOBLE_RESULT AppliNvm_ClearModelState(void)
* @param model state buff size
* @retval MOBLE_RESULT_SUCCESS on success
*/
-MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint8_t* size)
+MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[],
+ uint16_t* size)
{
#if (SAVE_MODEL_STATE_NVM == 1)
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
@@ -463,8 +476,10 @@ MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint8_t* size)
memcpy((void*)AppliNvm_Reqs.modelData,
(void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(currSubPageIdx-1) + APP_NVM_GENERIC_MODEL_OFFSET),
APP_NVM_GENERIC_MODEL_SIZE + APP_NVM_LIGHT_MODEL_SIZE);
- memcpy((void*)state, (void*)(AppliNvm_Reqs.modelData), APP_NVM_MODEL_SIZE);
- *size = APP_NVM_MODEL_SIZE;
+ memcpy((void*)state,
+ (void*)(AppliNvm_Reqs.modelData),
+ APP_NVM_MODEL_SIZE);
+ *size = APP_NVM_MODEL_SIZE;
}
}
return result;
@@ -487,41 +502,47 @@ void AppliNvm_Process(void)
uint8_t reserveAreaCopy[APP_NVM_RESERVED_SIZE];
/* Erase if required */
- if (AppliNvm_Reqs.erasePageReq == MOBLE_TRUE)
+ if ((AppliNvm_Reqs.erasePageReq == MOBLE_TRUE) &&
+ (!LL_FLASH_IsActiveFlag_OperationSuspended()))
{
- /* save reserve flash area */
- memcpy((void*)reserveAreaCopy, (void*)APP_NVM_BASE, APP_NVM_RESERVED_SIZE);
-
- result = PalNvmErase(APP_NVM_BASE, 0);
-
- if(result == MOBLE_RESULT_OUTOFMEMORY)
+ if(StopRadioInProgress == 0)
{
- AppliNvm_Reqs.erasePageReq = MOBLE_TRUE;
+ /* save reserve flash area */
+ memcpy((void*)reserveAreaCopy,
+ (void*)APP_NVM_BASE,
+ APP_NVM_RESERVED_SIZE);
+
+ TRACE_M(TF_PROVISION,"Erase flash page\r\n");
+ result = PalNvmErase(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);
+ 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;
+ }
+ 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);
+ 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;
+ result = AppliNvm_FlashProgram(0,
+ (uint32_t*)&reserveAreaCopy,
+ APP_NVM_RESERVED_SIZE);
+ BLEMesh_ResumeAdvScan();
}
}
+ else
+ StopRadioInProgress--;
}
- if (AppliNvm_Reqs.erasePageReq == MOBLE_FALSE
- && AppliNvm_Reqs.writeReq == MOBLE_TRUE)
+ if (AppliNvm_Reqs.erasePageReq == MOBLE_FALSE &&
+ AppliNvm_Reqs.writeReq == MOBLE_TRUE)
{
result = AppliNvm_FindFirstEmptyPage(&subPageIdx,
APP_NVM_SUBPAGE_SIZE,
@@ -530,11 +551,14 @@ void AppliNvm_Process(void)
if(result == MOBLE_RESULT_OUTOFMEMORY)
{
+ BLEMesh_SuspendAdvScan();
+ StopRadioInProgress = RADIO_OFF_DELAY;
+
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;
+ result = MOBLE_RESULT_SUCCESS;
}
else
{
@@ -637,6 +661,85 @@ MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
return result;
}
+#if 0
+MOBLE_RESULT AppliNVM_Save_FlashTesting(MOBLEUINT8 *buffer,
+ MOBLEUINT16 buffer_size)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+ uint8_t reserveAreaCopy[APP_NVM_RESERVED_SIZE];
+ MOBLEINT16 subPageIdx;
+
+ for(MOBLEUINT8 count = 0;count <= buffer_size;count++)
+ {
+ buffer[count] = count;
+ }
+
+ /* save reserve flash area */
+ memcpy((void*)reserveAreaCopy,
+ (void*)APP_NVM_BASE,
+ APP_NVM_RESERVED_SIZE);
+
+ result = AppliNvm_FlashErase((uint16_t)((APP_NVM_BASE - RESET_MANAGER_FLASH_BASE_ADDRESS) / PAGE_SIZE));
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ /* restore reserve area */
+// FLASH_ProgramWordBurst(APP_NVM_BASE, (uint32_t*)reserveAreaCopy);
+ result = AppliNvm_FlashProgram(0,
+ (uint32_t*)&reserveAreaCopy,
+ APP_NVM_RESERVED_SIZE);
+ }
+
+ result = AppliNvm_FindFirstEmptyPage(&subPageIdx,
+ APP_NVM_SUBPAGE_SIZE,
+ APP_NVM_MAX_SUBPAGE,
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
+
+ if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ TRACE_M(TF_PROVISION, "Flash sub page is full, preparing new subpage\r\n");
+ }
+ else
+ {
+ result = AppliNvm_FlashProgram(APP_NVM_SUBPAGE_OFFSET(subPageIdx)+APP_NVM_GENERIC_MODEL_OFFSET,
+ buffer,
+ buffer_size);
+ }
+ return result;
+}
+
+MOBLE_RESULT AppliNVM_Retrieve_FlashTesting(MOBLEUINT8 *buffer,
+ MOBLEUINT16 buffer_size)
+{
+ MOBLEINT16 currSubPageIdx;
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+
+ result = AppliNvm_FindFirstEmptyPage(&currSubPageIdx,
+ APP_NVM_SUBPAGE_SIZE,
+ APP_NVM_MAX_SUBPAGE,
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
+
+ if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ TRACE_M(TF_PROVISION," Can not find the empty page for testing flash \r\n");
+ }
+ else
+ {
+ memcpy((void*)buffer,
+ (void*)(APP_NVM_SUBPAGE_OFFSET(currSubPageIdx)+APP_NVM_GENERIC_MODEL_OFFSET),
+ buffer_size);
+
+ result = AppliNvm_MarkSubpageInvalid();
+
+ if (MOBLE_FAILED(result))
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+
+ return result;
+}
+#endif
/**
* @}
@@ -645,4 +748,4 @@ MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
/**
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 34667f26c..65fd789d7 100644
--- 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
@@ -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
@@ -55,9 +55,9 @@ typedef struct
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_SaveModelState(uint8_t* state, uint16_t size);
MOBLE_RESULT AppliNvm_ClearModelState(void);
-MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint8_t* size);
+MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint16_t* size);
void AppliNvm_Process(void);
void AppliNvm_SaveMessageParam (void);
MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
@@ -85,8 +85,13 @@ void AppliPrvnNvm_SaveProvisionerDevKey(MOBLEUINT8 *data ,
void AppliPrvnNvm_SaveKeys (MOBLEUINT8 status);
+MOBLE_RESULT AppliNVM_Save_FlashTesting(MOBLEUINT8 *buffer,
+ MOBLEUINT16 buffer_size);
+MOBLE_RESULT AppliNVM_Retrieve_FlashTesting(MOBLEUINT8 *buffer,
+ MOBLEUINT16 buffer_size);
+
#endif /* __APPLI_NVM_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensor.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensor.c
index 7c164b49e..c6bed93c0 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensor.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensor.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
@@ -21,9 +21,10 @@
#include "hal_common.h"
#include "types.h"
+#include "sensor_cfg_usr.h"
#include "sensors.h"
-#include "light_lc.h"
#include "appli_sensor.h"
+#include "appli_light_lc.h"
#include "mesh_cfg.h"
//#include "LPS25HB.h"
#include "string.h"
@@ -38,13 +39,49 @@
* @{
*/
-/* Private typedef -----------------------------------------------------------*/
-/* Private define ------------------------------------------------------------*/
+MOBLE_RESULT Appli_Sensor_ValueSet(MOBLEUINT8 sensorOffset,
+ MOBLEUINT32 value);
+
+/* Private variables ---------------------------------------------------------*/
+
+/* ALIGN(4) */
+__attribute__((aligned(4)))const sensor_server_init_params_t SensorServerInitParams = SENSOR_SERVER_INIT_PARAMS;
+
+/* ALIGN(4) */
+__attribute__((aligned(4)))const sensor_server_cb_t AppliSensor_cb =
+{
+ /* Sensor Model callbacks */
+ Appli_Sensor_CadenceGet,
+ Appli_Sensor_CadenceSet,
+ Appli_Sensor_CadenceSetUnack,
+ Appli_Sensor_SettingsGet,
+ Appli_Sensor_SettingGet,
+ Appli_Sensor_SettingSet,
+ Appli_Sensor_SettingSetUnack,
+ Appli_Sensor_DescriptorGet,
+ Appli_Sensor_Get,
+ Appli_Sensor_ColumnGet,
+ Appli_Sensor_SeriesGet,
+ Appli_Sensor_ReadDescriptor,
+ Appli_Sensor_ReadValue,
+ Appli_Sensor_ReadColumn,
+ Appli_Sensor_ReadSeries,
+ Appli_Sensor_IsFastCadence,
+ Appli_Sensor_IsStatusTrigger,
+ Appli_Sensor_Descriptor_Status,
+ Appli_Sensor_Cadence_Status,
+ Appli_Sensor_Settings_Status,
+ Appli_Sensor_Setting_Status,
+ Appli_Sensor_Status,
+ Appli_Sensor_Column_Status,
+ Appli_Sensor_Series_Status
+};
+
#if 0
/**
-* @brief PRESSURE init structure definition
-*/
-PRESSURE_InitTypeDef InitStructure =
+ * @brief Pressure sensor init
+ */
+__attribute__((aligned(4)))const PRESSURE_InitTypeDef Lps25InitParams =
{
LPS25HB_ODR_1Hz,
LPS25HB_BDU_READ,
@@ -55,44 +92,19 @@ PRESSURE_InitTypeDef InitStructure =
};
#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[3];
-
-/* By Default value used for cadence set for testing. */
-Sensor_CadenceSet_t Sensor_CadenceSet[NUMBER_OF_SENSOR];
-
-/*
-{
- {0x0071 , 0x2 , 2 , 2 ,2 ,1 ,0X05 , 0x64},
- {0x2A6D , 0x2 , 1 , 1 , 1, 1, 0X258 , 0x3ED},
- {0X2A7F ,0x2,1,1,1,0,0x10, 0x20}
-};*/
-
-
-#endif
-
-MODEL_Property_IDTableParam_t Property_ID_Table[NUMBER_OF_SENSOR] =
-{
- {TEMPERATURE_PID},
- {PRESSURE_PID},
- {TIME_OF_FLIGHT_PID}
-};
+/**
+ * @brief Variables for people
+ */
+MOBLEUINT8 AppliSensorReadFromSensor = 0; /* Used for PTS testing */
+MOBLEUINT8 PresentTemperatureValue = 0;
+MOBLEUINT8 PreviousTemperatureValue = 0;
MOBLEUINT8 Occupancy_Flag = MOBLE_FALSE;
extern MOBLEUINT8 NumberOfElements;
extern MOBLEUINT8 ProvisionFlag;
MOBLEUINT8 Sensor_Setting_Access = 0x01 ;
+MOBLEUINT32 PresentPeopleCount = 0;
+MOBLEUINT32 PreviousPeopleCount = 0;
-
-
-/* Temperature and Pressure init structure*/
-#if 0
- PRESSURE_DrvTypeDef* xLPS25HBDrv = &LPS25HBDrv;
-#endif
-
-/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/******************************************************************************/
@@ -101,792 +113,909 @@ MOBLEUINT8 Sensor_Setting_Access = 0x01 ;
/**
-* @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
+ * @brief Callback corresponding to Sensor_CadenceGet_cb
+ * @param Cadence parameters
+* @retval None
*/
-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 if( property_ID == (MOBLEUINT16) TIME_OF_FLIGHT_PID)
- {
- Sensor_CadenceSet[2].Property_ID = pCadence_param->Property_ID;
- Sensor_CadenceSet[2].FastCadenceDevisor = pCadence_param->FastCadenceDevisor ;
- Sensor_CadenceSet[2].StatusTriggerType = pCadence_param->StatusTriggerType ;
- Sensor_CadenceSet[2].triggerDeltaDown = pCadence_param->triggerDeltaDown;
- Sensor_CadenceSet[2].triggerDeltaUp = pCadence_param->triggerDeltaUp;
- Sensor_CadenceSet[2].StatusMinInterval = pCadence_param->StatusMinInterval;
- Sensor_CadenceSet[2].FastCadenceLow = pCadence_param->FastCadenceLow;
- Sensor_CadenceSet[2].FastCadenceHigh = pCadence_param->FastCadenceHigh;
- }
-
- return MOBLE_RESULT_SUCCESS;
+void Appli_Sensor_CadenceGet(sensor_CadenceCbParam_t* pCadenceParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pCadenceParam->property_ID, elementIndex, peerAddr, dstPeer);
}
+
/**
-* @brief Appli_Sensor_Cadence_Get: This function is callback for Application
-* when sensor cadence Set message is received
-* @param pCadence_get: 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
+ * @brief Callback corresponding to Sensor_CadenceSet_cb
+ * @param Cadence parameters
+* @retval None
*/
-
-MOBLE_RESULT Appli_Sensor_Cadence_Get(MOBLEUINT8* sensor_DataCadence,
- MOBLEUINT16 property_ID, MOBLEUINT32 length)
+void Appli_Sensor_CadenceSet(sensor_CadenceCbParam_t* pCadenceParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
- return MOBLE_RESULT_SUCCESS;
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pCadenceParam->property_ID, elementIndex, peerAddr, dstPeer);
}
-/**
-* @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,MOBLEUINT16 prop_ID)
-{
-
- for(int i=0;i< NUMBER_OF_SENSOR;i++)
- {
- if(prop_ID == Property_ID_Table[i].Property_ID)
- {
- Appli_Sensor_SettingSet[i].Property_ID = pSensor_SettingParam->Property_ID;
-
- Appli_Sensor_SettingSet[i].Sensor_Setting_ID = pSensor_SettingParam->Sensor_Setting_ID;
- Appli_Sensor_SettingSet[i].Sensor_Setting_Access = Sensor_Setting_Access;
- Appli_Sensor_SettingSet[i].Sensor_Setting_Value = pSensor_SettingParam->Sensor_Setting_Value;
- }
- }
- return MOBLE_RESULT_SUCCESS;
+/**
+ * @brief Callback corresponding to Sensor_CadenceSetUnack_cb
+ * @param Cadence parameters
+* @retval None
+*/
+void Appli_Sensor_CadenceSetUnack(sensor_CadenceCbParam_t* pCadenceParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pCadenceParam->property_ID, elementIndex, peerAddr, dstPeer);
}
-
/**
-* @brief Appli_Sensor_Data_Status: This function is callback for Application
-* when Sensor Get message is received
-* @param sensor_Data: Pointer to buffer to be updated with parameters
-* @param pLength: Length of the parameters to be sent in response
-* @param prop_ID: Property Id of requested sensor (optional)
-* @param length: Received data length
-* @retval MOBLE_RESULT
+ * @brief Callback corresponding to Sensor_SettingsGet_cb
+ * @param Setting parameters
+* @retval None
*/
-MOBLE_RESULT Appli_Sensor_Data_Status(MOBLEUINT8* sensor_Data ,
- MOBLEUINT32* pLength,
- MOBLEUINT16 prop_ID ,
- MOBLEUINT32 length)
+void Appli_Sensor_SettingsGet(sensor_SettingsCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
- MOBLE_RESULT result = MOBLE_RESULT_FALSE;
- MOBLEUINT32 temperatureData = 0;
- MOBLEUINT32 pressureData = 0;
- MOBLEUINT8 data_Length = 0x03;
- MOBLEUINT32 distance = 0x000000C8; // 200 cm
- MOBLEUINT8 data_Length_UnknownID;
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pSettingParam->propertyId, elementIndex, peerAddr, dstPeer);
+}
-#if 0
- LPS25HB_GetTemperature((float*)&temperatureData);
-
- LPS25HB_GetPressure((float*)&pressureData);
-#endif
-
- result = Check_Property_ID(Property_ID_Table , prop_ID);
-
- if(result == MOBLE_RESULT_SUCCESS && length > 0)
- {
- if((prop_ID == TEMPERATURE_PID )) /* format A */
- {
- /*(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))
- {
- /* 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))
- {
- /* 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(length == 0)
- {
- /*(prop_Id_Temp & 0x07) << 5) | (Len <<1) Format A
- Property calculation is done like above line
+/**
+ * @brief Callback corresponding to Sensor_SettingGet_cb
+ * @param Setting parameters
+* @retval None
*/
- *(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);
+void Appli_Sensor_SettingGet(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pSettingParam->property_ID, elementIndex, peerAddr, dstPeer);
+}
- *pLength =20;
- }
- else
- {
-// *(sensor_Data+0) = (MOBLEUINT8)prop_ID ;
-// *(sensor_Data+1) = (MOBLEUINT8)(prop_ID >> 8);
-//
-// *pLength =2;
-
- data_Length_UnknownID = 0x0F;
- if(prop_ID < 0x0800)
- {
- *(sensor_Data) = ((prop_ID & 0x07) << 5) | (data_Length_UnknownID << 1) ;
- *(sensor_Data+1) = (prop_ID >> 3) & 0xFF;
-
- *pLength=2;
- }
- else
- {
- *(sensor_Data+0) = 0xFF; //((data_Length <<1) | 0x01) & 0x00;
- *(sensor_Data+1) = (MOBLEUINT8)prop_ID ;
- *(sensor_Data+2) = (MOBLEUINT8)(prop_ID >> 8);
+/**
+ * @brief Callback corresponding to Sensor_SettingSet_cb
+ * @param Setting parameters
+* @retval None
+*/
+void Appli_Sensor_SettingSet(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pSettingParam->property_ID, elementIndex, peerAddr, dstPeer);
+}
- *pLength = 3;
- }
- }
- //*plength=0;
- }
-
- 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 Callback corresponding to Sensor_SettingSetUnack_cb
+ * @param Setting parameters
+* @retval None
+*/
+void Appli_Sensor_SettingSetUnack(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pSettingParam->property_ID, elementIndex, peerAddr, dstPeer);
}
/**
-* @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
+ * @brief Callback corresponding to Sensor_DescriptorGet_cb
+ * @param Descriptor parameters
+* @retval None
*/
-MOBLE_RESULT Appli_Sensor_Descriptor_Status(MOBLEUINT8* sensor_Descriptor ,
- MOBLEUINT32* pLength,MOBLEUINT16 prop_ID ,
- MOBLEUINT32 length)
+void Appli_Sensor_DescriptorGet(MOBLEUINT8 prop_ID,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
- Appli_Sensor_DescriptorStatus_t Appli_Sensor_DescriptorStatus1[] =
+ if(length == 0)
{
- {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;
- MOBLE_RESULT result = MOBLE_RESULT_FALSE;
- result = Check_Property_ID(Property_ID_Table , prop_ID);
-
- if (result != MOBLE_RESULT_FALSE )
+ TRACE_M(TF_SENSOR, "Sensor Descriptor data for all sensors on element index %X peer addr %X, dst peer %X\r\n",
+ elementIndex, peerAddr, dstPeer);
+ }
+ else
{
- if(prop_ID == TEMPERATURE_PID)
- {
- 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;
- *pLength = 8;
- }
- else if(prop_ID == PRESSURE_PID)
- {
- tolerance = Appli_Sensor_DescriptorStatus1[1].NegativeTolerance;
- tolerance = (tolerance << 12 ) | Appli_Sensor_DescriptorStatus1[1].PositiveTolerance ;
-
- *(sensor_Descriptor) = Appli_Sensor_DescriptorStatus1[1].Prop_ID;
- *(sensor_Descriptor+1) = Appli_Sensor_DescriptorStatus1[1].Prop_ID >> 8;
- *(sensor_Descriptor+2) = tolerance;
- *(sensor_Descriptor+3) = tolerance >> 8;
- *(sensor_Descriptor+4) = tolerance >> 16;
- *(sensor_Descriptor+5) = Appli_Sensor_DescriptorStatus1[1].SamplingFunction;
- *(sensor_Descriptor+6) = Appli_Sensor_DescriptorStatus1[1].MeasurementPeriod;
- *(sensor_Descriptor+7) = Appli_Sensor_DescriptorStatus1[1].UpdateInterval;
- *pLength =8;
- }
- else if(prop_ID == TIME_OF_FLIGHT_PID)
- {
- tolerance = Appli_Sensor_DescriptorStatus1[2].NegativeTolerance;
- tolerance = (tolerance << 12 ) | Appli_Sensor_DescriptorStatus1[2].PositiveTolerance ;
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X, dst peer %X\r\n",
+ prop_ID, elementIndex, peerAddr, dstPeer);
+ }
+}
- *(sensor_Descriptor) = Appli_Sensor_DescriptorStatus1[2].Prop_ID;
- *(sensor_Descriptor+1) = Appli_Sensor_DescriptorStatus1[2].Prop_ID >> 8;
- *(sensor_Descriptor+2) = tolerance;
- *(sensor_Descriptor+3) = tolerance >> 8;
- *(sensor_Descriptor+4) = tolerance >> 16;
- *(sensor_Descriptor+5) = Appli_Sensor_DescriptorStatus1[2].SamplingFunction;
- *(sensor_Descriptor+6) = Appli_Sensor_DescriptorStatus1[2].MeasurementPeriod;
- *(sensor_Descriptor+7) = Appli_Sensor_DescriptorStatus1[2].UpdateInterval;
- *pLength =8;
- }
+/**
+ * @brief Callback corresponding to Sensor_Get_cb
+ * @param Get parameters
+* @retval None
+*/
+void Appli_Sensor_Get(MOBLEUINT16 prop_ID,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ if(length == 0)
+ {
+ TRACE_M(TF_SENSOR, "Sensor Data for all sensors on element index %X peer addr %X dst peer %X\r\n",
+ elementIndex, peerAddr, dstPeer);
}
- else
+ else
{
- if(length ==0 )
- {
- 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;
- }
- else if(prop_ID != 0x0000)
- {
- *(sensor_Descriptor) = prop_ID >> 8;
- *(sensor_Descriptor+1) = prop_ID;
- *pLength = 2;
- }
- else
- {
-
- }
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X \r\n",
+ prop_ID, elementIndex, peerAddr, dstPeer);
}
+}
+
- // }
- //else if(result == MOBLE_RESULT_FALSE && length >0)
- //{
- // *(sensor_Descriptor) = prop_ID >> 8;
- // *(sensor_Descriptor+1) = prop_ID;
- // *pLength = 2;
- //}
- //else
- //{
- //
- //}
- return MOBLE_RESULT_SUCCESS;
+/**
+ * @brief Callback corresponding to Sensor_ColumnGet_cb
+ * @param Column parameters
+* @retval None
+*/
+void Appli_Sensor_ColumnGet(sensor_ColumnCbParams_t* pColumnParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pColumnParam->propertyId, elementIndex, peerAddr, dstPeer);
}
-MOBLE_RESULT Appli_Sensor_Column_Status(MOBLEUINT8* sensor_Column , MOBLEUINT32* pLength,MOBLEUINT16 prop_ID , MOBLEUINT32 length)
+/**
+ * @brief Callback corresponding to Sensor_SeriesGet_cb
+ * @param Series parameters
+* @retval None
+*/
+void Appli_Sensor_SeriesGet(sensor_SeriesCbParams_t* pSeriesParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
+ TRACE_M(TF_SENSOR, "Property ID %X Raw Value X1 %d Raw Value X2 %d\r\n",
+ pSeriesParam->propertyId,
+ pSeriesParam->rawValueX1,
+ pSeriesParam->rawValueX2);
+}
+
+
+/**
+ * @brief Callback corresponding to Sensor_ReadDescriptor_cb
+ * Update SENSORX descriptor identified by sensorOffset
+ * Read from application to optimize RAM
+ * @param Sensor offset in sensor init structure
+ * @param descriptor parameters
+ * @retval Fail if sensor doesn't exist or property ID mismatch occurrs
+ * else Success
+ */
+MOBLE_RESULT Appli_Sensor_ReadDescriptor(MOBLEUINT8 sensorOffset,
+ sensor_DescriptorCbParams_t* pDescriptorParams)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ const sensor_init_params_t* pSensorInitParams = NULL;
- Sensor_Column_param_t Appli_Sensor_ColumnStatus[]=
- {
- {PRESSURE_PID,0xD9AF,0xDE03,0x0405},
- {TEMPERATURE_PID,0xacd2,0x3456,0x6537},
- {TIME_OF_FLIGHT_PID,0x8248,0xDE03,0x0405}
- };
-
- MOBLEUINT8 flag = 0;
-
- for(int i=0;i< NUMBER_OF_SENSOR ;i++)
+ if (sensorOffset < SensorServerInitParams.sensorsCount)
{
- if(prop_ID == Appli_Sensor_ColumnStatus[i].Property_ID)
+ pSensorInitParams = &(SensorServerInitParams.sensorInitParams[sensorOffset]);
+
+ if (pSensorInitParams->propertyId != pDescriptorParams->propertyId)
{
- flag = 1;
- *sensor_Column= Appli_Sensor_ColumnStatus[i].Property_ID;
- *(sensor_Column+1) = Appli_Sensor_ColumnStatus[i].Property_ID>>8;
-
- *(sensor_Column+2)=Appli_Sensor_ColumnStatus[i].RawValueX;
- *(sensor_Column+3)=Appli_Sensor_ColumnStatus[i].RawValueX;
-
-
- *(sensor_Column+4)=Appli_Sensor_ColumnStatus[i].RawValueWidth;
- *(sensor_Column+5)=Appli_Sensor_ColumnStatus[i].RawValueWidth;
-
- *(sensor_Column+6)=Appli_Sensor_ColumnStatus[i].RawValueY;
- *(sensor_Column+7)=Appli_Sensor_ColumnStatus[i].RawValueY;
- *pLength = 8;
- break;
+ result = MOBLE_RESULT_FAIL;
+ }
+ else
+ {
+ /* */
}
}
-
- if(flag == 0)
+ else
{
- *pLength =4;
+ result = MOBLE_RESULT_FAIL;
}
- return MOBLE_RESULT_SUCCESS;
+ if (pSensorInitParams != NULL &&
+ pDescriptorParams != NULL)
+ {
+ pDescriptorParams->positiveTolerance = pSensorInitParams->positiveTolerance;
+ pDescriptorParams->negativeTolerance = pSensorInitParams->negativeTolerance;
+ pDescriptorParams->samplingFunction = pSensorInitParams->samplingFunction;
+ pDescriptorParams->measurementPeriod = pSensorInitParams->measurementPeriod;
+ pDescriptorParams->updateInterval = pSensorInitParams->updateInterval;
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ return result;
}
-MOBLE_RESULT Appli_Sensor_Series_Status(MOBLEUINT8* sensor_Series , MOBLEUINT32* pLength,MOBLEUINT16 prop_ID , MOBLEUINT32 length)
+/**
+ * @brief Callback corresponding to Sensor_ReadValue_cb
+ * Read sensor value and update buffer
+ * data length <= 128
+ * PreviousTemperatureValue, PresentTemperatureValue to be updated
+ * everytime sensor value is changed and call to Sensor_UpdateCadence
+ * @param Sensor offset in sensor init structure
+ * @param Value parameters
+ * @retval Fail if sensor doesn't exist
+ * else Success
+ */
+MOBLE_RESULT Appli_Sensor_ReadValue(MOBLEUINT8 sensorOffset,
+ sensor_ValueCbParams_t* pValueParams)
{
- Sensor_Series_param_t Appli_Sensor_SeriesStatus[NUMBER_OF_SENSOR]=
- {
- {PRESSURE_PID,{{0xabcd,0x73ac,0xcdef},{0xacd2,0x2345,0x1234}}},
- {TEMPERATURE_PID,{{0x00C1,0x0071,0x00DE},{0x0003,0x0004,0x0005}}},
- {TIME_OF_FLIGHT_PID,{{0x4528,0xbad3,0xdc12},{0xacd2,0x2345,0x1234}}}
- };
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+// PRESSURE_StatusTypeDef tempStatus = PRESSURE_OK;
+ MOBLEINT16 temp = 0;
+ MOBLEINT8 temperature8 = 0;
+ float pressure = 0;
- for(int i=0;i<NUMBER_OF_SENSOR;i++)
+ /* sensor offset exist */
+ if (sensorOffset < SensorServerInitParams.sensorsCount)
{
- if( prop_ID == Appli_Sensor_SeriesStatus[i].Property_ID )
+ if (sensorOffset == 0) /* Present Ambient Temperature */
{
+ if(AppliSensorReadFromSensor == 0) /* Normal mode */
+ {
+ /* Temperature, Temperature8 format, M=1, d=0, b=-1 */
+// tempStatus = LPS25HB_I2C_ReadRawTemperature(&temp);
+// if (tempStatus == PRESSURE_OK)
+ {
+ TRACE_M(TF_SENSOR, "Temperature sensor raw value %d\r\n" , temp);
+
+ /* Convert temperature raw value to Temperature8 format */
+ temp = (temp/240) + 85;
+
+ if (temp < -64*2)
+ {
+ temp = -64*2;
+ }
+ else if (temp > 63.5*2)
+ {
+ temp = 63.5*2;
+ }
+
+ temperature8 = temp;
+
+ pValueParams->data[0] = (MOBLEUINT8)temperature8;
+
+ if (pValueParams->data[0] == 0xFF)
+ {
+ /* 0xFF is unknown but here it is -1
+ -1 is approximated to 0 */
+ pValueParams->data[0] = 0x00;
+ }
+
+ TRACE_M(TF_SENSOR, "Temperature8 raw value %d, actual value %f\r\n",
+ temperature8, (float)temperature8/2);
+ }
+#if 0
+ else /* error */
+ {
+ pValueParams->data[0] = 0xFF;
+ }
+#endif
+ }
+ else /* Value not to be read from sensor */
+ {
+ pValueParams->data[0] = PresentTemperatureValue;
+ }
+ }
+ else if (sensorOffset == 1) /* Pressure */
+ {
+// tempStatus = LPS25HB_GetPressure(&pressure);
+// if (tempStatus == PRESSURE_OK)
+ {
+ TRACE_M(TF_SENSOR, "Pressure sensor value %f mbar\r\n" , pressure);
- *sensor_Series= Appli_Sensor_SeriesStatus[i].Property_ID;
- *(sensor_Series+1) = Appli_Sensor_SeriesStatus[i].Property_ID>>8;
- for(int y=0 ;y < SENSOR_SERIES_VALUE ;y++)
+ memcpy(pValueParams->data, (void*)&pressure, 4);
+ }
+#if 0
+ else /* error */
{
- *(sensor_Series+2+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawValueX>>8;
- *(sensor_Series+3+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawValueX;
- *(sensor_Series+4+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawColumnWidth>>8;
- *(sensor_Series+5+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawColumnWidth;
- *(sensor_Series+6+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawValueY>>8;
- *(sensor_Series+7+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawValueY;
+ memset(pValueParams->data, 0, 4);
}
- *pLength = 2 + 6*SENSOR_SERIES_VALUE ;
- break;
+#endif
}
}
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
-return MOBLE_RESULT_SUCCESS ;
-
+ return result;
}
-
+
#endif
+
/**
-* @brief Sensor Process Function will continuously monitor the sensors.
-* Function used for the Publishing, data monitoring..
-* @param void
-* @retval void
+ * @brief Callback corresponding to Appli_Sensor_Cadence_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
*/
-void Sensor_Process(void)
+void Appli_Sensor_Cadence_Status(const MOBLEUINT8 *pCadence,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
+ MOBLEUINT8 i;
-#ifdef ENABLE_SENSOR_PUBLICATION
- float sensorValue[NUMBER_OF_SENSOR];
- if(ProvisionFlag == 1)
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Cadence_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_CADENCE_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
{
- Read_Sensor_Data(&sensorValue[0]);
- Sensor_Publication_Process(&sensorValue[0], &Property_ID_Table[0]);
+ TRACE_M(TF_SERIAL_CTRL,"Cadence value: %d\n\r", pCadence[i]);
}
-#endif
+}
+
+
+/**
+ * @brief Callback corresponding to Appli_Sensor_Settings_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
+*/
+void Appli_Sensor_Settings_Status(const MOBLEUINT8 *pSettings,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Settings_Status callback received \r\n");
- /* 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)
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_SETTINGS_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
{
- 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;
- }
- }
+ TRACE_M(TF_SERIAL_CTRL,"Settings value: %d\n\r", pSettings[i]);
+ }
}
-
+
+
/**
-* @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)
+ * @brief Callback corresponding to Appli_Sensor_Setting_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
+*/
+void Appli_Sensor_Setting_Status(const MOBLEUINT8 *pSetting,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
- MOBLEUINT8 occupancyData = 0x1;
- MOBLEUINT8 sensor_Data[5];
- MOBLE_ADDRESS srcAdd;
- MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 i;
- sensor_Data[1] = (MOBLEUINT8)(PRESENCE_DETECTED_PROPERTY << 8);
- sensor_Data[0] = (MOBLEUINT8)PRESENCE_DETECTED_PROPERTY;
- sensor_Data[2] = occupancyData;
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Setting_Status callback received \r\n");
- srcAdd = BLEMesh_GetAddress();
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_SETTING_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
+ {
+ TRACE_M(TF_SERIAL_CTRL,"Setting value: %d\n\r", pSetting[i]);
+ }
+}
+
+
+/**
+ * @brief Callback corresponding to Appli_Sensor_Descriptor_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
+*/
+void Appli_Sensor_Descriptor_Status(const MOBLEUINT8 *pDescriptor,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
- result = BLEMesh_SetRemotePublication(SENSOR_SERVER_MODEL_ID, srcAdd ,
- SENSOR_STATUS ,
- sensor_Data,3,
- MOBLE_FALSE, MOBLE_FALSE);
-
- if(result)
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Descriptor_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_DESCRIPTOR_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
{
- TRACE_M(TF_LIGHT_LC,"Publication Error \r\n");
+ TRACE_M(TF_SERIAL_CTRL,"Descriptor value: %d\n\r", pDescriptor[i]);
}
-
}
-
-#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
+ * @brief Callback corresponding to Appli_Sensor_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
*/
-void Read_Sensor_Data(float *pSensorValue)
+void Appli_Sensor_Status(const MOBLEUINT8 *pStatus,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#if 0
- float temp,press;
- LPS25HB_GetTemperature(&temp);
- pSensorValue[0] = temp;
- LPS25HB_GetPressure(&press);
- pSensorValue[1] = press;
-#endif
+ MOBLEUINT8 i;
+
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
+ {
+ TRACE_M(TF_SERIAL_CTRL,"Status value: %d\n\r", pStatus[i]);
+ }
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+ Appli_Light_LC_SensorPropertyUpdate(elementIndex,
+ PRESENCE_DETECTED_PID,
+ (MOBLEUINT32) pStatus[length-1]);
+#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)
+ * @brief Callback corresponding to Appli_Sensor_Column_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
+*/
+void Appli_Sensor_Column_Status(const MOBLEUINT8 *pColumn,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
- 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};
+ MOBLEUINT8 i;
- floatToInt(pSensorData[sensor_Count], &out_value, 2);
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Column_Status callback received \r\n");
- /* Taking the timestamp for the cadence publication and making flag high */
- if(PublishingDataFlag[sensor_Count].CadenceDurationFlag == MOBLE_FALSE)
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_COLUMN_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
{
- cadenceDurationTick[sensor_Count] = Clock_Time();
- PublishingDataFlag[sensor_Count].CadenceDurationFlag = MOBLE_TRUE;
+ TRACE_M(TF_SERIAL_CTRL,"Column Status value: %d\n\r", pColumn[i]);
}
- /* 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))
+}
+
+
+/**
+ * @brief Callback corresponding to Appli_Sensor_Series_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
+*/
+void Appli_Sensor_Series_Status(const MOBLEUINT8 *pSeries,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Series_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_SERIES_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
{
- 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++;
- }
+ TRACE_M(TF_SERIAL_CTRL,"Series Status value: %d\n\r", pSeries[i]);
}
- else
+}
+
+
+/**
+ * @brief Callback corresponding to Sensor_ReadColumn_cb
+ * Fill column width and raw valye Y in data buffer
+ * data length <= 8
+ * @param Sensor offset in sensor init structure
+ * @param Series column parameters
+ * @retval Fail if sensor doesn't exist
+ * else Success
+*/
+MOBLE_RESULT Appli_Sensor_ReadColumn(MOBLEUINT8 sensorOffset,
+ MOBLEUINT8 columnOffset,
+ sensor_ColumnCbParams_t* pColumnParams)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ const sensor_init_params_t* pSensorInitParams = NULL;
+ MOBLEUINT8 dataLength = 0;
+ MOBLEUINT8* data = pColumnParams->data;
+
+ if (sensorOffset < SensorServerInitParams.sensorsCount)
{
- publishTime = SENSOR_PUBLISH_PERIOD ;
+ pSensorInitParams = &(SensorServerInitParams.sensorInitParams[sensorOffset]);
- 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)
+ /* fill sensor column data */
+ memcpy(data+dataLength,
+ &(pSensorInitParams->seriesColumn[columnOffset].columnWidth),
+ pSensorInitParams->dataLength);
+ dataLength = pSensorInitParams->dataLength;
+
+ memset(data+dataLength, 0xAA, pSensorInitParams->dataLength);
+ dataLength += pSensorInitParams->dataLength;
+
+ pColumnParams->dataLength = dataLength;
+ }
+ else
{
- sensor_Count = 0;
+ result = MOBLE_RESULT_FAIL;
}
-
+
+ return result;
}
+
/**
-* @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)
+ * @brief Callback corresponding to Sensor_ReadSeries_cb
+ * Fill sensor series state for all columns between and including X1 and X2
+ * Series data to be concatenated in triplet of raw value X, column width and raw value Y
+ * X[n] CW[n] Y[n] X[n+1] CW[n+1] Y[n+1] ...
+ * data length should be less than minimum of 379 or max application packet length supported
+ * @param Sensor offset in sensor init structure
+ * @param Series parameters
+ * @retval Fail if sensor doesn't exist
+ * else Success
+ */
+MOBLE_RESULT Appli_Sensor_ReadSeries(MOBLEUINT8 sensorOffset,
+ sensor_SeriesCbParams_t* pSeriesParams)
{
- MOBLEUINT32 length;
- MOBLEUINT8 sensor_Data[8];
- MOBLE_ADDRESS srcAdd;
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ const sensor_init_params_t* pSensorInitParams = NULL;
+ MOBLEUINT16 dataLength = 0;
+ MOBLEUINT8* data = pSeriesParams->data;
- srcAdd = BLEMesh_GetAddress();
-
- switch(*pProp_ID)
+ if (sensorOffset < SensorServerInitParams.sensorsCount)
{
- 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:
+ pSensorInitParams = &(SensorServerInitParams.sensorInitParams[sensorOffset]);
+
+ for (MOBLEUINT8 count=0; count<pSensorInitParams->seriesCount; count++)
+ {
+ /* fill sensor series data */
+ if (pSensorInitParams->seriesColumn[count].rawX >= pSeriesParams->rawValueX1 &&
+ pSensorInitParams->seriesColumn[count].rawX <= pSeriesParams->rawValueX2)
{
- /* 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(data+dataLength,
+ &(pSensorInitParams->seriesColumn[count].rawX),
+ pSensorInitParams->dataLength);
+ dataLength += pSensorInitParams->dataLength;
+ memcpy(data+dataLength,
+ &(pSensorInitParams->seriesColumn[count].columnWidth),
+ pSensorInitParams->dataLength);
+ dataLength += pSensorInitParams->dataLength;
+ memset(data+dataLength, 0xAA, pSensorInitParams->dataLength);
+ dataLength += pSensorInitParams->dataLength;
- memcpy(&sensor_Data[3],(void*)&pSensor_Value[0],4);
- length =7;
- break;
+ pSeriesParams->dataLength = dataLength;
}
- case TIME_OF_FLIGHT_PID:
+ else
{
- sensor_Data[0] = ((0x03 <<1) | 0x01);
- sensor_Data[1] = (MOBLEUINT8)TIME_OF_FLIGHT_PID ;
- sensor_Data[2] = (MOBLEUINT8)(TIME_OF_FLIGHT_PID >> 8);
-
- memcpy(&sensor_Data[3],(void*)&pSensor_Value[0],4);
- length =7;
- break;
+ /* */
}
- default:
- break;
+ }
}
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ return result;
+}
- result = BLEMesh_SetRemotePublication(SENSOR_SERVER_MODEL_ID, srcAdd,
- SENSOR_STATUS ,
- sensor_Data,length,
- MOBLE_FALSE, MOBLE_FALSE);
- if(result)
+/**
+ * @brief Callback corresponding to Sensor_IsFastCadence_cb
+ * To check if fast cadence to be used for current sensor state
+ * @param Sensor offset in sensor init structure
+ * @param Fast Cadence Low
+ * @param Fast Cadence High
+ * @retval Trigger status
+ */
+MOBLEUINT8 Appli_Sensor_IsFastCadence(MOBLEUINT8 sensorOffset,
+ void* pFastCadenceLow,
+ void* pFastCadenceHigh)
+{
+ MOBLEUINT8 fastCadenceStatus = 0;
+ MOBLEUINT32 fastCadenceLow = *((MOBLEUINT32*)pFastCadenceLow);
+ MOBLEUINT32 fastCadenceHigh = *((MOBLEUINT32*)pFastCadenceHigh);
+ MOBLEUINT32 sensorValue = PresentTemperatureValue;
+
+ if (sensorOffset == 0)
+ {
+ if (fastCadenceLow <= fastCadenceHigh)
+ {
+ fastCadenceStatus = sensorValue >= fastCadenceLow &&
+ sensorValue <= fastCadenceHigh;
+ }
+ else
+ {
+ fastCadenceStatus = sensorValue > fastCadenceLow ||
+ sensorValue < fastCadenceHigh;
+ }
+}
+ else
{
- TRACE_M(TF_SENSOR,"Publication Error \r\n");
+ /* Implmented only for sensor at offset 0 */
}
+ return fastCadenceStatus;
}
-#endif
-#ifdef ENABLE_SENSOR_MODEL_SERVER
-#if 0
/**
-* @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
+ * @brief Callback corresponding to Sensor_IsStatusTrigger_cb
+ * To check if sensor change in sensor state (delta) is more than
+ * given trigger state value
+ * delta up values
+ * @param Sensor offset in sensor init structure
+ * @param Trigger type -> value or percent change
+ * @param Status trigger delta down
+ * @param Status trigger delta up
+ * @retval Trigger status
*/
-/*
-MOBLE_RESULT Appli_Sensor_GetSettingStatus(MOBLEUINT8* pSetting_Status)
+MOBLEUINT8 Appli_Sensor_IsStatusTrigger(MOBLEUINT8 sensorOffset,
+ status_trigger_type_e triggerType,
+ void* pDeltaDown,
+ void* pDeltaUp)
{
+ const sensor_init_params_t* pSensorInitParams = NULL;
+ MOBLEUINT8 triggerStatus = 0;
+ MOBLEUINT32 deltaDown = *((MOBLEUINT32*)pDeltaDown);
+ MOBLEUINT32 deltaUp = *((MOBLEUINT32*)pDeltaUp);
+ status_trigger_delta_e statusTriggerDelta;
+ MOBLEUINT32 delta;
- *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;
-}*/
-#endif
+ if (sensorOffset == 0)
+ {
+ if (PresentTemperatureValue < PreviousTemperatureValue)
+ {
+ /* status trigger delta down */
+ statusTriggerDelta = STATUS_TRIGGER_DELTA_DOWN;
+ delta = PreviousTemperatureValue - PresentTemperatureValue;
-/**
-* @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
-*/
+ TRACE_M(TF_SENSOR, "Delta down value %ld\r\n", delta);
+ }
+ else
+ {
+ /* status trigger delta up */
+ statusTriggerDelta = STATUS_TRIGGER_DELTA_UP;
+ delta = PresentTemperatureValue - PreviousTemperatureValue;
-MOBLE_RESULT Appli_Sensor_GetSetting_IDStatus(MOBLEUINT8* pSetting_Status , MOBLEUINT16 prop_ID)
-{
- for(int i=0 ;i<NUMBER_OF_SENSOR;i++)
- {
- if(prop_ID == Appli_Sensor_SettingSet[i].Property_ID)
+ TRACE_M(TF_SENSOR, "Delta up value %ld\r\n", delta);
+ }
+
+ if (triggerType == STATUS_TRIGGER_TYPE_PC)
{
- *pSetting_Status = Appli_Sensor_SettingSet[i].Property_ID;
- *(pSetting_Status+1) = Appli_Sensor_SettingSet[i].Property_ID >> 8;
- *(pSetting_Status+2) = Appli_Sensor_SettingSet[i].Sensor_Setting_ID;
- *(pSetting_Status+3) = Appli_Sensor_SettingSet[i].Sensor_Setting_ID >> 8;
- *(pSetting_Status+4) = Appli_Sensor_SettingSet[i].Sensor_Setting_Access;
-
- if(Appli_Sensor_SettingSet[i].Sensor_Setting_Access == 0x03)
+ pSensorInitParams = &(SensorServerInitParams.sensorInitParams[sensorOffset]);
+
+ if (pSensorInitParams->valuesRange != 0)
{
- *(pSetting_Status+5) = Appli_Sensor_SettingSet[i].Sensor_Setting_Value;
- *(pSetting_Status+6) = Appli_Sensor_SettingSet[i].Sensor_Setting_Value >> 8;
+ /* change delta to percentage change (of 0.01 % steps) */
+ delta = (MOBLEUINT32)((delta*10000)/pSensorInitParams->valuesRange);
}
else
{
-
+ triggerStatus = 0;
}
}
- }
- return MOBLE_RESULT_SUCCESS;
+ if ((statusTriggerDelta == STATUS_TRIGGER_DELTA_DOWN && delta >= deltaDown) ||
+ (statusTriggerDelta == STATUS_TRIGGER_DELTA_UP && delta >= deltaUp))
+ {
+ triggerStatus = 1;
+ }
+ else
+ {
+ triggerStatus = 0;
+ }
+ }
+
+ return triggerStatus;
}
+
+
+/**
+* @brief Initialize hardware interfaces for sensors and mesh sensor model structures
+* Sensor init parameters to be defined in sensor_cfg_usr.h
+* Sensors are initialized in the order as defined in sensor_cfg_usr.h
+ * LPS25HB supports pressure and temperature sensor
+* @param void
+ * @retval
+ */
+MOBLE_RESULT Appli_Sensor_Init(void)
+ {
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+// PRESSURE_StatusTypeDef lps25Status;
+
+ /* Hardware interface initialization */
+#ifndef CUSTOM_BOARD_PWM_SELECTION
+// PRESSURE_StatusTypeDef tempStatus;
+// PRESSURE_StatusTypeDef pressStatus;
+// int16_t temperature;
+// int32_t pressure;
+
+#if 0
+ /* Initiallization of sensors */
+ lps25Status = LPS25HB_Init((PRESSURE_InitTypeDef*)(&Lps25InitParams));
+
+ if (lps25Status != PRESSURE_OK)
+ {
+ TRACE_M(TF_SENSOR, "Error initializing LPS25HB. status (%d)\r\n", lps25Status);
+ }
+
+ tempStatus = LPS25HB_I2C_ReadRawTemperature(&temperature);
+ pressStatus = LPS25HB_I2C_ReadRawPressure(&pressure);
+ if (tempStatus == PRESSURE_OK &&
+ pressStatus == PRESSURE_OK)
+ {
+ /* TRACE_M(TF_SENSOR, "Raw temperature (%d) and raw pressure (%d)\r\n",
+ temperature, pressure); */
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR, "Error reading LPS25HB at init\r\n");
+ }
+#endif
+
+#else
+ TRACE_M(TF_SENSOR, "LPS25HB not initialized\r\n");
#endif
+ /* initialize sensor server model */
+ result = SensorServer_Init(&BufferSensorServer,
+ &AppliSensor_cb,
+ TOTAL_SENSOR_SERVER_BUFF_SIZE,
+ &SensorServerInitParams);
+
+ if(MOBLE_FAILED(result))
+ {
+ TRACE_M(TF_SENSOR, "Sensor Server init failed\r\n");
+ }
+
+ return result;
+ }
+
+
/**
-* @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)
+ * @brief Handling of serial inputs to sensor model
+ * @param Sensor offset in sensor init structure
+ * @param Sensor value
+ * @retval void
+ */
+MOBLE_RESULT Appli_Sensor_Update(MOBLEUINT8 sensorOffset, MOBLEUINT32 value)
{
- MOBLE_RESULT result = MOBLE_RESULT_FALSE;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ AppliSensorReadFromSensor = 1;
+
+ /* Update previous with current and current with new */
+ PreviousTemperatureValue = PresentTemperatureValue;
+ PresentTemperatureValue = (MOBLEUINT8)value;
- for(MOBLEUINT8 i=0; i<NUMBER_OF_SENSOR; i++)
+ /* To update cadence parameters
+ results in either status trigger or (and) fast cadence based on change and present
+ Application may decide not to update cadence parameters if senosr value is changing
+ very frequently in some cases to save bandwidth */
+ if (PresentTemperatureValue != PreviousTemperatureValue)
{
- if(prop_ID_Table[i].Property_ID == prop_ID)
- {
- result = MOBLE_RESULT_SUCCESS;
- break;
- }
- }
+ result = Sensor_UpdateCadence(sensorOffset,
+ SensorServerInitParams.sensorInitParams[0].elementIdx,
+ SensorServerInitParams.sensorInitParams[0].propertyId);
+ }
return result;
-}
+ }
+
/**
-* @brief Appli_Sensor_Init: This function is callback for Initialisation of
-* Application interface
-* @param void
-* @retval MOBLE_RESULT
-*/
-MOBLE_RESULT Appli_Sensor_Init(void)
+ * @brief Handling of serial inputs to sensor model
+ * Appli_Sensor_SerialCmd can be used for testing periodic publishing and
+ * triggered publishing with PTS
+ * @param serial string
+ * @param serial string size
+ * @retval void
+ */
+void Appli_Sensor_SerialCmd(char *rcvdStringBuff, uint16_t rcvdStringSize)
{
-#if 0
- LPS25HB_Init(&InitStructure);
-#endif
- return MOBLE_RESULT_SUCCESS;
+ MOBLE_RESULT result = MOBLE_RESULT_INVALIDARG;
+ MOBLEUINT16 value = 0;
+ MOBLEUINT8 sensorOffset = 0;
+
+ if (!strncmp(rcvdStringBuff+6, "SETV", 4))
+ {
+ if (rcvdStringSize == 15)
+ {
+ sscanf(rcvdStringBuff+11, "%4hx", &value);
+
+ /* Set SENSOR1 value at offset 0 */
+ result = Appli_Sensor_Update(sensorOffset, value);
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ BLEMesh_PrintStringCb("Invalid size of string\r\n");
+ }
+ }
+ else if (!strncmp(rcvdStringBuff+6, "PUBLISH", 7))
+ {
+ if (rcvdStringSize == 17)
+ {
+ sscanf(rcvdStringBuff+14, "%1hx", &value);
+
+ sensorOffset = value;
+
+ sscanf(rcvdStringBuff+16, "%1hx", &value);
+
+ /* Enable / Disable publishing of sensor as identified by sensor offset */
+ if(value == 0) /* Disable */
+ {
+ result = Sensor_UpdatePublishState(sensorOffset, 0);
+ }
+ else /* Enable */
+ {
+ result = Sensor_UpdatePublishState(sensorOffset, 1);
+ }
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ BLEMesh_PrintStringCb("Invalid size of string\r\n");
+ }
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ /* Check the result of command processing */
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ BLEMesh_PrintStringCb("Success\r\n");
+ }
+ else if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ BLEMesh_PrintStringCb("Fail Out of memory\r\n");
+ }
+ else if(result == MOBLE_RESULT_INVALIDARG)
+ {
+ BLEMesh_PrintStringCb("Fail Invalid Argument\r\n");
+ }
+ else
+ {
+ BLEMesh_PrintStringCb("Fail\r\n");
+ }
}
@@ -898,5 +1027,5 @@ MOBLE_RESULT Appli_Sensor_Init(void)
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensor.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensor.h
index 18f060d82..613d14df5 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensor.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensor.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
@@ -23,118 +23,118 @@
/* 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;
- MOBLEUINT8 FastCadenceLow;
- MOBLEUINT8 FastCadenceHigh;
- // float FastCadenceLow;
-// float FastCadenceHigh;
-}Sensor_CadenceSet_t;
-
-typedef struct
-{
- MOBLEUINT16 Property_ID;
- MOBLEUINT16 RawValueX;
- MOBLEUINT16 RawValueWidth;
- MOBLEUINT16 RawValueY;
-}Sensor_Column_param_t;
-
-/* Sensor Series */
-struct Sensor_SeriesData
-{
- MOBLEUINT16 RawValueX;
- MOBLEUINT16 RawColumnWidth;
- MOBLEUINT16 RawValueY;
-};
-
-typedef struct
-{
- MOBLEUINT16 Property_ID;
- struct Sensor_SeriesData SeriesData[SENSOR_SERIES_VALUE];
-}Sensor_Series_param_t ;
-
-#pragma pack(4)
-
-MOBLE_RESULT Appli_Sensor_Cadence_Set(Sensor_CadenceParam_t* pCadence_param,
- MOBLEUINT16 property_ID,
- MOBLEUINT32 length);
-MOBLE_RESULT Appli_Sensor_Cadence_Get(MOBLEUINT8* sensor_DataCadence,
- 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,
- MOBLEUINT16 prop_ID,
- MOBLEUINT32 length);
-MOBLE_RESULT Appli_Sensor_Setting_Set(Sensor_SettingParam_t* pSensor_SettingParam,
- MOBLEUINT8 OptionalValid,
- MOBLEUINT16 prop_ID);
-MOBLE_RESULT Appli_Sensor_Series_Status(MOBLEUINT8* sensor_Series,
- MOBLEUINT32* pLength,
- MOBLEUINT16 prop_ID,
- MOBLEUINT32 length);
-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,
- MOBLEUINT16 prop_ID);
+#include "sensors.h"
+#include "mesh_cfg.h"
+
+/* Exported functions ------------------------------------------------------- */
+void Appli_Sensor_CadenceGet(sensor_CadenceCbParam_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_CadenceSet(sensor_CadenceCbParam_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_CadenceSetUnack(sensor_CadenceCbParam_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_SettingsGet(sensor_SettingsCbParams_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_SettingGet(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_SettingSet(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_SettingSetUnack(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_DescriptorGet(MOBLEUINT8 pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Get (MOBLEUINT16 prop_ID,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_ColumnGet(sensor_ColumnCbParams_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_SeriesGet(sensor_SeriesCbParams_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Sensor_ReadDescriptor(MOBLEUINT8 sensorOffset,
+ sensor_DescriptorCbParams_t* pDescriptorParams);
+MOBLE_RESULT Appli_Sensor_ReadValue(MOBLEUINT8 sensorOffset,
+ sensor_ValueCbParams_t* pValueParams);
+MOBLE_RESULT Appli_Sensor_ReadColumn(MOBLEUINT8 sensorOffset,
+ MOBLEUINT8 columnOffset,
+ sensor_ColumnCbParams_t* pColumnParams);
+MOBLE_RESULT Appli_Sensor_ReadSeries(MOBLEUINT8 sensorOffset,
+ sensor_SeriesCbParams_t* pSeriesParams);
+MOBLEUINT8 Appli_Sensor_IsFastCadence(MOBLEUINT8 sensorOffset,
+ void* pFastCadenceLow,
+ void* pFastCadenceHigh);
+MOBLEUINT8 Appli_Sensor_IsStatusTrigger(MOBLEUINT8 sensorOffset,
+ status_trigger_type_e triggerType,
+ void* pDeltaDown,
+ void* pDeltaUp);
MOBLE_RESULT Appli_Sensor_Init(void);
-void Sensor_Process(void);
-void Sensor_LC_Light_Publish(void);
-
+//void Appli_Sensor_SerialCmd(char *rcvdStringBuff, uint16_t rcvdStringSize);
+MOBLE_RESULT Appli_Sensor_Update(MOBLEUINT8 sensorOffset, MOBLEUINT32 value);
+
+void Appli_Sensor_Descriptor_Status(const MOBLEUINT8 *pDescriptor,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Cadence_Status(const MOBLEUINT8 *pCadence,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Settings_Status(const MOBLEUINT8 *pSettings,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Setting_Status(const MOBLEUINT8 *pSetting,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Status(const MOBLEUINT8 *pStatus,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Column_Status(const MOBLEUINT8 *pColumn,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Series_Status(const MOBLEUINT8 *pSeries,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Sensor_Update(MOBLEUINT8 sensorOffset,
+ MOBLEUINT32 value);
+void Appli_Sensor_SerialCmd(char *rcvdStringBuff,
+ uint16_t rcvdStringSize);
#endif /* __APPLI_SENSOR_H */
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensors_client.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensors_client.c
new file mode 100644
index 000000000..aecf584d4
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensors_client.c
@@ -0,0 +1,153 @@
+/**
+******************************************************************************
+* @file appli_sensors_client.c
+* @author BLE Mesh Team
+* @brief Application interface for Generic Mesh Models
+******************************************************************************
+* @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 "hal_common.h"
+#include "types.h"
+#include "appli_sensor.h"
+#include "appli_light.h"
+#include "common.h"
+#include "mesh_cfg_usr.h"
+#include "appli_nvm.h"
+#include "appli_mesh.h"
+#include "sensors_client.h"
+#include "appli_sensors_client.h"
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+
+
+/* Private functions ---------------------------------------------------------*/
+/**
+* @brief Appli_SensorsClient_API: This function is a Wrapper to call Sensors Client API depending on opcode received in input
+* @param elementIndex: Index of the element
+* @param msg_opcode: opcode of the desired API
+* @param msg_params: buffer containing the desired API parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_SensorsClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8 *msg_params)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+ switch(msg_opcode){
+/******************************************************************************/
+#ifdef ENABLE_SENSOR_MODEL_CLIENT
+/******************************************************************************/
+ case SENSOR_DESCRIPTOR_GET:
+ {
+ result = SensorsClient_Descriptor_Get(elementIndex, msg_params);
+ break;
+ }
+ case SENSOR_CADENCE_GET:
+ {
+ result = SensorsClient_Cadence_Get(elementIndex, msg_params);
+ break;
+ }
+ case SENSOR_CADENCE_SET:
+ {
+ //TODO: Set dynamic data size depending on Sensor DATA LENTGH: length = 4 + 4 + 2* SensorDataLength
+ result = SensorsClient_Cadence_Set(elementIndex,
+ msg_params,
+ 10); //(sizeof(sensor_CadenceCbParam_t)-3));
+ break;
+ }
+ case SENSOR_CADENCE_SET_UNACK:
+ {
+ //TODO: Set dynamic data size depending on Sensor DATA LENTGH: length = 4 + 4 + 2 * SensorDataLength
+ result = SensorsClient_Cadence_Set_Unack(elementIndex,
+ msg_params,
+ 10); //(sizeof(sensor_CadenceCbParam_t)-3));
+ break;
+ }
+ case SENSOR_SETTINGS_GET:
+ {
+ result = SensorsClient_Settings_Get(elementIndex, msg_params);
+ break;
+ }
+
+ case SENSOR_SETTING_GET:
+ {
+ result = SensorsClient_Setting_Get(elementIndex, msg_params, sizeof(sensor_SettingsCbParams_t));
+ break;
+ }
+ case SENSOR_SETTING_SET:
+ {
+ //TODO: Set dynamic data size depending on Sensor DATA LENTGH: length = 4 + SensorDataLength
+ result = SensorsClient_Setting_Set(elementIndex,
+ msg_params,
+ 6);
+ break;
+ }
+ case SENSOR_SETTING_SET_UNACK:
+ {
+ //TODO: Set dynamic data size depending on Sensor DATA LENTGH: length = 4 + SensorDataLength
+ result = SensorsClient_Setting_Set_Unack(elementIndex,
+ msg_params,
+ 6);
+ break;
+ }
+ case SENSOR_GET:
+ {
+ result = SensorsClient_Get(elementIndex, msg_params);
+ break;
+ }
+ case SENSOR_COLUMN_GET:
+ {
+ result = SensorsClient_Column_Get(elementIndex, msg_params, 4);
+ break;
+ }
+ case SENSOR_SERIES_GET:
+ {
+ result = SensorsClient_Series_Get(elementIndex, msg_params, 4);
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_SENSOR_MODEL_CLIENT */
+/******************************************************************************/
+
+
+ default:
+ {
+ TRACE_M(TF_SENSOR, "OpCode value invalid %d \r\n", msg_opcode);
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+ return result;
+}
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensors_client.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensors_client.h
new file mode 100644
index 000000000..431b5c691
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensors_client.h
@@ -0,0 +1,42 @@
+/**
+******************************************************************************
+* @file appli_sensor_client.h
+* @author BLE Mesh Team
+* @brief Application interface for Sensor Mesh Models
+******************************************************************************
+* @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 __APPLI_SENSOR_CLIENT_H
+#define __APPLI_SENSOR_CLIENT_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "sensors.h"
+#include "mesh_cfg.h"
+
+
+/* Exported macro ------------------------------------------------------------*/
+/* Exported variables ------------------------------------------------------- */
+/* Application Variable-------------------------------------------------------*/
+/* Exported Functions Prototypes ---------------------------------------------*/
+MOBLE_RESULT Appli_ConfigClient_Set(void);
+MOBLE_RESULT Appli_SensorsClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8 *msg_params);
+
+
+
+
+#endif /* __APPLI_SENSOR_CLIENT_H */
+
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_vendor.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_vendor.c
index 38004a61d..55a67d8a2 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_vendor.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_vendor.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
@@ -30,23 +30,34 @@
#include "mesh_cfg.h"
#include <string.h>
-
-/** @addtogroup MODEL_VENDOR
+/** @addtogroup ST_BLE_Mesh
* @{
*/
-/** @addtogroup Vendor_Model_Callbacks
+/** @addtogroup Application_Mesh_Models
* @{
*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
+typedef struct
+{
+ MOBLE_ADDRESS dst;
+ MOBLEUINT8 data[VENDOR_DATA_BUFFER_SIZE];
+ MOBLEUINT32 length;
+ MOBLEUINT8 elementIndex;
+} APPLI_SEND_BIG_DATA_PACKET;
+
/* Private variables ---------------------------------------------------------*/
-MOBLEUINT8 ResponseBuffer[VENDOR_DATA_BYTE];
+MOBLEUINT8 ResponseBuffer[VENDOR_DATA_BUFFER_SIZE];
MOBLEUINT16 BuffLength;
+APPLI_SEND_BIG_DATA_PACKET Appli_VendorBigData;
+
+/*Variable to enable OTA for received vendor command*/
extern MOBLEUINT8 Appli_LedState;
extern uint16_t DUTY;
+extern MOBLEUINT8 NumberOfElements;
MOBLEUINT32 TestHitCounter = 0;
extern Appli_LightPwmValue_t Appli_LightPwmValue;
@@ -268,18 +279,17 @@ MOBLE_RESULT Appli_Vendor_Test(MOBLEUINT8 const *data, MOBLEUINT32 length)
* @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
+* @param elementIndex : selected element where '0' is first element
* @retval MOBLE_RESULT status of result
*/
MOBLE_RESULT Appli_Vendor_LEDControl( MOBLEUINT8 const *data, MOBLEUINT32 length,
- MOBLEUINT8 elementNumber , MOBLE_ADDRESS dst_peer)
+ MOBLEUINT8 elementIndex , 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,"#03-%02hx!\n\r",data[0]);
switch(subCommand)
@@ -291,139 +301,102 @@ MOBLE_RESULT Appli_Vendor_LEDControl( MOBLEUINT8 const *data, MOBLEUINT32 length
*/
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 Need to write the commands as per the element selected*/
+
+ TRACE_M(TF_VENDOR,"Appli_LED_Control callback received for elementIndex %d \r\n", elementIndex);
+ Appli_LedState = *(data+1); /* Toggle the state of the Blue LED */
+ if( Appli_LedState == 1)
{
- /* user application code */
+ BSP_LED_On(LED_BLUE);
}
- else if(elementNumber == THIRD_ELEMENT)
+ else
{
- /* user application code */
- }
+ BSP_LED_Off(LED_BLUE);
+ }
break;
}
/* Toggle Command */
case APPLI_CMD_TOGGLE:
{
- if(elementNumber == FIRST_ELEMENT)
+ /*User Need to write the commands as per the element selected*/
+
+ TRACE_M(TF_VENDOR,"Appli_LED_Toggle callback received for elementIndex %d \r\n", elementIndex);
+ if(Appli_LedState == 1)
{
- if(Appli_LedState == 1)
- {
- Appli_LightPwmValue.IntensityValue = LED_OFF_VALUE;
+ 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) */
+ 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) */
+ 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 */
+ Appli_LedState = 0;
+ BSP_LED_Off(LED_BLUE);
}
- else if(elementNumber == THIRD_ELEMENT)
+ else
{
- /* user application code */
+ Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ Appli_LedState = 1;
+ BSP_LED_On(LED_BLUE);
}
+
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 */
- }
+ /*User Need to write the commands as per the element selected*/
+
+ TRACE_M(TF_VENDOR,"Appli_LED_ON callback received for elementIndex %d \r\n", elementIndex);
+ 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;
+
break;
}
/* Off Command */
case APPLI_CMD_OFF:
{
- if(elementNumber == FIRST_ELEMENT)
- {
- Appli_LightPwmValue.IntensityValue = LED_OFF_VALUE;
+ /*User Need to write the commands as per the element selected*/
+
+ TRACE_M(TF_VENDOR,"Appli_LED_OFF callback received for elementIndex %d \r\n", elementIndex);
+ 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) */
+ 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) */
+ 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 */
- }
+ Appli_LedState = 0;
+ BSP_LED_Off(LED_BLUE);
break;
}
/* intensity command */
case APPLI_CMD_LED_INTENSITY:
{
- if(elementNumber == FIRST_ELEMENT)
- {
- intensityValue = data[2] << 8;
- intensityValue |= data[1];
+ /*User Need to write the commands as per the element selected*/
+
+ TRACE_M(TF_VENDOR,"Appli_LED_Intensity callback received for elementIndex %d \r\n", elementIndex);
+ 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)
+ duty = PwmValueMapping(intensityValue , 0x7FFF ,0);
+ Appli_LightPwmValue.IntensityValue = duty;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ if(duty > 16000)
{
- /* user application code */
+ BSP_LED_On(LED_BLUE);
}
- else if(elementNumber == THIRD_ELEMENT)
+ else
{
- /* user application code */
+ BSP_LED_Off(LED_BLUE);
}
- break;
- }
+ break;
+ }
/* Default case - Not valid command */
default:
{
@@ -457,26 +430,32 @@ MOBLE_RESULT Appli_Vendor_LEDControl( MOBLEUINT8 const *data, MOBLEUINT32 length
*/
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,"#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;
+ MOBLE_RESULT status = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 subCmd = data[0];
+ /*First Byte is sending the Sub Command*/
+ ResponseBuffer[0]=subCmd;
+
+ TRACE_M(TF_VENDOR, "#0E-%02hx %02lx! \n\r",data[0], length);
+ for(MOBLEUINT16 i=0; i<length; i++)
+ {
+ TRACE_I(TF_VENDOR,"%02hx ",data[i]);
+ }
+ TRACE_I(TF_VENDOR,"\n\r");
+ switch(subCmd)
+ {
+ case APPLI_STRING_WRITE:
+ {
+ memcpy(&ResponseBuffer,data,length);
+ BuffLength = length;
+ break;
+ }
+ default:
+ {
+ status = MOBLE_RESULT_FALSE;
+ break;
+ }
+ }
+ return status;
}
/**
@@ -494,6 +473,58 @@ void Appli_GetTestValue (MOBLEUINT8 *responseValue)
TestHitCounter = 0;
}
/**
+* @brief Process the Vendor LED Control Command
+* @param data: Pointer to the data received from peer_addr
+* @param length: Length of the data
+* @param elementIndex : selected element where '0' is first element
+* @param dst_peer : Destination address
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_Vendor_SetBigDataPacket(MOBLEUINT8 *data, MOBLEUINT32 length,
+ MOBLEUINT8 elementIndex , MOBLE_ADDRESS dst_peer)
+{
+ MOBLE_RESULT status = MOBLE_RESULT_SUCCESS;
+
+ if (length > VENDOR_DATA_BUFFER_SIZE)
+ {
+ status = MOBLE_RESULT_INVALIDARG;
+ }
+ memmove(Appli_VendorBigData.data, data, length);
+ Appli_VendorBigData.dst = dst_peer;
+ Appli_VendorBigData.length = length;
+ Appli_VendorBigData.elementIndex = elementIndex;
+ return status;
+}
+/**
+* @brief Send Vendor big data packet
+* @param void
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_Vendor_SendBigDataPacket(void)
+{
+ MOBLE_RESULT status = MOBLE_RESULT_SUCCESS;
+
+ if(BLEMesh_TrsptIsBusyState())
+ {
+ BSP_LED_On(LED_BLUE);
+ status = MOBLE_RESULT_FALSE;
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+ status = BLEMesh_SetRemoteData(Appli_VendorBigData.dst,
+ Appli_VendorBigData.elementIndex,
+ 0x000E,
+ Appli_VendorBigData.data,
+ Appli_VendorBigData.length,
+ MOBLE_FALSE,
+ MOBLE_TRUE);
+
+ }
+ return status;
+}
+
+/**
* @}
*/
@@ -501,5 +532,5 @@ void Appli_GetTestValue (MOBLEUINT8 *responseValue)
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_vendor.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_vendor.h
index 2b9390099..8b8e60aa6 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_vendor.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_vendor.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
@@ -36,8 +36,10 @@ 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);
-
+MOBLE_RESULT Appli_Vendor_SendBigDataPacket(void);
+MOBLE_RESULT Appli_Vendor_SetBigDataPacket(MOBLEUINT8 *data, MOBLEUINT32 length,
+ MOBLEUINT8 elementIndex , MOBLE_ADDRESS dst_peer);
#endif /* __APPLI_VENDOR_H */
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/hal_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/hal_common.h
index 730c40219..704a08d80 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/hal_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/hal_common.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
@@ -44,12 +44,10 @@
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****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
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
deleted file mode 100644
index d668eae80..000000000
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/mesh_cfg.h
+++ /dev/null
@@ -1,273 +0,0 @@
-/**
- ******************************************************************************
- * @file mesh_cfg.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_H
-#define __MESH_CFG_H
-
-/* Includes ------------------------------------------------------------------*/
-#include "mesh_cfg_usr.h"
-#include "app_conf.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
-
-/*
-* TRACE_M includes function name and clock
-*/
-void TraceHeader(const char* func_name, int mode);
-#define TraceB0(func_name, ...)
-#if ( CFG_DEBUG_TRACE != 0 )
-#define TraceB1(func_name, ...) do {TraceHeader(func_name, 0); printf( __VA_ARGS__);} while(0)
-#else
-#define TraceB1(func_name, ...)
-#endif
-#define TraceBX(flags, func_name, ...) TraceB ##flags(func_name, ##__VA_ARGS__)
-#define TRACE_M(flag, ...) TraceBX(flag, __func__, ##__VA_ARGS__)
-
-/*
-* TRACE_I does not include function name and clock
-*/
-#define TraceC0(...)
-#if ( CFG_DEBUG_TRACE != 0 )
-#define TraceC1(...) do { printf( __VA_ARGS__);} while(0)
-#else
-#define TraceC1(...)
-#endif
-//#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 DEVICE_NAME_PARAMS \
-{ \
- DEVICE_NAME_SIZE, \
- Device_Name \
-}
-
-#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 device_name_params_t DeviceNameParams;
-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
index 032f968a4..86c591cee 100644
--- 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
@@ -3,11 +3,11 @@
******************************************************************************
* @file mesh_cfg_usr.h
* @author BLE Mesh Team
- * @brief Header file for mesh_usr_cfg.c
+ * @brief user configurable settings
******************************************************************************
* @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
@@ -36,7 +36,84 @@
#define ENABLE_PROXY_FEATURE
#define ENABLE_FRIEND_FEATURE
//#define ENABLE_LOW_POWER_FEATURE
+//#define ENABLE_PROVISIONER_FEATURE
+//#define DYNAMIC_PROVISIONER
+/*
+* 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_NO_OOB
+//#define ENABLE_AUTH_TYPE_STATIC_OOB
+//#define ENABLE_AUTH_TYPE_OUTPUT_OOB
+//#define ENABLE_AUTH_TYPE_INPUT_OOB
+
+/* Static OOB Configurations */
+#define STATIC_OOB_SIZE 16U
+
+/* Output OOB Configurations */
+#define OUTPUT_OOB_SIZE 1U
+#define OUTPUT_OOB_ACTION OUTPUT_OOB_ACTION_BIT_BLINK
+
+/* Input OOB Configurations */
+#define INPUT_OOB_SIZE 1U
+#define INPUT_OOB_ACTION INPUT_OOB_ACTION_BIT_PUSH
+
+/******************************************************************************/
+/* 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_SIG_MODELS_AT_COMMANDS 1
+#define ENABLE_VENDOR_MODELS_AT_COMMANDS 0
+#define ENABLE_UT 1
+
+/* Provisioner feature related configuration */
+#if defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER)
+#define PROVISIONER_ROOT_ADDR_DEFAULT 0x0001
+
+/*
+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
+
+/* Enables the UUID saving per Node - Currenly Not Supported */
+#define ENABLE_SAVE_UUID_PER_NODE 0
+
+//#define ENABLE_SERIAL_PRVN 1
+//#define ENABLE_CONFIG_MODEL_CLIENT (1)
+
+#define CLIENT_MAX_SIG_MODELS_PER_ELEMENT 12 /* Number of SIG Models for Node under provisioning */
+#define CLIENT_MAX_VENDOR_MODELS_PER_ELEMENT 1 /* Number of Vendor Models for Node under provisioning */
+#define CLIENT_MAX_ELEMENTS_PER_NODE 1 /* Number of Elements per Node */
+
+/*
+* 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
+
+#endif
+
+/* Macro to test the Flash saving data and retrieval process */
+#define ENABLE_NVM_TEST
+
/* Macros Used for user defined serial print data for models.
Either use 0 to disable or 1 to enable
@ TF_GENERIC -> Generic server
@@ -66,6 +143,7 @@ Either use 0 to disable or 1 to enable
@ TF_BEACON -> Beacons
@ TF_SERIAL_CTRL
*/
+/* Enabled by default */
#ifndef ENABLE_LOW_POWER_FEATURE
#define TF_GENERIC 1
#define TF_GENERIC_CLIENT 1
@@ -80,20 +158,22 @@ Either use 0 to disable or 1 to enable
#define TF_HANDLER 1
#define TF_INIT 1
#define TF_MISC 1
+#define TF_SERIAL_CTRL 1
/* Disabled by default */
#define TF_COMMON 0
#define TF_GENERIC_M 0
-#define TF_GENERIC_CLIENT_M 0
-#define TF_SENSOR_M 0
+#define TF_GENERIC_CLIENT_M 1
+#define TF_SENSOR_M 1
+#define TF_SENSOR_CLIENT_M 1
#define TF_LIGHT_M 0
-#define TF_LIGHT_CLIENT_M 0
-#define TF_LIGHT_LC_M 0
-#define TF_VENDOR_M 0
+#define TF_LIGHT_CLIENT_M 1
+#define TF_LIGHT_LC_M 1
+#define TF_VENDOR_M 1
#define TF_CONFIG_CLIENT_M 0
#define TF_NEIGHBOUR 0
#define TF_MEMORY 0
#define TF_BEACON 0
-#define TF_SERIAL_CTRL 0
+#define TF_VENDOR_APPLI_TEST 1 /* Vendor commands testing */
#endif
/*******************************************************************************
@@ -117,12 +197,11 @@ Either use 0 to disable or 1 to enable
/* Define the following Macros to enable the usage of the Server Generic Models */
#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
+//#define ENABLE_GENERIC_MODEL_SERVER_LEVEL (1)
+//#define ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF (1)
+//#define ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF_SETUP (1)
+//#define ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME (1)
-/* 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_GENERIC_MODEL_CLIENT_POWER_ONOFF (1)
@@ -153,14 +232,14 @@ Either use 0 to disable or 1 to enable
/******************************************************************************/
#define ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS (1)
-//#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
+//#define ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP (1)
+//#define ENABLE_LIGHT_MODEL_SERVER_CTL (1)
+//#define ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP (1)
+//#define ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE (1)
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL (1)
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP (1)
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL_HUE (1)
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION (1)
//#define ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS (1)
//#define ENABLE_LIGHT_MODEL_CLIENT_CTL (1)
@@ -169,8 +248,7 @@ Either use 0 to disable or 1 to enable
/*
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 ENABLE_LIGHT_MODEL_SERVER_LC (1)
//#define ENABLE_LIGHT_MODEL_CLIENT_LC (1)
@@ -182,8 +260,7 @@ Either use 0 to disable or 1 to enable
/* 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 (1)
//#define ENABLE_SENSOR_MODEL_CLIENT (1)
@@ -208,29 +285,23 @@ 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 (1)
#define GENERIC_SERVER_MODEL_PUBLISH
-/* Define the following Macros to enable the usage of the Client Generic Models */
-//#define ENABLE_CONFIG_MODEL_CLIENT (1)
-
/******************************************************************************/
/*
-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 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
-//#define ENABLE_MODEL_BINDING
-
/* Define the macros for the numbers of sensor present.*/
-#define NUMBER_OF_SENSOR 3
+//#define NUMBER_OF_SENSOR 1
//#define ENABLE_OCCUPANCY_SENSOR
/*
Macro is responsible for enabling and desabling the sensor publication.
@@ -271,12 +342,16 @@ this should be avoided to ensure flash longevity
//#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.
+
+/* Macros defined for the number of bytes saved, number of bytes dedicated for ganeric
+ model and light model.
*/
#define APP_NVM_GENERIC_MODEL_SIZE 16U
-#define APP_NVM_LIGHT_MODEL_SIZE 32U
-#define APP_NVM_MODEL_SIZE 50U
+#define APP_NVM_LIGHT_MODEL_SIZE 48U/*32U*/
+#define APP_NVM_MODELDATA_PER_ELEMENT_SIZE (APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE)
+//#define APP_NVM_MODEL_SIZE 50U
+#define APP_NVM_MODEL_SIZE (APP_NVM_MODELDATA_PER_ELEMENT_SIZE * APPLICATION_NUMBER_OF_ELEMENTS)
+//#define APP_NVM_MODEL_ALL_ELEMENTS_SIZE
/*Macros are defined for the selection of the number of led and type of lighting
@@ -298,23 +373,15 @@ this should be avoided to ensure flash longevity
/* 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
+/* Max SIG Models per element */
+#define USER_SIG_MODELS_MAX_COUNT 17
+/* Max Vendor Models per element */
+#define USER_VENDOR_MODELS_MAX_COUNT 1
/* Contains a 16-bit company identifier assigned by the Bluetooth SIG
@@ -365,43 +432,6 @@ For STMicroelectronics : it is 0x0030 */
/*
-* 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
*/
@@ -582,100 +612,6 @@ For STMicroelectronics : it is 0x0030 */
#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_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
-
-#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 ---------------------------------------------*/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/models_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/models_if.c
index ce2370722..3cc324edd 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/models_if.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/models_if.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
@@ -42,7 +42,9 @@
#include "config_client.h"
#include "generic_client.h"
#include "light_client.h"
+#include "sensors_client.h"
#include "appli_light_client.h"
+#include "appli_sensors_client.h"
/** @addtogroup ST_BLE_Mesh
* @{
@@ -59,6 +61,9 @@ typedef struct
MOBLE_ADDRESS peer;
MOBLE_ADDRESS dst;
MOBLEUINT8 command;
+ MOBLEUINT8 elementIndex;
+ MOBLEUINT8 appKeyOffset;
+ MOBLEUINT8 netKeyOffset;
MOBLEUINT8 data[DATA_BUFFER_LENGTH]; /* 8-Bytes response packet */
MOBLEUINT32 length;
} APPLI_SEND_RESPONSE_MODULE;
@@ -78,18 +83,48 @@ typedef struct
/* Private variables ---------------------------------------------------------*/
+MOBLEUINT8 Led_Value = 0;
+
+MOBLEUINT8 ButtonIndex_Value = 0;
+
APPLI_PENDING_PACKETS Appli_PendingPackets = {0};
-__attribute__((aligned(4)))
-const MOBLE_VENDOR_CB_MAP vendor_cb =
+MOBLEUINT8 pGeneric_OnOffParam[sizeof(Generic_OnOffParam_t)];
+MOBLEUINT8 pGeneric_LevelParam[sizeof(Generic_LevelParam_t)];
+MOBLEUINT8 pGeneric_DeltaLevelParam[sizeof(Generic_DeltaLevelParam_t)];
+MOBLEUINT8 pGeneric_MoveLevelParam[sizeof(Generic_LevelMoveParam_t)];
+MOBLEUINT8 pGeneric_PowerOnOffParam[sizeof(Generic_PowerOnOffParam_t)];
+MOBLEUINT8 pGeneric_DefaultTransitionTimeParam[sizeof(Generic_DefaultTransitionParam_t)];
+
+MOBLEUINT8 pLightnessParam[sizeof(Light_LightnessParam_t)];
+MOBLEUINT8 pLightnessRangeParam[sizeof(Light_LightnessRangeParam_t)];
+
+MOBLEUINT8 pLightCtlParam[sizeof(Light_CtlParam_t)];
+MOBLEUINT8 pLightCtlTemperatureParam[sizeof(Light_CtlTemperatureParam_t)];
+MOBLEUINT8 pLightCtlTemperatureRangeParam[sizeof(Light_CtlTemperatureRangeParam_t)];
+MOBLEUINT8 pLightCtlDefaultParam[sizeof(Light_CtlDefaultParam_t)];
+
+MOBLEUINT8 pLightHslParam[sizeof(Light_HslParam_t)];
+MOBLEUINT8 pLightHslRangeParam[sizeof(Light_HslRangeParam_t)];
+MOBLEUINT8 pLightHslHueParam[sizeof(Light_HslHueParam_t)];
+MOBLEUINT8 pLightHslSaturationParam[sizeof(Light_HslSaturationParam_t)];
+
+MOBLEUINT8 pLightLCModeParam[sizeof(Light_LC_ModeParam_t)];
+MOBLEUINT8 pLightLCOccupancyModeParam[sizeof(Light_LC_ModeParam_t)];
+MOBLEUINT8 pLightLCOnOffParam[sizeof(Light_LC_OnOffParam_t)];
+MOBLEUINT8 pLightLCPropertyParam[6];
+
+MOBLEUINT8 pSensorsCadenceParam[sizeof(sensor_CadenceCbParam_t)];
+MOBLEUINT8 pSensorsSettingParam[sizeof(sensor_SettingCbParams_t)];
+
+__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 =
+__attribute__((aligned(4)))const Appli_Vendor_cb_t VendorAppli_cb =
{
/*Vendor Commads*/
Appli_Vendor_LEDControl,
@@ -100,8 +135,7 @@ const Appli_Vendor_cb_t VendorAppli_cb =
Appli_Vendor_Data_write
};
-__attribute__((aligned(4)))
-const Appli_Generic_cb_t GenericAppli_cb =
+__attribute__((aligned(4)))const Appli_Generic_cb_t GenericAppli_cb =
{
/* Generic OnOff callbacks */
Appli_Generic_OnOff_Set,
@@ -124,8 +158,7 @@ const Appli_Generic_cb_t GenericAppli_cb =
Appli_Generic_DefaultTransitionTime_Status
};
-__attribute__((aligned(4)))
-const Appli_Generic_State_cb_t Appli_GenericState_cb =
+__attribute__((aligned(4)))const Appli_Generic_State_cb_t Appli_GenericState_cb =
{
/* Generic Get On Off status */
@@ -139,8 +172,7 @@ const Appli_Generic_State_cb_t Appli_GenericState_cb =
Appli_Generic_GetDefaultTransitionStatus
};
-__attribute__((aligned(4)))
-const Appli_Light_GetStatus_cb_t Appli_Light_GetStatus_cb =
+__attribute__((aligned(4)))const Appli_Light_GetStatus_cb_t Appli_Light_GetStatus_cb =
{
Appli_Light_GetLightnessStatus,
Appli_Light_GetLightnessLinearStatus,
@@ -148,10 +180,12 @@ const Appli_Light_GetStatus_cb_t Appli_Light_GetStatus_cb =
Appli_Light_GetLightnessLastStatus,
Appli_Light_GetLightnessRangeStatus,
Appli_Light_GetCtlLightStatus,
+ Appli_Light_GetCtlTargetStatus,
Appli_Light_GetCtlTemperatureStatus,
Appli_Light_GetCtlTemperatureRange,
Appli_Light_GetCtlDefaultStatus,
Appli_Light_GetHslStatus,
+ Appli_Light_GetHslTargetStatus,
Appli_Light_GetHslHueStatus,
Appli_Light_GetHslSaturationStatus,
Appli_Light_GetHslHueRange,
@@ -160,8 +194,7 @@ const Appli_Light_GetStatus_cb_t Appli_Light_GetStatus_cb =
};
-__attribute__((aligned(4)))
-const Appli_Light_cb_t LightAppli_cb =
+__attribute__((aligned(4)))const Appli_Light_cb_t LightAppli_cb =
{
/* Light Lightness callbacks */
Appli_Light_Lightness_Set,
@@ -173,6 +206,9 @@ const Appli_Light_cb_t LightAppli_cb =
Appli_Light_Lightness_Default_Set,
Appli_Light_Lightness_Default_Status,
+ Appli_Light_Lightness_Last_Set,
+ Appli_Light_Lightness_Last_Status,
+
Appli_Light_Lightness_Range_Set,
Appli_Light_Lightness_Range_Status,
@@ -205,17 +241,19 @@ const Appli_Light_cb_t LightAppli_cb =
};
-__attribute__((aligned(4)))
-const Appli_Light_Ctrl_cb_t LightLCAppli_cb =
+#if 0
+__attribute__((aligned(4)))const Appli_Light_Ctrl_cb_t LightLCAppli_cb =
{
/* Light LC mode set callbacks */
Appli_LightLC_Mode_Set,
+ Appli_LightLC_Mode_Status,
Appli_LightLC_OM_Set,
+ Appli_LightLC_OM_Status,
Appli_LightLC_OnOff_Set,
+ Appli_LightLC_OnOff_Status,
};
-__attribute__((aligned(4)))
-const Appli_LightLC_GetStatus_cb_t Appli_LightLC_GetStatus_cb =
+__attribute__((aligned(4)))const Appli_LightLC_GetStatus_cb_t Appli_LightLC_GetStatus_cb =
{
Appli_LightLC_Get_ModeStatus,
Appli_LightLC_Get_OMModeStatus,
@@ -223,33 +261,44 @@ const Appli_LightLC_GetStatus_cb_t Appli_LightLC_GetStatus_cb =
Appli_LightLC_Get_AmbientLuxLevelOutput,
Appli_Light_LC_PIRegulatorOutput,
};
+#endif
-#ifdef ENABLE_SENSOR_MODEL_SERVER
-
-__attribute__((aligned(4)))
-const Appli_Sensor_cb_t SensorAppli_cb =
+__attribute__((aligned(4)))const sensor_server_cb_t SensorAppli_cb =
{
- /* Sensor Model callbacks */
- Appli_Sensor_Cadence_Set,
- Appli_Sensor_Data_Status,
- Appli_Sensor_Descriptor_Status ,
- Appli_Sensor_Setting_Set,
+ Appli_Sensor_CadenceGet,
+ Appli_Sensor_CadenceSet,
+ Appli_Sensor_CadenceSetUnack,
+ Appli_Sensor_SettingsGet,
+ Appli_Sensor_SettingGet,
+ Appli_Sensor_SettingSet,
+ Appli_Sensor_SettingSetUnack,
+ Appli_Sensor_DescriptorGet,
+ Appli_Sensor_Get,
+ Appli_Sensor_ColumnGet,
+ Appli_Sensor_SeriesGet,
+ Appli_Sensor_ReadDescriptor,
+ Appli_Sensor_ReadValue,
+ Appli_Sensor_ReadColumn,
+ Appli_Sensor_ReadSeries,
+ Appli_Sensor_IsFastCadence,
+ Appli_Sensor_IsStatusTrigger,
+ Appli_Sensor_Descriptor_Status,
+ Appli_Sensor_Cadence_Status,
+ Appli_Sensor_Settings_Status,
+ Appli_Sensor_Setting_Status,
+ Appli_Sensor_Status,
Appli_Sensor_Column_Status,
Appli_Sensor_Series_Status
};
-__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 Appli_Sensor_GetStatus_cb_t Appli_Sensor_GetStatus_cb =
+//{
+// // Appli_Sensor_GetSettingStatus,
+// Appli_Sensor_GetSetting_IDStatus,
+//};
-__attribute__((aligned(4)))
-const MODEL_SIG_cb_t Model_SIG_cb[] =
+__attribute__((aligned(4)))const MODEL_SIG_cb_t Model_SIG_cb[] =
{
#ifdef ENABLE_GENERIC_MODEL_SERVER
{
@@ -266,6 +315,7 @@ const MODEL_SIG_cb_t Model_SIG_cb[] =
LightModelServer_ProcessMessageCb
},
#endif
+
#ifdef ENABLE_SENSOR_MODEL_SERVER
{
SensorModelServer_GetOpcodeTableCb,
@@ -273,6 +323,7 @@ const MODEL_SIG_cb_t Model_SIG_cb[] =
SensorModelServer_ProcessMessageCb
},
#endif
+
#ifdef ENABLE_TIME_SCENE_MODEL_SERVER
{
Time_SceneModelServer_GetOpcodeTableCb,
@@ -280,13 +331,15 @@ const MODEL_SIG_cb_t Model_SIG_cb[] =
Time_SceneModelServer_ProcessMessageCb
},
#endif
+
#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
{
- Light_LC_ModelServer_GetOpcodeTableCb,
- Light_LC_ModelServer_GetStatusRequestCb,
- Light_LC_ModelServer_ProcessMessageCb
+ LightLcServer_GetOpcodeTableCb,
+ LightLcServer_GetStatusRequestCb,
+ LightLcServer_ProcessMessageCb
},
#endif
+
#ifdef ENABLE_GENERIC_MODEL_CLIENT
{
GenericModelClient_GetOpcodeTableCb,
@@ -294,6 +347,7 @@ const MODEL_SIG_cb_t Model_SIG_cb[] =
GenericModelClient_ProcessMessageCb
},
#endif
+
#ifdef ENABLE_CONFIG_MODEL_CLIENT
{
ConfigClientModel_GetOpcodeTableCb,
@@ -309,15 +363,29 @@ const MODEL_SIG_cb_t Model_SIG_cb[] =
},
#endif
- { 0, 0,0 }
+#ifdef ENABLE_SENSOR_MODEL_CLIENT
+ {
+ SensorsModelClient_GetOpcodeTableCb,
+ SensorsModelClient_GetStatusRequestCb,
+ SensorsModelClient_ProcessMessageCb
+ },
+#endif
+
+ {
+ 0, 0, 0
+ }
};
__attribute__((aligned(4))) const APPLI_SAVE_MODEL_STATE_CB SaveModelState_cb = AppliNvm_SaveModelState;
+#if 0
+__attribute__((aligned(4))) const APPLI_SAVE_MODEL_TEST_STATE_CB SaveModelTestState_cb = AppliNVM_Save_FlashTesting;
+__attribute__((aligned(4))) const APPLI_RETRIEVE_MODEL_TEST_STATE_CB RetrieveModelTestState_cb = AppliNVM_Retrieve_FlashTesting;
+#endif
+
#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[] =
+__attribute__((aligned(4))) const MODEL_Vendor_cb_t Model_Vendor_cb[] =
{
#ifdef ENABLE_VENDOR_MODEL_SERVER
{
@@ -341,7 +409,7 @@ void GetApplicationVendorModels(const MODEL_Vendor_cb_t** pModelsTable, MOBLEUIN
*pModelsTable = Model_Vendor_cb ;
*VendorModelscount = MODEL_VENDOR_COUNT;
- TRACE_M(TF_VENDOR,"GetApplicationVendorModels \r\n");
+ TRACE_M(TF_VENDOR_M, "GetApplicationVendorModels \r\n");
}
/**
@@ -354,7 +422,7 @@ void BLEMesh_ModelsInit(void)
#ifdef ENABLE_SAVE_MODEL_STATE_NVM
- MOBLEUINT8 modelStateLoad_Size;
+ MOBLEUINT16 modelStateLoad_Size;
MOBLEUINT8 modelStateLoadBuff[APP_NVM_MODEL_SIZE];
#ifdef CLIENT
@@ -362,28 +430,39 @@ void BLEMesh_ModelsInit(void)
MOBLEUINT8 PrvnlStateLoadBuff[16];
#endif
+#if 0
+#ifdef ENABLE_NVM_TEST
+ /* Testing of flash code */
+ Device_FlashTesting();
+#endif
+#endif
+
+ /* Inintialise the light model range states with default values */
+ Light_ModelRangeInit();
+
/* 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);
+#if defined ENABLE_SENSOR_MODEL_SERVER && !defined CUSTOM_BOARD_PWM_SELECTION
+ /* Initialization of sensors */
+ Appli_Sensor_Init();
+#endif
+
+ Appli_Light_LCs_Init();
#endif
+ /* Load generic model states from nvm */
+ AppliNvm_LoadModelState(modelStateLoadBuff, &modelStateLoad_Size);
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
+#ifdef CLIENT
+ AppliPrvnNvm_LoadData(PrvnlStateLoadBuff,&PrvnStateLoad_Size);
+#endif
+
}
/**
@@ -418,7 +497,7 @@ void BLEMesh_ModelsProcess(void)
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
- Light_control_Process();
+ Light_LC_Process();
#endif
}
@@ -433,23 +512,498 @@ void BLEMesh_ModelsCommand(void)
Vendor_Publish(BLEMesh_GetAddress());
#endif
+#if defined(GENERIC_CLIENT_MODEL_PUBLISH) || defined(LIGHT_CLIENT_MODEL_PUBLISH)
+ Led_Value ^= APPLI_LED_ON;
+ pGeneric_OnOffParam[0] = Led_Value; // OnOff parameter byte 0 : The target value of the Generic Onoff state
+
+ pLightLCModeParam[0] = Led_Value;
+ pLightLCOccupancyModeParam[0] = Led_Value;
+ pLightLCOnOffParam[0] = Led_Value;
+
+ //This Switch-case allows to quickly set the different Models Messages parameters in order to demonstrate Client APIs functionning
+ switch (ButtonIndex_Value){
+ case 0:
+ ButtonIndex_Value=0x1;
+
+ pGeneric_LevelParam[0]= 0xE8; // Level parameter byte 0 : The target value of the Generic Level state
+ pGeneric_LevelParam[1]= 0x03; // Level parameter byte 1 : The target value of the Generic Level state
+
+ pGeneric_DeltaLevelParam[0]= 0xE8; // Delta Level parameter byte 0 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[1]= 0x03; // Delta Level parameter byte 1 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[2]= 0x00; // Delta Level parameter byte 2 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[3]= 0x00; // Delta Level parameter byte 3 : The Delta change of the Generic Level state
+
+ pGeneric_MoveLevelParam[0]= 0xE8; //Move Delta Level parameter byte 0 : The Delta Level step to calculate Move speed for the Generic Level state
+ pGeneric_MoveLevelParam[1]= 0x03; //Move Delta Level parameter byte 1 : The Delta Level step to calculate Move speed for the Generic Level state
+
+ pGeneric_DefaultTransitionTimeParam[0]=0x0F; //Transition time parameter byte 0 : The value of the Generic Default Transition Time state
+
+ pGeneric_PowerOnOffParam[0]=0x1; //OnPowerUp parameter byte 0 : The value of the Generic OnPowerUp state.
+
+ pLightnessParam[0] = 0xE8; //Lightness parameter byte 0 : The target value of the Light Lightness Actual/Linear/Default state
+ pLightnessParam[1] = 0x03; //Lightness parameter byte 1 : The target value of the Light Lightness Actual/Linear/Default state
+
+ pLightnessRangeParam[0] = 0xE8; //Lightness Range Min parameter byte 0 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[1] = 0x03; //Lightness Range Min parameter byte 1 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[2] = 0x88; //Lightness Range Max parameter byte 0 : The value of the Lightness Range Max field of the Light Lightness Range state
+ pLightnessRangeParam[3] = 0x13; //Lightness Range Max parameter byte 1 : The value of the Lightness Range Max field of the Light Lightness Range state
+
+ pLightCtlParam[0] = 0xE8; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness state
+ pLightCtlParam[1] = 0x03; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness state
+ pLightCtlParam[2] = 0xE8; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlParam[3] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlParam[4] = 0xE8; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlParam[5] = 0x03; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureParam[0] = 0xE8; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[1] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[2] = 0xE8; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlTemperatureParam[3] = 0x03; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureRangeParam[0] = 0xE8; //Temperature Range Min parameter byte 0 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[1] = 0x03; //Temperature Range Min parameter byte 1 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[2] = 0x88; //Temperature Range Max parameter byte 0 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[3] = 0x13; //Temperature Range Max parameter byte 1 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+
+ pLightCtlDefaultParam[0] = 0xE8; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[1] = 0x03; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[2] = 0xE8; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[3] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[4] = 0xE8; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV Default state
+ pLightCtlDefaultParam[5] = 0x03; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV Default state
+
+ pLightHslParam[0] = 0xE8; //HSL Lightness parameter byte 0 : The target value of the Light HSL Lightness state
+ pLightHslParam[1] = 0x03; //HSL Lightness parameter byte 1 : The target value of the Light HSL Lightness state
+ pLightHslParam[2] = 0xE8; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslParam[3] = 0x03; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+ pLightHslParam[4] = 0xE8; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslParam[5] = 0x03; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ pLightHslRangeParam[0] = 0xE8; //HSL Hue Range Min parameter byte 0 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[1] = 0x03; //HSL Hue Range Min parameter byte 1 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[2] = 0x88; //HSL Hue Range Max parameter byte 0 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[3] = 0x13; //HSL Hue Range Max parameter byte 1 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[4] = 0x88; //HSL Saturation Min parameter byte 0 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[5] = 0x13; //HSL Saturation Min parameter byte 1 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[6] = 0x70; //HSL Saturation Max parameter byte 0 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+ pLightHslRangeParam[7] = 0x17; //HSL Saturation Max parameter byte 1 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+
+ pLightHslHueParam[0] = 0xE8; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslHueParam[1] = 0x03; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+
+ pLightHslSaturationParam[0] = 0xE8; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslSaturationParam[1] = 0x03; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ //LIGHT_CONTROL_LUX_LEVEL_ON_ID : 0x202B
+ pLightLCPropertyParam[0]= 0x2B; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[1]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[2]= 0x44; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[3]= 0x44; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[4]= 0x44; // Property ID byte 2 : Property ID identifying a Light LC Property.
+ break;
+
+ case 1:
+ ButtonIndex_Value=0x2;
+
+ pGeneric_LevelParam[0]= 0xff; // Level parameter byte 0 : The target value of the Generic Level state
+ pGeneric_LevelParam[1]= 0x7f; // Level parameter byte 1 : The target value of the Generic Level state
+
+ pGeneric_DeltaLevelParam[0]= 0x10; // Delta Level parameter byte 0 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[1]= 0x27; // Delta Level parameter byte 1 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[2]= 0x00; // Delta Level parameter byte 2 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[3]= 0x00; // Delta Level parameter byte 3 : The Delta change of the Generic Level state
+
+ pGeneric_MoveLevelParam[0]= 0xff; //Move Delta Level parameter byte 0 : The Delta Level step to calculate Move speed for the Generic Level state
+ pGeneric_MoveLevelParam[1]= 0x7f; //Move Delta Level parameter byte 1 : The Delta Level step to calculate Move speed for the Generic Level state
+
+ pGeneric_DefaultTransitionTimeParam[0]=0x10; //Transition time parameter byte 0 : The value of the Generic Default Transition Time state
+
+ pGeneric_PowerOnOffParam[0]=0x2; //OnPowerUp parameter byte 0 : The value of the Generic OnPowerUp state.
+
+ pLightnessParam[0] = 0xff; //Lightness parameter byte 0 : The target value of the Light Lightness Actual/Linear/Default state
+ pLightnessParam[1] = 0xff; //Lightness parameter byte 1 : The target value of the Light Lightness Actual/Linear/Default state
+
+ pLightnessRangeParam[0] = 0x00; //Lightness Range Min parameter byte 0 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[1] = 0x00; //Lightness Range Min parameter byte 1 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[2] = 0xff; //Lightness Range Max parameter byte 0 : The value of the Lightness Range Max field of the Light Lightness Range state
+ pLightnessRangeParam[3] = 0xff; //Lightness Range Max parameter byte 1 : The value of the Lightness Range Max field of the Light Lightness Range state
+
+ pLightCtlParam[0] = 0xff; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness state
+ pLightCtlParam[1] = 0xff; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness state
+ pLightCtlParam[2] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlParam[3] = 0x4e; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlParam[4] = 0xff; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlParam[5] = 0x7f; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureParam[0] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[1] = 0x4e; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[2] = 0xff; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlTemperatureParam[3] = 0x7f; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureRangeParam[0] = 0x19; //Temperature Range Min parameter byte 0 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[1] = 0x4e; //Temperature Range Min parameter byte 1 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[2] = 0x20; //Temperature Range Max parameter byte 0 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[3] = 0x4e; //Temperature Range Max parameter byte 1 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+
+ pLightCtlDefaultParam[0] = 0xff; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[1] = 0xff; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[2] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[3] = 0x4e; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[4] = 0xff; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV Default state
+ pLightCtlDefaultParam[5] = 0x7f; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV Default state
+
+ pLightHslParam[0] = 0xff; //HSL Lightness parameter byte 0 : The target value of the Light HSL Lightness state
+ pLightHslParam[1] = 0xff; //HSL Lightness parameter byte 1 : The target value of the Light HSL Lightness state
+ pLightHslParam[2] = 0xee; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslParam[3] = 0xee; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+ pLightHslParam[4] = 0xdd; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslParam[5] = 0xdd; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ pLightHslRangeParam[0] = 0x00; //HSL Hue Range Min parameter byte 0 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[1] = 0xf0; //HSL Hue Range Min parameter byte 1 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[2] = 0xff; //HSL Hue Range Max parameter byte 0 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[3] = 0xff; //HSL Hue Range Max parameter byte 1 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[4] = 0x00; //HSL Saturation Min parameter byte 0 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[5] = 0xe0; //HSL Saturation Min parameter byte 1 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[6] = 0xff; //HSL Saturation Max parameter byte 0 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+ pLightHslRangeParam[7] = 0xef; //HSL Saturation Max parameter byte 1 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+
+ pLightHslHueParam[0] = 0xff; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslHueParam[1] = 0xff; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+
+ pLightHslSaturationParam[0] = 0xff; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslSaturationParam[1] = 0xff; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ //LIGHT_CONTROL_LUX_LEVEL_ON_ID : 0x202B
+ pLightLCPropertyParam[0]= 0x2B; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[1]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[2]= 0x01; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[3]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[4]= 0x10; // Property ID byte 2 : Property ID identifying a Light LC Property.
+ break;
+
+ case 2:
+ ButtonIndex_Value=0x0;
+
+ pGeneric_LevelParam[0]= 0x00; // Level parameter byte 0 : The target value of the Generic Level state
+ pGeneric_LevelParam[1]= 0x00; // Level parameter byte 1 : The target value of the Generic Level state
+
+ pGeneric_DeltaLevelParam[0]= 0x00; // Delta Level parameter byte 0 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[1]= 0x00; // Delta Level parameter byte 1 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[2]= 0x00; // Delta Level parameter byte 2 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[3]= 0x00; // Delta Level parameter byte 3 : The Delta change of the Generic Level state
+
+ pGeneric_MoveLevelParam[0]= 0x00; //Move Delta Level parameter byte 0 : The Delta Level step to calculate Move speed for the Generic Level state
+ pGeneric_MoveLevelParam[1]= 0x00; //Move Delta Level parameter byte 1 : The Delta Level step to calculate Move speed for the Generic Level state
+
+ pGeneric_DefaultTransitionTimeParam[0]=0x00; //Transition time parameter byte 0 : The value of the Generic Default Transition Time state
+
+ pGeneric_PowerOnOffParam[0]=0x0; //OnPowerUp parameter byte 0 : The value of the Generic OnPowerUp state.
+
+ pLightnessParam[0] = 0x00; //Lightness parameter byte 0 : The target value of the Light Lightness Actual/Linear/Default state
+ pLightnessParam[1] = 0x00; //Lightness parameter byte 1 : The target value of the Light Lightness Actual/Linear/Default state
+
+ pLightnessRangeParam[0] = 0x00; //Lightness Range Min parameter byte 0 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[1] = 0x00; //Lightness Range Min parameter byte 1 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[2] = 0x00; //Lightness Range Max parameter byte 0 : The value of the Lightness Range Max field of the Light Lightness Range state
+ pLightnessRangeParam[3] = 0x10; //Lightness Range Max parameter byte 1 : The value of the Lightness Range Max field of the Light Lightness Range state
+
+ pLightCtlParam[0] = 0x00; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness state
+ pLightCtlParam[1] = 0x00; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness state
+ pLightCtlParam[2] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlParam[3] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlParam[4] = 0x00; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlParam[5] = 0x00; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureParam[0] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[1] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[2] = 0x00; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlTemperatureParam[3] = 0x00; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureRangeParam[0] = 0x20; //Temperature Range Min parameter byte 0 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[1] = 0x03; //Temperature Range Min parameter byte 1 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[2] = 0x21; //Temperature Range Max parameter byte 0 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[3] = 0x03; //Temperature Range Max parameter byte 1 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+
+ pLightCtlDefaultParam[0] = 0x00; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[1] = 0x00; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[2] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[3] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[4] = 0x00; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV Default state
+ pLightCtlDefaultParam[5] = 0x00; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV Default state
+
+ pLightHslParam[0] = 0x00; //HSL Lightness parameter byte 0 : The target value of the Light HSL Lightness state
+ pLightHslParam[1] = 0x00; //HSL Lightness parameter byte 1 : The target value of the Light HSL Lightness state
+ pLightHslParam[2] = 0x00; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslParam[3] = 0x00; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+ pLightHslParam[4] = 0x00; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslParam[5] = 0x00; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ pLightHslRangeParam[0] = 0x00; //HSL Hue Range Min parameter byte 0 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[1] = 0x00; //HSL Hue Range Min parameter byte 1 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[2] = 0x00; //HSL Hue Range Max parameter byte 0 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[3] = 0x10; //HSL Hue Range Max parameter byte 1 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[4] = 0x00; //HSL Saturation Min parameter byte 0 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[5] = 0x00; //HSL Saturation Min parameter byte 1 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[6] = 0x00; //HSL Saturation Max parameter byte 0 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+ pLightHslRangeParam[7] = 0x20; //HSL Saturation Max parameter byte 1 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+
+ pLightHslHueParam[0] = 0x00; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslHueParam[1] = 0x00; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+
+ pLightHslSaturationParam[0] = 0x00; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslSaturationParam[1] = 0x00; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ //LIGHT_CONTROL_LUX_LEVEL_ON_ID : 0x202B
+ pLightLCPropertyParam[0]= 0x2B; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[1]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[2]= 0x00; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[3]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[4]= 0x00; // Property ID byte 2 : Property ID identifying a Light LC Property.
+ break;
+
+ default:
+ break;
+ }
+
+
#ifdef GENERIC_CLIENT_MODEL_PUBLISH
- Appli_GenericClient_OnOff_Set();
+ /** GENERIC ONOFF **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API ONOFF SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_ON_OFF_SET_ACK, pGeneric_OnOffParam);
+
+ TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API ONOFF SET UNACK ------------- \r\n");
+ Appli_GenericClient_API(0, GENERIC_ON_OFF_SET_UNACK, pGeneric_OnOffParam);
+
+ /** GENERIC LEVEL **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API LEVEL SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_LEVEL_SET_ACK, pGeneric_LevelParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API LEVEL SET UNACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_LEVEL_SET_UNACK, pGeneric_LevelParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API DELTA LEVEL SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_DELTA_SET, pGeneric_DeltaLevelParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API DELTA LEVEL SET UNACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_DELTA_SET_UNACK, pGeneric_DeltaLevelParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API MOVE DELTA LEVEL SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_MOVE_SET, pGeneric_MoveLevelParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API MOVE DELTA LEVEL SET UNACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_MOVE_SET_UNACK, pGeneric_MoveLevelParam);
+
+ /** GENERIC POWER ONOFF **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API POWER ON OFF SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_POWER_ON_OFF_SET, pGeneric_PowerOnOffParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API POWER ON OFF SET UNACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_POWER_ON_OFF_SET_UNACK, pGeneric_PowerOnOffParam);
+
+ /** GENERIC TRANSITION TIME **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API DEFAULT TRANSITION TIME SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_DEFAULT_TRANSITION_TIME_SET, pGeneric_DefaultTransitionTimeParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API DEFAULT TRANSITION TIME SET UNACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_DEFAULT_TRANSITION_TIME_SET_UNACK, pGeneric_DefaultTransitionTimeParam);
+
+
+
+#if 1 /* TODO FAGOTV: Initialize Present Ambient Temparature Sensor in sensor_cfg_usr.h */
+ //PRESENT_AMBIENT_TEMPERATURE_PID : 0x004F
+ pSensorsCadenceParam[0]= 0x4F; // Property ID byte 0 : Property ID for the sensor.
+ pSensorsCadenceParam[1]= 0x00; // Property ID byte 1 : Property ID for the sensor.
+
+ pSensorsCadenceParam[2]= 0x81; // Fast Cadence Period Divisor bits 0-7: Divisor for the Publish Period.
+ // Status Trigger Type bit 8 : Defines the unit and format of the Status Trigger Delta fields.
+ pSensorsCadenceParam[3]= 0x11; // Status Trigger Delta Down byte 0 : Delta down value that triggers a status message.
+ pSensorsCadenceParam[4]= 0x11; // Status Trigger Delta Down byte 1 : Delta down value that triggers a status message.
+
+ pSensorsCadenceParam[5]= 0x22; // Status Trigger Delta Up byte 0 : Delta down value that triggers a status message.
+ pSensorsCadenceParam[6]= 0x22; // Status Trigger Delta Up byte 1 : Delta down value that triggers a status message.
+
+ pSensorsCadenceParam[7]= 0x10; // Status Min Interval byte 0 : Minimum interval between two consecutive Status messages.
+
+ pSensorsCadenceParam[8]= 0x33; // Fast Cadence Low byte 0 : Low value for the fast cadence range.
+
+ pSensorsCadenceParam[9]= 0x44; // Fast Cadence High byte 0 : High value for the fast cadence range.
+
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR CADENCE SET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_CADENCE_SET, pSensorsCadenceParam);
+
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR CADENCE SET UNACK ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_CADENCE_SET_UNACK, pSensorsCadenceParam);
+
+ /** SENSOR SETTING**/
+ /*
+ PRESENT_AMBIENT_TEMPERATURE_PID : 0x004F
+ Second Property PID : 0x00AD
+ */
+ pSensorsSettingParam[0]= 0x4F; // Property ID byte 0 : Property ID for the sensor
+ pSensorsSettingParam[1]= 0x00; // Property ID byte 1 : Property ID for the sensor
+ pSensorsSettingParam[2]= 0xAD; // Sensor Setting Property ID byte 0 : Property ID for the sensor setting
+ pSensorsSettingParam[3]= 0x00; // Sensor Setting Property ID byte 1 : Property ID for the sensor setting
+
+ switch (ButtonIndex_Value){
+ case 0:
+ pSensorsSettingParam[4]= 0x10; // Sensor Setting Property ID byte 0 : Property ID for the sensor setting
+ //pSensorsSettingParam[5]= 0x10; // Sensor Setting Property ID byte 1 : Property ID for the sensor setting
+ break;
+ case 1:
+ pSensorsSettingParam[4]= 0x20; // Sensor Setting Property ID byte 0 : Property ID for the sensor setting
+ //pSensorsSettingParam[5]= 0x20; // Sensor Setting Property ID byte 1 : Property ID for the sensor setting
+ break;
+ case 2:
+ pSensorsSettingParam[4]= 0x0F; // Sensor Setting Property ID byte 0 : Property ID for the sensor setting
+ //pSensorsSettingParam[5]= 0x00; // Sensor Setting Property ID byte 1 : Property ID for the sensor setting
+ break;
+ default:
+ break;
+ }
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR SETTING SET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_SETTING_SET, pSensorsSettingParam);
+
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR SETTING SET UNACK ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_SETTING_SET_UNACK, pSensorsSettingParam);
+#endif
+
+#endif
+
+#ifdef LIGHT_CLIENT_MODEL_PUBLISH
+ /** LIGHT LIGHTNESS **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_SET, pLightnessParam);
+//
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_SET_UNACK, pLightnessParam);
+
+ /** LIGHT LIGHTNESS LINEAR **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS SET LINEAR ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_LINEAR_SET, pLightnessParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS SET LINEAR UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_LINEAR_SET_UNACK, pLightnessParam);
+
+ /** LIGHT LIGHTNESS DEFAULT **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS DEFAULT SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_DEFAULT_SET, pLightnessParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS DEFAULT SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_DEFAULT_SET_UNACK, pLightnessParam);
+
+ /** LIGHT LIGHTNESS RANGE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS RANGE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_RANGE_SET, pLightnessRangeParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS RANGE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_RANGE_SET_UNACK, pLightnessRangeParam);
+
+ /** LIGHT LIGHTNESS CTL **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_SET, pLightCtlParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_SET_UNACK, pLightCtlParam);
+
+ /** LIGHT LIGHTNESS CTL TEMPERATURE**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_SET, pLightCtlTemperatureParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_SET_UNACK, pLightCtlTemperatureParam);
+
+ /** LIGHT LIGHTNESS CTL TEMPERATURE RANGE**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE RANGE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_RANGE_SET, pLightCtlTemperatureRangeParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE RANGE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_RANGE_SET_UNACK, pLightCtlTemperatureRangeParam);
+
+ /** LIGHT LIGHTNESS CTL DEFAULT**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL DEFAULT SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_DEFAULT_SET, pLightCtlDefaultParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL DEFAULT SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_DEFAULT_SET_UNACK, pLightCtlDefaultParam);
+
+ /** LIGHT LIGHTNESS HSL **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_SET, pLightHslParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_SET_UNACK, pLightHslParam);
+
+ /** LIGHT LIGHTNESS HSL DEFAULT **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL DEFAULT SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_DEFAULT_SET, pLightHslParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL DEFAULT SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_DEFAULT_SET_UNACK, pLightHslParam);
+
+ /** LIGHT LIGHTNESS HSL RANGE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL RANGE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_RANGE_SET, pLightHslRangeParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL RANGE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_RANGE_SET_UNACK, pLightHslRangeParam);
+
+ /** LIGHT LIGHTNESS HSL HUE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL HUE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_HUE_SET, pLightHslHueParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL HUE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_HUE_SET_UNACK, pLightHslHueParam);
+
+ /** LIGHT LIGHTNESS HSL SATURATION **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL SATURATION SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_SATURATION_SET, pLightHslSaturationParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL SATURATION SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_SATURATION_SET_UNACK, pLightHslSaturationParam);
+
+ /** LIGHT LC MODE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC MODE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_MODE_SET, pLightLCModeParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC MODE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_MODE_SET_UNACK, pLightLCModeParam);
+
+ /** LIGHT LC OM **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC OM SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_OM_SET, pLightLCOccupancyModeParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC OM SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_OM_SET_UNACK, pLightLCOccupancyModeParam);
+
+ /** LIGHT LC ONOFF **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC ONOFF SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_ON_OFF_SET, pLightLCOnOffParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC ONOFF SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_ON_OFF_SET_UNACK, pLightLCOnOffParam);
+
+ /** LIGHT LC PROPERTY **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC PROPERTY SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_PROPERTY_SET, pLightLCPropertyParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC PROPERTY SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_PROPERTY_SET_UNACK, pLightLCPropertyParam);
+#endif
#endif
-#ifndef CLIENT
/* if CLIENT and SERVER => Publish is already done in CLIENT */
#ifdef GENERIC_SERVER_MODEL_PUBLISH
+#ifndef GENERIC_CLIENT_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
+* @retval MOBLEUINT8 : elementNumber
*/
MOBLEUINT8 BLEMesh_ModelsGetElementNumber(MOBLE_ADDRESS dst_peer)
{
@@ -464,46 +1018,35 @@ MOBLEUINT8 BLEMesh_ModelsGetElementNumber(MOBLE_ADDRESS dst_peer)
}
/**
-* @brief Check Subscription of Elements for Group Address for selected Model
+* @brief Get the Element Index for selected Model
* @param dst_peer : Destination Address received
-* @param elementNumber : Number of element to check Subscription
-* @retval MOBLE_RESULT status of result
+* @retval MOBLEUINT8 : elementIndex
*/
-MOBLE_RESULT BLEMesh_ModelsCheckSubscription(MOBLE_ADDRESS dst_peer, \
- MOBLEUINT8 elementNumber)
+MOBLEUINT8 BLEMesh_ModelsGetElementIndex(MOBLE_ADDRESS dst_peer)
{
- 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);
+ MOBLE_ADDRESS nodeAddress;
+ MOBLEUINT8 elementIndex;
- for(uint8_t list=0; list<length; list++)
- {
- if(dst_peer == subscriptionList[list])
- {
- status = MOBLE_RESULT_SUCCESS;
- break;
- }
- }
+ nodeAddress = BLEMesh_GetAddress();
+ elementIndex =(dst_peer - nodeAddress);
- return status;
+ return elementIndex;
}
+
/**
* @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 *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* @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,
+void BLEMesh_ModelsDelayPacket(MODEL_MessageHeader_t *pmsgParams,
MOBLEUINT8 command,
MOBLEUINT8 const * data,
MOBLEUINT32 length)
@@ -541,8 +1084,11 @@ void BLEMesh_ModelsDelayPacket(MOBLE_ADDRESS peer,
}
}
- Appli_PendingPackets.head->peer = peer;
- Appli_PendingPackets.head->dst = dst;
+ Appli_PendingPackets.head->peer = pmsgParams->peer_addr;
+ Appli_PendingPackets.head->dst = pmsgParams->dst_peer;
+ Appli_PendingPackets.head->elementIndex = pmsgParams->elementIndex;
+ Appli_PendingPackets.head->appKeyOffset = pmsgParams->rcvdAppKeyOffset;
+ Appli_PendingPackets.head->netKeyOffset = pmsgParams->rcvdNetKeyOffset;
Appli_PendingPackets.head->command = command;
Appli_PendingPackets.head->length = length;
for (MOBLEUINT8 count=0; count<length; count++)
@@ -558,6 +1104,7 @@ void BLEMesh_ModelsDelayPacket(MOBLE_ADDRESS peer,
void BLEMesh_ModelsSendDelayedPacket(void)
{
APPLI_SEND_RESPONSE_MODULE* ptr;
+ MODEL_MessageHeader_t msgParam;
MOBLEUINT8 temp_index;
if ((Appli_PendingPackets.packet_count != 0) &&
@@ -571,9 +1118,17 @@ void BLEMesh_ModelsSendDelayedPacket(void)
-count)%MAX_PENDING_PACKETS_QUE_SIZE;
ptr = Appli_PendingPackets.packet + temp_index;
+ /* Initialize the messageParam*/
+ msgParam.dst_peer = ptr->dst;
+ msgParam.peer_addr = ptr->peer;
+ msgParam.elementIndex = 0;
+ msgParam.rcvdAppKeyOffset = 0;
+ msgParam.rcvdNetKeyOffset = 0;
+ msgParam.rssi = 0;
+ msgParam.ttl = 0;
+
VendorModel_SendResponse(VENDOR_STMICRO_CID,
- ptr->peer,
- ptr->dst,
+ &msgParam,
ptr->command,
ptr->data,
ptr->length);
@@ -587,14 +1142,14 @@ void BLEMesh_ModelsSendDelayedPacket(void)
* 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 elementIdx element index
* @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,
+MOBLE_RESULT MeshClient_SetRemotePublication(MOBLEUINT32 modelId, MOBLEUINT8 elementIdx,
MOBLEUINT16 msg_opcode, MOBLEUINT8 const *msg_buff,
MOBLEUINT32 length, MOBLEBOOL ack_flag,
MOBLEUINT8 isVendor)
@@ -604,7 +1159,7 @@ MOBLE_RESULT MeshClient_SetRemotePublication(MOBLEUINT32 modelId, MOBLEUINT16 el
srcAddress = BLEMesh_GetAddress();
srcAddress += elementIdx; /* Get the Address to send in the message */
- return BLEMesh_SetRemotePublication(GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
+ return BLEMesh_SetRemotePublication(modelId,
srcAddress ,
msg_opcode ,
msg_buff, length,
@@ -634,4 +1189,4 @@ __weak void Test_Process(void)
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/models_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/models_if.h
index 486e0bcec..f00d2d28d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/models_if.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/models_if.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
@@ -33,18 +33,19 @@
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 BLEMesh_ModelsGetElementIndex(MOBLE_ADDRESS dst_peer);
+void BLEMesh_ModelsDelayPacket(MODEL_MessageHeader_t *pmsgParams, 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,
+MOBLE_RESULT MeshClient_SetRemotePublication(MOBLEUINT32 modelId, MOBLEUINT8 elementIdx,
MOBLEUINT16 msg_opcode, MOBLEUINT8 const *msg_buff,
MOBLEUINT32 length, MOBLEBOOL ack_flag,
MOBLEUINT8 isVendor);
#endif /* __MODELS_H */
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/pal_nvm.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/pal_nvm.c
index 60ae48e6d..12df6a87f 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/pal_nvm.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/pal_nvm.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
@@ -30,7 +30,7 @@
#include "hw_flash.h"
/* Private define ------------------------------------------------------------*/
-#define FLASH_SECTOR_SIZE 0x1000
+#define FLASH_SECTOR_SIZE 0x1000
/* Private variables ---------------------------------------------------------*/
@@ -168,7 +168,7 @@ MOBLE_RESULT PalNvmCompare(MOBLEUINT32 address,
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
MOBLEUINT32 i;
-
+
#ifdef ENABLE_SAVE_MODEL_STATE_NVM
// printf("MoblePalNvmCompare >>>\r\n");
@@ -272,9 +272,9 @@ MOBLE_RESULT PalNvmErase(MOBLEUINT32 address,
* @retval Result
*/
MOBLE_RESULT PalNvmWrite(MOBLEUINT32 address,
- MOBLEUINT32 offset,
- void const *buf,
- MOBLEUINT32 size)
+ MOBLEUINT32 offset,
+ void const *buf,
+ MOBLEUINT32 size)
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
@@ -436,8 +436,8 @@ static MOBLE_RESULT PalNvmBackupProcess(void)
*/
MOBLE_RESULT PalNvmProcess(void)
{
- /* do nothing */
- return MOBLE_RESULT_SUCCESS;
+ /* do nothing */
+ return MOBLE_RESULT_SUCCESS;
}
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/sensor_cfg_usr.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/sensor_cfg_usr.h
new file mode 100644
index 000000000..e7a4df96a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/sensor_cfg_usr.h
@@ -0,0 +1,685 @@
+/**
+******************************************************************************
+* @file sensor_cfg_usr.h
+* @author BLE Mesh Team
+* @brief sensor server initialization parameters
+******************************************************************************
+* @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 __SENSOR_USR_CFG_H
+#define __SENSOR_USR_CFG_H
+
+/**
+* Maximum count of settings that can be supported by a sensor
+* E.g., 5 sensors
+* 1st sensor has 2 settings
+* 2nd sensor has 3 settings
+* 3rd sensor has 2 settings
+* 4th sensor has 1 setting
+* 5th sensor has 2 settings
+* This value is max(2, 3, 2, 1, 2) = 3
+* value is >=1
+*/
+#define SENSOR_MAX_SETTINGS_COUNT 2
+
+/**
+* Maximum count of series column that is supported by a sensor
+* E.g., 2 sensors supporting series column
+* One sensor supports 2 columns while other sensor supports 20 columns
+* This value is max(2, 20) = 20
+* value is >=1
+*/
+#define SENSOR_MAX_SERIES_COUNT 1
+
+/**
+* Total sensors count on all elements
+* It is sum of sensors count on all elements
+* Sensor init fails in case of mismatch with sensor server initialization parameters
+*/
+#define TOTAL_SENSORS_COUNT 2
+
+/**
+* Sum of sensor settings on all sensors on all elements
+* Sensor init fails in case of mismatch with sensor server initialization parameters
+*/
+#define TOTAL_SENSOR_SETTINGS_COUNT 4
+
+/**
+* Sum of sensor series columns on all sensors on all elements
+* Sensor init fails in case of mismatch with sensor server initialization parameters
+*/
+#define TOTAL_SENSOR_SERIES_COLUMN_COUNT 0
+
+
+/**
+* This structure contains sensor setting initialization parameters
+*/
+typedef struct
+{
+ uint16_t settingPropertyId;
+ uint8_t settingAccess;
+ uint32_t settingRaw;
+}sensor_settings_init_params_t;
+
+
+/**
+* This structure contains sensor series column initialization parameters
+*/
+typedef struct
+{
+ uint32_t rawX;
+ uint32_t columnWidth;
+}sensor_series_column_init_params_t;
+
+
+/**
+* This structure contains sensor initialization parameters
+*/
+typedef struct
+{
+ uint8_t elementIdx;
+ uint16_t propertyId;
+ uint16_t positiveTolerance;
+ uint16_t negativeTolerance;
+ uint8_t samplingFunction;
+ uint8_t measurementPeriod;
+ uint8_t updateInterval;
+ uint8_t dataLength;
+ uint8_t cadenceState;
+ uint32_t valuesRange;
+ uint8_t settingsCount;
+ sensor_settings_init_params_t settings[SENSOR_MAX_SETTINGS_COUNT];
+ uint16_t seriesCount;
+ sensor_series_column_init_params_t seriesColumn[SENSOR_MAX_SERIES_COUNT];
+}sensor_init_params_t;
+
+
+/**
+* This structure contains sensor server initialization parameters
+*/
+typedef struct
+{
+ uint8_t sensorsCount;
+ sensor_init_params_t sensorInitParams[TOTAL_SENSORS_COUNT];
+} sensor_server_init_params_t;
+
+
+/**
+* Below section represents initialization parameters of sensors supported
+* Define sensors in ascending order of element index followed by ascending
+* order of Property IDs else initialization of sensor structure would fail
+* Single element can support one instance of sensor PID, there can't be multiple
+* instances of same PID on same element
+* For e.g. 10 sensors with PID (PID1 < PIDn ... < PID7) supported on 3 elements
+* with element index (0, 1 and 2) in below fashion
+* Element index 0 supports sensors corresponding to PID3, PID4, PID6 and PID7
+* Element index 1 supports sensors corresponding to PID2, PID4, PID5 and PID6
+* Element index 2 supports sensors corresponding to PID1, PID5
+* Corrector order of naming sensors (SENSORX) is
+* Element index 0 -> SENSOR1(PID3), SENSOR2(PID4), SENSOR3(PID6) and SENSOR4(PID7)
+* Element index 1 -> SENSOR5(PID2), SENSOR6(PID4), SENSOR7(PID5), and SENSOR8(PID6)
+* Element index 2 -> SENSOR9(PID1), and SENSOR10(PID5)
+*/
+
+/* Sensor 1 initialization */
+
+#define SENSOR1_ELEMENT_IDX 0
+#define SENSOR1_PROPERTY_ID PRESENT_AMBIENT_TEMPERATURE_PID
+#define SENSOR1_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR1_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR1_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR1_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR1_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR1_DATA_LENGTH 1
+#define SENSOR1_CADENCE_STATE SENSOR_CADENCE_SUPPORTED
+#define SENSOR1_VALUES_RANGE 254
+#define SENSOR1_SETTINGS_COUNT 2
+#define SENSOR1_SETTING1_PROPERTY_ID 0x00BB
+#define SENSOR1_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR1_SETTING1_RAW 0
+#define SENSOR1_SETTING2_PROPERTY_ID 0x00AD
+#define SENSOR1_SETTING2_ACCESS SENSOR_SETTING_ACCESS_READ_WRITE
+#define SENSOR1_SETTING2_RAW 0
+#define SENSOR1_SERIES_COUNT 0
+
+#define SENSOR1_SETTINGS1_INIT_PARAMS \
+{\
+ SENSOR1_SETTING1_PROPERTY_ID,\
+ SENSOR1_SETTING1_ACCESS,\
+ SENSOR1_SETTING1_RAW \
+}
+
+#define SENSOR1_SETTINGS2_INIT_PARAMS \
+{\
+ SENSOR1_SETTING2_PROPERTY_ID,\
+ SENSOR1_SETTING2_ACCESS,\
+ SENSOR1_SETTING2_RAW \
+}
+
+#define SENSOR1_INIT_PARAMS \
+{\
+ SENSOR1_ELEMENT_IDX,\
+ SENSOR1_PROPERTY_ID,\
+ SENSOR1_POSITIVE_TOLERANCE,\
+ SENSOR1_NEGATIVE_TOLERANCE,\
+ SENSOR1_SAMPLING_FUNCTION,\
+ SENSOR1_MEASUREMENT_PERIOD,\
+ SENSOR1_UPDATE_INTERVAL,\
+ SENSOR1_DATA_LENGTH,\
+ SENSOR1_CADENCE_STATE,\
+ SENSOR1_VALUES_RANGE,\
+ SENSOR1_SETTINGS_COUNT,\
+ {\
+ SENSOR1_SETTINGS1_INIT_PARAMS,\
+ SENSOR1_SETTINGS2_INIT_PARAMS\
+ },\
+ SENSOR1_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+/* Sensor 2 initialization */
+
+#define SENSOR2_ELEMENT_IDX 0
+#define SENSOR2_PROPERTY_ID PRESSURE_PID
+#define SENSOR2_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR2_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR2_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR2_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR2_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR2_DATA_LENGTH 4
+#define SENSOR2_CADENCE_STATE SENSOR_CADENCE_NOT_SUPPORTED
+#define SENSOR2_VALUES_RANGE 500
+#define SENSOR2_SETTINGS_COUNT 2
+#define SENSOR2_SETTING1_PROPERTY_ID 0x0AAA
+#define SENSOR2_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR2_SETTING1_RAW 35666
+#define SENSOR2_SETTING2_PROPERTY_ID 0x0AAC
+#define SENSOR2_SETTING2_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR2_SETTING2_RAW 33666
+#define SENSOR2_SERIES_COUNT 0
+
+#define SENSOR2_SETTINGS1_INIT_PARAMS \
+{\
+ SENSOR2_SETTING1_PROPERTY_ID,\
+ SENSOR2_SETTING1_ACCESS,\
+ SENSOR2_SETTING1_RAW\
+}
+
+#define SENSOR2_SETTINGS2_INIT_PARAMS \
+{\
+ SENSOR2_SETTING2_PROPERTY_ID,\
+ SENSOR2_SETTING2_ACCESS,\
+ SENSOR2_SETTING2_RAW\
+}
+
+#define SENSOR2_INIT_PARAMS \
+{\
+ SENSOR2_ELEMENT_IDX,\
+ SENSOR2_PROPERTY_ID,\
+ SENSOR2_POSITIVE_TOLERANCE,\
+ SENSOR2_NEGATIVE_TOLERANCE,\
+ SENSOR2_SAMPLING_FUNCTION,\
+ SENSOR2_MEASUREMENT_PERIOD,\
+ SENSOR2_UPDATE_INTERVAL,\
+ SENSOR2_DATA_LENGTH,\
+ SENSOR2_CADENCE_STATE,\
+ SENSOR2_VALUES_RANGE,\
+ SENSOR2_SETTINGS_COUNT,\
+ {\
+ SENSOR2_SETTINGS1_INIT_PARAMS,\
+ SENSOR2_SETTINGS2_INIT_PARAMS\
+ },\
+ SENSOR2_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+/**
+* Combined defined of all sensors intialization parameters
+*/
+
+#define SENSOR_SERVER_INIT_PARAMS \
+{\
+ TOTAL_SENSORS_COUNT,\
+ {\
+ SENSOR1_INIT_PARAMS,\
+ SENSOR2_INIT_PARAMS,\
+ }\
+}
+#endif /* __SENSOR_USR_CFG_H */
+
+/*
+
+Example for multiple sensors with series column support
+
+#define SENSOR_MAX_SETTINGS_COUNT 3
+#define SENSOR_MAX_SERIES_COUNT 20
+#define TOTAL_SENSORS_COUNT 5
+#define TOTAL_SENSOR_SETTINGS_COUNT 9
+#define TOTAL_SENSOR_SERIES_COLUMN_COUNT 22
+
+#define SENSOR1_ELEMENT_IDX 0
+#define SENSOR1_PROPERTY_ID PEOPLE_COUNT_PID
+#define SENSOR1_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR1_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR1_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR1_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR1_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR1_DATA_LENGTH 2
+#define SENSOR1_CADENCE_STATE SENSOR_CADENCE_SUPPORTED
+#define SENSOR1_VALUES_RANGE 1000
+#define SENSOR1_SETTINGS_COUNT 3
+#define SENSOR1_SETTING1_PROPERTY_ID 0x000A
+#define SENSOR1_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR1_SETTING1_RAW 234
+#define SENSOR1_SETTING2_PROPERTY_ID 0x000C
+#define SENSOR1_SETTING2_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR1_SETTING2_RAW 246
+#define SENSOR1_SETTING3_PROPERTY_ID 0x0010
+#define SENSOR1_SETTING3_ACCESS SENSOR_SETTING_ACCESS_READ_WRITE
+#define SENSOR1_SETTING3_RAW 278
+#define SENSOR1_SERIES_COUNT 0
+
+#define SENSOR1_SETTINGS1_INIT_PARAMS \
+{\
+ SENSOR1_SETTING1_PROPERTY_ID,\
+ SENSOR1_SETTING1_ACCESS,\
+ SENSOR1_SETTING1_RAW\
+}
+
+#define SENSOR1_SETTINGS2_INIT_PARAMS \
+{\
+ SENSOR1_SETTING2_PROPERTY_ID,\
+ SENSOR1_SETTING2_ACCESS,\
+ SENSOR1_SETTING2_RAW\
+}
+
+#define SENSOR1_SETTINGS3_INIT_PARAMS \
+{\
+ SENSOR1_SETTING3_PROPERTY_ID,\
+ SENSOR1_SETTING3_ACCESS,\
+ SENSOR1_SETTING3_RAW\
+}
+
+#define SENSOR1_INIT_PARAMS \
+{\
+ SENSOR1_ELEMENT_IDX,\
+ SENSOR1_PROPERTY_ID,\
+ SENSOR1_POSITIVE_TOLERANCE,\
+ SENSOR1_NEGATIVE_TOLERANCE,\
+ SENSOR1_SAMPLING_FUNCTION,\
+ SENSOR1_MEASUREMENT_PERIOD,\
+ SENSOR1_UPDATE_INTERVAL,\
+ SENSOR1_DATA_LENGTH,\
+ SENSOR1_CADENCE_STATE,\
+ SENSOR1_VALUES_RANGE,\
+ SENSOR1_SETTINGS_COUNT,\
+ {\
+ SENSOR1_SETTINGS1_INIT_PARAMS,\
+ SENSOR1_SETTINGS2_INIT_PARAMS,\
+ SENSOR1_SETTINGS3_INIT_PARAMS\
+ },\
+ SENSOR1_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+#define SENSOR2_ELEMENT_IDX 0
+#define SENSOR2_PROPERTY_ID DESIRED_AMBIENT_TEMPERATURE_PID
+#define SENSOR2_POSITIVE_TOLERANCE 0xabc
+#define SENSOR2_NEGATIVE_TOLERANCE 0xdef
+#define SENSOR2_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_RMS
+#define SENSOR2_MEASUREMENT_PERIOD 0x04
+#define SENSOR2_UPDATE_INTERVAL 0x05
+#define SENSOR2_DATA_LENGTH 1
+#define SENSOR2_CADENCE_STATE SENSOR_CADENCE_SUPPORTED
+#define SENSOR2_VALUES_RANGE 100
+#define SENSOR2_SETTINGS_COUNT 2
+#define SENSOR2_SETTING1_PROPERTY_ID 0x00BB
+#define SENSOR2_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR2_SETTING1_RAW 345
+#define SENSOR2_SETTING2_PROPERTY_ID 0x00AD
+#define SENSOR2_SETTING2_ACCESS SENSOR_SETTING_ACCESS_READ_WRITE
+#define SENSOR2_SETTING2_RAW 435
+#define SENSOR2_SERIES_COUNT 0
+
+#define SENSOR2_SETTINGS1_INIT_PARAMS \
+{\
+ SENSOR2_SETTING1_PROPERTY_ID,\
+ SENSOR2_SETTING1_ACCESS,\
+ SENSOR2_SETTING1_RAW\
+}
+
+#define SENSOR2_SETTINGS2_INIT_PARAMS \
+{\
+ SENSOR2_SETTING2_PROPERTY_ID,\
+ SENSOR2_SETTING2_ACCESS,\
+ SENSOR2_SETTING2_RAW \
+}
+
+#define SENSOR2_INIT_PARAMS \
+{\
+ SENSOR2_ELEMENT_IDX,\
+ SENSOR2_PROPERTY_ID,\
+ SENSOR2_POSITIVE_TOLERANCE,\
+ SENSOR2_NEGATIVE_TOLERANCE,\
+ SENSOR2_SAMPLING_FUNCTION,\
+ SENSOR2_MEASUREMENT_PERIOD,\
+ SENSOR2_UPDATE_INTERVAL,\
+ SENSOR2_DATA_LENGTH,\
+ SENSOR2_CADENCE_STATE,\
+ SENSOR2_VALUES_RANGE,\
+ SENSOR2_SETTINGS_COUNT,\
+ {\
+ SENSOR2_SETTINGS1_INIT_PARAMS,\
+ SENSOR2_SETTINGS2_INIT_PARAMS\
+ },\
+ SENSOR2_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+#define SENSOR3_ELEMENT_IDX 0
+#define SENSOR3_PROPERTY_ID PRESSURE_PID
+#define SENSOR3_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR3_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR3_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR3_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR3_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR3_DATA_LENGTH 2
+#define SENSOR3_CADENCE_STATE SENSOR_CADENCE_NOT_SUPPORTED
+#define SENSOR3_VALUES_RANGE 500
+#define SENSOR3_SETTINGS_COUNT 2
+#define SENSOR3_SETTING1_PROPERTY_ID 0x0AAA
+#define SENSOR3_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR3_SETTING1_RAW 35666
+#define SENSOR3_SETTING2_PROPERTY_ID 0x0AAC
+#define SENSOR3_SETTING2_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR3_SETTING2_RAW 33666
+#define SENSOR3_SERIES_COUNT 20
+#define SENSOR3_SERIES1_RAWX 0
+#define SENSOR3_SERIES1_CW 10
+#define SENSOR3_SERIES2_RAWX 23
+#define SENSOR3_SERIES2_CW 10
+#define SENSOR3_SERIES3_RAWX 34
+#define SENSOR3_SERIES3_CW 10
+#define SENSOR3_SERIES4_RAWX 35
+#define SENSOR3_SERIES4_CW 10
+#define SENSOR3_SERIES5_RAWX 36
+#define SENSOR3_SERIES5_CW 10
+#define SENSOR3_SERIES6_RAWX 40
+#define SENSOR3_SERIES6_CW 10
+#define SENSOR3_SERIES7_RAWX 41
+#define SENSOR3_SERIES7_CW 10
+#define SENSOR3_SERIES8_RAWX 42
+#define SENSOR3_SERIES8_CW 10
+#define SENSOR3_SERIES9_RAWX 43
+#define SENSOR3_SERIES9_CW 10
+#define SENSOR3_SERIES10_RAWX 45
+#define SENSOR3_SERIES10_CW 10
+#define SENSOR3_SERIES11_RAWX 46
+#define SENSOR3_SERIES11_CW 10
+#define SENSOR3_SERIES12_RAWX 47
+#define SENSOR3_SERIES12_CW 10
+#define SENSOR3_SERIES13_RAWX 48
+#define SENSOR3_SERIES13_CW 10
+#define SENSOR3_SERIES14_RAWX 49
+#define SENSOR3_SERIES14_CW 10
+#define SENSOR3_SERIES15_RAWX 50
+#define SENSOR3_SERIES15_CW 10
+#define SENSOR3_SERIES16_RAWX 51
+#define SENSOR3_SERIES16_CW 10
+#define SENSOR3_SERIES17_RAWX 52
+#define SENSOR3_SERIES17_CW 10
+#define SENSOR3_SERIES18_RAWX 53
+#define SENSOR3_SERIES18_CW 10
+#define SENSOR3_SERIES19_RAWX 55
+#define SENSOR3_SERIES19_CW 10
+#define SENSOR3_SERIES20_RAWX 89
+#define SENSOR3_SERIES20_CW 10
+
+#define SENSOR3_SETTINGS1_INIT_PARAMS \
+{\
+ SENSOR3_SETTING1_PROPERTY_ID,\
+ SENSOR3_SETTING1_ACCESS,\
+ SENSOR3_SETTING1_RAW\
+}
+
+#define SENSOR3_SETTINGS2_INIT_PARAMS \
+{\
+ SENSOR3_SETTING2_PROPERTY_ID,\
+ SENSOR3_SETTING2_ACCESS,\
+ SENSOR3_SETTING2_RAW\
+}
+
+#define SENSOR3_COLUMN1_INIT_PARAMS {SENSOR3_SERIES1_RAWX,SENSOR3_SERIES1_CW}
+#define SENSOR3_COLUMN2_INIT_PARAMS {SENSOR3_SERIES2_RAWX,SENSOR3_SERIES2_CW}
+#define SENSOR3_COLUMN3_INIT_PARAMS {SENSOR3_SERIES3_RAWX,SENSOR3_SERIES3_CW}
+#define SENSOR3_COLUMN4_INIT_PARAMS {SENSOR3_SERIES4_RAWX,SENSOR3_SERIES4_CW}
+#define SENSOR3_COLUMN5_INIT_PARAMS {SENSOR3_SERIES5_RAWX,SENSOR3_SERIES5_CW}
+#define SENSOR3_COLUMN6_INIT_PARAMS {SENSOR3_SERIES6_RAWX,SENSOR3_SERIES6_CW}
+#define SENSOR3_COLUMN7_INIT_PARAMS {SENSOR3_SERIES7_RAWX,SENSOR3_SERIES7_CW}
+#define SENSOR3_COLUMN8_INIT_PARAMS {SENSOR3_SERIES8_RAWX,SENSOR3_SERIES8_CW}
+#define SENSOR3_COLUMN9_INIT_PARAMS {SENSOR3_SERIES9_RAWX,SENSOR3_SERIES9_CW}
+#define SENSOR3_COLUMN10_INIT_PARAMS {SENSOR3_SERIES10_RAWX,SENSOR3_SERIES10_CW}
+#define SENSOR3_COLUMN11_INIT_PARAMS {SENSOR3_SERIES11_RAWX,SENSOR3_SERIES11_CW}
+#define SENSOR3_COLUMN12_INIT_PARAMS {SENSOR3_SERIES12_RAWX,SENSOR3_SERIES12_CW}
+#define SENSOR3_COLUMN13_INIT_PARAMS {SENSOR3_SERIES13_RAWX,SENSOR3_SERIES13_CW}
+#define SENSOR3_COLUMN14_INIT_PARAMS {SENSOR3_SERIES14_RAWX,SENSOR3_SERIES14_CW}
+#define SENSOR3_COLUMN15_INIT_PARAMS {SENSOR3_SERIES15_RAWX,SENSOR3_SERIES15_CW}
+#define SENSOR3_COLUMN16_INIT_PARAMS {SENSOR3_SERIES16_RAWX,SENSOR3_SERIES16_CW}
+#define SENSOR3_COLUMN17_INIT_PARAMS {SENSOR3_SERIES17_RAWX,SENSOR3_SERIES17_CW}
+#define SENSOR3_COLUMN18_INIT_PARAMS {SENSOR3_SERIES18_RAWX,SENSOR3_SERIES18_CW}
+#define SENSOR3_COLUMN19_INIT_PARAMS {SENSOR3_SERIES19_RAWX,SENSOR3_SERIES19_CW}
+#define SENSOR3_COLUMN20_INIT_PARAMS {SENSOR3_SERIES20_RAWX,SENSOR3_SERIES20_CW}
+
+#define SENSOR3_INIT_PARAMS \
+{\
+ SENSOR3_ELEMENT_IDX,\
+ SENSOR3_PROPERTY_ID,\
+ SENSOR3_POSITIVE_TOLERANCE,\
+ SENSOR3_NEGATIVE_TOLERANCE,\
+ SENSOR3_SAMPLING_FUNCTION,\
+ SENSOR3_MEASUREMENT_PERIOD,\
+ SENSOR3_UPDATE_INTERVAL,\
+ SENSOR3_DATA_LENGTH,\
+ SENSOR3_CADENCE_STATE,\
+ SENSOR3_VALUES_RANGE,\
+ SENSOR3_SETTINGS_COUNT,\
+ {\
+ SENSOR3_SETTINGS1_INIT_PARAMS,\
+ SENSOR3_SETTINGS2_INIT_PARAMS\
+ },\
+ SENSOR3_SERIES_COUNT,\
+ {\
+ SENSOR3_COLUMN1_INIT_PARAMS,\
+ SENSOR3_COLUMN2_INIT_PARAMS,\
+ SENSOR3_COLUMN3_INIT_PARAMS,\
+ SENSOR3_COLUMN4_INIT_PARAMS,\
+ SENSOR3_COLUMN5_INIT_PARAMS,\
+ SENSOR3_COLUMN6_INIT_PARAMS,\
+ SENSOR3_COLUMN7_INIT_PARAMS,\
+ SENSOR3_COLUMN8_INIT_PARAMS,\
+ SENSOR3_COLUMN9_INIT_PARAMS,\
+ SENSOR3_COLUMN10_INIT_PARAMS,\
+ SENSOR3_COLUMN11_INIT_PARAMS,\
+ SENSOR3_COLUMN12_INIT_PARAMS,\
+ SENSOR3_COLUMN13_INIT_PARAMS,\
+ SENSOR3_COLUMN14_INIT_PARAMS,\
+ SENSOR3_COLUMN15_INIT_PARAMS,\
+ SENSOR3_COLUMN16_INIT_PARAMS,\
+ SENSOR3_COLUMN17_INIT_PARAMS,\
+ SENSOR3_COLUMN18_INIT_PARAMS,\
+ SENSOR3_COLUMN19_INIT_PARAMS,\
+ SENSOR3_COLUMN20_INIT_PARAMS}\
+}
+
+#define SENSOR4_ELEMENT_IDX 0
+#define SENSOR4_PROPERTY_ID HUMIDITY_PID
+#define SENSOR4_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR4_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR4_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR4_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR4_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR4_DATA_LENGTH 2
+#define SENSOR4_CADENCE_STATE SENSOR_CADENCE_SUPPORTED
+#define SENSOR4_VALUES_RANGE 200
+#define SENSOR4_SETTINGS_COUNT 1
+#define SENSOR4_SETTING1_PROPERTY_ID 0xAAAA
+#define SENSOR4_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ_WRITE
+#define SENSOR4_SETTING1_RAW 35666
+#define SENSOR4_SERIES_COUNT 0
+
+#define SENSOR4_SETTINGS_INIT_PARAMS \
+{\
+ SENSOR4_SETTING1_PROPERTY_ID,\
+ SENSOR4_SETTING1_ACCESS,\
+ SENSOR4_SETTING1_RAW\
+}
+
+#define SENSOR4_INIT_PARAMS \
+{\
+ SENSOR4_ELEMENT_IDX,\
+ SENSOR4_PROPERTY_ID,\
+ SENSOR4_POSITIVE_TOLERANCE,\
+ SENSOR4_NEGATIVE_TOLERANCE,\
+ SENSOR4_SAMPLING_FUNCTION,\
+ SENSOR4_MEASUREMENT_PERIOD,\
+ SENSOR4_UPDATE_INTERVAL,\
+ SENSOR4_DATA_LENGTH,\
+ SENSOR4_CADENCE_STATE,\
+ SENSOR4_VALUES_RANGE,\
+ SENSOR4_SETTINGS_COUNT,\
+ {\
+ SENSOR4_SETTINGS_INIT_PARAMS\
+ },\
+ SENSOR4_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+#define SENSOR5_ELEMENT_IDX 0
+#define SENSOR5_PROPERTY_ID TIME_OF_FLIGHT_PID
+#define SENSOR5_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR5_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR5_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR5_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR5_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR5_DATA_LENGTH 2
+#define SENSOR5_CADENCE_STATE SENSOR_CADENCE_NOT_SUPPORTED
+#define SENSOR5_VALUES_RANGE 0
+#define SENSOR5_SETTINGS_COUNT 1
+#define SENSOR5_SETTING1_PROPERTY_ID 0xAAFA
+#define SENSOR5_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR5_SETTING1_RAW 35666
+#define SENSOR5_SERIES_COUNT 2
+#define SENSOR5_SERIES1_RAWX 20
+#define SENSOR5_SERIES1_CW 30
+#define SENSOR5_SERIES2_RAWX 50
+#define SENSOR5_SERIES2_CW 40
+
+#define SENSOR5_SETTINGS_INIT_PARAMS \
+{\
+ SENSOR5_SETTING1_PROPERTY_ID,\
+ SENSOR5_SETTING1_ACCESS,\
+ SENSOR5_SETTING1_RAW\
+}
+
+#define SENSOR5_COLUMN1_INIT_PARAMS {SENSOR5_SERIES1_RAWX,SENSOR5_SERIES1_CW}
+#define SENSOR5_COLUMN2_INIT_PARAMS {SENSOR5_SERIES2_RAWX,SENSOR5_SERIES2_CW}
+
+#define SENSOR5_INIT_PARAMS \
+{\
+ SENSOR5_ELEMENT_IDX,\
+ SENSOR5_PROPERTY_ID,\
+ SENSOR5_POSITIVE_TOLERANCE,\
+ SENSOR5_NEGATIVE_TOLERANCE,\
+ SENSOR5_SAMPLING_FUNCTION,\
+ SENSOR5_MEASUREMENT_PERIOD,\
+ SENSOR5_UPDATE_INTERVAL,\
+ SENSOR5_DATA_LENGTH,\
+ SENSOR5_CADENCE_STATE,\
+ SENSOR5_VALUES_RANGE,\
+ SENSOR5_SETTINGS_COUNT,\
+ {\
+ SENSOR5_SETTINGS_INIT_PARAMS\
+ },\
+ SENSOR5_SERIES_COUNT,\
+ {\
+ SENSOR5_COLUMN1_INIT_PARAMS,\
+ SENSOR5_COLUMN2_INIT_PARAMS\
+ }\
+}
+
+#define SENSOR6_ELEMENT_IDX 0
+#define SENSOR6_PROPERTY_ID PRESENCE_PID
+#define SENSOR6_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR6_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR6_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR6_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR6_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR6_DATA_LENGTH 1
+#define SENSOR6_CADENCE_STATE SENSOR_CADENCE_NOT_SUPPORTED
+#define SENSOR6_VALUES_RANGE 0
+#define SENSOR6_SETTINGS_COUNT 0
+#define SENSOR6_SERIES_COUNT 0
+
+#define SENSOR6_SETTINGS_INIT_PARAMS \
+{\
+ {\
+ {0}\
+ }\
+}
+
+#define SENSOR6_INIT_PARAMS \
+{\
+ SENSOR6_ELEMENT_IDX,\
+ SENSOR6_PROPERTY_ID,\
+ SENSOR6_POSITIVE_TOLERANCE,\
+ SENSOR6_NEGATIVE_TOLERANCE,\
+ SENSOR6_SAMPLING_FUNCTION,\
+ SENSOR6_MEASUREMENT_PERIOD,\
+ SENSOR6_UPDATE_INTERVAL,\
+ SENSOR6_DATA_LENGTH,\
+ SENSOR6_CADENCE_STATE,\
+ SENSOR6_VALUES_RANGE,\
+ SENSOR6_SETTINGS_COUNT,\
+ {\
+ {0}\
+ },\
+ SENSOR6_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+#define SENSOR_SERVER_INIT_PARAMS \
+{\
+ TOTAL_SENSORS_COUNT,\
+ {\
+ SENSOR1_INIT_PARAMS,\
+ SENSOR2_INIT_PARAMS,\
+ SENSOR3_INIT_PARAMS,\
+ SENSOR4_INIT_PARAMS,\
+ SENSOR5_INIT_PARAMS\
+ }\
+}
+*/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/tl_dbg_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/tl_dbg_conf.h
new file mode 100644
index 000000000..b468b2863
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/tl_dbg_conf.h
@@ -0,0 +1,126 @@
+/**
+ ******************************************************************************
+ * File Name : tl_dbg_conf.h
+ * Description : Debug configuration file for stm32wpan transport layer 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
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __TL_DBG_CONF_H
+#define __TL_DBG_CONF_H
+
+/* USER CODE BEGIN Tl_Conf */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_conf.h" /* required as some configuration used in dbg_trace.h are set there */
+#include "dbg_trace.h"
+#include "hw_if.h"
+
+/**
+ * Enable or Disable traces
+ * The raw data output is the hci binary packet format as specified by the BT specification *
+ */
+#define TL_SHCI_CMD_DBG_EN 0 /* Reports System commands sent to CPU2 and the command response */
+#define TL_SHCI_CMD_DBG_RAW_EN 0 /* Reports raw data System commands sent to CPU2 and the command response */
+#define TL_SHCI_EVT_DBG_EN 0 /* Reports System Asynchronous Events received from CPU2 */
+#define TL_SHCI_EVT_DBG_RAW_EN 0 /* Reports raw data System Asynchronous Events received from CPU2 */
+
+#define TL_HCI_CMD_DBG_EN 0 /* Reports BLE command sent to CPU2 and the command response */
+#define TL_HCI_CMD_DBG_RAW_EN 0 /* Reports raw data BLE command sent to CPU2 and the command response */
+#define TL_HCI_EVT_DBG_EN 0 /* Reports BLE Asynchronous Events received from CPU2 */
+#define TL_HCI_EVT_DBG_RAW_EN 0 /* Reports raw data BLE Asynchronous Events received from CPU2 */
+
+#define TL_MM_DBG_EN 0 /* Reports the informations of the buffer released to CPU2 */
+
+/**
+ * Macro definition
+ */
+
+/**
+ * System Transport Layer
+ */
+#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_CMD_DBG_RAW_EN != 0)
+#define TL_SHCI_CMD_DBG_RAW(_PDATA_, _SIZE_) HW_UART_Transmit(hw_uart1, (uint8_t*)_PDATA_, _SIZE_, (~0))
+#else
+#define TL_SHCI_CMD_DBG_RAW(...)
+#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
+
+#if (TL_SHCI_EVT_DBG_RAW_EN != 0)
+#define TL_SHCI_EVT_DBG_RAW(_PDATA_, _SIZE_) HW_UART_Transmit(hw_uart1, (uint8_t*)_PDATA_, _SIZE_, (~0))
+#else
+#define TL_SHCI_EVT_DBG_RAW(...)
+#endif
+
+/**
+ * BLE Transport Layer
+ */
+#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_CMD_DBG_RAW_EN != 0)
+#define TL_HCI_CMD_DBG_RAW(_PDATA_, _SIZE_) HW_UART_Transmit(hw_uart1, (uint8_t*)_PDATA_, _SIZE_, (~0))
+#else
+#define TL_HCI_CMD_DBG_RAW(...)
+#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
+
+#if (TL_HCI_EVT_DBG_RAW_EN != 0)
+#define TL_HCI_EVT_DBG_RAW(_PDATA_, _SIZE_) HW_UART_Transmit(hw_uart1, (uint8_t*)_PDATA_, _SIZE_, (~0))
+#else
+#define TL_HCI_EVT_DBG_RAW(...)
+#endif
+
+/**
+ * Memory Manager - Released buffer tracing
+ */
+#if (TL_MM_DBG_EN != 0)
+#define TL_MM_DBG_MSG PRINT_MESG_DBG
+#else
+#define TL_MM_DBG_MSG(...)
+#endif
+
+/* USER CODE END Tl_Conf */
+
+#endif /*__TL_DBG_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/target/hw_ipcc.c
index a58b95cad..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/target/hw_ipcc.c
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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_MeshLightingProvisioner/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/Core/Inc/app_common.h
index 9dbfbba05..7e66ee35a 100644
--- 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
@@ -67,9 +67,13 @@ extern "C"
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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
index 0d66c0b14..32de9fdc1 100644
--- 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
@@ -51,7 +51,7 @@
*/
#define CFG_BONDING_MODE (1)
#define CFG_FIXED_PIN (111111)
-#define CFG_USED_FIXED_PIN (0)
+#define CFG_USED_FIXED_PIN (1)
#define CFG_ENCRYPTION_KEY_SIZE_MAX (16)
#define CFG_ENCRYPTION_KEY_SIZE_MIN (8)
@@ -74,6 +74,28 @@
#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_NOT_SUPPORTED
+
+/**
+ * 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)
/**
* Define PHY
@@ -142,7 +164,7 @@
* Maximum number of simultaneous connections that the device will support.
* Valid values are from 1 to 8
*/
-#define CFG_BLE_NUM_LINK 8
+#define CFG_BLE_NUM_LINK 2
/**
* Maximum number of Services that can be stored in the GATT database.
@@ -487,6 +509,7 @@ typedef enum
CFG_TASK_MESH_UART_RX_REQ_ID,
CFG_TASK_APPLI_REQ_ID,
CFG_TASK_MESH_SW1_REQ_ID,
+ CFG_TASK_MESH_SW3_REQ_ID,
CFG_TASK_MESH_LPN_REQ_ID,
CFG_LAST_TASK_ID_WITH_HCICMD, /**< Shall be LAST in the list */
@@ -496,7 +519,7 @@ typedef enum
typedef enum
{
CFG_FIRST_TASK_ID_WITH_NO_HCICMD = CFG_LAST_TASK_ID_WITH_HCICMD - 1, /**< Shall be FIRST in the list */
-
+ CFG_TASK_SW1_BUTTON_PUSHED_ID,
CFG_TASK_SYSTEM_HCI_ASYNCH_EVT_ID,
CFG_LAST_TASK_ID_WITHO_NO_HCICMD /**< Shall be LAST in the list */
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
index 1e2d7a616..b703e7393 100644
--- 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
@@ -1,36 +1,39 @@
+/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file hw_conf.h
* @author MCD Application Team
* @brief Configuration of hardware interface
- ******************************************************************************
- * @attention
- *
+ ******************************************************************************
+ * @attention
+ *
* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under Ultimate Liberty license
- * SLA0044, the "License"; You may not use this file except in compliance with
- * the License. You may obtain a copy of the License at:
- * www.st.com/SLA0044
- *
- ******************************************************************************
- */
-
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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
+#ifndef HW_CONF_H
+#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
* 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.
+* Once the Semaphore has been released, there shall be at least 1us before it can be taken again. This is required
+* to give the opportunity to CPU2 to take it.
* 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()
@@ -69,7 +72,6 @@
/* Index of the semaphore used to access the RNG */
#define CFG_HW_RNG_SEMID 0
-
/******************************************************************************
* HW TIMER SERVER
*****************************************************************************/
@@ -84,7 +86,7 @@
* wakeup timer.
* This setting is the preemptpriority part of the NVIC.
*/
-#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+#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
@@ -92,7 +94,7 @@
* 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 CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
/**
* Define a critical section in the Timer server
@@ -108,35 +110,35 @@
* 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
+#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
- */
+ * 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_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
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
/**
* LPUART1
@@ -242,6 +244,6 @@
#define CFG_HW_USART1_TX_DMA_IRQn DMA2_Channel4_IRQn
#define CFG_HW_USART1_DMA_TX_IRQHandler DMA2_Channel4_IRQHandler
-#endif /*__HW_CONF_H */
+#endif /*HW_CONF_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
index 3de57ae3e..0dfed68a8 100644
--- 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
@@ -31,6 +31,8 @@
extern RTC_HandleTypeDef hrtc; /**< RTC handler declaration */
/* Exported macro ------------------------------------------------------------*/
+/* Exported functions prototypes ---------------------------------------------*/
+void Error_Handler(void);
/* Exported functions ------------------------------------------------------- */
#endif /* __MAIN_H */
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
index ca974416b..b7dab125a 100644
--- 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
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "main.h"
@@ -32,7 +33,7 @@
#include "app_debug.h"
-#include "appli_mesh.h"
+//#include "appli_mesh.h"
#include "appli_nvm.h"
#include "pal_nvm.h"
#include "lp_timer.h"
@@ -172,7 +173,7 @@ void APPE_Init( void )
* @param None
* @retval None
*/
-static void SystemPower_Config(void)
+static void SystemPower_Config( void )
{
/**
@@ -181,7 +182,7 @@ static void SystemPower_Config(void)
LL_RCC_SetClkAfterWakeFromStop(LL_RCC_STOP_WAKEUPCLOCK_HSI);
/* Initialize low power manager */
- UTIL_LPM_Init();
+ UTIL_LPM_Init( );
/* Initialize the CPU2 reset value before starting CPU2 with C2BOOT */
LL_C2_PWR_SetPowerMode(LL_PWR_MODE_SHUTDOWN);
@@ -232,7 +233,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
@@ -373,39 +374,15 @@ void HAL_GPIO_EXTI_Callback( uint16_t GPIO_Pin )
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);
- }
+ Occupancy_Flag = 1;
+ UTIL_SEQ_SetTask( 1<<CFG_TASK_MESH_SW3_REQ_ID, CFG_SCH_PRIO_0);
}
break;
#endif
- default:
+ default:
break;
}
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
index 34c013a8e..95537ac98 100644
--- 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
@@ -327,11 +327,10 @@ void SystemClock_Config(void)
/** Configure LSE Drive Capability
*/
__HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
- /** Configure the main internal regulator output voltage
+ /** Configure the main internal regulator output voltage
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
- /** Initializes the RCC Oscillators according to the specified parameters
- * in the RCC_OscInitTypeDef structure.
+ /** Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
|RCC_OSCILLATORTYPE_LSE;
@@ -344,7 +343,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
@@ -364,7 +363,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Initializes the peripherals clocks
+ /** Initializes the peripherals clocks
*/
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
|RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/EWARM/BLE_MeshLightingProvisioner.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/EWARM/BLE_MeshLightingProvisioner.ewp
index 36afb7a73..fdd2c27ab 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/EWARM/BLE_MeshLightingProvisioner.ewp
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/EWARM/BLE_MeshLightingProvisioner.ewp
@@ -367,7 +367,6 @@
<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>
-
</option>
<option>
<name>CCStdIncCheck</name>
@@ -835,7 +834,6 @@
<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>
@@ -1125,6 +1123,9 @@
<name>$PROJ_DIR$\..\STM32_WPAN\app\appli_sensor.c</name>
</file>
<file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\appli_sensors_client.c</name>
+ </file>
+ <file>
<name>$PROJ_DIR$\..\STM32_WPAN\app\appli_vendor.c</name>
</file>
<file>
@@ -1268,6 +1269,9 @@
<name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\sensors.c</name>
</file>
<file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\sensors_client.c</name>
+ </file>
+ <file>
<name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\svc\Src\svc_ctl.c</name>
</file>
<file>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/MDK-ARM/BLE_MeshLightingDemoProvisioner.uvoptx b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/MDK-ARM/BLE_MeshLightingDemoProvisioner.uvoptx
index 9f4dc45a5..baf868391 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/MDK-ARM/BLE_MeshLightingDemoProvisioner.uvoptx
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/MDK-ARM/BLE_MeshLightingDemoProvisioner.uvoptx
@@ -307,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>
@@ -491,6 +491,18 @@
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>26</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\STM32_WPAN\app\appli_sensors_client.c</PathWithFileName>
+ <FilenameWithoutPath>appli_sensors_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
</Group>
<Group>
@@ -501,7 +513,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>4</GroupNumber>
- <FileNumber>26</FileNumber>
+ <FileNumber>27</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -521,7 +533,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>5</GroupNumber>
- <FileNumber>27</FileNumber>
+ <FileNumber>28</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -541,7 +553,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>6</GroupNumber>
- <FileNumber>28</FileNumber>
+ <FileNumber>29</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -561,7 +573,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>7</GroupNumber>
- <FileNumber>29</FileNumber>
+ <FileNumber>30</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -581,7 +593,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>30</FileNumber>
+ <FileNumber>31</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -593,7 +605,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>31</FileNumber>
+ <FileNumber>32</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -605,7 +617,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>32</FileNumber>
+ <FileNumber>33</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -617,7 +629,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>33</FileNumber>
+ <FileNumber>34</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -629,7 +641,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>34</FileNumber>
+ <FileNumber>35</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -641,7 +653,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>35</FileNumber>
+ <FileNumber>36</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -653,7 +665,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>36</FileNumber>
+ <FileNumber>37</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -665,7 +677,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>37</FileNumber>
+ <FileNumber>38</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -677,7 +689,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>38</FileNumber>
+ <FileNumber>39</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -689,7 +701,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>39</FileNumber>
+ <FileNumber>40</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -701,7 +713,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>40</FileNumber>
+ <FileNumber>41</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -713,7 +725,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>41</FileNumber>
+ <FileNumber>42</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -725,7 +737,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>42</FileNumber>
+ <FileNumber>43</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -737,7 +749,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>43</FileNumber>
+ <FileNumber>44</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -749,7 +761,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>44</FileNumber>
+ <FileNumber>45</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -761,7 +773,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>45</FileNumber>
+ <FileNumber>46</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -773,7 +785,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>46</FileNumber>
+ <FileNumber>47</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -785,7 +797,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>47</FileNumber>
+ <FileNumber>48</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -799,13 +811,13 @@
<Group>
<GroupName>Middlewares/STM32_WPAN/ble/blesvc</GroupName>
- <tvExp>0</tvExp>
+ <tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>48</FileNumber>
+ <FileNumber>49</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -817,7 +829,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>49</FileNumber>
+ <FileNumber>50</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -829,7 +841,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>50</FileNumber>
+ <FileNumber>51</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -841,7 +853,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>51</FileNumber>
+ <FileNumber>52</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -853,7 +865,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>52</FileNumber>
+ <FileNumber>53</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -865,7 +877,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>53</FileNumber>
+ <FileNumber>54</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -877,7 +889,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>54</FileNumber>
+ <FileNumber>55</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -889,7 +901,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>55</FileNumber>
+ <FileNumber>56</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -901,7 +913,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>56</FileNumber>
+ <FileNumber>57</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -913,7 +925,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>57</FileNumber>
+ <FileNumber>58</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -925,7 +937,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>58</FileNumber>
+ <FileNumber>59</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -937,7 +949,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>59</FileNumber>
+ <FileNumber>60</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -949,7 +961,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>60</FileNumber>
+ <FileNumber>61</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -959,6 +971,18 @@
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
+ <File>
+ <GroupNumber>9</GroupNumber>
+ <FileNumber>62</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\sensors_client.c</PathWithFileName>
+ <FilenameWithoutPath>sensors_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
</Group>
<Group>
@@ -969,7 +993,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>61</FileNumber>
+ <FileNumber>63</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -981,7 +1005,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>62</FileNumber>
+ <FileNumber>64</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -993,7 +1017,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>63</FileNumber>
+ <FileNumber>65</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1005,7 +1029,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>64</FileNumber>
+ <FileNumber>66</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1017,7 +1041,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>65</FileNumber>
+ <FileNumber>67</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1029,7 +1053,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>66</FileNumber>
+ <FileNumber>68</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1049,7 +1073,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>11</GroupNumber>
- <FileNumber>67</FileNumber>
+ <FileNumber>69</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1069,7 +1093,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>12</GroupNumber>
- <FileNumber>68</FileNumber>
+ <FileNumber>70</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1081,7 +1105,7 @@
</File>
<File>
<GroupNumber>12</GroupNumber>
- <FileNumber>69</FileNumber>
+ <FileNumber>71</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1093,7 +1117,7 @@
</File>
<File>
<GroupNumber>12</GroupNumber>
- <FileNumber>70</FileNumber>
+ <FileNumber>72</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1105,7 +1129,7 @@
</File>
<File>
<GroupNumber>12</GroupNumber>
- <FileNumber>71</FileNumber>
+ <FileNumber>73</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1117,7 +1141,7 @@
</File>
<File>
<GroupNumber>12</GroupNumber>
- <FileNumber>72</FileNumber>
+ <FileNumber>74</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1137,7 +1161,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>73</FileNumber>
+ <FileNumber>75</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1149,7 +1173,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>74</FileNumber>
+ <FileNumber>76</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1161,7 +1185,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>75</FileNumber>
+ <FileNumber>77</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1173,7 +1197,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>76</FileNumber>
+ <FileNumber>78</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1185,7 +1209,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>77</FileNumber>
+ <FileNumber>79</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1197,7 +1221,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>78</FileNumber>
+ <FileNumber>80</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1217,7 +1241,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>14</GroupNumber>
- <FileNumber>79</FileNumber>
+ <FileNumber>81</FileNumber>
<FileType>4</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1230,26 +1254,6 @@
</Group>
<Group>
- <GroupName>Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib</GroupName>
- <tvExp>1</tvExp>
- <tvExpOptDlg>0</tvExpOptDlg>
- <cbSel>0</cbSel>
- <RteFlg>0</RteFlg>
- <File>
- <GroupNumber>15</GroupNumber>
- <FileNumber>80</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>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/MDK-ARM/BLE_MeshLightingDemoProvisioner.uvprojx b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/MDK-ARM/BLE_MeshLightingDemoProvisioner.uvprojx
index 35af79f20..e449fe9a6 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/MDK-ARM/BLE_MeshLightingDemoProvisioner.uvprojx
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/MDK-ARM/BLE_MeshLightingDemoProvisioner.uvprojx
@@ -517,6 +517,11 @@
<FileType>1</FileType>
<FilePath>../STM32_WPAN/app/PWM_handlers.c</FilePath>
</File>
+ <File>
+ <FileName>appli_sensors_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\STM32_WPAN\app\appli_sensors_client.c</FilePath>
+ </File>
</Files>
</Group>
<Group>
@@ -722,6 +727,11 @@
<FileType>1</FileType>
<FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/vendor.c</FilePath>
</File>
+ <File>
+ <FileName>sensors_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\sensors_client.c</FilePath>
+ </File>
</Files>
</Group>
<Group>
@@ -845,16 +855,6 @@
</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>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32CubeIDE/.cproject b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32CubeIDE/.cproject
index d47fdf6dc..eb1f13d31 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32CubeIDE/.cproject
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32CubeIDE/.cproject
@@ -78,13 +78,11 @@
</tool>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.1692612458" name="MCU GCC Linker" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker">
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script.1490944277" name="Linker Script (-T)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" useByScannerDiscovery="false" value="${workspace_loc:/${ProjName}/STM32WB55RGVX_FLASH.ld}" valueType="string"/>
- <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.libraries.1987048841" name="Libraries (-l)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.libraries" valueType="libs">
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.libraries.1987048841" name="Libraries (-l)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.libraries" 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 IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.directories.447706864" name="Library search path (-L)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.directories" valueType="libPaths">
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.directories.447706864" name="Library search path (-L)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.directories" 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>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input.64203933" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input">
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
@@ -143,7 +141,7 @@
</tool>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.16440459" name="MCU GCC Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler">
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.1586554123" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.value.g0" valueType="enumerated"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.89278512" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.value.os" valueType="enumerated"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.89278512" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.value.o3" valueType="enumerated"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols.1149970307" name="Define symbols (-D)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols" useByScannerDiscovery="false" valueType="definedSymbols">
<listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
<listOptionValue builtIn="false" value="STM32"/>
@@ -186,10 +184,8 @@
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script.1158100085" name="Linker Script (-T)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" useByScannerDiscovery="false" value="${workspace_loc:/${ProjName}/STM32WB55RGVX_FLASH.ld}" valueType="string"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.libraries.1636166899" name="Libraries (-l)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.libraries" 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 IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.directories.623554224" name="Library search path (-L)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.directories" useByScannerDiscovery="false" valueType="libPaths">
- <listOptionValue builtIn="false" value="../../../../../../../Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib"/>
<listOptionValue builtIn="false" value="../../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Library"/>
</option>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input.1482393152" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input">
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32CubeIDE/.project b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32CubeIDE/.project
index e66630ecb..c93091098 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32CubeIDE/.project
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32CubeIDE/.project
@@ -237,6 +237,11 @@
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/app/appli_sensor.c</locationURI>
</link>
<link>
+ <name>Application/STM32_WPAN/app/appli_sensors_client.c</name>
+ <type>1</type>
+ <locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/app/appli_sensors_client.c</locationURI>
+ </link>
+ <link>
<name>Application/STM32_WPAN/app/appli_vendor.c</name>
<type>1</type>
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/app/appli_vendor.c</locationURI>
@@ -342,6 +347,11 @@
<locationURI>$%7BPARENT-6-PROJECT_LOC%7D/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors.c</locationURI>
</link>
<link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/sensors_client.c</name>
+ <type>1</type>
+ <locationURI>$%7BPARENT-6-PROJECT_LOC%7D/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors_client.c</locationURI>
+ </link>
+ <link>
<name>Middlewares/STM32_WPAN/ble/blesvc/svc_ctl.c</name>
<type>1</type>
<locationURI>$%7BPARENT-6-PROJECT_LOC%7D/Middlewares/ST/STM32_WPAN/ble/svc/Src/svc_ctl.c</locationURI>
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
index 9b9a7285a..6a0705fb7 100644
--- 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
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
@@ -35,7 +36,7 @@
#include "types.h"
#include "ble_mesh.h"
-#include "appli_mesh.h"
+//#include "appli_mesh.h"
#include "mesh_cfg.h"
/* Private includes ----------------------------------------------------------*/
@@ -296,7 +297,10 @@ void APP_BLE_Init( void )
/**
* Starts the BLE Stack on CPU2
*/
- SHCI_C2_BLE_Init( &ble_init_cmd_packet );
+ if (SHCI_C2_BLE_Init( &ble_init_cmd_packet ) != SHCI_Success)
+ {
+ Error_Handler();
+ }
/**
* Initialization of HCI & GATT & GAP layer
@@ -329,6 +333,7 @@ void APP_BLE_Init( void )
SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
{
+ /* callback of mesh Library to receive all GAP/GATT events*/
HCI_Event_CB(pckt);
#if (LOW_POWER_FEATURE == 1)
@@ -480,11 +485,11 @@ static void Ble_Hci_Gap_Gatt_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;
@@ -492,13 +497,13 @@ static void Ble_Hci_Gap_Gatt_Init(void){
aci_gap_set_authentication_requirement(BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode,
BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode,
- 0,
- 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
);
/**
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
index 0ab8a8578..ba0b3307a 100644
--- 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
@@ -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
@@ -24,6 +24,7 @@
#include "appli_generic.h"
#include "appli_light.h"
#include "common.h"
+#include "mesh_cfg.h"
#include "mesh_cfg_usr.h"
#include "appli_nvm.h"
#include "config_client.h"
@@ -58,6 +59,10 @@
#define NUM_VENDOR_MODELS_TO_PUBLISH 0
#define NUM_VENDOR_MODELS_TO_BIND_APP 0
+/******************************************************************************/
+#if defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER)
+/******************************************************************************/
+
const MOBLEUINT8 aConfigAppKeyDefault[19]=
{ /* NetKeyIndexAndAppKeyIndex : 3B
Index of the NetKey and index of the AppKey*/
@@ -88,52 +93,6 @@ 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,
@@ -619,7 +578,7 @@ const MODEL_CONFIG_CLIENT_OpcodeTableParam_t ConfigClient_MessageOpcodes_Table[]
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
+ /* { OPCODE_HEALTH_PERIOD_STATUS 0x8037 */
@@ -823,14 +782,14 @@ MOBLE_RESULT Appli_ConfigClient_ConfigureNode(void)
{
/* Waiting for the Provisioning to be done before to Start the
node configuration procedure */
- return result;
+ 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;
+ return MOBLE_RESULT_FAIL;
}
if (eClientSendMsgState == ProvisioningDone_State)
@@ -842,12 +801,12 @@ MOBLE_RESULT Appli_ConfigClient_ConfigureNode(void)
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 */
+ 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)
{
@@ -871,8 +830,8 @@ MOBLE_RESULT Appli_ConfigClient_ConfigureNode(void)
else
{
/* Continue the AppKeyAdd servicing */
- Appli_ConfigClient_DefaultAppKeyAdd();
- }
+ Appli_ConfigClient_DefaultAppKeyAdd();
+ }
}
else if (eClientSendMsgState == AppBindModel_State)
@@ -884,9 +843,9 @@ MOBLE_RESULT Appli_ConfigClient_ConfigureNode(void)
}
else
{
- /* Continue the AppKeyBIND servicing */
- Appli_ConfigClient_DefaultAppKeyBind();
- }
+ /* Continue the AppKeyBIND servicing */
+ Appli_ConfigClient_DefaultAppKeyBind();
+ }
}
else if (eClientSendMsgState == AddSubscription_State)
@@ -899,7 +858,7 @@ MOBLE_RESULT Appli_ConfigClient_ConfigureNode(void)
else
{
/* Continue the Subscription add servicing */
- AppliConfigClient_SubscriptionAddDefault();
+ AppliConfigClient_SubscriptionAddDefault();
}
}
@@ -1188,62 +1147,62 @@ MOBLE_RESULT Appli_ConfigClient_DefaultAppKeyBind (void)
*/
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;
+ 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)
- {
+ 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;
+ 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,
+ numSIGmodels = GetCountSIGModelToSubscribe(elementIndex);
+ modelIdentifier = GetSIGModelToSubscribe(elementIndex,
&indexSIGmodels,
numSIGmodels);
/* Switch to NodeSendMessage_State */
- eServerRespRecdState = NodeSendMessage_State;
+ eServerRespRecdState = NodeSendMessage_State;
break;
case NodeNextVendorModel_State:
- modelIdentifier = GetVendorModelToSubscribe(elementIndex,indexVendormodels );
- /* Switch to NodeSendMessage_State */
- eServerRespRecdState = NodeSendMessage_State;
+ modelIdentifier = GetVendorModelToSubscribe(elementIndex,indexVendormodels );
+ /* Switch to NodeSendMessage_State */
+ eServerRespRecdState = NodeSendMessage_State;
break;
case NodeSendMessage_State:
- elementAddress = GetServerElementAddress(elementIndex);
- ConfigClient_SaveMsgSendingTime();
+ elementAddress = GetServerElementAddress(elementIndex);
+ ConfigClient_SaveMsgSendingTime();
+
+ /* Switch to InProgress_State */
+ eServerRespRecdState = InProgress_State;
+ ConfigClient_SubscriptionAdd (elementAddress, address, modelIdentifier);
- /* 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 ? */
+ /* 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++;
@@ -1254,16 +1213,16 @@ MOBLE_RESULT AppliConfigClient_SubscriptionAddDefault (void)
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
@@ -1282,8 +1241,8 @@ MOBLE_RESULT AppliConfigClient_SubscriptionAddDefault (void)
eServerRespRecdState = NodeNextSigModel_State;
indexSIGmodels =0; /* Reset the variable again for the next element */
- indexVendormodels = 0;
- }
+ indexVendormodels = 0;
+ }
}
break;
@@ -1291,7 +1250,7 @@ MOBLE_RESULT AppliConfigClient_SubscriptionAddDefault (void)
/* Just wait and let the messages be completed
or look for timeout */
retry = ConfigClient_ChkRetries();
-
+
if (retry == CLIENT_TX_RETRY_ENDS)
{
eServerRespRecdState = NodeNoResponse_State;
@@ -1305,8 +1264,8 @@ MOBLE_RESULT AppliConfigClient_SubscriptionAddDefault (void)
default:
/* Error State */
break;
- }
-
+ }
+
return result;
}
@@ -1481,11 +1440,11 @@ MOBLE_RESULT AppliConfigClient_SelfPublicationSetDefault (void)
MOBLEUINT8 elementIndex;
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
- for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ for (elementIndex=0; elementIndex < APPLICATION_NUMBER_OF_ELEMENTS; elementIndex++ )
{
/*Checking for SIG Models*/
- for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
- {
+ for (MOBLEUINT8 index=0; index < APPLICATION_SIG_MODELS_MAX_COUNT; index++)
+ {
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1495,6 +1454,14 @@ MOBLE_RESULT AppliConfigClient_SelfPublicationSetDefault (void)
{
break;
}
+ else if (MODEL_IS_FOUNDATION_MODEL(modelIdentifier))
+ {
+ /* If Model is Foundation Model, then it doesnt need to be
+ added for Publishing */
+
+ /* Do NOTHING, let the next Model be picked */
+ }
+
else
{
ConfigClient_PublicationSet(elementAddress,
@@ -1510,7 +1477,7 @@ MOBLE_RESULT AppliConfigClient_SelfPublicationSetDefault (void)
}
/*Checking for VENDOR Models*/
- for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
+ for (MOBLEUINT8 index=0; index < APPLICATION_VENDOR_MODELS_MAX_COUNT; index++)
{
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1523,17 +1490,17 @@ MOBLE_RESULT AppliConfigClient_SelfPublicationSetDefault (void)
}
else
{
- ConfigClient_PublicationSet(elementAddress,
- publishAddress,
- appKeyIndex,
- credentialFlag,
- publishTTL,
- publishPeriod,
- publishRetransmitCount,
- publishRetransmitIntervalSteps,
- modelIdentifier);
- }
- }
+ ConfigClient_PublicationSet(elementAddress,
+ publishAddress,
+ appKeyIndex,
+ credentialFlag,
+ publishTTL,
+ publishPeriod,
+ publishRetransmitCount,
+ publishRetransmitIntervalSteps,
+ modelIdentifier);
+ }
+ }
}
return result;
}
@@ -1554,10 +1521,10 @@ MOBLE_RESULT AppliConfigClient_SelfSubscriptionSetDefault (void)
MOBLEUINT16 address = DEFAULT_GROUP_ADDR;
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
- for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ for (elementIndex=0; elementIndex < APPLICATION_NUMBER_OF_ELEMENTS; elementIndex++ )
{
/*Checking for SIG Models*/
- for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
+ for (MOBLEUINT8 index=0; index < APPLICATION_SIG_MODELS_MAX_COUNT; index++)
{
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1569,6 +1536,13 @@ MOBLE_RESULT AppliConfigClient_SelfSubscriptionSetDefault (void)
{
break;
}
+ else if (MODEL_IS_FOUNDATION_MODEL(modelIdentifier))
+ {
+ /* If Model is Foundation Model, then it doesnt need to be
+ Subscribed */
+
+ /* Do NOTHING, let the next Model be picked */
+ }
else
{
ConfigClient_SubscriptionAdd (elementAddress, address, modelIdentifier);
@@ -1576,7 +1550,7 @@ MOBLE_RESULT AppliConfigClient_SelfSubscriptionSetDefault (void)
}
/*Checking for Vendor Models*/
- for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
+ for (MOBLEUINT8 index=0; index < APPLICATION_VENDOR_MODELS_MAX_COUNT; index++)
{
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1613,10 +1587,10 @@ MOBLE_RESULT Appli_ConfigClient_SelfDefaultAppKeyBind (void)
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
appKeyIndex = DEFAULT_APPKEY_INDEX;
- for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ for (elementIndex=0; elementIndex < APPLICATION_NUMBER_OF_ELEMENTS; elementIndex++ )
{
/*Checking for SIG Models*/
- for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
+ for (MOBLEUINT8 index=0; index < APPLICATION_SIG_MODELS_MAX_COUNT; index++)
{
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1627,14 +1601,21 @@ MOBLE_RESULT Appli_ConfigClient_SelfDefaultAppKeyBind (void)
{
break;
}
+ else if (MODEL_IS_FOUNDATION_MODEL(modelIdentifier))
+ {
+ /* If Model is Foundation Model, then it doesnt need to be binded
+ with AppKey */
+
+ /* Do NOTHING, let the next Model be picked */
+ }
else
- {
+ {
ConfigClient_ModelAppBind (elementAddress, appKeyIndex, modelIdentifier);
}
}
/*Checking for VENDOR Models*/
- for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
+ for (MOBLEUINT8 index=0; index < APPLICATION_VENDOR_MODELS_MAX_COUNT; index++)
{
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1647,9 +1628,9 @@ MOBLE_RESULT Appli_ConfigClient_SelfDefaultAppKeyBind (void)
}
else
{
- ConfigClient_ModelAppBind (elementAddress, appKeyIndex, modelIdentifier);
- }
- }
+ ConfigClient_ModelAppBind (elementAddress, appKeyIndex, modelIdentifier);
+ }
+ }
}
return result;
@@ -1663,7 +1644,7 @@ MOBLE_RESULT Appli_ConfigClient_SelfDefaultAppKeyBind (void)
*/
void Appli_CompositionDataStatusCb(MOBLE_RESULT status)
{
- eServerRespRecdState = CompositionRecd_State;
+ eServerRespRecdState = CompositionRecd_State;
}
@@ -1675,8 +1656,8 @@ void Appli_CompositionDataStatusCb(MOBLE_RESULT status)
*/
void Appli_AppKeyStatusCb(MOBLEUINT8 status)
{
- /* Change the received state for application */
- eServerRespRecdState = AppkeyAck_State;
+ /* Change the received state for application */
+ eServerRespRecdState = AppkeyAck_State;
}
@@ -1688,8 +1669,8 @@ void Appli_AppKeyStatusCb(MOBLEUINT8 status)
*/
void Appli_AppBindModelStatusCb(MOBLEUINT8 status)
{
- /* Change the received state for application */
- eServerRespRecdState = AppBindModelAck_State;
+ /* Change the received state for application */
+ eServerRespRecdState = AppBindModelAck_State;
}
@@ -1701,8 +1682,8 @@ void Appli_AppBindModelStatusCb(MOBLEUINT8 status)
*/
void Appli_SubscriptionAddStatusCb(MOBLEUINT8 status)
{
- /* Change the received state for application */
- eServerRespRecdState = SubscriptionAck_State;
+ /* Change the received state for application */
+ eServerRespRecdState = SubscriptionAck_State;
}
@@ -1714,8 +1695,8 @@ void Appli_SubscriptionAddStatusCb(MOBLEUINT8 status)
*/
void Appli_PublicationStatusCb(MOBLEUINT8 status)
{
- /* Change the received state for application */
- eServerRespRecdState = PublicationStatus_State;
+ /* Change the received state for application */
+ eServerRespRecdState = PublicationStatus_State;
}
@@ -1727,8 +1708,8 @@ void Appli_PublicationStatusCb(MOBLEUINT8 status)
*/
void Appli_NodeResetStatusCb(void)
{
- /* Change the received state for application */
- eServerRespRecdState = NodeResetStatus_State;
+ /* Change the received state for application */
+ eServerRespRecdState = NodeResetStatus_State;
}
@@ -1744,7 +1725,6 @@ MOBLEUINT16 GetSIGModelToBindApp(MOBLEUINT8 elementIndex,
MOBLEUINT8 numberOfModels)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
MOBLEUINT16 model_id;
MOBLEUINT8 index;
MOBLEUINT8 idxSIG = *pModelIndex;
@@ -1765,9 +1745,7 @@ MOBLEUINT16 GetSIGModelToBindApp(MOBLEUINT8 elementIndex,
*pModelIndex = index;
return model_id;
-#else
- return aSigModelsToBind[idxSIG][elementIdx] ;
-#endif
+
}
@@ -1780,11 +1758,7 @@ MOBLEUINT16 GetSIGModelToBindApp(MOBLEUINT8 elementIndex,
*/
MOBLEUINT32 GetVendorModelToBindApp(MOBLEUINT8 elementIndex, MOBLEUINT8 indexModels)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].aVendorModels[indexModels];
-#else
- return VENDORMODEL_STMICRO_ID1 ;
-#endif
}
/**
@@ -1795,11 +1769,7 @@ MOBLEUINT32 GetVendorModelToBindApp(MOBLEUINT8 elementIndex, MOBLEUINT8 indexMod
*/
MOBLEUINT8 GetCountSIGModelToBindApp(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumSIGmodels;
-#else
- return sizeof(aSigModelsToBind)/sizeof(MOBLEUINT16);
-#endif
}
@@ -1810,11 +1780,7 @@ MOBLEUINT8 GetCountSIGModelToBindApp(MOBLEUINT8 elementIndex)
*/
MOBLEUINT8 GetCountVendorModelToBindApp(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumVendorModels;
-#else
- return NUM_VENDOR_MODELS_TO_BIND_APP;
-#endif
}
@@ -1830,13 +1796,9 @@ MOBLEUINT16 GetSIGModelToPublish(MOBLEUINT8 elementIndex,
MOBLEUINT8 numberOfModels)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return GetSIGModelToBindApp(elementIndex,
pModelIndex,
numberOfModels);
-#else
- return aPublishModels[idxSIG] ;
-#endif
}
@@ -1848,11 +1810,7 @@ MOBLEUINT16 GetSIGModelToPublish(MOBLEUINT8 elementIndex,
*/
MOBLEUINT32 GetVendorModelToPublish(MOBLEUINT8 elementIndex, MOBLEUINT8 idxSIG)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].aVendorModels[idxSIG];
-#else
- return VENDORMODEL_STMICRO_ID1 ;
-#endif
}
@@ -1863,11 +1821,7 @@ MOBLEUINT32 GetVendorModelToPublish(MOBLEUINT8 elementIndex, MOBLEUINT8 idxSIG)
*/
MOBLEUINT8 GetCountSIGModelToPublish(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumSIGmodels;
-#else
- return sizeof(aPublishModels)/sizeof(MOBLEUINT16);
-#endif
}
@@ -1878,11 +1832,7 @@ MOBLEUINT8 GetCountSIGModelToPublish(MOBLEUINT8 elementIndex)
*/
MOBLEUINT8 GetCountVendorModelToPublish(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumVendorModels;
-#else
- return NUM_VENDOR_MODELS_TO_PUBLISH;
-#endif
}
@@ -1897,13 +1847,9 @@ MOBLEUINT16 GetSIGModelToSubscribe(MOBLEUINT8 elementIndex,
MOBLEUINT8 *pModelIndex,
MOBLEUINT8 numberOfModels)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return GetSIGModelToBindApp(elementIndex,
pModelIndex,
numberOfModels);
-#else
- return aSubscribeModels[idxSIG] ;
-#endif
}
@@ -1917,11 +1863,7 @@ MOBLEUINT16 GetSIGModelToSubscribe(MOBLEUINT8 elementIndex,
MOBLEUINT32 GetVendorModelToSubscribe(MOBLEUINT8 elementIndex,
MOBLEUINT8 idxSIG)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].aVendorModels[idxSIG];
-#else
- return VENDORMODEL_STMICRO_ID1 ;
-#endif
}
@@ -1932,11 +1874,7 @@ MOBLEUINT32 GetVendorModelToSubscribe(MOBLEUINT8 elementIndex,
*/
MOBLEUINT8 GetCountSIGModelToSubscribe(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumSIGmodels;
-#else
- return sizeof(aSubscribeModels)/sizeof(MOBLEUINT16);
-#endif
}
@@ -1948,11 +1886,7 @@ MOBLEUINT8 GetCountSIGModelToSubscribe(MOBLEUINT8 elementIndex)
*/
MOBLEUINT8 GetCountVendorModelToSubscribe(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumVendorModels;
-#else
- return NUM_VENDOR_MODELS_TO_SUBSCRIBE;
-#endif
}
@@ -1968,6 +1902,9 @@ MOBLEUINT8 AppliConfigClient_SendMessageDefault(MOBLEUINT8 elementIdx)
return NUM_VENDOR_MODELS_TO_SUBSCRIBE;
}
+/******************************************************************************/
+#endif /* defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER) */
+/******************************************************************************/
/**
* @}
@@ -1977,5 +1914,5 @@ MOBLEUINT8 AppliConfigClient_SendMessageDefault(MOBLEUINT8 elementIdx)
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 34169448c..b380cf636 100644
--- 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
@@ -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
@@ -26,7 +26,7 @@
#include "generic.h"
#include "mesh_cfg.h"
#include "config_client.h"
-
+#include "mesh_cfg_usr.h"
/* Exported macro ------------------------------------------------------------*/
#define MAX_CONFIG_PARAM_SIZE 22
@@ -35,6 +35,9 @@
/* Exported variables ------------------------------------------------------- */
/* Application Variable-------------------------------------------------------*/
/* Exported Functions Prototypes ---------------------------------------------*/
+
+#if defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER)
+
MOBLE_RESULT Appli_ConfigClient_Init(void);
MOBLE_RESULT Appli_ConfigClient_Process(void);
MOBLE_RESULT Appli_ConfigClient_ConfigureNode(void);
@@ -82,8 +85,9 @@ MOBLEUINT8 GetCountSIGModelToPublish(MOBLEUINT8 elementIdx);
MOBLEUINT8 GetCountVendorModelToPublish(MOBLEUINT8 elementIdx);
+#endif /*defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER) */
#endif /* __APPLI_CONFIG_CLIENT_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 0ecaea465..c5d21b225 100644
--- 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
@@ -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
@@ -50,16 +50,21 @@ 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;
+
+Appli_Generic_OnOffSet AppliOnOffSet[APPLICATION_NUMBER_OF_ELEMENTS];
+Appli_Generic_LevelSet AppliLevelSet[APPLICATION_NUMBER_OF_ELEMENTS];
+Appli_Generic_PowerOnOffSet AppliPowerOnSet[APPLICATION_NUMBER_OF_ELEMENTS];
+Appli_Generic_DefaultTransitionSet AppliDefaultTransitionSet[APPLICATION_NUMBER_OF_ELEMENTS];
/* 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);
+MOBLE_RESULT Appli_Generic_LevelDelta_Set(Generic_LevelStatus_t* pdeltalevelParam,
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_LevelMove_Set(Generic_LevelStatus_t* pdeltaMoveParam,
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
/* Private functions ---------------------------------------------------------*/
/******************************************************************************/
@@ -71,43 +76,57 @@ MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t* pdeltalevelParam,
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t* pGeneric_OnOffParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- AppliOnOffSet.Present_OnOff = pGeneric_OnOffParam->Present_OnOff_State;
- AppliOnOffSet.Present_OnOffValue = pGeneric_OnOffParam->Present_OnOff_Value;
-
+ /*User need to modify the parameters as per the number of elements per node*/
+ AppliOnOffSet[elementIndex].Present_OnOff = pGeneric_OnOffParam->Present_OnOff_State;
+ AppliOnOffSet[elementIndex].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.
- */
+ /* 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;
+ Appli_LightPwmValue.IntensityValue = AppliOnOffSet[elementIndex].Present_OnOffValue;
Light_UpdateLedValue(LOAD_STATE ,Appli_LightPwmValue);
- if(AppliOnOffSet.Present_OnOff == APPLI_LED_ON)
+
+ #if 0 /* EME */
+ if(AppliOnOffSet[elementIndex].Present_OnOff == APPLI_LED_ON)
{
- AppliOnOffSet.TargetValue = PWM_TIME_PERIOD;
+ AppliOnOffSet[elementIndex].TargetValue = PWM_TIME_PERIOD;
}
else
{
- AppliOnOffSet.TargetValue = APPLI_LED_OFF;
+ AppliOnOffSet[elementIndex].TargetValue = APPLI_LED_OFF;
}
+ #else
+ AppliOnOffSet[elementIndex].TargetValue = pGeneric_OnOffParam->Target_OnOff;
+ #endif /* EME */
- if(AppliOnOffSet.Present_OnOffValue > 16000)
- {
- BSP_LED_On(LED_BLUE);
- }
- else
+ if(AppliOnOffSet[elementIndex].Present_OnOffValue == AppliOnOffSet[elementIndex].TargetValue)
{
- BSP_LED_Off(LED_BLUE);
+ if(AppliOnOffSet[elementIndex].Present_OnOffValue > 0)
+ {
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+ }
}
}
else
{
- if((AppliOnOffSet.Present_OnOff == APPLI_LED_ON) && (OptionalValid == NO_TRANSITION))
+ if((AppliOnOffSet[elementIndex].Present_OnOff == APPLI_LED_ON) && (OptionalValid == NO_TRANSITION))
{
Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
@@ -120,18 +139,15 @@ MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t* pGeneric_OnOffParam,
BSP_LED_Off(LED_BLUE);
}
}
+
+ TRACE_M(TF_GENERIC,"Generic_OnOff_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8202%02hx!\n\r",AppliOnOffSet[elementIndex].Present_OnOff);
- TRACE_M(TF_SERIAL_CTRL,"#8202%02hx!\n\r",AppliOnOffSet.Present_OnOff);
+ NvmStatePowerFlag_Set(GENERIC_ON_OFF_NVM_FLAG, elementIndex);
- /* set the flag value for NVM store */
- RestoreFlag = GENERIC_ON_OFF_NVM_FLAG;
-
- AppliNvm_SaveMessageParam();
-
return MOBLE_RESULT_SUCCESS;
}
-
/******************************************************************************/
#endif /* #ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF */
/******************************************************************************/
@@ -142,15 +158,20 @@ MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t* pGeneric_OnOffParam,
* when Generic OnOff message is received
* @param pOnOff_status: Pointer to the parameters received for message
* @param plength: length of the data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUINT32 plength)
+MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
MOBLEUINT8 i;
- TRACE_M(TF_GENERIC,"Appli_Generic_OnOff_Status callback received \r\n");
+ TRACE_M(TF_GENERIC,"Generic_OnOff_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8204!\r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8204! \n\r");
for(i = 0; i < plength; i++)
{
if(i == 0)
@@ -164,6 +185,7 @@ MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUI
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_GENERIC_MODEL_SERVER_LEVEL
/******************************************************************************/
@@ -173,21 +195,26 @@ MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUI
* when Generic Level message is received
* @param plevelParam: Pointer to the parameters message
* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t* plevelParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid,MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
MOBLEUINT16 duty;
static MOBLEUINT16 previousIntensity = 0;
- AppliLevelSet.Present_Level16= plevelParam->Present_Level16;
- if(AppliLevelSet.Present_Level16 <= 0)
+ AppliLevelSet[elementIndex].Present_Level16= plevelParam->Present_Level16;
+ if(AppliLevelSet[elementIndex].Present_Level16 <= 0)
{
- AppliLevelSet.Present_Level16 = 0;
+ AppliLevelSet[elementIndex].Present_Level16 = 0;
}
- IntensityValue = AppliLevelSet.Present_Level16;
+ IntensityValue = AppliLevelSet[elementIndex].Present_Level16;
if(((IntensityValue > previousIntensity) && (IntensityValue <PWM_TIME_PERIOD)) ||
IntensityValue == INTENSITY_LEVEL_ZERO)
@@ -200,49 +227,42 @@ MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t* plevelParam,
}
previousIntensity = IntensityValue;
- if(AppliLevelSet.Present_Level16 < 0x00)
+ if(AppliLevelSet[elementIndex].Present_Level16 < 0x00)
{
- AppliLevelSet.Present_Level16 = 0;
+ AppliLevelSet[elementIndex].Present_Level16 = 0;
}
- duty = PwmValueMapping(AppliLevelSet.Present_Level16 , 0x7FFF ,0x0000);
+ duty = PwmValueMapping(AppliLevelSet[elementIndex].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);
- }
+ TRACE_M(TF_GENERIC,"Generic_Level_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8206!\r\n");
+ NvmStatePowerFlag_Set(GENERIC_LEVEL_NVM_FLAG, elementIndex);
+
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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t* pdeltalevelParam,
- MOBLEUINT8 OptionalValid)
+MOBLE_RESULT Appli_Generic_LevelDelta_Set(Generic_LevelStatus_t* pdeltalevelParam,
+ MOBLEUINT8 OptionalValid,MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-
- AppliLevelSet.Present_Level16 = pdeltalevelParam->Present_Level16;
+ AppliLevelSet[elementIndex].Present_Level16 = pdeltalevelParam->Present_Level16;
/* For demo, if Level is more than 50, switch ON the LED */
- if (AppliLevelSet.Present_Level16 >= 50)
+ if (AppliLevelSet[elementIndex].Present_Level16 >= 50)
{
Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
@@ -253,32 +273,43 @@ MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t* pdeltalevelParam,
Light_UpdateLedValue(RESET_STATE , Appli_LightPwmValue);
BSP_LED_Off(LED_BLUE);
}
- TRACE_M(TF_SERIAL_CTRL,"#8206!\n\r");
+
+ TRACE_M(TF_GENERIC,"Generic_LevelDelta_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8209!\r\n");
+
return MOBLE_RESULT_SUCCESS;
}
/**
-* @brief Appli_Generic_Move_Set: This function is callback for Application
+* @brief Appli_Generic_LevelMove_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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
- MOBLEUINT8 OptionalValid)
+MOBLE_RESULT Appli_Generic_LevelMove_Set(Generic_LevelStatus_t* pdeltaMoveParam,
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- AppliLevelSet.Last_delta_level = pdeltaMoveParam->Last_delta_level;
- AppliLevelSet.Last_Level_TID = pdeltaMoveParam->Last_Level_TID;
- AppliLevelSet.Last_Present_Level16 = pdeltaMoveParam->Last_Present_Level16;
- AppliLevelSet.Present_Level16 = pdeltaMoveParam->Present_Level16;
- AppliLevelSet.RemainingTime = pdeltaMoveParam->RemainingTime;
- AppliLevelSet.Target_Level16 = pdeltaMoveParam->Target_Level16;
+// if(OptionalValid == 1)
+// {
+ AppliLevelSet[elementIndex].Last_delta_level = pdeltaMoveParam->Last_delta_level;
+ AppliLevelSet[elementIndex].Last_Level_TID = pdeltaMoveParam->Last_Level_TID;
+ AppliLevelSet[elementIndex].Last_Present_Level16 = pdeltaMoveParam->Last_Present_Level16;
+ AppliLevelSet[elementIndex].Present_Level16 = pdeltaMoveParam->Present_Level16;
+ AppliLevelSet[elementIndex].RemainingTime = pdeltaMoveParam->RemainingTime;
+ AppliLevelSet[elementIndex].Target_Level16 = pdeltaMoveParam->Target_Level16;
+// }
- TRACE_M(TF_SERIAL_CTRL,"#8206!\n\r");
-
- return MOBLE_RESULT_SUCCESS;
+ TRACE_M(TF_GENERIC,"Generic_LevelMove_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#820B! \r\n");
+ return MOBLE_RESULT_SUCCESS;
}
@@ -291,39 +322,45 @@ MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
* when Generic Level Move message is received
* @param plevel_status: Pointer to the parameters message
* @param plength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Generic_Level_Status(MOBLEUINT8 const *plevel_status,
- MOBLEUINT32 plength)
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT8 i;
MOBLEUINT8 level = 0;
-#endif
-
- TRACE_M(TF_GENERIC,"Generic_Level_Status callback received \r\n");
+#endif
- TRACE_M(TF_SERIAL_CTRL,"#8208! \n\r");
+ TRACE_M(TF_GENERIC,"Generic_Level_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8208! \r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < plength; i++)
{
if((i == 0) || (i == 2))
level = plevel_status[i];
else if(i == 1)
- TRACE_M(TF_GENERIC,"Present Level value: %d\n\r",
+ TRACE_M(TF_SERIAL_CTRL,"Present Level value: %d\n\r",
(plevel_status[i]<<8)|level);
else if(i == 3)
- TRACE_M(TF_GENERIC,"Target Level value: %d\n\r",
+ TRACE_M(TF_SERIAL_CTRL,"Target Level value: %d\n\r",
(plevel_status[i]<<8)|level);
else if(i == 4)
- TRACE_M(TF_GENERIC,"Remaining Time value: %d\n\r", plevel_status[i]);
+ TRACE_M(TF_SERIAL_CTRL,"Remaining Time value: %d\n\r", plevel_status[i]);
}
-#endif
+#endif
+
return MOBLE_RESULT_SUCCESS;
}
-
+
/******************************************************************************/
#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF
/******************************************************************************/
@@ -333,17 +370,26 @@ MOBLE_RESULT Appli_Generic_Level_Status(MOBLEUINT8 const *plevel_status,
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Generic_PowerOnOff_Set(Generic_PowerOnOffParam_t* pPowerOnOffParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- AppliPowerOnSet.PowerOnState = pPowerOnOffParam->PowerOnOffState;
-
- TRACE_M(TF_SERIAL_CTRL,"#8213!\n\r");
+ AppliPowerOnSet[elementIndex].PowerOnState = pPowerOnOffParam->PowerOnOffState;
+
+ TRACE_M(TF_GENERIC,"Generic_PowerOnOff_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8213!\r\n");
- /* set the flag value for NVM store */
- //RestoreFlag = GENERIC_ON_OFF_NVM_FLAG;
+ if(AppliPowerOnSet[elementIndex].PowerOnState == GENERIC_POWER_ON_STATE)
+ {
+ /* set the flag value for NVM store */
+ RestoreFlag = GENERIC_ON_OFF_NVM_FLAG;
+ }
AppliNvm_SaveMessageParam();
@@ -359,17 +405,20 @@ MOBLE_RESULT Appli_Generic_PowerOnOff_Set(Generic_PowerOnOffParam_t* pPowerOnOff
* when Generic Power on off set message is received
* @param powerOnOff_status: Pointer to the parameters message
* @param plength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status ,
- MOBLEUINT32 plength)
+MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status,\
+ MOBLEUINT32 plength, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
MOBLEUINT8 i;
- TRACE_M(TF_GENERIC,"Generic_PowerOnOff_Status callback received \r\n");
+ TRACE_M(TF_GENERIC,"Generic_PowerOnOff_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8212!\r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8212! \n\r");
-
for(i = 0; i < plength; i++)
{
if(i == 0)
@@ -390,37 +439,43 @@ MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Set(Generic_DefaultTransitionParam_t* pDefaultTimeParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- AppliDefaultTransitionSet.DefaultTransitionTime = pDefaultTimeParam->DefaultTransitionTime;
+ AppliDefaultTransitionSet[elementIndex].DefaultTransitionTime = pDefaultTimeParam->DefaultTransitionTime;
+ TRACE_M(TF_GENERIC,"Generic_DefaultTransitionTime_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#820E!\r\n");
return MOBLE_RESULT_SUCCESS;
}
-
/******************************************************************************/
#endif /* ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME */
/******************************************************************************/
-
/**
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status ,
- MOBLEUINT32 plength)
+MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status , MOBLEUINT32 plength,MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_GENERIC,"Generic_DefaultTransitionTime_Status callback received \r\n");
-
- TRACE_M(TF_SERIAL_CTRL,"#8210! \n\r");
+ TRACE_M(TF_GENERIC,"Generic_DefaultTransitionTime_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8210!\r\n");
return MOBLE_RESULT_SUCCESS;
}
@@ -431,83 +486,99 @@ MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTrans
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_GetOnOffStatus(MOBLEUINT8* pOnOff_Status)
+MOBLE_RESULT Appli_Generic_GetOnOffStatus(MOBLEUINT8* pOnOff_Status,MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- *pOnOff_Status = AppliOnOffSet.Present_OnOff;
- TRACE_M(TF_SERIAL_CTRL,"Generic Get OnOff Status: Status %d!\n\r",
- AppliOnOffSet.Present_OnOff);
-
+ *pOnOff_Status = AppliOnOffSet[elementIndex].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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_GetOnOffValue(MOBLEUINT8* pOnOff_Value)
+MOBLE_RESULT Appli_Generic_GetOnOffValue(MOBLEUINT8* pOnOff_Value, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- *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);
+ *pOnOff_Value = AppliOnOffSet[elementIndex].Present_OnOffValue;
+ *(pOnOff_Value+1) = AppliOnOffSet[elementIndex].Present_OnOffValue >> 8;
+ *(pOnOff_Value+2) = AppliOnOffSet[elementIndex].TargetValue;
+ *(pOnOff_Value+3) = AppliOnOffSet[elementIndex].TargetValue >> 8;
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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_GetLevelStatus(MOBLEUINT8* pLevel_Status)
+MOBLE_RESULT Appli_Generic_GetLevelStatus(MOBLEUINT8* pLevel_Status, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- *pLevel_Status = AppliLevelSet.Present_Level16;
- *(pLevel_Status+1) = AppliLevelSet.Present_Level16 >> 8;
- *(pLevel_Status+2) = AppliLevelSet.Target_Level16;
- *(pLevel_Status+3) = AppliLevelSet.Target_Level16 >> 8;
-// TRACE_M(TF_SERIAL_CTRL,"Generic Get Level Status: Value %d!\n\r",
-// *pLevel_Status);
+ *pLevel_Status = AppliLevelSet[elementIndex].Present_Level16;
+ *(pLevel_Status+1) = AppliLevelSet[elementIndex].Present_Level16 >> 8;
+ *(pLevel_Status+2) = AppliLevelSet[elementIndex].Target_Level16;
+ *(pLevel_Status+3) = AppliLevelSet[elementIndex].Target_Level16 >> 8;
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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_GetPowerOnOffStatus(MOBLEUINT8* pPower_Status)
+MOBLE_RESULT Appli_Generic_GetPowerOnOffStatus(MOBLEUINT8* pPower_Status, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- *pPower_Status = AppliPowerOnSet.PowerOnState;
- TRACE_M(TF_SERIAL_CTRL,"Generic Get OnOff Status: Status %d!\n\r",
- AppliPowerOnSet.PowerOnState);
+
+ *pPower_Status = AppliPowerOnSet[elementIndex].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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_Status)
+MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_Status,MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- *pTransition_Status = AppliDefaultTransitionSet.DefaultTransitionTime;
- TRACE_M(TF_SERIAL_CTRL,"Get Default Transition Status: Status %d!\n\r",
- AppliDefaultTransitionSet.DefaultTransitionTime);
+
+ *pTransition_Status = AppliDefaultTransitionSet[elementIndex].DefaultTransitionTime;
return MOBLE_RESULT_SUCCESS;
}
+
/**
* @}
*/
@@ -516,5 +587,5 @@ MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_St
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 992baad9b..370769608 100644
--- 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
@@ -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
@@ -86,35 +86,72 @@ typedef struct
/* Exported Functions Prototypes ---------------------------------------------*/
-MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t*, MOBLEUINT8);
+MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t*,
+ MOBLEUINT8,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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 );
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t*,
+ MOBLEUINT8,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t*,
+ MOBLEUINT8,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
- MOBLEUINT8 OptionalValid);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_Level_Status(MOBLEUINT8 const *plevel_status,
- MOBLEUINT32 plength);
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_PowerOnOff_Set(Generic_PowerOnOffParam_t* pPowerOnOffParam,
- MOBLEUINT8 OptionalValid);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status ,
- MOBLEUINT32 plength);
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Set(Generic_DefaultTransitionParam_t* pDefaultTimeParam,
- MOBLEUINT8 OptionalValid);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status ,
- MOBLEUINT32 plength);
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
-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_GetOnOffStatus(MOBLEUINT8* pOnOff_Status,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_GetOnOffValue(MOBLEUINT8* pOnOff_Value,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_GetLevelStatus(MOBLEUINT8* pLevel_Status,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_GetPowerOnOffStatus(MOBLEUINT8* pLevel_Status,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Generic_Restore_PowerOn_Value(MOBLEUINT8 restoreValue,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_Status,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status,
- MOBLEUINT32 plength);
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
#endif /* __APPLI_GENERIC_H */
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index aecd5575e..317071a1c 100644
--- 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
@@ -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
@@ -41,58 +41,166 @@
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
-
-MOBLEUINT8 Led_Value;
/* Private function prototypes -----------------------------------------------*/
-MOBLE_RESULT Appli_GenericClient_OnOff_Set(void);
-/* Private functions ---------------------------------------------------------*/
+
+/* Private functions ---------------------------------------------------------*/
/**
-* @brief Appli_Generic_OnOff_Set: This function is callback for Application
-* when Generic OnOff message is called
-* @param void
+* @brief Appli_GenericClient_API: This function is a Wrapper to call Generic Client API depending on opcode received in input
+* @param elementIndex: Index of the element
+* @param msg_opcode: opcode of the desired API
+* @param msg_params: buffer containing the desired API parameters
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_GenericClient_OnOff_Set(void)
+MOBLE_RESULT Appli_GenericClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8 *msg_params)
{
- 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;
-}
-
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+ switch(msg_opcode){
/******************************************************************************/
-#ifdef ENABLE_GENERIC_MODEL_CLIENT_LEVEL
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_ONOFF
/******************************************************************************/
-
-/**
-* @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));
+ case GENERIC_ON_OFF_GET:
+ {
+ result = GenericClient_OnOff_Get(elementIndex);
+ break;
+ }
+ case GENERIC_ON_OFF_SET_ACK:
+ {
+ result = GenericClient_OnOff_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_OnOffParam_t) );
+ break;
+ }
+ case GENERIC_ON_OFF_SET_UNACK:
+ {
+ result = GenericClient_OnOff_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_OnOffParam_t) );
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_GENERIC_MODEL_CLIENT_ONOFF */
+/******************************************************************************/
- return MOBLE_RESULT_SUCCESS;
-}
+/******************************************************************************/
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_LEVEL
+/******************************************************************************/
+ case GENERIC_LEVEL_GET:
+ {
+ result = GenericClient_Level_Get(elementIndex);
+ break;
+ }
+ case GENERIC_LEVEL_SET_ACK:
+ {
+ result = GenericClient_Level_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_LevelParam_t));
+ break;
+ }
+ case GENERIC_LEVEL_SET_UNACK:
+ {
+ result = GenericClient_Level_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_LevelParam_t));
+ break;
+ }
+ case GENERIC_DELTA_SET:
+ {
+
+ result = GenericClient_Delta_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_DeltaLevelParam_t));
+ break;
+ }
+ case GENERIC_DELTA_SET_UNACK:
+ {
+ result = GenericClient_Delta_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_DeltaLevelParam_t));
+ break;
+ }
+ case GENERIC_MOVE_SET:
+ {
+ result = GenericClient_Move_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_LevelMoveParam_t));
+ break;
+ }
+ case GENERIC_MOVE_SET_UNACK:
+ {
+ result = GenericClient_Move_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_LevelMoveParam_t));
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_GENERIC_MODEL_CLIENT_LEVEL */
+/******************************************************************************/
/******************************************************************************/
-#endif /* #ifdef ENABLE_GENERIC_MODEL_CLIENT_LEVEL */
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_POWER_ONOFF
/******************************************************************************/
+ case GENERIC_POWER_ON_OFF_GET:
+ {
+ GenericClient_PowerOnOff_Get(elementIndex);
+ break;
+ }
+ case GENERIC_POWER_ON_OFF_SET:
+ {
+ result = GenericClient_PowerOnOff_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_PowerOnOffParam_t));
+ break;
+ }
+ case GENERIC_POWER_ON_OFF_SET_UNACK:
+ {
+ result = GenericClient_PowerOnOff_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_PowerOnOffParam_t));
+ break;
+ }
+
+/******************************************************************************/
+#endif /* #ifdef ENABLE_GENERIC_MODEL_CLIENT_POWER_ONOFF */
+/******************************************************************************/
+
+/******************************************************************************/
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_DEFAULT_TRANSITION_TIME
+/******************************************************************************/
+ case GENERIC_DEFAULT_TRANSITION_TIME_GET:
+ {
+ result = GenericClient_DefaultTransitionTime_Get(elementIndex);
+ break;
+ }
+
+ case GENERIC_DEFAULT_TRANSITION_TIME_SET:
+ {
+ result = GenericClient_DefaultTransitionTime_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_DefaultTransitionParam_t));
+ break;
+ }
+
+ case GENERIC_DEFAULT_TRANSITION_TIME_SET_UNACK:
+ {
+ result = GenericClient_DefaultTransitionTime_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_DefaultTransitionParam_t));
+ break;
+ }
+
+/******************************************************************************/
+#endif /* #ifdef ENABLE_GENERIC_MODEL_CLIENT_DEFAULT_TRANSITION_TIME */
+/******************************************************************************/
+
+ default:
+ {
+ TRACE_M(TF_GENERIC, "OpCode value invalid %d \r\n", msg_opcode);
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+ return result;
+}
/**
* @}
@@ -102,5 +210,5 @@ MOBLE_RESULT Appli_GenericClient_Level_Set_Unack(void)
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 742fd1e68..c56fd5a9e 100644
--- 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
@@ -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
@@ -32,12 +32,12 @@
/* 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);
+MOBLE_RESULT Appli_GenericClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8 *msg_params);
+
#endif /* __APPLI_GENERIC_CLIENT_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 318929ffc..19face0da 100644
--- 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
@@ -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
@@ -41,7 +41,9 @@
* @{
*/
-MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState);
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
@@ -55,9 +57,8 @@ 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;
+Appli_Light_lightnessSet ApplilightnessSet[APPLICATION_NUMBER_OF_ELEMENTS] = {{1,0,0,0,0,0}};
+Appli_Light_lightnessLinearSet ApplilightnessLinearSet[APPLICATION_NUMBER_OF_ELEMENTS];
/******************************************************************************/
#endif /* #ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS */
@@ -70,10 +71,9 @@ 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;
+ Appli_Light_CtlSet AppliCtlSet[APPLICATION_NUMBER_OF_ELEMENTS];
+ Appli_Light_CtlTemperatureRangeSet AppliCtlTemperatureRangeSet[APPLICATION_NUMBER_OF_ELEMENTS];
+ Appli_Light_CtlDefaultSet AppliCtlDefaultSet[APPLICATION_NUMBER_OF_ELEMENTS];
/******************************************************************************/
#endif /* #ifdef ENABLE_LIGHT_MODEL_SERVER_CTL */
@@ -83,14 +83,11 @@ Appli_Light_CtlDefaultSet AppliCtlDefaultSet;
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;
+ Appli_Light_HslSet AppliHslSet[APPLICATION_NUMBER_OF_ELEMENTS];
+ Appli_Light_HslDefaultSet Appli_HslDefaultSet[APPLICATION_NUMBER_OF_ELEMENTS] = {{0x7FFF,0x7FFF,0x7FFF}};
+ Appli_Light_RGBSet Appli_RGBParam[APPLICATION_NUMBER_OF_ELEMENTS];
+ Appli_Light_HslRangeSet AppliHslRangeSet[APPLICATION_NUMBER_OF_ELEMENTS];
/*******************************************************************************/
#endif /*End of the LIGHTING HSL MODEL variables */
@@ -117,22 +114,28 @@ extern MOBLEUINT16 IntensityValue;
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_LightnessParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
MOBLEUINT16 duty;
static MOBLEUINT16 previousIntensity = 0;
- TRACE_M(TF_SERIAL_CTRL,"#824C!\n\r");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#824C!\r\n");
- ApplilightnessSet.PresentState16 = pLight_LightnessParam->LightnessPresentValue16;
- ApplilightnessSet.LastLightness16 = pLight_LightnessParam->LightnessLastStatus;
+ ApplilightnessSet[elementIndex].PresentState16 = pLight_LightnessParam->LightnessPresentValue16;
+ ApplilightnessSet[elementIndex].LastLightness16 = pLight_LightnessParam->LightnessLastStatus;
if(pLight_LightnessParam->LightnessPresentValue16 != 0x00)
{
- ApplilightnessSet.LastLightness16 = pLight_LightnessParam->LightnessPresentValue16;
+ ApplilightnessSet[elementIndex].LastLightness16 = pLight_LightnessParam->LightnessPresentValue16;
}
if(((IntensityValue > previousIntensity) && (IntensityValue <PWM_TIME_PERIOD)) ||
@@ -146,6 +149,7 @@ MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_Lightness
}
previousIntensity = IntensityValue;
+#if 0
/* For demo, if Level is more than 100, switch ON the LED */
if(pLight_LightnessParam->LightnessPresentValue16 >= 0x8000)
{
@@ -155,16 +159,17 @@ MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_Lightness
{
BSP_LED_Off(LED_BLUE);
}
- TRACE_M(TF_SERIAL_CTRL,"#8206%04hx!\n\r",ApplilightnessSet.PresentState16);
+#endif
+
+ TRACE_M(TF_SERIAL_CTRL,"#8206%04hx!\n\r",
+ ApplilightnessSet[elementIndex].PresentState16);
- duty = PwmValueMapping(ApplilightnessSet.PresentState16 , 0xfFFF ,0);
+ duty = PwmValueMapping(ApplilightnessSet[elementIndex].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();
+ NvmStatePowerFlag_Set(LIGHT_LIGHTNESS_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
@@ -181,18 +186,18 @@ MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_Lightness
* @param pLength: length of data
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_Lightness_Status callback received \r\n");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#824E!\r\n");
- TRACE_M(TF_SERIAL_CTRL,"#824E! \n\r");
-
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2))
@@ -201,28 +206,33 @@ MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, M
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present Lightness: %d \r\n",
- value << 8 | pLightness_status[i]);
+ TRACE_M(TF_LIGHT,"Present Lightness: 0x%x (%d)\r\n",
+ value | pLightness_status[i] << 8,
+ value | pLightness_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Target Lightness: %d \r\n",
- value << 8 | pLightness_status[i]);
+ TRACE_M(TF_LIGHT,"Target Lightness: 0x%x (%d)\r\n",
+ value | pLightness_status[i] << 8,
+ value | pLightness_status[i] << 8);
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\r\n",
+ pLightness_status[i],
pLightness_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#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
@@ -231,11 +241,13 @@ MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, M
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Lightness_Linear_Set(Light_LightnessStatus_t* pLight_LightnessLinearParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- ApplilightnessLinearSet.PresentState16 = pLight_LightnessLinearParam->LinearPresentValue16;
+ ApplilightnessLinearSet[elementIndex].PresentState16 = pLight_LightnessLinearParam->LinearPresentValue16;
- TRACE_M(TF_SERIAL_CTRL,"#8250!\n\r");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Linear_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8250!\r\n");
return MOBLE_RESULT_SUCCESS;
}
@@ -248,20 +260,25 @@ MOBLE_RESULT Appli_Light_Lightness_Linear_Set(Light_LightnessStatus_t* pLight_Li
* @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 dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @param pLength: length of data
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_Lightness_Linear_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8252! \n\r");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Linear_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8252!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2))
@@ -270,24 +287,29 @@ MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLin
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present Lightness: %d \r\n",
- value << 8 | pLightnessLinear_status[i]);
+ TRACE_M(TF_LIGHT,"Present Lightness: 0x%x (%d)\r\n",
+ value | pLightnessLinear_status[i] << 8,
+ value | pLightnessLinear_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Target Lightness: %d \r\n",
- value << 8 | pLightnessLinear_status[i]);
+ TRACE_M(TF_LIGHT,"Target Lightness: 0x%x (%d)\r\n",
+ value | pLightnessLinear_status[i] << 8,
+ value | pLightnessLinear_status[i] << 8);
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\r\n",
+ pLightnessLinear_status[i],
pLightnessLinear_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP
/******************************************************************************/
@@ -297,11 +319,17 @@ MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLin
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pLight_LightnessDefaultParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
+#if 0
if(pLight_LightnessDefaultParam->LightnessDefaultStatus > 0)
{
BSP_LED_On(LED_BLUE);
@@ -310,14 +338,16 @@ MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pL
{
BSP_LED_Off(LED_BLUE);
}
- ApplilightnessSet.LightnessDefault = pLight_LightnessDefaultParam->LightnessDefaultStatus;
+#endif
+
+ ApplilightnessSet[elementIndex].LightnessDefault =
+ pLight_LightnessDefaultParam->LightnessDefaultStatus;
+
+ TRACE_M(TF_LIGHT,"Light_Lightness_Default_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8259! \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8259!\n\r");
-
/* set the flag value for NVM store */
- RestoreFlag = LIGHT_LIGHTNESS_NVM_FLAG;
-
- AppliNvm_SaveMessageParam();
+ NvmStatePowerFlag_Set(LIGHT_LIGHTNESS_NVM_FLAG,elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -331,19 +361,25 @@ MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pL
* when Light Lightness Default status message is received
* @param pLightnessDefault_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDefault_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDefault_status, MOBLEUINT32 pLength
+ , MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
- MOBLEUINT16 value = 0;
- #endif
- TRACE_M(TF_LIGHT,"Light_Lightness_Default_Status callback received \r\n");
+ MOBLEUINT16 value;
+#endif
- TRACE_M(TF_SERIAL_CTRL,"#8256! \n\r");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Default_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8256!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if(i == 0)
@@ -352,14 +388,61 @@ MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDe
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Lightness: %d \r\n",
- value << 8 | pLightnessDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Lightness Default: 0x%x (%d)\r\n",
+ value | pLightnessDefault_status[i] << 8,
+ value | pLightnessDefault_status[i] << 8);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
+/**
+* @brief Appli_Light_Lightness_Last_Status: This function is callback for Application
+* when Light Lightness Last status message is received
+* @param pLightnessDefault_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Lightness_Last_Status(MOBLEUINT8 const *pLightnessLast_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+#if ( CFG_DEBUG_TRACE != 0 )
+ MOBLEUINT32 i;
+ MOBLEUINT16 value;
+#endif
+
+ TRACE_M(TF_LIGHT,"Light_Lightness_Last_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8256!\r\n");
+
+#if ( CFG_DEBUG_TRACE != 0 )
+ for(i = 0; i < pLength; i++)
+ {
+ if(i == 0)
+ {
+ value = pLightnessLast_status[i];
+ }
+ else if(i == 1)
+ {
+ TRACE_M(TF_LIGHT,"Lightness Last: 0x%x (%d)\r\n",
+ value | pLightnessLast_status[i] << 8,
+ value | pLightnessLast_status[i] << 8);
+ }
+ }
+#endif
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP
/******************************************************************************/
@@ -369,16 +452,22 @@ MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDe
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Lightness_Range_Set(Light_LightnessRangeParam_t* pLight_LightnessRangeParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- ApplilightnessSet.StatusCode = pLight_LightnessRangeParam->StatusCode;
- ApplilightnessSet.RangeMin = pLight_LightnessRangeParam->MinRangeStatus;
- ApplilightnessSet.RangeMax = pLight_LightnessRangeParam->MaxRangeStatus;
+ ApplilightnessSet[elementIndex].StatusCode = pLight_LightnessRangeParam->StatusCode;
+ ApplilightnessSet[elementIndex].RangeMin = pLight_LightnessRangeParam->MinRangeStatus;
+ ApplilightnessSet[elementIndex].RangeMax = pLight_LightnessRangeParam->MaxRangeStatus;
- TRACE_M(TF_SERIAL_CTRL,"#825B! \n\r");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Range_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#825B!\r\n");
return MOBLE_RESULT_SUCCESS;
}
@@ -392,45 +481,56 @@ MOBLE_RESULT Appli_Light_Lightness_Range_Set(Light_LightnessRangeParam_t* pLight
* when Light Lightness range ststus message is received
* @param pLightnessRange_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status, MOBLEUINT32 pLength
+ , MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
- MOBLEUINT16 value = 0;
+ MOBLEUINT16 value;
#endif
- TRACE_M(TF_LIGHT,"Light_Lightness_Range_Status callback received \r\n");
-
- TRACE_M(TF_SERIAL_CTRL,"#8258! \n\r");
-#ifdef CFG_DEBUG_TRACE
+ TRACE_M(TF_LIGHT,"Light_Lightness_Range_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8258!\r\n");
+
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if(i == 0)
{
- TRACE_M(TF_LIGHT,"Status Code: %d \r\n",
- value << 8 | pLightnessRange_status[i]);
+ TRACE_M(TF_LIGHT,"Status Code: 0x%x (%d)\r\n",
+ pLightnessRange_status[i],
+ pLightnessRange_status[i]);
}
else if((i == 1) || (i == 3))
{
value = pLightnessRange_status[i];
}
- else if(i == 1)
+ else if(i == 2)
{
- TRACE_M(TF_LIGHT,"Range Min: %d \r\n",
- value << 8 | pLightnessRange_status[i]);
+ TRACE_M(TF_LIGHT,"Range Min: 0x%x (%d)\r\n",
+ value | pLightnessRange_status[i] << 8,
+ value | pLightnessRange_status[i] << 8);
}
- else if(i == 3)
+ else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Range Max: %d \r\n",
- value << 8 | pLightnessRange_status[i]);
+ TRACE_M(TF_LIGHT,"Range Max: 0x%x (%d)\r\n",
+ value | pLightnessRange_status[i] << 8,
+ value | pLightnessRange_status[i] << 8);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL
/******************************************************************************/
@@ -440,22 +540,34 @@ MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRang
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Ctl_Set(Light_CtlStatus_t* pLight_CtlParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
float colourRatio;
float brightRatio;
- TRACE_M(TF_SERIAL_CTRL,"#825E! \n\r");
+ TRACE_M(TF_LIGHT,"Appli_Light_Ctl_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#825E!\r\n");
- 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);
+ AppliCtlSet[elementIndex].PresentLightness16 = pLight_CtlParam->PresentCtlLightness16;
+ AppliCtlSet[elementIndex].PresentTemperature16 = pLight_CtlParam->PresentCtlTemperature16;
+ AppliCtlSet[elementIndex].PresentCtlDelta16 = pLight_CtlParam->PresentCtlDelta16;
- brightRatio = Ratio_CalculateValue(AppliCtlSet.PresentLightness16 ,0XFFFF ,0);
+ /* Save target parameters if transition is available */
+ AppliCtlSet[elementIndex].TargetLightness16 = pLight_CtlParam->TargetCtlLightness16;
+ AppliCtlSet[elementIndex].TargetTemperature16 = pLight_CtlParam->TargetCtlTemperature16;
+ AppliCtlSet[elementIndex].TargetCtlDelta16 = pLight_CtlParam->TargetCtlDeltaUv16;
+
+ colourRatio = Ratio_CalculateValue(AppliCtlSet[elementIndex].PresentTemperature16 ,MAX_CTL_TEMP_RANGE ,MIN_CTL_TEMP_RANGE);
+
+ brightRatio = Ratio_CalculateValue(AppliCtlSet[elementIndex].PresentLightness16 ,0XFFFF ,0);
Appli_LightPwmValue.PwmCoolValue = PWM_CoolValue(colourRatio , brightRatio);
Appli_LightPwmValue.PwmWarmValue = PWM_WarmValue(colourRatio , brightRatio);
@@ -464,15 +576,8 @@ MOBLE_RESULT Appli_Light_Ctl_Set(Light_CtlStatus_t* pLight_CtlParam,
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();
+ NvmStatePowerFlag_Set(LIGHT_CTL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -488,18 +593,18 @@ MOBLE_RESULT Appli_Light_Ctl_Set(Light_CtlStatus_t* pLight_CtlParam,
* @param pLength: length of data
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status,
- MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_Ctl_Status callback received \r\n");
-
- TRACE_M(TF_SERIAL_CTRL,"#8260! \n\r");
+
+ TRACE_M(TF_LIGHT,"Light_Ctl_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8260!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2) || (i == 4) || (i == 6))
@@ -508,34 +613,41 @@ MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status,
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present CTL Lightness: %d \r\n",
- value << 8 | pLightCtl_status[i]);
+ TRACE_M(TF_LIGHT,"Present CTL Lightness: 0x%x (%d)\r\n",
+ value | pLightCtl_status[i] << 8,
+ value | pLightCtl_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Present CTL Temperature: %d \r\n",
- value << 8 | pLightCtl_status[i]);
+ TRACE_M(TF_LIGHT,"Present CTL Temperature: 0x%x (%d)\r\n",
+ value | pLightCtl_status[i] << 8,
+ value | pLightCtl_status[i] << 8);
}
else if(i == 5)
{
- TRACE_M(TF_LIGHT,"Target CTL Lightness: %d \r\n",
- value << 8 | pLightCtl_status[i]);
+ TRACE_M(TF_LIGHT,"Target CTL Lightness: 0x%x (%d)\r\n",
+ value | pLightCtl_status[i] << 8,
+ value | pLightCtl_status[i] << 8);
}
else if(i == 7)
{
- TRACE_M(TF_LIGHT,"Target CTL Temperature: %d \r\n",
- value << 8 | pLightCtl_status[i]);
+ TRACE_M(TF_LIGHT,"Target CTL Temperature: 0x%x (%d)\r\n",
+ value | pLightCtl_status[i] << 8,
+ value | pLightCtl_status[i] << 8);
}
else if(i == 8)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time:0x%x (%d)\r\n",
+ pLightCtl_status[i],
pLightCtl_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE
/******************************************************************************/
@@ -545,21 +657,32 @@ MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status,
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_CtlTemperature_Set(Light_CtlStatus_t* pLight_CtltempParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
float colourRatio;
float brightRatio;
- TRACE_M(TF_SERIAL_CTRL,"#8264!\n\r");
- AppliCtlSet.PresentTemperature16 = pLight_CtltempParam->PresentCtlTemperature16;
- AppliCtlSet.PresentCtlDelta16 = pLight_CtltempParam->PresentCtlDelta16;
+ TRACE_M(TF_LIGHT,"Appli_Light_CtlTemperature_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8264!\r\n");
+
+ AppliCtlSet[elementIndex].PresentTemperature16 = pLight_CtltempParam->PresentCtlTemperature16;
+ AppliCtlSet[elementIndex].PresentCtlDelta16 = pLight_CtltempParam->PresentCtlDelta16;
- colourRatio = Ratio_CalculateValue(AppliCtlSet.PresentTemperature16 ,MAX_CTL_TEMP_RANGE ,MIN_CTL_TEMP_RANGE);
+ /* Made a copy of target in case of transition values change */
+ AppliCtlSet[elementIndex].TargetTemperature16 = pLight_CtltempParam->TargetCtlTemperature16;
+ AppliCtlSet[elementIndex].TargetCtlDelta16 = pLight_CtltempParam->TargetCtlDeltaUv16;
- brightRatio = Ratio_CalculateValue(AppliCtlSet.PresentLightness16 ,0XFFFF ,0);
+ colourRatio = Ratio_CalculateValue(AppliCtlSet[elementIndex].PresentTemperature16 ,MAX_CTL_TEMP_RANGE ,MIN_CTL_TEMP_RANGE);
+
+ brightRatio = Ratio_CalculateValue(AppliCtlSet[elementIndex].PresentLightness16 ,0XFFFF ,0);
Appli_LightPwmValue.PwmCoolValue = PWM_CoolValue(colourRatio , brightRatio);
Appli_LightPwmValue.PwmWarmValue = PWM_WarmValue(colourRatio , brightRatio);
@@ -568,9 +691,7 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Set(Light_CtlStatus_t* pLight_CtltempPar
Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
/* set the flag value for NVM store */
- RestoreFlag = LIGHT_CTL_NVM_FLAG;
-
- AppliNvm_SaveMessageParam();
+ NvmStatePowerFlag_Set(LIGHT_CTL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -584,19 +705,25 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Set(Light_CtlStatus_t* pLight_CtltempPar
* when Light CTL temperature status message is received
* @param pLightCtlTemp_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status, MOBLEUINT32 pLength
+ , MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_CtlTemperature_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8266! \n\r");
+ TRACE_M(TF_LIGHT,"Light_CtlTemperature_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8266!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2) || (i == 4) || (i == 6))
@@ -605,35 +732,42 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_s
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present CTL Temperature: %d \r\n",
- value << 8 | pLightCtlTemp_status[i]);
+ TRACE_M(TF_LIGHT,"Present CTL Temperature: 0x%x (%d)\r\n",
+ value | pLightCtlTemp_status[i] << 8,
+ value | pLightCtlTemp_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Present CTL Delta UV: %d \r\n",
- value << 8 | pLightCtlTemp_status[i]);
+ TRACE_M(TF_LIGHT,"Present CTL Delta UV: 0x%x (%d)\r\n",
+ value | pLightCtlTemp_status[i] << 8,
+ value | pLightCtlTemp_status[i] << 8);
}
else if(i == 5)
{
- TRACE_M(TF_LIGHT,"Target CTL Temperature: %d \r\n",
- value << 8 | pLightCtlTemp_status[i]);
+ TRACE_M(TF_LIGHT,"Target CTL Temperature: 0x%x (%d)\r\n",
+ value | pLightCtlTemp_status[i] << 8,
+ value | pLightCtlTemp_status[i] << 8);
}
else if(i == 7)
{
- TRACE_M(TF_LIGHT,"Target CTL Delta UV: %d \r\n",
- value << 8 | pLightCtlTemp_status[i]);
+ TRACE_M(TF_LIGHT,"Target CTL Delta UV: 0x%x (%d)\r\n",
+ value | pLightCtlTemp_status[i] << 8,
+ value | pLightCtlTemp_status[i] << 8);
}
else if(i == 8)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\r\n",
+ pLightCtlTemp_status[i],
pLightCtlTemp_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP
/******************************************************************************/
@@ -643,16 +777,22 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_s
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_CtlTemperature_Range_Set(Light_CtlTemperatureRangeParam_t* pLight_CtlTempRangeParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- AppliCtlTemperatureRangeSet.RangeMin = pLight_CtlTempRangeParam->MinRangeStatus;
- AppliCtlTemperatureRangeSet.RangeMax = pLight_CtlTempRangeParam->MaxRangeStatus;
- AppliCtlTemperatureRangeSet.StatusCode = pLight_CtlTempRangeParam->StatusCode;
+ AppliCtlTemperatureRangeSet[elementIndex].RangeMin = pLight_CtlTempRangeParam->MinRangeStatus;
+ AppliCtlTemperatureRangeSet[elementIndex].RangeMax = pLight_CtlTempRangeParam->MaxRangeStatus;
+ AppliCtlTemperatureRangeSet[elementIndex].StatusCode = pLight_CtlTempRangeParam->StatusCode;
- TRACE_M(TF_SERIAL_CTRL,"#826B!\n\r");
+ TRACE_M(TF_LIGHT,"Light_CtlTemperature_Range_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#826B!\r\n");
return MOBLE_RESULT_SUCCESS;
}
@@ -667,28 +807,34 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Range_Set(Light_CtlTemperatureRangeParam
* when Light CTL temperature range status message is received
* @param pCtlTempRange_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
- MOBLEUINT16 value = 0;
+ MOBLEUINT16 value;
#endif
- TRACE_M(TF_LIGHT,"Light_CtlTemperature_Range_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8263! \n\r");
+ TRACE_M(TF_LIGHT,"Light_CtlTemperature_Range_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8263!\r\n");
- RestoreFlag = LIGHT_CTL_NVM_FLAG;
+ RestoreFlag = LIGHT_CTL_NVM_FLAG;
AppliNvm_SaveMessageParam();
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if(i == 0)
{
- TRACE_M(TF_LIGHT,"Status Code: %d \r\n",
+ TRACE_M(TF_LIGHT,"Status Code: 0x%x (%d)\r\n",
+ pCtlTempRange_status[i],
pCtlTempRange_status[i]);
}
else if((i == 1) || (i == 3))
@@ -697,19 +843,23 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempR
}
else if(i == 2)
{
- TRACE_M(TF_LIGHT,"Range Min: %d \r\n",
- value << 8 | pCtlTempRange_status[i]);
+ TRACE_M(TF_LIGHT,"Range Min: 0x%x (%d)\r\n",
+ value | pCtlTempRange_status[i] << 8,
+ value | pCtlTempRange_status[i] << 8 );
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Range Max: %d \r\n",
- value << 8 | pCtlTempRange_status[i]);
+ TRACE_M(TF_LIGHT,"Range Max: 0x%x (%d)\r\n",
+ value | pCtlTempRange_status[i] << 8,
+ value | pCtlTempRange_status[i] << 8 );
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP
/******************************************************************************/
@@ -719,16 +869,22 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempR
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_CtlDefault_Set(Light_CtlDefaultParam_t* pLight_CtlDefaultParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- AppliCtlDefaultSet.CtlDefaultLightness16 = pLight_CtlDefaultParam->CtlDefaultLightness16;
- AppliCtlDefaultSet.CtlDefaultTemperature16 = pLight_CtlDefaultParam->CtlDefaultTemperature16;
- AppliCtlDefaultSet.CtlDefaultDeltaUv = pLight_CtlDefaultParam->CtlDefaultDeltaUv;
+ AppliCtlDefaultSet[elementIndex].CtlDefaultLightness16 = pLight_CtlDefaultParam->CtlDefaultLightness16;
+ AppliCtlDefaultSet[elementIndex].CtlDefaultTemperature16 = pLight_CtlDefaultParam->CtlDefaultTemperature16;
+ AppliCtlDefaultSet[elementIndex].CtlDefaultDeltaUv = pLight_CtlDefaultParam->CtlDefaultDeltaUv;
- TRACE_M(TF_SERIAL_CTRL,"#8269!\n\r");
+ TRACE_M(TF_LIGHT,"Light_CtlDefault_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8269!\r\n");
return MOBLE_RESULT_SUCCESS;
}
@@ -742,19 +898,24 @@ MOBLE_RESULT Appli_Light_CtlDefault_Set(Light_CtlDefaultParam_t* pLight_CtlDefau
* when Light CTL Default status message is received
* @param pCtlDefault_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_Ctl_DefaultStatus callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8268! \n\r");
+ TRACE_M(TF_LIGHT,"Light_Ctl_DefaultStatus callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8268!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2) || (i == 4))
@@ -763,24 +924,29 @@ MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status,
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Lightness: %d \r\n",
- value << 8 | pCtlDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Lightness: 0x%x (%d)\n\r",
+ value | pCtlDefault_status[i] << 8,
+ value | pCtlDefault_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Temperature: %d \r\n",
- value << 8 | pCtlDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Temperature: 0x%x (%d)\n\r",
+ value | pCtlDefault_status[i] << 8,
+ value | pCtlDefault_status[i] << 8);
}
else if(i == 5)
{
- TRACE_M(TF_LIGHT,"Delta UV: %d \r\n",
- value << 8 | pCtlDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Delta UV: 0x%x (%d)\n\r",
+ value | pCtlDefault_status[i] << 8,
+ value | pCtlDefault_status[i] << 8);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL
/******************************************************************************/
@@ -790,32 +956,41 @@ MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status,
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Hsl_Set(Light_HslStatus_t* pLight_HslParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_SERIAL_CTRL,"#8276!\n\r");
+ TRACE_M(TF_LIGHT,"Appli_Light_Hsl_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8276!\r\n");
- AppliHslSet.HslLightness16 = pLight_HslParam->PresentHslLightness16;
- AppliHslSet.HslHueLightness16 = pLight_HslParam->PresentHslHueLightness16;
- AppliHslSet.HslSaturation16 = pLight_HslParam->PresentHslSaturation16;
+ AppliHslSet[elementIndex].HslLightness16 = pLight_HslParam->PresentHslLightness16;
+ AppliHslSet[elementIndex].HslHueLightness16 = pLight_HslParam->PresentHslHueLightness16;
+ AppliHslSet[elementIndex].HslSaturation16 = pLight_HslParam->PresentHslSaturation16;
+ /* Save target parameters if transition is available */
+ AppliHslSet[elementIndex].TargetHslLightness16 = pLight_HslParam->TargetHslLightness16;
+ AppliHslSet[elementIndex].TargetHslHueLightness16 = pLight_HslParam->TargetHslHueLightness16;
+ AppliHslSet[elementIndex].TargetHslSaturation16 = pLight_HslParam->TargetHslSaturation16;
+
/* Function to convert HSL values in RGB values */
- HSL2RGB_Conversion();
+ HSL2RGB_Conversion(elementIndex);
- 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);
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam[elementIndex].Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam[elementIndex].Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam[elementIndex].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();
+ NvmStatePowerFlag_Set(LIGHT_HSL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -829,19 +1004,24 @@ MOBLE_RESULT Appli_Light_Hsl_Set(Light_HslStatus_t* pLight_HslParam,
* when Light HSL status message is received
* @param pHsl_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_Hsl_Status callback received \r\n");
-
- TRACE_M(TF_SERIAL_CTRL,"#8278! \n\r");
+
+ TRACE_M(TF_LIGHT,"Light_Hsl_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8278!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2) || (i == 4))
@@ -850,29 +1030,35 @@ MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 p
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"HSL Lightness: %d \r\n",
- value << 8 | pHsl_status[i]);
+ TRACE_M(TF_LIGHT,"HSL Lightness: 0x%x (%d)\n\r",
+ value | pHsl_status[i] << 8,
+ value | pHsl_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"HSL Hue: %d \r\n",
- value << 8 | pHsl_status[i]);
+ TRACE_M(TF_LIGHT,"HSL Hue: 0x%x (%d)\n\r",
+ value | pHsl_status[i] << 8,
+ value | pHsl_status[i] << 8);
}
else if(i == 5)
{
- TRACE_M(TF_LIGHT,"HSL Saturation: %d \r\n",
- value << 8 | pHsl_status[i]);
+ TRACE_M(TF_LIGHT,"HSL Saturation: 0x%x (%d)\n\r",
+ value | pHsl_status[i] << 8,
+ value | pHsl_status[i] << 8);
}
else if(i == 6)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\n\r",
+ pHsl_status[i],
pHsl_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_HUE
/******************************************************************************/
@@ -882,28 +1068,32 @@ MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 p
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_HslHue_Set(Light_HslStatus_t* pLight_HslHueParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_SERIAL_CTRL,"#826F! \n\r");
+ TRACE_M(TF_LIGHT,"Light_HslHue_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#826F!\r\n");
- AppliHslSet.HslHueLightness16 = pLight_HslHueParam->PresentHslHueLightness16;
+ AppliHslSet[elementIndex].HslHueLightness16 = pLight_HslHueParam->PresentHslHueLightness16;
- HSL2RGB_Conversion();
+ HSL2RGB_Conversion(elementIndex);
- 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);
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam[elementIndex].Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam[elementIndex].Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam[elementIndex].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();
+ NvmStatePowerFlag_Set(LIGHT_HSL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
@@ -918,19 +1108,24 @@ MOBLE_RESULT Appli_Light_HslHue_Set(Light_HslStatus_t* pLight_HslHueParam,
* when Light HSL HUE status message is received
* @param pHslHue_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_HslHue_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8271! \n\r");
+ TRACE_M(TF_LIGHT,"Light_HslHue_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8271!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2))
@@ -939,24 +1134,29 @@ MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUI
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present Hue: %d \r\n",
- value << 8 | pHslHue_status[i]);
+ TRACE_M(TF_LIGHT,"Present Hue: 0x%x (%d)\n\r",
+ value | pHslHue_status[i] << 8,
+ value | pHslHue_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Target Hue: %d \r\n",
- value << 8 | pHslHue_status[i]);
+ TRACE_M(TF_LIGHT,"Target Hue: 0x%x (%d)\n\r",
+ value | pHslHue_status[i] << 8,
+ value | pHslHue_status[i] << 8);
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\n\r",
+ pHslHue_status[i],
pHslHue_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION
/******************************************************************************/
@@ -966,28 +1166,32 @@ MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUI
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_HslSaturation_Set(Light_HslStatus_t* pLight_HslSaturationParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_SERIAL_CTRL,"#8273! \n\r");
+ TRACE_M(TF_LIGHT,"Appli_Light_HslSaturation_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8273!\r\n");
- AppliHslSet.HslSaturation16 = pLight_HslSaturationParam->PresentHslSaturation16;
+ AppliHslSet[elementIndex].HslSaturation16 = pLight_HslSaturationParam->PresentHslSaturation16;
- HSL2RGB_Conversion();
+ HSL2RGB_Conversion(elementIndex);
- 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);
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam[elementIndex].Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam[elementIndex].Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam[elementIndex].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();
+ NvmStatePowerFlag_Set(LIGHT_HSL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -1001,19 +1205,24 @@ MOBLE_RESULT Appli_Light_HslSaturation_Set(Light_HslStatus_t* pLight_HslSaturati
* when Light HSL Saturation status message is received
* @param pHslSaturation_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_HslSaturation_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8275! \n\r");
-
-#ifdef CFG_DEBUG_TRACE
+ TRACE_M(TF_LIGHT,"Light_HslSaturation_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8275!\r\n");
+
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2))
@@ -1022,24 +1231,29 @@ MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_s
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present Saturation: %d \r\n",
- value << 8 | pHslSaturation_status[i]);
+ TRACE_M(TF_LIGHT,"Present Saturation: 0x%x (%d)\n\r",
+ value | pHslSaturation_status[i] << 8,
+ value | pHslSaturation_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Target Saturation: %d \r\n",
- value << 8 | pHslSaturation_status[i]);
+ TRACE_M(TF_LIGHT,"Target Saturation: 0x%x (%d)\n\r",
+ value | pHslSaturation_status[i] << 8,
+ value | pHslSaturation_status[i] << 8);
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\n\r",
+ pHslSaturation_status[i],
pHslSaturation_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP
/******************************************************************************/
@@ -1049,34 +1263,38 @@ MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_s
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_HslDefault_Set(Light_HslStatus_t* pLight_HslDefaultParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_SERIAL_CTRL,"#827F! \n\r");
+ TRACE_M(TF_LIGHT,"Appli_Light_HslDefault_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#827F!\r\n");
- Appli_HslDefaultSet.HslDefaultLightness16 = pLight_HslDefaultParam->PresentHslLightness16;
- Appli_HslDefaultSet.HslDefaultHueLightness16 = pLight_HslDefaultParam->PresentHslHueLightness16;
- Appli_HslDefaultSet.HslDefaultSaturation16 = pLight_HslDefaultParam->PresentHslSaturation16;
+ Appli_HslDefaultSet[elementIndex].HslDefaultLightness16 = pLight_HslDefaultParam->PresentHslLightness16;
+ Appli_HslDefaultSet[elementIndex].HslDefaultHueLightness16 = pLight_HslDefaultParam->PresentHslHueLightness16;
+ Appli_HslDefaultSet[elementIndex].HslDefaultSaturation16 = pLight_HslDefaultParam->PresentHslSaturation16;
- AppliHslSet.HslLightness16 = Appli_HslDefaultSet.HslDefaultLightness16;
- AppliHslSet.HslHueLightness16 = Appli_HslDefaultSet.HslDefaultHueLightness16;
- AppliHslSet.HslSaturation16 = Appli_HslDefaultSet.HslDefaultSaturation16;
+ AppliHslSet[elementIndex].HslLightness16 = Appli_HslDefaultSet[elementIndex].HslDefaultLightness16;
+ AppliHslSet[elementIndex].HslHueLightness16 = Appli_HslDefaultSet[elementIndex].HslDefaultHueLightness16;
+ AppliHslSet[elementIndex].HslSaturation16 = Appli_HslDefaultSet[elementIndex].HslDefaultSaturation16;
- HSL2RGB_Conversion();
+ HSL2RGB_Conversion(elementIndex);
- 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);
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam[elementIndex].Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam[elementIndex].Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam[elementIndex].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();
+ NvmStatePowerFlag_Set(LIGHT_HSL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -1092,17 +1310,18 @@ MOBLE_RESULT Appli_Light_HslDefault_Set(Light_HslStatus_t* pLight_HslDefaultPara
* @param pLength: length of data
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_HslDefault_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#827C! \n\r");
-
-#ifdef CFG_DEBUG_TRACE
+ TRACE_M(TF_LIGHT,"Light_HslDefault_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#827C!\r\n");
+
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2) || (i == 4))
@@ -1111,24 +1330,29 @@ MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status,
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Lightness: %d \r\n",
- value << 8 | pHslDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Lightness: 0x%x (%d)\n\r",
+ value | pHslDefault_status[i] << 8,
+ value | pHslDefault_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Hue: %d \r\n",
- value << 8 | pHslDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Hue: 0x%x (%d)\n\r",
+ value | pHslDefault_status[i] << 8,
+ value | pHslDefault_status[i] << 8);
}
- else if(i == 4)
+ else if(i == 5)
{
- TRACE_M(TF_LIGHT,"Saturation: %d \r\n",
- value << 8 | pHslDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Saturation: 0x%x (%d)\n\r",
+ value | pHslDefault_status[i] << 8,
+ value | pHslDefault_status[i] << 8);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP
/******************************************************************************/
@@ -1141,14 +1365,16 @@ MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status,
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_HslRange_Set(Light_HslRangeParam_t* pLight_HslRangeParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_SERIAL_CTRL,"#8281! \n\r");
+ TRACE_M(TF_LIGHT,"Light_HslRange_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8281!\r\n");
- AppliHslRangeSet.HslHueMinRange16 = pLight_HslRangeParam->HslHueMinRange16;
- AppliHslRangeSet.HslHueMaxRange16 = pLight_HslRangeParam->HslHueMaxRange16;
- AppliHslRangeSet.HslMinSaturation16 = pLight_HslRangeParam->HslMinSaturation16;
- AppliHslRangeSet.HslMaxSaturation16 = pLight_HslRangeParam->HslMaxSaturation16;
+ AppliHslRangeSet[elementIndex].HslHueMinRange16 = pLight_HslRangeParam->HslHueMinRange16;
+ AppliHslRangeSet[elementIndex].HslHueMaxRange16 = pLight_HslRangeParam->HslHueMaxRange16;
+ AppliHslRangeSet[elementIndex].HslMinSaturation16 = pLight_HslRangeParam->HslMinSaturation16;
+ AppliHslRangeSet[elementIndex].HslMaxSaturation16 = pLight_HslRangeParam->HslMaxSaturation16;
return MOBLE_RESULT_SUCCESS;
}
@@ -1162,24 +1388,31 @@ MOBLE_RESULT Appli_Light_HslRange_Set(Light_HslRangeParam_t* pLight_HslRangePara
* when Light HSL range status message is received
* @param pHslRange_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_HslRange_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#827E! \n\r");
+ TRACE_M(TF_LIGHT,"Light_HslRange_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#827E!\r\n");
+
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if(i == 0)
{
- TRACE_M(TF_LIGHT,"Status Code: %d \r\n",
+ TRACE_M(TF_LIGHT,"Status Code: 0x%x (%d)\n\r",
+ pHslRange_status[i],
pHslRange_status[i]);
}
else if((i == 1) || (i == 3) || (i == 5) || (i == 7))
@@ -1188,30 +1421,36 @@ MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status, MOB
}
else if(i == 2)
{
- TRACE_M(TF_LIGHT,"Hue Range Min: %d \r\n",
- value << 8 | pHslRange_status[i]);
+ TRACE_M(TF_LIGHT,"Hue Range Min: 0x%x (%d)\n\r",
+ value | pHslRange_status[i] << 8,
+ value | pHslRange_status[i] << 8);
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Hue Range Max: %d \r\n",
- value << 8 | pHslRange_status[i]);
+ TRACE_M(TF_LIGHT,"Hue Range Max: 0x%x (%d)\n\r",
+ value | pHslRange_status[i] << 8,
+ value | pHslRange_status[i] << 8);
}
else if(i == 6)
{
- TRACE_M(TF_LIGHT,"Saturation Range Min: %d \r\n",
- value << 8 | pHslRange_status[i]);
+ TRACE_M(TF_LIGHT,"Saturation Range Min: 0x%x (%d)\n\r",
+ value | pHslRange_status[i] << 8,
+ value | pHslRange_status[i] << 8);
}
else if(i == 8)
{
- TRACE_M(TF_LIGHT,"Saturation Range Max: %d \r\n",
- value << 8 | pHslRange_status[i]);
+ TRACE_M(TF_LIGHT,"Saturation Range Max: 0x%x (%d)\n\r",
+ value | pHslRange_status[i] << 8,
+ value | pHslRange_status[i] << 8);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/*******************************************************************************
Following Functions are used for the LIGHTING Lightness MODEL
*******************************************************************************/
@@ -1224,14 +1463,19 @@ Following Functions are used for the LIGHTING Lightness MODEL
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState)
+MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(lLightnessState) = ApplilightnessSet.PresentState16;
- *(lLightnessState+1) = ApplilightnessSet.PresentState16 >> 8;
- *(lLightnessState+2) = ApplilightnessSet.LastLightness16 ;
- *(lLightnessState+3) = ApplilightnessSet.LastLightness16 >> 8;
+ *(lLightnessState) = ApplilightnessSet[elementIndex].PresentState16;
+ *(lLightnessState+1) = ApplilightnessSet[elementIndex].PresentState16 >> 8;
+ *(lLightnessState+2) = ApplilightnessSet[elementIndex].LastLightness16 ;
+ *(lLightnessState+3) = ApplilightnessSet[elementIndex].LastLightness16 >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1241,17 +1485,19 @@ MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState)
+MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lLightnessState) = ApplilightnessLinearSet[elementIndex].PresentState16;
+ *(lLightnessState+1) = ApplilightnessLinearSet[elementIndex].PresentState16 >> 8;
+ *(lLightnessState+2) = ApplilightnessSet[elementIndex].LastLightness16 ;
+ *(lLightnessState+3) = ApplilightnessSet[elementIndex].LastLightness16 >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1261,14 +1507,17 @@ MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState)
+MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(lDefaultState) = ApplilightnessSet.LightnessDefault;
- *(lDefaultState+1) = ApplilightnessSet.LightnessDefault >> 8;
- TRACE_M(TF_SERIAL_CTRL,"Get Lighness Default Status: %d\n\r",
- ApplilightnessSet.LightnessDefault);
+ *(lDefaultState) = ApplilightnessSet[elementIndex].LightnessDefault;
+ *(lDefaultState+1) = ApplilightnessSet[elementIndex].LightnessDefault >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1280,13 +1529,11 @@ MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState)
* @param lLastState: Pointer to the status message
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState)
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(lLastState) = ApplilightnessSet.LastLightness16;
- *(lLastState+1) = ApplilightnessSet.LastLightness16 >> 8;
-
- TRACE_M(TF_SERIAL_CTRL,"Get Lighness Last Status: status: %d \n\r",
- ApplilightnessSet.LastLightness16);
+ *(lLastState) = ApplilightnessSet[elementIndex].LastLightness16;
+ *(lLastState+1) = ApplilightnessSet[elementIndex].LastLightness16 >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1295,19 +1542,20 @@ MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetLightnessRangeStatus(MOBLEUINT8* lRangeState)
+MOBLE_RESULT Appli_Light_GetLightnessRangeStatus(MOBLEUINT8* lRangeState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lRangeState) = ApplilightnessSet[elementIndex].StatusCode;
+ *(lRangeState+1) = ApplilightnessSet[elementIndex].RangeMin;
+ *(lRangeState+2) = ApplilightnessSet[elementIndex].RangeMin >> 8;
+ *(lRangeState+3) = ApplilightnessSet[elementIndex].RangeMax;
+ *(lRangeState+4) = ApplilightnessSet[elementIndex].RangeMax >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1328,40 +1576,67 @@ Following Functions are used for the LIGHTING CTL MODEL
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetCtlLightStatus(MOBLEUINT8* lCtlLightState)
+MOBLE_RESULT Appli_Light_GetCtlLightStatus(MOBLEUINT8* lCtlLightState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lCtlLightState) = AppliCtlSet[elementIndex].PresentLightness16;
+ *(lCtlLightState+1) = AppliCtlSet[elementIndex].PresentLightness16 >> 8;
+ *(lCtlLightState+2) = AppliCtlSet[elementIndex].PresentTemperature16;
+ *(lCtlLightState+3) = AppliCtlSet[elementIndex].PresentTemperature16 >>8;
+ *(lCtlLightState+4) = AppliCtlSet[elementIndex].PresentCtlDelta16;
+ *(lCtlLightState+5) = AppliCtlSet[elementIndex].PresentCtlDelta16 >>8;
return MOBLE_RESULT_SUCCESS;
}
/**
+* @brief Appli_Light_GetCtlTargetStatus: This function is callback for Application
+* to get the application values in middleware used for target state.
+* @param lCtlLightState: Pointer to the status message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetCtlTargetStatus(MOBLEUINT8* lCtlLightState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ *(lCtlLightState) = AppliCtlSet[elementIndex].TargetLightness16;
+ *(lCtlLightState+1) = AppliCtlSet[elementIndex].TargetLightness16 >> 8;
+ *(lCtlLightState+2) = AppliCtlSet[elementIndex].TargetTemperature16;
+ *(lCtlLightState+3) = AppliCtlSet[elementIndex].TargetTemperature16 >>8;
+ *(lCtlLightState+4) = AppliCtlSet[elementIndex].TargetCtlDelta16;
+ *(lCtlLightState+5) = AppliCtlSet[elementIndex].TargetCtlDelta16 >>8;
+
+ 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState)
+MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lCtlTempState) = AppliCtlSet[elementIndex].PresentTemperature16;
+ *(lCtlTempState+1) = AppliCtlSet[elementIndex].PresentTemperature16 >> 8;
+ *(lCtlTempState+2) = AppliCtlSet[elementIndex].PresentCtlDelta16;
+ *(lCtlTempState+3) = AppliCtlSet[elementIndex].PresentCtlDelta16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1371,19 +1646,20 @@ MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange)
+MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lCtlTempRange) = AppliCtlTemperatureRangeSet[elementIndex].StatusCode;
+ *(lCtlTempRange+1) = AppliCtlTemperatureRangeSet[elementIndex].RangeMin;
+ *(lCtlTempRange+2) = AppliCtlTemperatureRangeSet[elementIndex].RangeMin >> 8;
+ *(lCtlTempRange+3) = AppliCtlTemperatureRangeSet[elementIndex].RangeMax;
+ *(lCtlTempRange+4) = AppliCtlTemperatureRangeSet[elementIndex].RangeMax >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1393,20 +1669,21 @@ MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetCtlDefaultStatus(MOBLEUINT8* lCtlDefaultState)
+MOBLE_RESULT Appli_Light_GetCtlDefaultStatus(MOBLEUINT8* lCtlDefaultState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lCtlDefaultState) = AppliCtlDefaultSet[elementIndex].CtlDefaultLightness16;
+ *(lCtlDefaultState+1) = AppliCtlDefaultSet[elementIndex].CtlDefaultLightness16 >> 8;
+ *(lCtlDefaultState+2) = AppliCtlDefaultSet[elementIndex].CtlDefaultTemperature16;
+ *(lCtlDefaultState+3) = AppliCtlDefaultSet[elementIndex].CtlDefaultTemperature16 >>8;
+ *(lCtlDefaultState+4) = AppliCtlDefaultSet[elementIndex].CtlDefaultDeltaUv;
+ *(lCtlDefaultState+5) = AppliCtlDefaultSet[elementIndex].CtlDefaultDeltaUv >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1427,36 +1704,65 @@ Following Functions are used for the LIGHTING HSL MODEL
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslStatus(MOBLEUINT8* lHslState)
+MOBLE_RESULT Appli_Light_GetHslStatus(MOBLEUINT8* lHslState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lHslState) = AppliHslSet[elementIndex].HslLightness16;
+ *(lHslState+1) = AppliHslSet[elementIndex].HslLightness16 >> 8;
+ *(lHslState+2) = AppliHslSet[elementIndex].HslHueLightness16;
+ *(lHslState+3) = AppliHslSet[elementIndex].HslHueLightness16 >>8;
+ *(lHslState+4) = AppliHslSet[elementIndex].HslSaturation16;
+ *(lHslState+5) = AppliHslSet[elementIndex].HslSaturation16 >>8;
return MOBLE_RESULT_SUCCESS;
}
+
+/**
+* @brief Appli_Light_GetHslTargetStatus: This function is callback for Application
+* to get the application values in middleware used for target state.
+* @param lHslState: Pointer to the status message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetHslTargetStatus(MOBLEUINT8* lHslState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ *(lHslState) = AppliHslSet[elementIndex].TargetHslLightness16;
+ *(lHslState+1) = AppliHslSet[elementIndex].TargetHslLightness16 >> 8;
+ *(lHslState+2) = AppliHslSet[elementIndex].TargetHslHueLightness16;
+ *(lHslState+3) = AppliHslSet[elementIndex].TargetHslHueLightness16 >>8;
+ *(lHslState+4) = AppliHslSet[elementIndex].TargetHslSaturation16;
+ *(lHslState+5) = AppliHslSet[elementIndex].TargetHslSaturation16 >>8;
+
+ 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState)
+MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(lHslHueState) = AppliHslSet.HslHueLightness16;
- *(lHslHueState+1) = AppliHslSet.HslHueLightness16 >>8;
- TRACE_M(TF_SERIAL_CTRL,"Get Hsl Hue Status: %d\n\r",
- AppliHslSet.HslHueLightness16);
+ *(lHslHueState) = AppliHslSet[elementIndex].HslHueLightness16;
+ *(lHslHueState+1) = AppliHslSet[elementIndex].HslHueLightness16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1466,14 +1772,17 @@ MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState)
+MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(lHslSaturationState) = AppliHslSet.HslSaturation16;
- *(lHslSaturationState+1) = AppliHslSet.HslSaturation16 >>8;
- TRACE_M(TF_SERIAL_CTRL,"Get Hsl Saturation Status: %d\n\r",
- AppliHslSet.HslSaturation16);
+ *(lHslSaturationState) = AppliHslSet[elementIndex].HslSaturation16;
+ *(lHslSaturationState+1) = AppliHslSet[elementIndex].HslSaturation16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1482,16 +1791,21 @@ MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState)
+MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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;
+ *(lHslDefaultState) = Appli_HslDefaultSet[elementIndex].HslDefaultLightness16;
+ *(lHslDefaultState+1) = Appli_HslDefaultSet[elementIndex].HslDefaultLightness16 >> 8;
+ *(lHslDefaultState+2) = Appli_HslDefaultSet[elementIndex].HslDefaultHueLightness16;
+ *(lHslDefaultState+3) = Appli_HslDefaultSet[elementIndex].HslDefaultHueLightness16 >>8;
+ *(lHslDefaultState+4) = Appli_HslDefaultSet[elementIndex].HslDefaultSaturation16;
+ *(lHslDefaultState+5) = Appli_HslDefaultSet[elementIndex].HslDefaultSaturation16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1500,19 +1814,20 @@ MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange)
+MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lHslSatRange) = AppliHslRangeSet[elementIndex].StatusCode;
+ *(lHslSatRange+1) = AppliHslRangeSet[elementIndex].HslMinSaturation16;
+ *(lHslSatRange+2) = AppliHslRangeSet[elementIndex].HslMinSaturation16 >> 8;
+ *(lHslSatRange+3) = AppliHslRangeSet[elementIndex].HslMaxSaturation16;
+ *(lHslSatRange+4) = AppliHslRangeSet[elementIndex].HslMaxSaturation16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1521,19 +1836,20 @@ MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslHueRange(MOBLEUINT8* lHslHueRange)
+MOBLE_RESULT Appli_Light_GetHslHueRange(MOBLEUINT8* lHslHueRange, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lHslHueRange) = AppliHslRangeSet[elementIndex].StatusCode;
+ *(lHslHueRange+1) = AppliHslRangeSet[elementIndex].HslHueMinRange16;
+ *(lHslHueRange+2) = AppliHslRangeSet[elementIndex].HslHueMinRange16 >> 8;
+ *(lHslHueRange+3) = AppliHslRangeSet[elementIndex].HslHueMaxRange16;
+ *(lHslHueRange+4) = AppliHslRangeSet[elementIndex].HslHueMaxRange16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1563,21 +1879,24 @@ void Appli_Light_PwmInit()
* @param value1: This value corresponds to red led.
* @param value2: This value corresponds to green led .
* @param value3: This value corresponds to blue led .
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval void
*/
-void RgbF_Create(MOBLEUINT16 value1, MOBLEUINT16 value2, MOBLEUINT16 value3)
+void RgbF_Create(MOBLEUINT16 value1, MOBLEUINT16 value2, MOBLEUINT16 value3, MOBLEUINT8 elementIndex)
{
- Appli_RGBParam.Red_Value = (MOBLEUINT16)(65535 * value1/1000);
- Appli_RGBParam.Green_Value = (MOBLEUINT16)(65535 * value2/1000);
- Appli_RGBParam.Blue_Value = (MOBLEUINT16)(65535 * value3/1000);
+ Appli_RGBParam[elementIndex].Red_Value = (MOBLEUINT16)(65535 * value1/1000);
+ Appli_RGBParam[elementIndex].Green_Value = (MOBLEUINT16)(65535 * value2/1000);
+ Appli_RGBParam[elementIndex].Blue_Value = (MOBLEUINT16)(65535 * value3/1000);
}
/**
* @brief Function to convert the HSL values in RGB values.
-* @param void
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval void
*/
-void HSL2RGB_Conversion(void)
+void HSL2RGB_Conversion(MOBLEUINT8 elementIndex)
{
MOBLEUINT16 hueValue;
@@ -1587,24 +1906,24 @@ void HSL2RGB_Conversion(void)
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)
+ if(AppliHslSet[elementIndex].HslSaturation16 == 0)
{
- Appli_RGBParam.Red_Value = AppliHslSet.HslLightness16 ;
- Appli_RGBParam.Green_Value = AppliHslSet.HslLightness16 ;
- Appli_RGBParam.Blue_Value = AppliHslSet.HslLightness16 ;
+ Appli_RGBParam[elementIndex].Red_Value = AppliHslSet[elementIndex].HslLightness16 ;
+ Appli_RGBParam[elementIndex].Green_Value = AppliHslSet[elementIndex].HslLightness16 ;
+ Appli_RGBParam[elementIndex].Blue_Value = AppliHslSet[elementIndex].HslLightness16 ;
}
- else if((AppliHslSet.HslLightness16 == 0xFFFF) || (AppliHslSet.HslLightness16 == 0x00))
+ else if((AppliHslSet[elementIndex].HslLightness16 == 0xFFFF) || (AppliHslSet[elementIndex].HslLightness16 == 0x00))
{
- Appli_RGBParam.Red_Value = AppliHslSet.HslLightness16 ;
- Appli_RGBParam.Green_Value = AppliHslSet.HslLightness16 ;
- Appli_RGBParam.Blue_Value = AppliHslSet.HslLightness16 ;
+ Appli_RGBParam[elementIndex].Red_Value = AppliHslSet[elementIndex].HslLightness16 ;
+ Appli_RGBParam[elementIndex].Green_Value = AppliHslSet[elementIndex].HslLightness16 ;
+ Appli_RGBParam[elementIndex].Blue_Value = AppliHslSet[elementIndex].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;
+ hueValue = (MOBLEUINT16)(360 * (float)AppliHslSet[elementIndex].HslHueLightness16/65535);
+ lightnessvalue = (float)AppliHslSet[elementIndex].HslLightness16/65535;
+ saturationValue = (float)AppliHslSet[elementIndex].HslSaturation16/65535;
/* Formula to get the values used for RGB conversion */
cValue = (MOBLEUINT16)(((1- fabs(2 * lightnessvalue-1))*saturationValue) * 1000);
@@ -1614,33 +1933,33 @@ void HSL2RGB_Conversion(void)
/* Conditons applied for the different angle of hue value */
if (hueValue > 0 && hueValue < (HUE_UPPER_LIMIT / 6))
{
- RgbF_Create(cValue + mValue, xValue + mValue, mValue);
+ RgbF_Create(cValue + mValue, xValue + mValue, mValue, elementIndex);
}
else if (hueValue >= (HUE_UPPER_LIMIT / 6) && hueValue < (HUE_UPPER_LIMIT / 3))
{
- RgbF_Create(xValue + mValue, cValue + mValue, mValue);
+ RgbF_Create(xValue + mValue, cValue + mValue, mValue, elementIndex);
}
else if (hueValue >= (HUE_UPPER_LIMIT / 3) && hueValue < (HUE_UPPER_LIMIT / 2))
{
- RgbF_Create(mValue, cValue + mValue, xValue + mValue);
+ RgbF_Create(mValue, cValue + mValue, xValue + mValue, elementIndex);
}
else if (hueValue >= (HUE_UPPER_LIMIT / 2)
&& hueValue < (2 * HUE_UPPER_LIMIT / 3))
{
- RgbF_Create(mValue, xValue + mValue, cValue + mValue);
+ RgbF_Create(mValue, xValue + mValue, cValue + mValue, elementIndex);
}
else if (hueValue >= (2 * HUE_UPPER_LIMIT / 3)
&& hueValue < (5 * HUE_UPPER_LIMIT / 6))
{
- RgbF_Create(xValue + mValue, mValue, cValue + mValue);
+ RgbF_Create(xValue + mValue, mValue, cValue + mValue, elementIndex);
}
else if ((hueValue >= (5 * HUE_UPPER_LIMIT / 6) && hueValue <= HUE_UPPER_LIMIT) || (hueValue == 0))
{
- RgbF_Create(cValue + mValue, mValue, xValue + mValue);
+ RgbF_Create(cValue + mValue, mValue, xValue + mValue, elementIndex);
}
else
{
- RgbF_Create(mValue, mValue, mValue);
+ RgbF_Create(mValue, mValue, mValue, elementIndex);
}
}
}
@@ -1778,5 +2097,5 @@ void Light_UpdateLedValue(MOBLEUINT8 state ,Appli_LightPwmValue_t light_state)
/**
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index aaa600146..c5bb76ec0 100644
--- 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
@@ -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
@@ -54,6 +54,9 @@ typedef struct
MOBLEUINT16 PresentLightness16;
MOBLEUINT16 PresentTemperature16;
MOBLEINT16 PresentCtlDelta16;
+ MOBLEUINT16 TargetLightness16;
+ MOBLEUINT16 TargetTemperature16;
+ MOBLEINT16 TargetCtlDelta16;
}Appli_Light_CtlSet;
/* Light Ctl Temperature Range Set */
@@ -78,6 +81,9 @@ typedef struct
MOBLEUINT16 HslLightness16;
MOBLEUINT16 HslHueLightness16;
MOBLEUINT16 HslSaturation16;
+ MOBLEUINT16 TargetHslLightness16;
+ MOBLEUINT16 TargetHslHueLightness16;
+ MOBLEUINT16 TargetHslSaturation16;
}Appli_Light_HslSet;
/* Light Hsl Hue set */
@@ -117,80 +123,225 @@ typedef struct
/* Exported Functions Prototypes ---------------------------------------------*/
-MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t*, MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t*,
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
-MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, MOBLEUINT32 pLength);
+MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
-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_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pLight_LightnessDefaultParam,
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Lightness_Last_Status(MOBLEUINT8 const *pLightnessDefault_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessLast_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Lightness_Last_Set(Light_LightnessStatus_t* pLight_LightnessParam,
+ MOBLEUINT8 elementIndex);
+
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetLightnessRangeStatus(MOBLEUINT8* lRangeState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetCtlLightStatus(MOBLEUINT8* lCtlLightState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetCtlTargetStatus(MOBLEUINT8* lCtlLightState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetCtlDefaultStatus(MOBLEUINT8* lCtlDefaultState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslStatus(MOBLEUINT8* lHslState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslTargetStatus(MOBLEUINT8* lHslState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslHueRange(MOBLEUINT8* lHslHueRange,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
void Appli_Light_PwmInit(void);
-void HSL2RGB_Conversion(void);
+void HSL2RGB_Conversion(MOBLEUINT8 elementIndex);
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);
+void RgbF_Create(MOBLEUINT16 value1,
+ MOBLEUINT16 value2,
+ MOBLEUINT16 value3,
+ MOBLEUINT8 elementIndex);
+void Light_UpdateLedValue(MOBLEUINT8 state,
+ Appli_LightPwmValue_t light_state);
+
+/******************************************************************************/
#endif /* __APPLI_LIGHT_H */
+/******************************************************************************/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index d7982080a..8556233b3 100644
--- 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
@@ -6,7 +6,8 @@
******************************************************************************
* @attention
*
-* <h2><center>&copy; COPYRIGHT(c) 20120 STMicroelectronics</center></h2>
+* <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
@@ -21,6 +22,7 @@
#include "types.h"
#include "appli_generic.h"
#include "appli_light.h"
+#include "appli_light_lc.h"
#include "common.h"
#include "mesh_cfg_usr.h"
#include "appli_nvm.h"
@@ -46,26 +48,392 @@
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
+* @brief Appli_LightClient_API: This function is a Wrapper to call Light Client API depending on opcode received in input
+* @param elementIndex: Index of the element
+* @param msg_opcode: opcode of the desired API
+* @param msg_params: buffer containing the desired API parameters
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_LightClient_Lightness_Set(void)
+MOBLE_RESULT Appli_LightClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8 *msg_params)
{
- MOBLE_ADDRESS elementAddr = 0;
- MOBLEUINT8 pLightnessParam[3];
-
- Appli_IntensityControlPublishing(pLightnessParam);
- LightClient_Lightness_Set_Unack(elementAddr,
- (_Light_LightnessParam*) pLightnessParam,
- sizeof(pLightnessParam) );
-
- return MOBLE_RESULT_SUCCESS;
-}
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+
+ switch(msg_opcode){
+/******************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS
+/******************************************************************************/
+ case LIGHT_LIGHTNESS_GET:
+ {
+ result = LightClient_Lightness_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LIGHTNESS_SET:
+ {
+ result = LightClient_Lightness_Set_Ack(elementIndex,
+ msg_params,
+ (sizeof(Light_LightnessParam_t)-2)); //Remove the size of Linear Lightness params
+ break;
+ }
+ case LIGHT_LIGHTNESS_SET_UNACK:
+ {
+ result = LightClient_Lightness_Set_Unack(elementIndex,
+ msg_params,
+ (sizeof(Light_LightnessParam_t)-2)); //Remove the size of Linear Lightness params
+ break;
+ }
+
+ case LIGHT_LIGHTNESS_LINEAR_GET:
+ {
+ result = LightClient_Lightness_Linear_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LIGHTNESS_LINEAR_SET:
+ {
+ result = LightClient_Lightness_Linear_Set_Ack(elementIndex,
+ msg_params,
+ (sizeof(Light_LightnessParam_t)-2)); //Remove the size of Lightness params
+ break;
+ }
+ case LIGHT_LIGHTNESS_LINEAR_SET_UNACK:
+ {
+ result = LightClient_Lightness_Linear_Set_Unack(elementIndex,
+ msg_params,
+ (sizeof(Light_LightnessParam_t)-2)); //Remove the size of Lightness params
+ break;
+ }
+
+ case LIGHT_LIGHTNESS_DEFAULT_GET:
+ {
+ result = LightClient_Lightness_Default_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LIGHTNESS_DEFAULT_SET:
+ {
+ result = LightClient_Lightness_Default_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_LightnessDefaultParam_t));
+ break;
+ }
+ case LIGHT_LIGHTNESS_DEFAULT_SET_UNACK:
+ {
+ result = LightClient_Lightness_Default_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_LightnessDefaultParam_t));
+ break;
+ }
+
+
+ case LIGHT_LIGHTNESS_RANGE_GET:
+ {
+ result = LightClient_Lightness_Range_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LIGHTNESS_RANGE_SET:
+ {
+ result = LightClient_Lightness_Range_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_LightnessRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+ case LIGHT_LIGHTNESS_RANGE_SET_UNACK:
+ {
+ result = LightClient_Lightness_Range_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_LightnessRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+
+
+/******************************************************************************/
+#endif /* #ifdef ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS */
+/******************************************************************************/
+
+/******************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_CTL
+/******************************************************************************/
+ case LIGHT_CTL_GET:
+ {
+ result = LightClient_Ctl_Get(elementIndex);
+ break;
+ }
+ case LIGHT_CTL_SET:
+ {
+ result = LightClient_Ctl_Set_Ack(elementIndex,
+ msg_params,
+ (sizeof(Light_CtlParam_t)-4) ); //Remove the size of Last_Lightness and Last_Temperature
+ break;
+ }
+ case LIGHT_CTL_SET_UNACK:
+ {
+ result = LightClient_Ctl_Set_Unack(elementIndex,
+ msg_params,
+ (sizeof(Light_CtlParam_t)-4) ); //Remove the size of Last_Lightness and Last_Temperature
+ break;
+ }
+
+ case LIGHT_CTL_TEMPERATURE_GET:
+ {
+ result = LightClient_Ctl_Temperature_Get(elementIndex);
+ break;
+ }
+ case LIGHT_CTL_TEMPERATURE_SET:
+ {
+ result = LightClient_Ctl_Temperature_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlTemperatureParam_t));
+ break;
+ }
+ case LIGHT_CTL_TEMPERATURE_SET_UNACK:
+ {
+ result = LightClient_Ctl_Temperature_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlTemperatureParam_t));
+ break;
+ }
+
+ case LIGHT_CTL_TEMPERATURE_RANGE_GET:
+ {
+ result = LightClient_Ctl_Temperature_Range_Get(elementIndex);
+ break;
+ }
+ case LIGHT_CTL_TEMPERATURE_RANGE_SET:
+ {
+ result = LightClient_Ctl_Temperature_Range_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlTemperatureRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+ case LIGHT_CTL_TEMPERATURE_RANGE_SET_UNACK:
+ {
+ result = LightClient_Ctl_Temperature_Range_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlTemperatureRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+
+ case LIGHT_CTL_DEFAULT_GET:
+ {
+ result = LightClient_Ctl_Default_Get(elementIndex);
+ break;
+ }
+ case LIGHT_CTL_DEFAULT_SET:
+ {
+ result = LightClient_Ctl_Default_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlDefaultParam_t));
+ break;
+ }
+ case LIGHT_CTL_DEFAULT_SET_UNACK:
+ {
+ result = LightClient_Ctl_Default_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlDefaultParam_t));
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_LIGHT_MODEL_CLIENT_CTL */
+/******************************************************************************/
+/******************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_HSL
+/******************************************************************************/
+ case LIGHT_HSL_GET:
+ {
+ result = LightClient_Hsl_Get(elementIndex);
+ break;
+ }
+ case LIGHT_HSL_SET:
+ {
+ result = LightClient_Hsl_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_HslParam_t) );
+ break;
+ }
+ case LIGHT_HSL_SET_UNACK:
+ {
+ result = LightClient_Hsl_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_HslParam_t) );
+ break;
+ }
+
+ case LIGHT_HSL_DEFAULT_GET:
+ {
+ result = LightClient_Hsl_Default_Get(elementIndex);
+ break;
+ }
+ case LIGHT_HSL_DEFAULT_SET:
+ {
+ result = LightClient_Hsl_Default_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_HslDefault_t) );
+ break;
+ }
+ case LIGHT_HSL_DEFAULT_SET_UNACK:
+ {
+ result = LightClient_Hsl_Default_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_HslDefault_t) );
+ break;
+ }
+
+ case LIGHT_HSL_RANGE_GET:
+ {
+ result = LightClient_Hsl_Range_Get(elementIndex);
+ break;
+ }
+ case LIGHT_HSL_RANGE_SET:
+ {
+ result = LightClient_Hsl_Range_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_HslRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+ case LIGHT_HSL_RANGE_SET_UNACK:
+ {
+ result = LightClient_Hsl_Range_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_HslRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+
+ case LIGHT_HSL_HUE_GET:
+ {
+ result = LightClient_Hsl_Hue_Get(elementIndex);
+ break;
+ }
+ case LIGHT_HSL_HUE_SET:
+ {
+ result = LightClient_Hsl_Hue_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_HslHueParam_t));
+ break;
+ }
+ case LIGHT_HSL_HUE_SET_UNACK:
+ {
+ result = LightClient_Hsl_Hue_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_HslHueParam_t));
+ break;
+ }
+
+ case LIGHT_HSL_SATURATION_GET:
+ {
+ result = LightClient_Hsl_Saturation_Get(elementIndex);
+ break;
+ }
+ case LIGHT_HSL_SATURATION_SET:
+ {
+ result = LightClient_Hsl_Saturation_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_HslSaturationParam_t));
+ break;
+ }
+ case LIGHT_HSL_SATURATION_SET_UNACK:
+ {
+ result = LightClient_Hsl_Saturation_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_HslSaturationParam_t));
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_LIGHT_MODEL_CLIENT_HSL */
+/******************************************************************************/
+
+/******************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_LC
+/******************************************************************************/
+ case LIGHT_LC_MODE_GET:
+ {
+ result = LightClient_LC_Mode_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LC_MODE_SET:
+ {
+ result = LightClient_LC_Mode_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_ModeParam_t));
+ break;
+ }
+ case LIGHT_LC_MODE_SET_UNACK:
+ {
+ result = LightClient_LC_Mode_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_ModeParam_t));
+ break;
+ }
+ case LIGHT_LC_OM_GET:
+ {
+ result = LightClient_LC_OM_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LC_OM_SET:
+ {
+ result = LightClient_LC_OM_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_OccupancyModeParam_t));
+ break;
+ }
+ case LIGHT_LC_OM_SET_UNACK:
+ {
+ result = LightClient_LC_OM_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_OccupancyModeParam_t));
+ break;
+ }
+ case LIGHT_LC_ON_OFF_GET:
+ {
+ result = LightClient_LC_OnOff_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LC_ON_OFF_SET:
+ {
+ result = LightClient_LC_OnOff_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_OnOffParam_t));
+ break;
+ }
+ case LIGHT_LC_ON_OFF_SET_UNACK:
+ {
+ result = LightClient_LC_OnOff_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_OnOffParam_t));
+ break;
+ }
+
+ case LIGHT_LC_PROPERTY_GET:
+ {
+ result = LightClient_LC_Property_Get(elementIndex, msg_params);
+ break;
+ }
+ case LIGHT_LC_PROPERTY_SET:
+ {
+ //TODO: Set dynamic data size depending on Property DATA LENTGH: length = 2 + PropertyDataLength
+ result = LightClient_LC_Property_Set_Ack(elementIndex,
+ msg_params,
+ 5);
+ break;
+ }
+ case LIGHT_LC_PROPERTY_SET_UNACK:
+ {
+ //TODO: Set dynamic data size depending on Property DATA LENTGH: length = 2 + PropertyDataLength
+ result = LightClient_LC_Property_Set_Unack(elementIndex,
+ msg_params,
+ 5);
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_LIGHT_MODEL_CLIENT_LC */
+/******************************************************************************/
+ default:
+ {
+ TRACE_M(TF_LIGHT, "OpCode value invalid %d \r\n", msg_opcode);
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+ return result;
+}
/**
* @}
@@ -75,5 +443,5 @@ MOBLE_RESULT Appli_LightClient_Lightness_Set(void)
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index a9e0fa708..ba977f2c8 100644
--- 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
@@ -31,10 +31,10 @@
/* Exported variables ------------------------------------------------------- */
/* Application Variable-------------------------------------------------------*/
/* Exported Functions Prototypes ---------------------------------------------*/
-MOBLE_RESULT Appli_LightClient_Lightness_Set(void);
+MOBLE_RESULT Appli_LightClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8* msg_params);
#endif /* __APPLI_LIGHT_CLIENT_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index a7d123c91..953e880bd 100644
--- 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
@@ -39,138 +39,407 @@
/* Private macro -------------------------------------------------------------*/
/* Private variable ----------------------------------------------------------*/
-Appli_LightLC_Set_t Appli_LightLC_set;
-Appli_Light_LC_PropertySet_t Appli_LightLC_PropertySet;
+__attribute__((aligned(4)))const light_lc_cb_t AppliLightLc_cb =
+{
+ Appli_LightLCs_ModeGet,
+ Appli_LightLCs_ModeSet,
+ Appli_LightLCs_ModeSetUnack,
+ Appli_LightLCs_ModeStatus,
+ Appli_LightLCs_OmGet,
+ Appli_LightLCs_OmSet,
+ Appli_LightLCs_OmSetUnack,
+ Appli_LightLCs_OmStatus,
+ Appli_LightLCs_OnOffGet,
+ Appli_LightLCs_OnOffSet,
+ Appli_LightLCs_OnOffSetUnack,
+ Appli_LightLCs_OnOffStatus,
+ Appli_LightLCs_PropertyGet,
+ Appli_LightLCs_PropertySet,
+ Appli_LightLCs_PropertySetUnack,
+ Appli_LightLCs_PropertyStatus
+};
-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
+ * @brief Callback corresponding to LightLCs_ModeGet_cb
+ * @param Message parameters
+ * @retval None
*/
-MOBLE_RESULT Appli_LightLC_Mode_Set(Light_LC_Param_t* pLight_LC_Param,
- MOBLEUINT8 OptionalValid)
+void Appli_LightLCs_ModeGet(MODEL_MessageHeader_t *pmsgParam)
{
- 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;
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
}
+
/**
-* @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
+ * @brief Callback corresponding to LightLCs_ModeSet_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
*/
-MOBLE_RESULT Appli_LightLC_OM_Set(Light_LC_Param_t* pLight_LC_Param,
- MOBLEUINT8 OptionalValid)
+void Appli_LightLCs_ModeSet(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
{
- 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;
-}
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
+
/**
-* @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
+ * @brief Callback corresponding to LightLCs_ModeSetUnack_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
*/
-MOBLE_RESULT Appli_LightLC_OnOff_Set(Light_LC_Param_t* pLight_LC_Param,
- MOBLEUINT8 OptionalValid)
+void Appli_LightLCs_ModeSetUnack(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
{
- 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;
-}
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
+
/**
-* @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)
+ * @brief Callback corresponding to LightLCs_ModeSatus_cb
+ * @param Message parameters
+ * @retval None
+*/
+void Appli_LightLCs_ModeStatus(MOBLEUINT8 const* pLightLCMode_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+ TRACE_M(TF_LIGHT_LC,"LightLCs_ModeStatus callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8294!\r\n");
+
+ for(i = 0; i < plength; i++)
+ {
+ if(i == 0)
+ TRACE_M(TF_SERIAL_CTRL,"Light LC Mode value: %d\n\r",
+ pLightLCMode_status[i]);
+ }
+}
+
+
+/**
+ * @brief Callback corresponding to LightLCs_OmGet_cb
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_OmGet(MODEL_MessageHeader_t *pmsgParam)
{
- /* 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.
- */
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
- return AmbientLuxLevel;
+
+/**
+ * @brief Callback corresponding to LightLCs_OmSet_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_OmSet(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
+{
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
}
+
/**
-* @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)
+ * @brief Callback corresponding to LightLCs_OmSetUnack_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_OmSetUnack(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
{
- MOBLEUINT16 luxLevel = 0;
- /* User can write their code for the calculation */
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
+
+/**
+ * @brief Callback corresponding to LightLCs_OmStatus_cb
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_OmStatus(MOBLEUINT8 const* pLightLCOccupancyMode_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+ TRACE_M(TF_LIGHT_LC,"LightLCs_OmStatus callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8298!\r\n");
- return luxLevel;
+ for(i = 0; i < plength; i++)
+ {
+ if(i == 0)
+ TRACE_M(TF_SERIAL_CTRL,"Light LC OM value: %d\n\r",
+ pLightLCOccupancyMode_status[i]);
+ }
+}
+
+
+/**
+ * @brief Callback corresponding to LightLCs_OnOffGet_cb
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_OnOffGet(MODEL_MessageHeader_t *pmsgParam)
+{
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
}
+
/**
-* @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
+ * @brief Callback corresponding to LightLC_OnOffSet_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
*/
-MOBLE_RESULT Appli_LightLC_Get_ModeStatus(MOBLEUINT8* plcModeState)
+void Appli_LightLCs_OnOffSet(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
{
- *(plcModeState) = Appli_LightLC_set.LC_mode;
- TRACE_M(TF_SERIAL_CTRL,"Get Mode Status: %d\n\r",
- Appli_LightLC_set.LC_mode);
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
- return MOBLE_RESULT_SUCCESS;
+
+/**
+ * @brief Callback corresponding to LightLCs_OnOffSetUnack_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+*/
+void Appli_LightLCs_OnOffSetUnack(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
+{
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
}
+
/**
-* @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
+ * @brief Callback corresponding to LightLCs_OnOffStatus_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
*/
-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);
+void Appli_LightLCs_OnOffStatus(MOBLEUINT8 const* pLightLCOnOff_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+ TRACE_M(TF_LIGHT_LC,"LightLCs_OnOffStatus callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#829C!\r\n");
- return MOBLE_RESULT_SUCCESS;
+ for(i = 0; i < plength; i++)
+ {
+ if(i == 0)
+ TRACE_M(TF_SERIAL_CTRL,"Light LC OnOff status: %d\n\r",
+ pLightLCOnOff_status[i]);
+ }
+}
+
+
+/**
+ * @brief Callback corresponding to LightLCs_PropertyGet_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+*/
+void Appli_LightLCs_PropertyGet(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
+{
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
}
+
+/**
+ * @brief Callback corresponding to LightLCs_PropertySet_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_PropertySet(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
+{
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
+
+
+/**
+ * @brief Callback corresponding to LightLCs_PropertySetUnack_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_PropertySetUnack(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
+ {
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+ }
+
+
/**
-* @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
+ * @brief Callback corresponding to LightLCs_PropertyStatus_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
*/
-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);
+void Appli_LightLCs_PropertyStatus(MOBLEUINT8 const* pLightLCProperty_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+ TRACE_M(TF_LIGHT_LC,"LightLCs_PropertyStatus callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#64!\r\n");
- return MOBLE_RESULT_SUCCESS;
-}
+ for(i = 0; i < plength; i++)
+ {
+ if(i == 0)
+ TRACE_M(TF_SERIAL_CTRL,"Light LC Property status: %d\n\r",
+ pLightLCProperty_status[i]);
+ }
+}
+
+
+/**
+ * @brief
+ * @param
+ * @retval
+ */
+__weak MOBLE_RESULT Appli_Light_LCs_Init(void)
+ {
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+ MOBLEUINT8 lcsElementIndex = 0;
+
+ /* Extract element index of LC server */
+ result = ExtractLcServerElementIndex(&lcsElementIndex,
+#ifdef APPLICATION_NUMBER_OF_ELEMENTS
+ APPLICATION_NUMBER_OF_ELEMENTS,
+#else
+ 0,
+#endif
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+ ENABLE_LIGHT_MODEL_SERVER_LC,
+ ENABLE_LIGHT_MODEL_SERVER_LC_SETUP,
+#else
+ 0,
+ 0,
+#endif
+#ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF
+ ENABLE_GENERIC_MODEL_SERVER_ONOFF,
+#else
+ 0,
+#endif
+#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF
+ ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF,
+#else
+ 0,
+#endif
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
+ ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS);
+#else
+ 0);
+#endif
+
+ if(MOBLE_SUCCEEDED(result))
+ {
+ result = Light_LCs_Init(&BufferLcServer, lcsElementIndex, &AppliLightLc_cb, SIZE_OF_LC_SERVER_T);
+ }
+
+ if(MOBLE_FAILED(result))
+ {
+ TRACE_M(TF_LIGHT_LC, "Light LC Server init failed\r\n");
+ }
+
+ return result;
+}
+
+
+/**
+ * @brief
+ * @param
+ * @retval
+ */
+__weak MOBLE_RESULT Appli_Light_LC_SensorPropertyUpdate(MOBLEUINT8 elementIndex,
+ MOBLEUINT16 propertyId,
+ MOBLEUINT32 value)
+{
+ return Light_LC_SensorPropertyUpdate(elementIndex,
+ propertyId,
+ value);
+}
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+/**
+ * @brief Handling of serial inputs to LC model
+ * @param serial string
+ * @param serial string size
+ * @retval void
+ */
+void Appli_Light_LC_SerialCmd(char *rcvdStringBuff, uint16_t rcvdStringSize)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_INVALIDARG;
+
+ if (!strncmp(rcvdStringBuff+6, "TR0", 3))
+ {
+ if (rcvdStringSize == 9)
+ {
+ /* call to function corresponding MMDL/SR/LLC/BV-03-C */
+ result = Light_LC_SetTransitionTimeZero(1);
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ BLEMesh_PrintStringCb("Invalid size of string\r\n");
+ }
+ }
+ else if (!strncmp(rcvdStringBuff+6, "OCCUPANCY", 9)) /* occupancy detect */
+ {
+ if (rcvdStringSize == 15)
+ {
+ /* occupancy detected for element index 0 */
+ Appli_Light_LC_SensorPropertyUpdate(0,
+ PRESENCE_DETECTED_PID,
+ 1);
+ result = MOBLE_RESULT_SUCCESS;
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ BLEMesh_PrintStringCb("Invalid size of string\r\n");
+ }
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ /* Check the result of command processing */
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ BLEMesh_PrintStringCb("Success\r\n");
+ }
+ else if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ BLEMesh_PrintStringCb("Fail Out of memory\r\n");
+ }
+ else if(result == MOBLE_RESULT_INVALIDARG)
+ {
+ BLEMesh_PrintStringCb("Fail Invalid Argument\r\n");
+ }
+ else
+ {
+ BLEMesh_PrintStringCb("Fail\r\n");
+ }
+}
+#endif
/**
@@ -181,5 +450,5 @@ MOBLE_RESULT Appli_LightLC_Get_OnOffStatus(MOBLEUINT8* plcOnOffState)
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
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
index e9893c5e8..7691992ed 100644
--- 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
@@ -25,43 +25,55 @@
#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);
+void Appli_LightLCs_ModeGet(MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_ModeSet(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_ModeSetUnack(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_ModeStatus(MOBLEUINT8 const* pLightLCMode_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_LightLCs_OmGet(MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OmSet(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OmSetUnack(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OmStatus(MOBLEUINT8 const* pLightLCOccupancyMode_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_LightLCs_OnOffGet(MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OnOffSet(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OnOffSetUnack(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OnOffStatus(MOBLEUINT8 const* pLightLCOnOff_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_LightLCs_PropertyGet(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_PropertySet(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_PropertySetUnack(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_PropertyStatus(MOBLEUINT8 const* pLightLCOccupancyMode_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Light_LCs_Init(void);
+MOBLE_RESULT Appli_Light_LC_SensorPropertyUpdate(MOBLEUINT8 elementIndex,
+ MOBLEUINT16 propertyId,
+ MOBLEUINT32 value);
+void Appli_Light_LC_SerialCmd(char *rcvdStringBuff,
+ uint16_t rcvdStringSize);
#endif /* __APPLI_LIGHT_LC_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 7883fbf35..307bafcfd 100644
--- 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
@@ -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
@@ -20,15 +20,18 @@
#include "ble_common.h"
#include "app_conf.h"
#include "hal_common.h"
+#include "ble_mesh.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 "light.h"
+#include "light_lc.h"
+#include "sensors.h"
#include "common.h"
#include "serial_if.h"
#include "appli_nvm.h"
@@ -36,9 +39,16 @@
#include "appli_config_client.h"
#include "appli_generic_client.h"
#include "appli_light_client.h"
+#if ((ENABLE_SENSOR_MODEL_SERVER != 0)||(ENABLE_SENSOR_MODEL_CLIENT != 0))
+#include "appli_sensor.h"
+#include "appli_sensors_client.h"
+#endif
#include "stm32_seq.h"
+#if (( CFG_LPM_SUPPORTED == 0) && (ENABLE_PWM_SUPPORT == 1))
#include "PWM_config.h"
+#include "PWM_handlers.h"
+#endif
#if defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER)
#include "serial_prvn.h"
@@ -94,6 +104,7 @@
/* Private variables ---------------------------------------------------------*/
+
enum ButtonState
{
BS_OFF,
@@ -104,12 +115,13 @@ enum ButtonState
enum ButtonState buttonState = BS_OFF;
tClockTime tBounce = 0;
+/*Will be an array aligned with number of elements*/
MOBLEUINT8 Appli_LedState = 0;
MOBLEUINT16 IntensityValue = INTENSITY_LEVEL_ZERO;
MOBLEUINT8 IntensityFlag = FALSE;
MOBLEUINT8 ProxyFlag = 0;
MOBLEUINT8 ProvisionFlag = 0;
-
+MOBLEUINT8 UnprovisionInProgress = 0;
#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
static MOBLEUINT8 PrvngInProcess = 0;
@@ -131,7 +143,7 @@ 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,
+const MOBLEUINT8 StaticOobBuff[SIZE_STATIC_OOB] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
#else
const MOBLEUINT8 StaticOobBuff[] = {0};
@@ -190,6 +202,8 @@ volatile uint8_t BleProcessInit = 0;
MOBLEUINT8 lowPowerNodeApiTimer_Id;
#endif
+MOBLEUINT8 pPropertyId[4];
+
/********************* Application configuration **************************/
#if defined(__GNUC__) || defined(__IAR_SYSTEMS_ICC__) || defined(__CC_ARM)
MOBLEUINT8 bdaddr[8];
@@ -206,7 +220,7 @@ const void *prvsnr_data;
#endif /* __GNUC__ || defined(__IAR_SYSTEMS_ICC__) || defined(__CC_ARM) */
/* Private function prototypes -----------------------------------------------*/
-//static void Appli_LongButtonPress(void);
+static void Appli_LongButtonPress(void);
static void Appli_ShortButtonPress(void);
#if USER_OUTPUT_OOB_APPLI_PROCESS
void Appli_OobAuthenticationProcess(void);
@@ -218,6 +232,9 @@ MOBLEUINT16 BLEMesh_PvnrDataInputCallback(MOBLEUINT8* devKey, MOBLEUINT8* appKey
static void AppliMeshTask(void);
#endif
void Appli_SelfConfigurationProcess(void);
+void Appli_GetPublicationParamsCb(model_publicationparams_t* pPubParameters);
+WEAK_FUNCTION (void SerialPrvn_ProvisioningStatusUpdateCb(uint8_t flagPrvningInProcess,
+ MOBLEUINT16 nodeAddress));
/* Private functions ---------------------------------------------------------*/
@@ -232,7 +249,7 @@ static void Appli_ShortButtonPress(void)
BLEMesh_ModelsCommand();
}
-#if 0
+
/**
* @brief Function calls when a button is pressed for Long duration
* @param void
@@ -240,9 +257,137 @@ static void Appli_ShortButtonPress(void)
*/
static void Appli_LongButtonPress(void)
{
- /* User Implementation */
-}
+ /** GENERIC ONOFF **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API ONOFF GET ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_ON_OFF_GET, NULL);
+
+ /** GENERIC LEVEL **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API LEVEL GET ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_LEVEL_GET, NULL);
+
+ /** GENERIC POWER ONOFF **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API POWER ON OFF GET ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_POWER_ON_OFF_GET, NULL);
+
+ /** GENERIC TRANSITION TIME **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API DEFAULT TRANSITION TIME GET ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_DEFAULT_TRANSITION_TIME_GET, NULL);
+
+ /** LIGHT LIGHTNESS **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_GET, NULL);
+
+ /** LIGHT LIGHTNESS LINEAR **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS LINEAR GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_LINEAR_GET, NULL);
+
+ /** LIGHT LIGHTNESS DEFAULT **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS DEFAULT GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_DEFAULT_GET, NULL);
+
+ /** LIGHT LIGHTNESS RANGE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS RANGE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_RANGE_GET, NULL);
+
+ /** LIGHT LIGHTNESS CTL **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_GET, NULL);
+
+ /** LIGHT LIGHTNESS CTL TEMPERATURE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_GET, NULL);
+
+ /** LIGHT LIGHTNESS CTL TEMPERATURE RANGE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE RANGE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_RANGE_GET, NULL);
+
+ /** LIGHT LIGHTNESS CTL DEFAULT **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL DEFAULT GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_DEFAULT_GET, NULL);
+
+ /** LIGHT LIGHTNESS HSL **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_GET, NULL);
+
+ /** LIGHT LIGHTNESS HSL DEFAULT **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL DEFAULT GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_DEFAULT_GET, NULL);
+
+ /** LIGHT LIGHTNESS HSL RANGE**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL RANGE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_RANGE_GET, NULL);
+
+ /** LIGHT LIGHTNESS HSL HUE**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL HUE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_HUE_GET, NULL);
+
+ /** LIGHT LIGHTNESS HSL SATURATION**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL SATURATION GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_SATURATION_GET, NULL);
+
+ /** LIGHT LC MODE**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC MODE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_MODE_GET, NULL);
+
+ /** LIGHT LC OM**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC OM GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_OM_GET, NULL);
+
+ /** LIGHT LC ON OFF**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC ON OFF GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_ON_OFF_GET, NULL);
+
+ /** LIGHT LC PROPERTY **/
+ //LIGHT_CONTROL_LUX_LEVEL_ON_ID : 0x202B
+ pPropertyId[0]= 0x2B; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pPropertyId[1]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC PROPERTY GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_PROPERTY_GET, pPropertyId);
+
+#if 0 /* still under test */
+ //PRESENT_AMBIENT_TEMPERATURE_PID : 0x004F
+ pPropertyId[0]= 0x4F; // Property ID byte 0 : Property ID for the sensor
+ pPropertyId[1]= 0x00; // Property ID byte 1 : Property ID for the sensor
+
+ /** SENSOR DESCRIPTOR**/
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR DESCRIPTOR GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_DESCRIPTOR_GET, pPropertyId);
+
+ /** SENSOR CADENCE**/
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR CADENCE GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_CADENCE_GET, pPropertyId);
+
+ /** SENSOR SETTINGS **/
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR SETTINGS GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_SETTINGS_GET, pPropertyId);
+
+ /** SENSOR SETTING **/
+ pPropertyId[2]= 0xAD; // Sensor Setting Property ID byte 0 : Property ID for the sensor setting
+ pPropertyId[3]= 0x00; // Sensor Setting Property ID byte 1 : Property ID for the sensor setting
+
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR SETTING GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_SETTING_GET, pPropertyId);
+
+ /** SENSOR GET **/
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_GET, pPropertyId);
+
+ /** SENSOR COLUMN **/
+// pPropertyId[2]= 0x01; // Raw Value X byte 0 : Raw value identifying a column
+// pPropertyId[3]= 0x00; // Raw Value X byte 1 : Raw value identifying a column
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR COLUMN GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_COLUMN_GET, pPropertyId);
+
+ /** SENSOR SERIES **/
+// pPropertyId[2]= 0x01; // Raw Value X1 byte 0 : Raw value identifying a starting column.
+// pPropertyId[3]= 0x02; // Raw Value X2 byte 0 : Raw value identifying an ending column.
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR SERIES GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_SERIES_GET, pPropertyId);
#endif
+
+ IntensityPublish();
+
+}
/**
* @brief Updates the button status
@@ -260,7 +405,7 @@ static void Appli_UpdateButtonState(int isPressed)
if((t1 - t0) > LONG_PRESS_THRESHOLD)
{
- IntensityPublish();
+ Appli_LongButtonPress();
}
else if((t1 - t0) > BOUNCE_THRESHOLD)
{
@@ -279,6 +424,25 @@ static void Mesh_Task()
BLEMesh_Process();
BLEMesh_ModelsProcess(); /* Models Processing */
+ if((UnprovisionInProgress > 0) &&
+ (!LL_FLASH_IsActiveFlag_OperationSuspended()))
+ {
+ UnprovisionInProgress = 0;
+ AppliNvm_ClearModelState();
+ PalNvmErase(NVM_BASE, 0);
+ PalNvmErase(NVM_BASE, 0x1000);
+ PalNvmErase(APP_NVM_BASE, 0);
+ PalNvmErase(PRVN_NVM_BASE_OFFSET, 0);
+ TRACE_M(TF_PROVISION,"NVM erased\r\n");
+ BLEMesh_Unprovision();
+ AppliNvm_ClearModelState();
+ TRACE_M(TF_PROVISION,"Device is unprovisioned by application \r\n");
+
+ BLEMesh_Process();
+
+ NVIC_SystemReset();
+ }
+
#if (APPLI_OPTIM == 0)
/* Set the task in the scheduler for the next execution */
#if (LOW_POWER_FEATURE == 0)
@@ -511,10 +675,10 @@ void Appli_BleUnprovisionedIdentifyCb(MOBLEUINT8 data)
*/
MOBLEUINT8 Appli_BleSetNumberOfElementsCb(void)
{
- if(NumberOfElements > MAX_NUMB_ELEMENTS)
+ if(NumberOfElements > BLEMesh_GetNumberOfElements())
{
- TRACE_M(TF_MISC,"In version 1.11.00x one Element per node is supported!\r\n");
- return MAX_NUMB_ELEMENTS;
+ TRACE_M(TF_MISC, "Number of Elements enabled in application exceeding from Library Capability!\r\n");
+ return BLEMesh_GetNumberOfElements();
}
else if(NumberOfElements == 0)
@@ -525,7 +689,7 @@ MOBLEUINT8 Appli_BleSetNumberOfElementsCb(void)
else
{
- return NumberOfElements;
+ return NumberOfElements;
}
}
@@ -603,6 +767,8 @@ MOBLEUINT8* Appli_BleInputOOBAuthCb(MOBLEUINT8 size)
while(1)
{
Serial_InterfaceProcess();
+ /* Enable Mesh process working in while loop */
+ BTLE_StackTick();
/* Check if input is completed or timeout */
if((inputOOBDataReady != 0x00) | (inputTimer > INPUT_OOB_TIMEOUT))
{
@@ -725,7 +891,7 @@ void Appli_Unprovision(void)
if(!ProxyFlag)
{
/* No GATT connection */
- BLEMesh_Unprovision();
+ BLEMesh_StopAdvScan();
PalNvmErase(NVM_BASE, 0);
PalNvmErase(NVM_BASE, 0x1000);
@@ -733,6 +899,7 @@ void Appli_Unprovision(void)
PalNvmErase(PRVN_NVM_BASE_OFFSET, 0);
TRACE_M(TF_PROVISION,"NVM erased\r\n");
+ BLEMesh_Unprovision();
AppliNvm_ClearModelState();
TRACE_M(TF_PROVISION,"Device is unprovisioned by application \r\n");
@@ -871,11 +1038,13 @@ SleepModes App_SleepMode_Check(SleepModes sleepMode)
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();
+ BLEMesh_StopAdvScan();
+ UnprovisionInProgress = 1; /* Wait release on FLASH PESD bit */
}
/*----------------------------------------------------------------------------*/
@@ -1103,6 +1272,7 @@ void Appli_SelfConfigurationProcess(void)
case SELF_PUBLISH_DEFAULT_STATE:
AppliConfigClient_SelfPublicationSetDefault();
self_config_state = SELF_CONFIG_IDLE_STATE;
+ TRACE_I(TF_PROVISION,"**Provisioner Node configured**\r\n");
break;
@@ -1487,28 +1657,19 @@ void BLEMesh_CustomBeaconReceivedCallback(const MOBLEUINT8* bdAddr,
if (result == MOBLE_RESULT_SUCCESS)
{
- if ((length-1) < data[0])
+ if (data[1] == CUSTOM_BEACON_AD_TYPE)
{
- result = MOBLE_RESULT_FAIL;
- TRACE_M(TF_BEACON, "Length field does not match with message length \r\n");
- }
- }
+ TRACE_M(TF_BEACON, "Message length(%d), rssi(%d) \r\n", length, rssi);
- 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 */
+ if (TF_BEACON == 1)
+ {
+ TRACE_I(TF_BEACON, "Data: ");
+ for (MOBLEUINT8 count=0; count<length; count++)
+ {
+ TRACE_I(TF_BEACON, "%.2x ", data[count]);
+ }
+ TRACE_I(TF_BEACON, " \r\n");
+ }
}
}
}
@@ -1621,12 +1782,22 @@ void IntensityPublish(void)
{
#ifdef LIGHT_CLIENT_MODEL_PUBLISH
- Appli_LightClient_Lightness_Set();
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS
+ MOBLEUINT8 elementIndex = 0;
+ MOBLEUINT8 pLightnessParam[3];
+ Appli_IntensityControlPublishing(pLightnessParam);
+ Appli_LightClient_API(elementIndex, LIGHT_LIGHTNESS_SET, pLightnessParam);
#endif
+#else
#ifdef GENERIC_CLIENT_MODEL_PUBLISH
- Appli_GenericClient_Level_Set_Unack();
+ MOBLEUINT8 elementIndex = 0;
+ MOBLEUINT8 pGeneric_LevelParam[3];
+
+ Appli_IntensityControlPublishing(pGeneric_LevelParam);
+ Appli_GenericClient_API(elementIndex, GENERIC_LEVEL_SET_ACK, pGeneric_LevelParam);
#endif
+#endif
}
/**
@@ -1645,7 +1816,6 @@ void Appli_Process(void)
AppliPrvnNvm_Process();
#endif
- Appli_LowPowerProcess();
#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
if(PrvngInProcess)
{
@@ -1706,6 +1876,17 @@ static void AppliMeshSW1Task(void)
return;
}
+#if (ENABLE_SENSOR_MODEL_SERVER != 0)
+static void AppliMeshSW3Task(void)
+{
+ Sensor_UpdatePublishState(0, 1);
+
+ Appli_Sensor_Update(0, 1);
+
+ return;
+}
+#endif
+
#if (LOW_POWER_FEATURE == 1)
static void LowPowerNodeApiApp(void)
{
@@ -1794,6 +1975,18 @@ void Appli_Init(MOBLEUINT8 *flag)
__HAL_RCC_TIM1_CLK_ENABLE();
__HAL_RCC_TIM2_CLK_ENABLE();
PWM_Init();
+#ifdef USER_BOARD_1LED
+ Modify_PWM(SINGLE_LED, 1);
+#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, 1);
+ Modify_PWM(GREEN_LED, 1);
+ Modify_PWM(BLUE_LED, 1);
+#endif
#endif
UTIL_SEQ_RegTask( 1<< CFG_TASK_MESH_SW1_REQ_ID, UTIL_SEQ_RFU, AppliMeshSW1Task );
@@ -1810,8 +2003,36 @@ void Appli_Init(MOBLEUINT8 *flag)
UTIL_SEQ_RegTask( 1<< CFG_TASK_MESH_LPN_REQ_ID, UTIL_SEQ_RFU, LowPowerNodeApiApp );
LPN_scan_enabled = MOBLE_FALSE;
#endif
+#if (ENABLE_SENSOR_MODEL_SERVER != 0)
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_MESH_SW3_REQ_ID, UTIL_SEQ_RFU, AppliMeshSW3Task );
+#endif
}
+/*****************************Config Model Callbacks***************************/
+/**
+* @brief Callback from Config Model to receive the Publication Parameters
+* @param Structure Pointer having parameters - modelID, elementAddress,
+* Publish Address, PublishPeriod, PublishTTL, Credential Flag,
+* Publish AppKeyIndex, Retransmit Count & Restransmit Interval Steps
+* @retval none
+*/
+void Appli_GetPublicationParamsCb(model_publicationparams_t* pPubParameters)
+{
+ if(pPubParameters->modelID == SENSOR_SERVER_MODEL_ID)
+ {
+ Sensor_ModelPublishSet(pPubParameters);
+ }
+}
+
+
+/************************************ Weak linking ***********************************
+If implemented in application, linker would replace weak linking in library */
+WEAK_FUNCTION (void SerialPrvn_ProvisioningStatusUpdateCb(uint8_t flagPrvningInProcess, MOBLEUINT16 nodeAddress))
+{
+
+}
+
+
/**
* @}
*/
@@ -1819,4 +2040,4 @@ void Appli_Init(MOBLEUINT8 *flag)
/**
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 489ca8dc0..e37bf2ffa 100644
--- 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
@@ -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
@@ -114,14 +114,15 @@ 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);
+void Appli_GetPublicationParamsCb(model_publicationparams_t*);
+MOBLE_RESULT BLEMesh_ScanDevices(neighbor_params_t *unprovDeviceArray, MOBLEUINT8 *noOfUnprovDevices);
+MOBLE_RESULT BLEMesh_ProvisionDevice(neighbor_params_t *unprovDeviceArray, MOBLEUINT16 index);
#endif /* __APPLI_MESH_H */
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_nvm.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_nvm.c
index e9a103700..52dc2d9a6 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_nvm.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_nvm.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
@@ -26,9 +26,7 @@
#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"
@@ -89,6 +87,8 @@ extern const void* prvsnr_data;
#define FLASH_EMPTY_SIGNATURE 0xFFFFFFFF
+#define RADIO_OFF_DELAY 1000
+
/* Private variables ---------------------------------------------------------*/
typedef struct
@@ -100,6 +100,7 @@ typedef struct
/* ALIGN(4) */
__attribute__((aligned(4))) APPLI_NVM_REQS AppliNvm_Reqs;
+MOBLEUINT16 StopRadioInProgress;
typedef struct
{
@@ -159,7 +160,9 @@ MOBLE_RESULT AppliNvm_FlashErase(uint16_t PageNumber)
* @param Data: word to write
* @retval MOBLE_RESULT_SUCCESS on success
*/
-MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size)
+MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset,
+ void const *buf,
+ MOBLEUINT32 size)
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
@@ -185,7 +188,10 @@ MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUIN
}
else
{
- result = PalNvmWrite(APP_NVM_BASE, offset, buf, size);
+ result = PalNvmWrite(APP_NVM_BASE,
+ offset,
+ buf,
+ size);
}
return result;
@@ -362,8 +368,8 @@ MOBLE_RESULT AppliNvm_FactorySettingReset(void)
/* Load model data copy from nvm */
memcpy((void*)AppliNvm_Reqs.modelData,
- (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(currSubPageIdx) + APP_NVM_GENERIC_MODEL_OFFSET),
- APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE);
+ (void*)(APP_NVM_SUBPAGE_OFFSET(currSubPageIdx)+APP_NVM_GENERIC_MODEL_OFFSET),
+ APP_NVM_MODELDATA_PER_ELEMENT_SIZE);
result = AppliNvm_MarkSubpageInvalid();
@@ -407,7 +413,8 @@ MOBLE_RESULT AppliNvm_FactorySettingReset(void)
* @param model state buff size
* @retval MOBLE_RESULT_SUCCESS on success
*/
-MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state, uint8_t size)
+MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state,
+ uint16_t size)
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS; /* if save model state not defined, return MOBLE_RESULT_FAIL */
@@ -420,7 +427,9 @@ MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state, uint8_t size)
}
else
{
- memcpy(AppliNvm_Reqs.modelData, state, size);
+ memcpy(AppliNvm_Reqs.modelData,
+ state,
+ size);
AppliNvm_Reqs.writeReq = MOBLE_TRUE;
AppliNvm_Reqs.erasePageReq = MOBLE_FALSE;
@@ -445,7 +454,7 @@ MOBLE_RESULT AppliNvm_ClearModelState(void)
#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};
+ MOBLEUINT8 clearBuff[APP_NVM_MODELDATA_PER_ELEMENT_SIZE] = {0};
MOBLEUINT32 valid = 0;
result = AppliNvm_FindFirstEmptyPage(&subPageIdx,
@@ -500,7 +509,8 @@ MOBLE_RESULT AppliNvm_ClearModelState(void)
* @param model state buff size
* @retval MOBLE_RESULT_SUCCESS on success
*/
-MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint8_t* size)
+MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[],
+ uint16_t* size)
{
#if (SAVE_MODEL_STATE_NVM == 1)
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
@@ -529,7 +539,9 @@ MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint8_t* size)
memcpy((void*)AppliNvm_Reqs.modelData,
(void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(currSubPageIdx-1) + APP_NVM_GENERIC_MODEL_OFFSET),
APP_NVM_GENERIC_MODEL_SIZE + APP_NVM_LIGHT_MODEL_SIZE);
- memcpy((void*)state, (void*)(AppliNvm_Reqs.modelData), APP_NVM_MODEL_SIZE);
+ memcpy((void*)state,
+ (void*)(AppliNvm_Reqs.modelData),
+ APP_NVM_MODEL_SIZE);
*size = APP_NVM_MODEL_SIZE;
}
}
@@ -553,11 +565,17 @@ void AppliNvm_Process(void)
uint8_t reserveAreaCopy[APP_NVM_RESERVED_SIZE];
/* Erase if required */
- if (AppliNvm_Reqs.erasePageReq == MOBLE_TRUE)
+ if ((AppliNvm_Reqs.erasePageReq == MOBLE_TRUE) &&
+ (!LL_FLASH_IsActiveFlag_OperationSuspended()))
+ {
+ if(StopRadioInProgress == 0)
{
/* save reserve flash area */
- memcpy((void*)reserveAreaCopy, (void*)APP_NVM_BASE, APP_NVM_RESERVED_SIZE);
+ memcpy((void*)reserveAreaCopy,
+ (void*)APP_NVM_BASE,
+ APP_NVM_RESERVED_SIZE);
+ TRACE_M(TF_PROVISION,"Erase flash page\r\n");
result = PalNvmErase(APP_NVM_BASE, 0);
if(result == MOBLE_RESULT_OUTOFMEMORY)
@@ -579,15 +597,15 @@ void AppliNvm_Process(void)
result = AppliNvm_FlashProgram(0,
(uint32_t*)&reserveAreaCopy,
APP_NVM_RESERVED_SIZE);
- if (result == MOBLE_RESULT_SUCCESS)
- {
- AppliNvm_Reqs.writeReq = MOBLE_FALSE;
+ BLEMesh_ResumeAdvScan();
}
}
+ else
+ StopRadioInProgress--;
}
- if (AppliNvm_Reqs.erasePageReq == MOBLE_FALSE
- && AppliNvm_Reqs.writeReq == MOBLE_TRUE)
+ if (AppliNvm_Reqs.erasePageReq == MOBLE_FALSE &&
+ AppliNvm_Reqs.writeReq == MOBLE_TRUE)
{
result = AppliNvm_FindFirstEmptyPage(&subPageIdx,
APP_NVM_SUBPAGE_SIZE,
@@ -596,11 +614,14 @@ void AppliNvm_Process(void)
if(result == MOBLE_RESULT_OUTOFMEMORY)
{
+ BLEMesh_SuspendAdvScan();
+ StopRadioInProgress = RADIO_OFF_DELAY;
+
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;
+ result = MOBLE_RESULT_SUCCESS;
}
else
{
@@ -706,6 +727,87 @@ MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
}
+#if 0
+MOBLE_RESULT AppliNVM_Save_FlashTesting(MOBLEUINT8 *buffer,
+ MOBLEUINT16 buffer_size)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+ uint8_t reserveAreaCopy[APP_NVM_RESERVED_SIZE];
+ MOBLEINT16 subPageIdx;
+
+ for(MOBLEUINT8 count = 0;count <= buffer_size;count++)
+ {
+ buffer[count] = count;
+ }
+
+ /* save reserve flash area */
+ memcpy((void*)reserveAreaCopy,
+ (void*)APP_NVM_BASE,
+ APP_NVM_RESERVED_SIZE);
+
+ result = AppliNvm_FlashErase((uint16_t)((APP_NVM_BASE - RESET_MANAGER_FLASH_BASE_ADDRESS) / PAGE_SIZE));
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ /* restore reserve area */
+// FLASH_ProgramWordBurst(APP_NVM_BASE, (uint32_t*)reserveAreaCopy);
+ result = AppliNvm_FlashProgram(0,
+ (uint32_t*)&reserveAreaCopy,
+ APP_NVM_RESERVED_SIZE);
+ }
+
+ result = AppliNvm_FindFirstEmptyPage(&subPageIdx,
+ APP_NVM_SUBPAGE_SIZE,
+ APP_NVM_MAX_SUBPAGE,
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
+
+ if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ TRACE_M(TF_PROVISION, "Flash sub page is full, preparing new subpage\r\n");
+ }
+ else
+ {
+ result = AppliNvm_FlashProgram(APP_NVM_SUBPAGE_OFFSET(subPageIdx)+APP_NVM_GENERIC_MODEL_OFFSET,
+ buffer,
+ buffer_size);
+ }
+ return result;
+}
+
+MOBLE_RESULT AppliNVM_Retrieve_FlashTesting(MOBLEUINT8 *buffer,
+ MOBLEUINT16 buffer_size)
+{
+ MOBLEINT16 currSubPageIdx;
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+
+ result = AppliNvm_FindFirstEmptyPage(&currSubPageIdx,
+ APP_NVM_SUBPAGE_SIZE,
+ APP_NVM_MAX_SUBPAGE,
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
+
+ if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ TRACE_M(TF_PROVISION," Can not find the empty page for testing flash \r\n");
+ }
+ else
+ {
+ memcpy((void*)buffer,
+ (void*)(APP_NVM_SUBPAGE_OFFSET(currSubPageIdx)+APP_NVM_GENERIC_MODEL_OFFSET),
+ buffer_size);
+
+ result = AppliNvm_MarkSubpageInvalid();
+
+ if (MOBLE_FAILED(result))
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+
+ return result;
+}
+#endif
+
+
/**
* @brief Load Provisioner data from nvm
* @param model state buff
@@ -873,7 +975,8 @@ void AppliPrvnNvm_Process(void)
}
else
{
- TRACE_M(TF_PROVISION,"Saving in SubPage[%.8x] = \r\n", PRVN_NVM_SUBPAGE_OFFSET(subPageIdx));
+ TRACE_M(TF_PROVISION,"Saving provisioning data in SubPage[%.8x]\r\n",
+ PRVN_NVM_SUBPAGE_OFFSET(subPageIdx));
result = AppliPrvnNvm_FlashProgram(PRVN_NVM_SUBPAGE_OFFSET(subPageIdx),
PrvnNvm_Reqs.prvnData,
@@ -949,7 +1052,7 @@ MOBLE_RESULT AppliPrvnNvm_FactorySettingReset(MOBLEUINT8 *flag)
}
else
{
- /* After reset of provisioner , retreiving the next node address to be provisioned */
+ /* After reset of provisioner , retreiving the next node address to be provisioned */
if(currSubPageIdx == 0)
{
*flag = 1;
@@ -973,12 +1076,12 @@ MOBLE_RESULT AppliPrvnNvm_FactorySettingReset(MOBLEUINT8 *flag)
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_BASE_OFFSET + PRVN_NVM_SUBPAGE_OFFSET(currSubPageIdx));
+// TRACE_I(TF_PROVISION,"Next NVM Address %.8x \r\n",
+// PRVN_NVM_BASE_OFFSET + PRVN_NVM_SUBPAGE_OFFSET(currSubPageIdx));
- }
+ }
return result;
}
@@ -990,4 +1093,4 @@ MOBLE_RESULT AppliPrvnNvm_FactorySettingReset(MOBLEUINT8 *flag)
/**
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 3dbd8dd3d..2431254de 100644
--- 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
@@ -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
@@ -55,9 +55,9 @@ typedef struct
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_SaveModelState(uint8_t* state, uint16_t size);
MOBLE_RESULT AppliNvm_ClearModelState(void);
-MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint8_t* size);
+MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint16_t* size);
void AppliNvm_Process(void);
void AppliNvm_SaveMessageParam (void);
MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
@@ -85,8 +85,13 @@ void AppliPrvnNvm_SaveProvisionerDevKey(MOBLEUINT8 *data ,
void AppliPrvnNvm_SaveKeys (MOBLEUINT8 status);
+MOBLE_RESULT AppliNVM_Save_FlashTesting(MOBLEUINT8 *buffer,
+ MOBLEUINT16 buffer_size);
+MOBLE_RESULT AppliNVM_Retrieve_FlashTesting(MOBLEUINT8 *buffer,
+ MOBLEUINT16 buffer_size);
+
#endif /* __APPLI_NVM_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 7c164b49e..c6bed93c0 100644
--- 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
@@ -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
@@ -21,9 +21,10 @@
#include "hal_common.h"
#include "types.h"
+#include "sensor_cfg_usr.h"
#include "sensors.h"
-#include "light_lc.h"
#include "appli_sensor.h"
+#include "appli_light_lc.h"
#include "mesh_cfg.h"
//#include "LPS25HB.h"
#include "string.h"
@@ -38,13 +39,49 @@
* @{
*/
-/* Private typedef -----------------------------------------------------------*/
-/* Private define ------------------------------------------------------------*/
+MOBLE_RESULT Appli_Sensor_ValueSet(MOBLEUINT8 sensorOffset,
+ MOBLEUINT32 value);
+
+/* Private variables ---------------------------------------------------------*/
+
+/* ALIGN(4) */
+__attribute__((aligned(4)))const sensor_server_init_params_t SensorServerInitParams = SENSOR_SERVER_INIT_PARAMS;
+
+/* ALIGN(4) */
+__attribute__((aligned(4)))const sensor_server_cb_t AppliSensor_cb =
+{
+ /* Sensor Model callbacks */
+ Appli_Sensor_CadenceGet,
+ Appli_Sensor_CadenceSet,
+ Appli_Sensor_CadenceSetUnack,
+ Appli_Sensor_SettingsGet,
+ Appli_Sensor_SettingGet,
+ Appli_Sensor_SettingSet,
+ Appli_Sensor_SettingSetUnack,
+ Appli_Sensor_DescriptorGet,
+ Appli_Sensor_Get,
+ Appli_Sensor_ColumnGet,
+ Appli_Sensor_SeriesGet,
+ Appli_Sensor_ReadDescriptor,
+ Appli_Sensor_ReadValue,
+ Appli_Sensor_ReadColumn,
+ Appli_Sensor_ReadSeries,
+ Appli_Sensor_IsFastCadence,
+ Appli_Sensor_IsStatusTrigger,
+ Appli_Sensor_Descriptor_Status,
+ Appli_Sensor_Cadence_Status,
+ Appli_Sensor_Settings_Status,
+ Appli_Sensor_Setting_Status,
+ Appli_Sensor_Status,
+ Appli_Sensor_Column_Status,
+ Appli_Sensor_Series_Status
+};
+
#if 0
/**
-* @brief PRESSURE init structure definition
-*/
-PRESSURE_InitTypeDef InitStructure =
+ * @brief Pressure sensor init
+ */
+__attribute__((aligned(4)))const PRESSURE_InitTypeDef Lps25InitParams =
{
LPS25HB_ODR_1Hz,
LPS25HB_BDU_READ,
@@ -55,44 +92,19 @@ PRESSURE_InitTypeDef InitStructure =
};
#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[3];
-
-/* By Default value used for cadence set for testing. */
-Sensor_CadenceSet_t Sensor_CadenceSet[NUMBER_OF_SENSOR];
-
-/*
-{
- {0x0071 , 0x2 , 2 , 2 ,2 ,1 ,0X05 , 0x64},
- {0x2A6D , 0x2 , 1 , 1 , 1, 1, 0X258 , 0x3ED},
- {0X2A7F ,0x2,1,1,1,0,0x10, 0x20}
-};*/
-
-
-#endif
-
-MODEL_Property_IDTableParam_t Property_ID_Table[NUMBER_OF_SENSOR] =
-{
- {TEMPERATURE_PID},
- {PRESSURE_PID},
- {TIME_OF_FLIGHT_PID}
-};
+/**
+ * @brief Variables for people
+ */
+MOBLEUINT8 AppliSensorReadFromSensor = 0; /* Used for PTS testing */
+MOBLEUINT8 PresentTemperatureValue = 0;
+MOBLEUINT8 PreviousTemperatureValue = 0;
MOBLEUINT8 Occupancy_Flag = MOBLE_FALSE;
extern MOBLEUINT8 NumberOfElements;
extern MOBLEUINT8 ProvisionFlag;
MOBLEUINT8 Sensor_Setting_Access = 0x01 ;
+MOBLEUINT32 PresentPeopleCount = 0;
+MOBLEUINT32 PreviousPeopleCount = 0;
-
-
-/* Temperature and Pressure init structure*/
-#if 0
- PRESSURE_DrvTypeDef* xLPS25HBDrv = &LPS25HBDrv;
-#endif
-
-/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/******************************************************************************/
@@ -101,792 +113,909 @@ MOBLEUINT8 Sensor_Setting_Access = 0x01 ;
/**
-* @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
+ * @brief Callback corresponding to Sensor_CadenceGet_cb
+ * @param Cadence parameters
+* @retval None
*/
-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 if( property_ID == (MOBLEUINT16) TIME_OF_FLIGHT_PID)
- {
- Sensor_CadenceSet[2].Property_ID = pCadence_param->Property_ID;
- Sensor_CadenceSet[2].FastCadenceDevisor = pCadence_param->FastCadenceDevisor ;
- Sensor_CadenceSet[2].StatusTriggerType = pCadence_param->StatusTriggerType ;
- Sensor_CadenceSet[2].triggerDeltaDown = pCadence_param->triggerDeltaDown;
- Sensor_CadenceSet[2].triggerDeltaUp = pCadence_param->triggerDeltaUp;
- Sensor_CadenceSet[2].StatusMinInterval = pCadence_param->StatusMinInterval;
- Sensor_CadenceSet[2].FastCadenceLow = pCadence_param->FastCadenceLow;
- Sensor_CadenceSet[2].FastCadenceHigh = pCadence_param->FastCadenceHigh;
- }
-
- return MOBLE_RESULT_SUCCESS;
+void Appli_Sensor_CadenceGet(sensor_CadenceCbParam_t* pCadenceParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pCadenceParam->property_ID, elementIndex, peerAddr, dstPeer);
}
+
/**
-* @brief Appli_Sensor_Cadence_Get: This function is callback for Application
-* when sensor cadence Set message is received
-* @param pCadence_get: 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
+ * @brief Callback corresponding to Sensor_CadenceSet_cb
+ * @param Cadence parameters
+* @retval None
*/
-
-MOBLE_RESULT Appli_Sensor_Cadence_Get(MOBLEUINT8* sensor_DataCadence,
- MOBLEUINT16 property_ID, MOBLEUINT32 length)
+void Appli_Sensor_CadenceSet(sensor_CadenceCbParam_t* pCadenceParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
- return MOBLE_RESULT_SUCCESS;
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pCadenceParam->property_ID, elementIndex, peerAddr, dstPeer);
}
-/**
-* @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,MOBLEUINT16 prop_ID)
-{
-
- for(int i=0;i< NUMBER_OF_SENSOR;i++)
- {
- if(prop_ID == Property_ID_Table[i].Property_ID)
- {
- Appli_Sensor_SettingSet[i].Property_ID = pSensor_SettingParam->Property_ID;
-
- Appli_Sensor_SettingSet[i].Sensor_Setting_ID = pSensor_SettingParam->Sensor_Setting_ID;
- Appli_Sensor_SettingSet[i].Sensor_Setting_Access = Sensor_Setting_Access;
- Appli_Sensor_SettingSet[i].Sensor_Setting_Value = pSensor_SettingParam->Sensor_Setting_Value;
- }
- }
- return MOBLE_RESULT_SUCCESS;
+/**
+ * @brief Callback corresponding to Sensor_CadenceSetUnack_cb
+ * @param Cadence parameters
+* @retval None
+*/
+void Appli_Sensor_CadenceSetUnack(sensor_CadenceCbParam_t* pCadenceParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pCadenceParam->property_ID, elementIndex, peerAddr, dstPeer);
}
-
/**
-* @brief Appli_Sensor_Data_Status: This function is callback for Application
-* when Sensor Get message is received
-* @param sensor_Data: Pointer to buffer to be updated with parameters
-* @param pLength: Length of the parameters to be sent in response
-* @param prop_ID: Property Id of requested sensor (optional)
-* @param length: Received data length
-* @retval MOBLE_RESULT
+ * @brief Callback corresponding to Sensor_SettingsGet_cb
+ * @param Setting parameters
+* @retval None
*/
-MOBLE_RESULT Appli_Sensor_Data_Status(MOBLEUINT8* sensor_Data ,
- MOBLEUINT32* pLength,
- MOBLEUINT16 prop_ID ,
- MOBLEUINT32 length)
+void Appli_Sensor_SettingsGet(sensor_SettingsCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
- MOBLE_RESULT result = MOBLE_RESULT_FALSE;
- MOBLEUINT32 temperatureData = 0;
- MOBLEUINT32 pressureData = 0;
- MOBLEUINT8 data_Length = 0x03;
- MOBLEUINT32 distance = 0x000000C8; // 200 cm
- MOBLEUINT8 data_Length_UnknownID;
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pSettingParam->propertyId, elementIndex, peerAddr, dstPeer);
+}
-#if 0
- LPS25HB_GetTemperature((float*)&temperatureData);
-
- LPS25HB_GetPressure((float*)&pressureData);
-#endif
-
- result = Check_Property_ID(Property_ID_Table , prop_ID);
-
- if(result == MOBLE_RESULT_SUCCESS && length > 0)
- {
- if((prop_ID == TEMPERATURE_PID )) /* format A */
- {
- /*(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))
- {
- /* 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))
- {
- /* 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(length == 0)
- {
- /*(prop_Id_Temp & 0x07) << 5) | (Len <<1) Format A
- Property calculation is done like above line
+/**
+ * @brief Callback corresponding to Sensor_SettingGet_cb
+ * @param Setting parameters
+* @retval None
*/
- *(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);
+void Appli_Sensor_SettingGet(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pSettingParam->property_ID, elementIndex, peerAddr, dstPeer);
+}
- *pLength =20;
- }
- else
- {
-// *(sensor_Data+0) = (MOBLEUINT8)prop_ID ;
-// *(sensor_Data+1) = (MOBLEUINT8)(prop_ID >> 8);
-//
-// *pLength =2;
-
- data_Length_UnknownID = 0x0F;
- if(prop_ID < 0x0800)
- {
- *(sensor_Data) = ((prop_ID & 0x07) << 5) | (data_Length_UnknownID << 1) ;
- *(sensor_Data+1) = (prop_ID >> 3) & 0xFF;
-
- *pLength=2;
- }
- else
- {
- *(sensor_Data+0) = 0xFF; //((data_Length <<1) | 0x01) & 0x00;
- *(sensor_Data+1) = (MOBLEUINT8)prop_ID ;
- *(sensor_Data+2) = (MOBLEUINT8)(prop_ID >> 8);
+/**
+ * @brief Callback corresponding to Sensor_SettingSet_cb
+ * @param Setting parameters
+* @retval None
+*/
+void Appli_Sensor_SettingSet(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pSettingParam->property_ID, elementIndex, peerAddr, dstPeer);
+}
- *pLength = 3;
- }
- }
- //*plength=0;
- }
-
- 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 Callback corresponding to Sensor_SettingSetUnack_cb
+ * @param Setting parameters
+* @retval None
+*/
+void Appli_Sensor_SettingSetUnack(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pSettingParam->property_ID, elementIndex, peerAddr, dstPeer);
}
/**
-* @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
+ * @brief Callback corresponding to Sensor_DescriptorGet_cb
+ * @param Descriptor parameters
+* @retval None
*/
-MOBLE_RESULT Appli_Sensor_Descriptor_Status(MOBLEUINT8* sensor_Descriptor ,
- MOBLEUINT32* pLength,MOBLEUINT16 prop_ID ,
- MOBLEUINT32 length)
+void Appli_Sensor_DescriptorGet(MOBLEUINT8 prop_ID,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
- Appli_Sensor_DescriptorStatus_t Appli_Sensor_DescriptorStatus1[] =
+ if(length == 0)
{
- {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;
- MOBLE_RESULT result = MOBLE_RESULT_FALSE;
- result = Check_Property_ID(Property_ID_Table , prop_ID);
-
- if (result != MOBLE_RESULT_FALSE )
+ TRACE_M(TF_SENSOR, "Sensor Descriptor data for all sensors on element index %X peer addr %X, dst peer %X\r\n",
+ elementIndex, peerAddr, dstPeer);
+ }
+ else
{
- if(prop_ID == TEMPERATURE_PID)
- {
- 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;
- *pLength = 8;
- }
- else if(prop_ID == PRESSURE_PID)
- {
- tolerance = Appli_Sensor_DescriptorStatus1[1].NegativeTolerance;
- tolerance = (tolerance << 12 ) | Appli_Sensor_DescriptorStatus1[1].PositiveTolerance ;
-
- *(sensor_Descriptor) = Appli_Sensor_DescriptorStatus1[1].Prop_ID;
- *(sensor_Descriptor+1) = Appli_Sensor_DescriptorStatus1[1].Prop_ID >> 8;
- *(sensor_Descriptor+2) = tolerance;
- *(sensor_Descriptor+3) = tolerance >> 8;
- *(sensor_Descriptor+4) = tolerance >> 16;
- *(sensor_Descriptor+5) = Appli_Sensor_DescriptorStatus1[1].SamplingFunction;
- *(sensor_Descriptor+6) = Appli_Sensor_DescriptorStatus1[1].MeasurementPeriod;
- *(sensor_Descriptor+7) = Appli_Sensor_DescriptorStatus1[1].UpdateInterval;
- *pLength =8;
- }
- else if(prop_ID == TIME_OF_FLIGHT_PID)
- {
- tolerance = Appli_Sensor_DescriptorStatus1[2].NegativeTolerance;
- tolerance = (tolerance << 12 ) | Appli_Sensor_DescriptorStatus1[2].PositiveTolerance ;
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X, dst peer %X\r\n",
+ prop_ID, elementIndex, peerAddr, dstPeer);
+ }
+}
- *(sensor_Descriptor) = Appli_Sensor_DescriptorStatus1[2].Prop_ID;
- *(sensor_Descriptor+1) = Appli_Sensor_DescriptorStatus1[2].Prop_ID >> 8;
- *(sensor_Descriptor+2) = tolerance;
- *(sensor_Descriptor+3) = tolerance >> 8;
- *(sensor_Descriptor+4) = tolerance >> 16;
- *(sensor_Descriptor+5) = Appli_Sensor_DescriptorStatus1[2].SamplingFunction;
- *(sensor_Descriptor+6) = Appli_Sensor_DescriptorStatus1[2].MeasurementPeriod;
- *(sensor_Descriptor+7) = Appli_Sensor_DescriptorStatus1[2].UpdateInterval;
- *pLength =8;
- }
+/**
+ * @brief Callback corresponding to Sensor_Get_cb
+ * @param Get parameters
+* @retval None
+*/
+void Appli_Sensor_Get(MOBLEUINT16 prop_ID,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ if(length == 0)
+ {
+ TRACE_M(TF_SENSOR, "Sensor Data for all sensors on element index %X peer addr %X dst peer %X\r\n",
+ elementIndex, peerAddr, dstPeer);
}
- else
+ else
{
- if(length ==0 )
- {
- 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;
- }
- else if(prop_ID != 0x0000)
- {
- *(sensor_Descriptor) = prop_ID >> 8;
- *(sensor_Descriptor+1) = prop_ID;
- *pLength = 2;
- }
- else
- {
-
- }
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X \r\n",
+ prop_ID, elementIndex, peerAddr, dstPeer);
}
+}
+
- // }
- //else if(result == MOBLE_RESULT_FALSE && length >0)
- //{
- // *(sensor_Descriptor) = prop_ID >> 8;
- // *(sensor_Descriptor+1) = prop_ID;
- // *pLength = 2;
- //}
- //else
- //{
- //
- //}
- return MOBLE_RESULT_SUCCESS;
+/**
+ * @brief Callback corresponding to Sensor_ColumnGet_cb
+ * @param Column parameters
+* @retval None
+*/
+void Appli_Sensor_ColumnGet(sensor_ColumnCbParams_t* pColumnParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pColumnParam->propertyId, elementIndex, peerAddr, dstPeer);
}
-MOBLE_RESULT Appli_Sensor_Column_Status(MOBLEUINT8* sensor_Column , MOBLEUINT32* pLength,MOBLEUINT16 prop_ID , MOBLEUINT32 length)
+/**
+ * @brief Callback corresponding to Sensor_SeriesGet_cb
+ * @param Series parameters
+* @retval None
+*/
+void Appli_Sensor_SeriesGet(sensor_SeriesCbParams_t* pSeriesParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
+ TRACE_M(TF_SENSOR, "Property ID %X Raw Value X1 %d Raw Value X2 %d\r\n",
+ pSeriesParam->propertyId,
+ pSeriesParam->rawValueX1,
+ pSeriesParam->rawValueX2);
+}
+
+
+/**
+ * @brief Callback corresponding to Sensor_ReadDescriptor_cb
+ * Update SENSORX descriptor identified by sensorOffset
+ * Read from application to optimize RAM
+ * @param Sensor offset in sensor init structure
+ * @param descriptor parameters
+ * @retval Fail if sensor doesn't exist or property ID mismatch occurrs
+ * else Success
+ */
+MOBLE_RESULT Appli_Sensor_ReadDescriptor(MOBLEUINT8 sensorOffset,
+ sensor_DescriptorCbParams_t* pDescriptorParams)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ const sensor_init_params_t* pSensorInitParams = NULL;
- Sensor_Column_param_t Appli_Sensor_ColumnStatus[]=
- {
- {PRESSURE_PID,0xD9AF,0xDE03,0x0405},
- {TEMPERATURE_PID,0xacd2,0x3456,0x6537},
- {TIME_OF_FLIGHT_PID,0x8248,0xDE03,0x0405}
- };
-
- MOBLEUINT8 flag = 0;
-
- for(int i=0;i< NUMBER_OF_SENSOR ;i++)
+ if (sensorOffset < SensorServerInitParams.sensorsCount)
{
- if(prop_ID == Appli_Sensor_ColumnStatus[i].Property_ID)
+ pSensorInitParams = &(SensorServerInitParams.sensorInitParams[sensorOffset]);
+
+ if (pSensorInitParams->propertyId != pDescriptorParams->propertyId)
{
- flag = 1;
- *sensor_Column= Appli_Sensor_ColumnStatus[i].Property_ID;
- *(sensor_Column+1) = Appli_Sensor_ColumnStatus[i].Property_ID>>8;
-
- *(sensor_Column+2)=Appli_Sensor_ColumnStatus[i].RawValueX;
- *(sensor_Column+3)=Appli_Sensor_ColumnStatus[i].RawValueX;
-
-
- *(sensor_Column+4)=Appli_Sensor_ColumnStatus[i].RawValueWidth;
- *(sensor_Column+5)=Appli_Sensor_ColumnStatus[i].RawValueWidth;
-
- *(sensor_Column+6)=Appli_Sensor_ColumnStatus[i].RawValueY;
- *(sensor_Column+7)=Appli_Sensor_ColumnStatus[i].RawValueY;
- *pLength = 8;
- break;
+ result = MOBLE_RESULT_FAIL;
+ }
+ else
+ {
+ /* */
}
}
-
- if(flag == 0)
+ else
{
- *pLength =4;
+ result = MOBLE_RESULT_FAIL;
}
- return MOBLE_RESULT_SUCCESS;
+ if (pSensorInitParams != NULL &&
+ pDescriptorParams != NULL)
+ {
+ pDescriptorParams->positiveTolerance = pSensorInitParams->positiveTolerance;
+ pDescriptorParams->negativeTolerance = pSensorInitParams->negativeTolerance;
+ pDescriptorParams->samplingFunction = pSensorInitParams->samplingFunction;
+ pDescriptorParams->measurementPeriod = pSensorInitParams->measurementPeriod;
+ pDescriptorParams->updateInterval = pSensorInitParams->updateInterval;
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ return result;
}
-MOBLE_RESULT Appli_Sensor_Series_Status(MOBLEUINT8* sensor_Series , MOBLEUINT32* pLength,MOBLEUINT16 prop_ID , MOBLEUINT32 length)
+/**
+ * @brief Callback corresponding to Sensor_ReadValue_cb
+ * Read sensor value and update buffer
+ * data length <= 128
+ * PreviousTemperatureValue, PresentTemperatureValue to be updated
+ * everytime sensor value is changed and call to Sensor_UpdateCadence
+ * @param Sensor offset in sensor init structure
+ * @param Value parameters
+ * @retval Fail if sensor doesn't exist
+ * else Success
+ */
+MOBLE_RESULT Appli_Sensor_ReadValue(MOBLEUINT8 sensorOffset,
+ sensor_ValueCbParams_t* pValueParams)
{
- Sensor_Series_param_t Appli_Sensor_SeriesStatus[NUMBER_OF_SENSOR]=
- {
- {PRESSURE_PID,{{0xabcd,0x73ac,0xcdef},{0xacd2,0x2345,0x1234}}},
- {TEMPERATURE_PID,{{0x00C1,0x0071,0x00DE},{0x0003,0x0004,0x0005}}},
- {TIME_OF_FLIGHT_PID,{{0x4528,0xbad3,0xdc12},{0xacd2,0x2345,0x1234}}}
- };
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+// PRESSURE_StatusTypeDef tempStatus = PRESSURE_OK;
+ MOBLEINT16 temp = 0;
+ MOBLEINT8 temperature8 = 0;
+ float pressure = 0;
- for(int i=0;i<NUMBER_OF_SENSOR;i++)
+ /* sensor offset exist */
+ if (sensorOffset < SensorServerInitParams.sensorsCount)
{
- if( prop_ID == Appli_Sensor_SeriesStatus[i].Property_ID )
+ if (sensorOffset == 0) /* Present Ambient Temperature */
{
+ if(AppliSensorReadFromSensor == 0) /* Normal mode */
+ {
+ /* Temperature, Temperature8 format, M=1, d=0, b=-1 */
+// tempStatus = LPS25HB_I2C_ReadRawTemperature(&temp);
+// if (tempStatus == PRESSURE_OK)
+ {
+ TRACE_M(TF_SENSOR, "Temperature sensor raw value %d\r\n" , temp);
+
+ /* Convert temperature raw value to Temperature8 format */
+ temp = (temp/240) + 85;
+
+ if (temp < -64*2)
+ {
+ temp = -64*2;
+ }
+ else if (temp > 63.5*2)
+ {
+ temp = 63.5*2;
+ }
+
+ temperature8 = temp;
+
+ pValueParams->data[0] = (MOBLEUINT8)temperature8;
+
+ if (pValueParams->data[0] == 0xFF)
+ {
+ /* 0xFF is unknown but here it is -1
+ -1 is approximated to 0 */
+ pValueParams->data[0] = 0x00;
+ }
+
+ TRACE_M(TF_SENSOR, "Temperature8 raw value %d, actual value %f\r\n",
+ temperature8, (float)temperature8/2);
+ }
+#if 0
+ else /* error */
+ {
+ pValueParams->data[0] = 0xFF;
+ }
+#endif
+ }
+ else /* Value not to be read from sensor */
+ {
+ pValueParams->data[0] = PresentTemperatureValue;
+ }
+ }
+ else if (sensorOffset == 1) /* Pressure */
+ {
+// tempStatus = LPS25HB_GetPressure(&pressure);
+// if (tempStatus == PRESSURE_OK)
+ {
+ TRACE_M(TF_SENSOR, "Pressure sensor value %f mbar\r\n" , pressure);
- *sensor_Series= Appli_Sensor_SeriesStatus[i].Property_ID;
- *(sensor_Series+1) = Appli_Sensor_SeriesStatus[i].Property_ID>>8;
- for(int y=0 ;y < SENSOR_SERIES_VALUE ;y++)
+ memcpy(pValueParams->data, (void*)&pressure, 4);
+ }
+#if 0
+ else /* error */
{
- *(sensor_Series+2+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawValueX>>8;
- *(sensor_Series+3+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawValueX;
- *(sensor_Series+4+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawColumnWidth>>8;
- *(sensor_Series+5+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawColumnWidth;
- *(sensor_Series+6+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawValueY>>8;
- *(sensor_Series+7+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawValueY;
+ memset(pValueParams->data, 0, 4);
}
- *pLength = 2 + 6*SENSOR_SERIES_VALUE ;
- break;
+#endif
}
}
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
-return MOBLE_RESULT_SUCCESS ;
-
+ return result;
}
-
+
#endif
+
/**
-* @brief Sensor Process Function will continuously monitor the sensors.
-* Function used for the Publishing, data monitoring..
-* @param void
-* @retval void
+ * @brief Callback corresponding to Appli_Sensor_Cadence_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
*/
-void Sensor_Process(void)
+void Appli_Sensor_Cadence_Status(const MOBLEUINT8 *pCadence,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
+ MOBLEUINT8 i;
-#ifdef ENABLE_SENSOR_PUBLICATION
- float sensorValue[NUMBER_OF_SENSOR];
- if(ProvisionFlag == 1)
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Cadence_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_CADENCE_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
{
- Read_Sensor_Data(&sensorValue[0]);
- Sensor_Publication_Process(&sensorValue[0], &Property_ID_Table[0]);
+ TRACE_M(TF_SERIAL_CTRL,"Cadence value: %d\n\r", pCadence[i]);
}
-#endif
+}
+
+
+/**
+ * @brief Callback corresponding to Appli_Sensor_Settings_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
+*/
+void Appli_Sensor_Settings_Status(const MOBLEUINT8 *pSettings,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Settings_Status callback received \r\n");
- /* 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)
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_SETTINGS_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
{
- 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;
- }
- }
+ TRACE_M(TF_SERIAL_CTRL,"Settings value: %d\n\r", pSettings[i]);
+ }
}
-
+
+
/**
-* @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)
+ * @brief Callback corresponding to Appli_Sensor_Setting_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
+*/
+void Appli_Sensor_Setting_Status(const MOBLEUINT8 *pSetting,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
- MOBLEUINT8 occupancyData = 0x1;
- MOBLEUINT8 sensor_Data[5];
- MOBLE_ADDRESS srcAdd;
- MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 i;
- sensor_Data[1] = (MOBLEUINT8)(PRESENCE_DETECTED_PROPERTY << 8);
- sensor_Data[0] = (MOBLEUINT8)PRESENCE_DETECTED_PROPERTY;
- sensor_Data[2] = occupancyData;
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Setting_Status callback received \r\n");
- srcAdd = BLEMesh_GetAddress();
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_SETTING_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
+ {
+ TRACE_M(TF_SERIAL_CTRL,"Setting value: %d\n\r", pSetting[i]);
+ }
+}
+
+
+/**
+ * @brief Callback corresponding to Appli_Sensor_Descriptor_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
+*/
+void Appli_Sensor_Descriptor_Status(const MOBLEUINT8 *pDescriptor,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
- result = BLEMesh_SetRemotePublication(SENSOR_SERVER_MODEL_ID, srcAdd ,
- SENSOR_STATUS ,
- sensor_Data,3,
- MOBLE_FALSE, MOBLE_FALSE);
-
- if(result)
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Descriptor_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_DESCRIPTOR_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
{
- TRACE_M(TF_LIGHT_LC,"Publication Error \r\n");
+ TRACE_M(TF_SERIAL_CTRL,"Descriptor value: %d\n\r", pDescriptor[i]);
}
-
}
-
-#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
+ * @brief Callback corresponding to Appli_Sensor_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
*/
-void Read_Sensor_Data(float *pSensorValue)
+void Appli_Sensor_Status(const MOBLEUINT8 *pStatus,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#if 0
- float temp,press;
- LPS25HB_GetTemperature(&temp);
- pSensorValue[0] = temp;
- LPS25HB_GetPressure(&press);
- pSensorValue[1] = press;
-#endif
+ MOBLEUINT8 i;
+
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
+ {
+ TRACE_M(TF_SERIAL_CTRL,"Status value: %d\n\r", pStatus[i]);
+ }
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+ Appli_Light_LC_SensorPropertyUpdate(elementIndex,
+ PRESENCE_DETECTED_PID,
+ (MOBLEUINT32) pStatus[length-1]);
+#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)
+ * @brief Callback corresponding to Appli_Sensor_Column_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
+*/
+void Appli_Sensor_Column_Status(const MOBLEUINT8 *pColumn,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
- 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};
+ MOBLEUINT8 i;
- floatToInt(pSensorData[sensor_Count], &out_value, 2);
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Column_Status callback received \r\n");
- /* Taking the timestamp for the cadence publication and making flag high */
- if(PublishingDataFlag[sensor_Count].CadenceDurationFlag == MOBLE_FALSE)
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_COLUMN_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
{
- cadenceDurationTick[sensor_Count] = Clock_Time();
- PublishingDataFlag[sensor_Count].CadenceDurationFlag = MOBLE_TRUE;
+ TRACE_M(TF_SERIAL_CTRL,"Column Status value: %d\n\r", pColumn[i]);
}
- /* 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))
+}
+
+
+/**
+ * @brief Callback corresponding to Appli_Sensor_Series_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
+*/
+void Appli_Sensor_Series_Status(const MOBLEUINT8 *pSeries,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Series_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_SERIES_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
{
- 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++;
- }
+ TRACE_M(TF_SERIAL_CTRL,"Series Status value: %d\n\r", pSeries[i]);
}
- else
+}
+
+
+/**
+ * @brief Callback corresponding to Sensor_ReadColumn_cb
+ * Fill column width and raw valye Y in data buffer
+ * data length <= 8
+ * @param Sensor offset in sensor init structure
+ * @param Series column parameters
+ * @retval Fail if sensor doesn't exist
+ * else Success
+*/
+MOBLE_RESULT Appli_Sensor_ReadColumn(MOBLEUINT8 sensorOffset,
+ MOBLEUINT8 columnOffset,
+ sensor_ColumnCbParams_t* pColumnParams)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ const sensor_init_params_t* pSensorInitParams = NULL;
+ MOBLEUINT8 dataLength = 0;
+ MOBLEUINT8* data = pColumnParams->data;
+
+ if (sensorOffset < SensorServerInitParams.sensorsCount)
{
- publishTime = SENSOR_PUBLISH_PERIOD ;
+ pSensorInitParams = &(SensorServerInitParams.sensorInitParams[sensorOffset]);
- 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)
+ /* fill sensor column data */
+ memcpy(data+dataLength,
+ &(pSensorInitParams->seriesColumn[columnOffset].columnWidth),
+ pSensorInitParams->dataLength);
+ dataLength = pSensorInitParams->dataLength;
+
+ memset(data+dataLength, 0xAA, pSensorInitParams->dataLength);
+ dataLength += pSensorInitParams->dataLength;
+
+ pColumnParams->dataLength = dataLength;
+ }
+ else
{
- sensor_Count = 0;
+ result = MOBLE_RESULT_FAIL;
}
-
+
+ return result;
}
+
/**
-* @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)
+ * @brief Callback corresponding to Sensor_ReadSeries_cb
+ * Fill sensor series state for all columns between and including X1 and X2
+ * Series data to be concatenated in triplet of raw value X, column width and raw value Y
+ * X[n] CW[n] Y[n] X[n+1] CW[n+1] Y[n+1] ...
+ * data length should be less than minimum of 379 or max application packet length supported
+ * @param Sensor offset in sensor init structure
+ * @param Series parameters
+ * @retval Fail if sensor doesn't exist
+ * else Success
+ */
+MOBLE_RESULT Appli_Sensor_ReadSeries(MOBLEUINT8 sensorOffset,
+ sensor_SeriesCbParams_t* pSeriesParams)
{
- MOBLEUINT32 length;
- MOBLEUINT8 sensor_Data[8];
- MOBLE_ADDRESS srcAdd;
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ const sensor_init_params_t* pSensorInitParams = NULL;
+ MOBLEUINT16 dataLength = 0;
+ MOBLEUINT8* data = pSeriesParams->data;
- srcAdd = BLEMesh_GetAddress();
-
- switch(*pProp_ID)
+ if (sensorOffset < SensorServerInitParams.sensorsCount)
{
- 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:
+ pSensorInitParams = &(SensorServerInitParams.sensorInitParams[sensorOffset]);
+
+ for (MOBLEUINT8 count=0; count<pSensorInitParams->seriesCount; count++)
+ {
+ /* fill sensor series data */
+ if (pSensorInitParams->seriesColumn[count].rawX >= pSeriesParams->rawValueX1 &&
+ pSensorInitParams->seriesColumn[count].rawX <= pSeriesParams->rawValueX2)
{
- /* 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(data+dataLength,
+ &(pSensorInitParams->seriesColumn[count].rawX),
+ pSensorInitParams->dataLength);
+ dataLength += pSensorInitParams->dataLength;
+ memcpy(data+dataLength,
+ &(pSensorInitParams->seriesColumn[count].columnWidth),
+ pSensorInitParams->dataLength);
+ dataLength += pSensorInitParams->dataLength;
+ memset(data+dataLength, 0xAA, pSensorInitParams->dataLength);
+ dataLength += pSensorInitParams->dataLength;
- memcpy(&sensor_Data[3],(void*)&pSensor_Value[0],4);
- length =7;
- break;
+ pSeriesParams->dataLength = dataLength;
}
- case TIME_OF_FLIGHT_PID:
+ else
{
- sensor_Data[0] = ((0x03 <<1) | 0x01);
- sensor_Data[1] = (MOBLEUINT8)TIME_OF_FLIGHT_PID ;
- sensor_Data[2] = (MOBLEUINT8)(TIME_OF_FLIGHT_PID >> 8);
-
- memcpy(&sensor_Data[3],(void*)&pSensor_Value[0],4);
- length =7;
- break;
+ /* */
}
- default:
- break;
+ }
}
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ return result;
+}
- result = BLEMesh_SetRemotePublication(SENSOR_SERVER_MODEL_ID, srcAdd,
- SENSOR_STATUS ,
- sensor_Data,length,
- MOBLE_FALSE, MOBLE_FALSE);
- if(result)
+/**
+ * @brief Callback corresponding to Sensor_IsFastCadence_cb
+ * To check if fast cadence to be used for current sensor state
+ * @param Sensor offset in sensor init structure
+ * @param Fast Cadence Low
+ * @param Fast Cadence High
+ * @retval Trigger status
+ */
+MOBLEUINT8 Appli_Sensor_IsFastCadence(MOBLEUINT8 sensorOffset,
+ void* pFastCadenceLow,
+ void* pFastCadenceHigh)
+{
+ MOBLEUINT8 fastCadenceStatus = 0;
+ MOBLEUINT32 fastCadenceLow = *((MOBLEUINT32*)pFastCadenceLow);
+ MOBLEUINT32 fastCadenceHigh = *((MOBLEUINT32*)pFastCadenceHigh);
+ MOBLEUINT32 sensorValue = PresentTemperatureValue;
+
+ if (sensorOffset == 0)
+ {
+ if (fastCadenceLow <= fastCadenceHigh)
+ {
+ fastCadenceStatus = sensorValue >= fastCadenceLow &&
+ sensorValue <= fastCadenceHigh;
+ }
+ else
+ {
+ fastCadenceStatus = sensorValue > fastCadenceLow ||
+ sensorValue < fastCadenceHigh;
+ }
+}
+ else
{
- TRACE_M(TF_SENSOR,"Publication Error \r\n");
+ /* Implmented only for sensor at offset 0 */
}
+ return fastCadenceStatus;
}
-#endif
-#ifdef ENABLE_SENSOR_MODEL_SERVER
-#if 0
/**
-* @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
+ * @brief Callback corresponding to Sensor_IsStatusTrigger_cb
+ * To check if sensor change in sensor state (delta) is more than
+ * given trigger state value
+ * delta up values
+ * @param Sensor offset in sensor init structure
+ * @param Trigger type -> value or percent change
+ * @param Status trigger delta down
+ * @param Status trigger delta up
+ * @retval Trigger status
*/
-/*
-MOBLE_RESULT Appli_Sensor_GetSettingStatus(MOBLEUINT8* pSetting_Status)
+MOBLEUINT8 Appli_Sensor_IsStatusTrigger(MOBLEUINT8 sensorOffset,
+ status_trigger_type_e triggerType,
+ void* pDeltaDown,
+ void* pDeltaUp)
{
+ const sensor_init_params_t* pSensorInitParams = NULL;
+ MOBLEUINT8 triggerStatus = 0;
+ MOBLEUINT32 deltaDown = *((MOBLEUINT32*)pDeltaDown);
+ MOBLEUINT32 deltaUp = *((MOBLEUINT32*)pDeltaUp);
+ status_trigger_delta_e statusTriggerDelta;
+ MOBLEUINT32 delta;
- *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;
-}*/
-#endif
+ if (sensorOffset == 0)
+ {
+ if (PresentTemperatureValue < PreviousTemperatureValue)
+ {
+ /* status trigger delta down */
+ statusTriggerDelta = STATUS_TRIGGER_DELTA_DOWN;
+ delta = PreviousTemperatureValue - PresentTemperatureValue;
-/**
-* @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
-*/
+ TRACE_M(TF_SENSOR, "Delta down value %ld\r\n", delta);
+ }
+ else
+ {
+ /* status trigger delta up */
+ statusTriggerDelta = STATUS_TRIGGER_DELTA_UP;
+ delta = PresentTemperatureValue - PreviousTemperatureValue;
-MOBLE_RESULT Appli_Sensor_GetSetting_IDStatus(MOBLEUINT8* pSetting_Status , MOBLEUINT16 prop_ID)
-{
- for(int i=0 ;i<NUMBER_OF_SENSOR;i++)
- {
- if(prop_ID == Appli_Sensor_SettingSet[i].Property_ID)
+ TRACE_M(TF_SENSOR, "Delta up value %ld\r\n", delta);
+ }
+
+ if (triggerType == STATUS_TRIGGER_TYPE_PC)
{
- *pSetting_Status = Appli_Sensor_SettingSet[i].Property_ID;
- *(pSetting_Status+1) = Appli_Sensor_SettingSet[i].Property_ID >> 8;
- *(pSetting_Status+2) = Appli_Sensor_SettingSet[i].Sensor_Setting_ID;
- *(pSetting_Status+3) = Appli_Sensor_SettingSet[i].Sensor_Setting_ID >> 8;
- *(pSetting_Status+4) = Appli_Sensor_SettingSet[i].Sensor_Setting_Access;
-
- if(Appli_Sensor_SettingSet[i].Sensor_Setting_Access == 0x03)
+ pSensorInitParams = &(SensorServerInitParams.sensorInitParams[sensorOffset]);
+
+ if (pSensorInitParams->valuesRange != 0)
{
- *(pSetting_Status+5) = Appli_Sensor_SettingSet[i].Sensor_Setting_Value;
- *(pSetting_Status+6) = Appli_Sensor_SettingSet[i].Sensor_Setting_Value >> 8;
+ /* change delta to percentage change (of 0.01 % steps) */
+ delta = (MOBLEUINT32)((delta*10000)/pSensorInitParams->valuesRange);
}
else
{
-
+ triggerStatus = 0;
}
}
- }
- return MOBLE_RESULT_SUCCESS;
+ if ((statusTriggerDelta == STATUS_TRIGGER_DELTA_DOWN && delta >= deltaDown) ||
+ (statusTriggerDelta == STATUS_TRIGGER_DELTA_UP && delta >= deltaUp))
+ {
+ triggerStatus = 1;
+ }
+ else
+ {
+ triggerStatus = 0;
+ }
+ }
+
+ return triggerStatus;
}
+
+
+/**
+* @brief Initialize hardware interfaces for sensors and mesh sensor model structures
+* Sensor init parameters to be defined in sensor_cfg_usr.h
+* Sensors are initialized in the order as defined in sensor_cfg_usr.h
+ * LPS25HB supports pressure and temperature sensor
+* @param void
+ * @retval
+ */
+MOBLE_RESULT Appli_Sensor_Init(void)
+ {
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+// PRESSURE_StatusTypeDef lps25Status;
+
+ /* Hardware interface initialization */
+#ifndef CUSTOM_BOARD_PWM_SELECTION
+// PRESSURE_StatusTypeDef tempStatus;
+// PRESSURE_StatusTypeDef pressStatus;
+// int16_t temperature;
+// int32_t pressure;
+
+#if 0
+ /* Initiallization of sensors */
+ lps25Status = LPS25HB_Init((PRESSURE_InitTypeDef*)(&Lps25InitParams));
+
+ if (lps25Status != PRESSURE_OK)
+ {
+ TRACE_M(TF_SENSOR, "Error initializing LPS25HB. status (%d)\r\n", lps25Status);
+ }
+
+ tempStatus = LPS25HB_I2C_ReadRawTemperature(&temperature);
+ pressStatus = LPS25HB_I2C_ReadRawPressure(&pressure);
+ if (tempStatus == PRESSURE_OK &&
+ pressStatus == PRESSURE_OK)
+ {
+ /* TRACE_M(TF_SENSOR, "Raw temperature (%d) and raw pressure (%d)\r\n",
+ temperature, pressure); */
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR, "Error reading LPS25HB at init\r\n");
+ }
+#endif
+
+#else
+ TRACE_M(TF_SENSOR, "LPS25HB not initialized\r\n");
#endif
+ /* initialize sensor server model */
+ result = SensorServer_Init(&BufferSensorServer,
+ &AppliSensor_cb,
+ TOTAL_SENSOR_SERVER_BUFF_SIZE,
+ &SensorServerInitParams);
+
+ if(MOBLE_FAILED(result))
+ {
+ TRACE_M(TF_SENSOR, "Sensor Server init failed\r\n");
+ }
+
+ return result;
+ }
+
+
/**
-* @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)
+ * @brief Handling of serial inputs to sensor model
+ * @param Sensor offset in sensor init structure
+ * @param Sensor value
+ * @retval void
+ */
+MOBLE_RESULT Appli_Sensor_Update(MOBLEUINT8 sensorOffset, MOBLEUINT32 value)
{
- MOBLE_RESULT result = MOBLE_RESULT_FALSE;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ AppliSensorReadFromSensor = 1;
+
+ /* Update previous with current and current with new */
+ PreviousTemperatureValue = PresentTemperatureValue;
+ PresentTemperatureValue = (MOBLEUINT8)value;
- for(MOBLEUINT8 i=0; i<NUMBER_OF_SENSOR; i++)
+ /* To update cadence parameters
+ results in either status trigger or (and) fast cadence based on change and present
+ Application may decide not to update cadence parameters if senosr value is changing
+ very frequently in some cases to save bandwidth */
+ if (PresentTemperatureValue != PreviousTemperatureValue)
{
- if(prop_ID_Table[i].Property_ID == prop_ID)
- {
- result = MOBLE_RESULT_SUCCESS;
- break;
- }
- }
+ result = Sensor_UpdateCadence(sensorOffset,
+ SensorServerInitParams.sensorInitParams[0].elementIdx,
+ SensorServerInitParams.sensorInitParams[0].propertyId);
+ }
return result;
-}
+ }
+
/**
-* @brief Appli_Sensor_Init: This function is callback for Initialisation of
-* Application interface
-* @param void
-* @retval MOBLE_RESULT
-*/
-MOBLE_RESULT Appli_Sensor_Init(void)
+ * @brief Handling of serial inputs to sensor model
+ * Appli_Sensor_SerialCmd can be used for testing periodic publishing and
+ * triggered publishing with PTS
+ * @param serial string
+ * @param serial string size
+ * @retval void
+ */
+void Appli_Sensor_SerialCmd(char *rcvdStringBuff, uint16_t rcvdStringSize)
{
-#if 0
- LPS25HB_Init(&InitStructure);
-#endif
- return MOBLE_RESULT_SUCCESS;
+ MOBLE_RESULT result = MOBLE_RESULT_INVALIDARG;
+ MOBLEUINT16 value = 0;
+ MOBLEUINT8 sensorOffset = 0;
+
+ if (!strncmp(rcvdStringBuff+6, "SETV", 4))
+ {
+ if (rcvdStringSize == 15)
+ {
+ sscanf(rcvdStringBuff+11, "%4hx", &value);
+
+ /* Set SENSOR1 value at offset 0 */
+ result = Appli_Sensor_Update(sensorOffset, value);
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ BLEMesh_PrintStringCb("Invalid size of string\r\n");
+ }
+ }
+ else if (!strncmp(rcvdStringBuff+6, "PUBLISH", 7))
+ {
+ if (rcvdStringSize == 17)
+ {
+ sscanf(rcvdStringBuff+14, "%1hx", &value);
+
+ sensorOffset = value;
+
+ sscanf(rcvdStringBuff+16, "%1hx", &value);
+
+ /* Enable / Disable publishing of sensor as identified by sensor offset */
+ if(value == 0) /* Disable */
+ {
+ result = Sensor_UpdatePublishState(sensorOffset, 0);
+ }
+ else /* Enable */
+ {
+ result = Sensor_UpdatePublishState(sensorOffset, 1);
+ }
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ BLEMesh_PrintStringCb("Invalid size of string\r\n");
+ }
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ /* Check the result of command processing */
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ BLEMesh_PrintStringCb("Success\r\n");
+ }
+ else if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ BLEMesh_PrintStringCb("Fail Out of memory\r\n");
+ }
+ else if(result == MOBLE_RESULT_INVALIDARG)
+ {
+ BLEMesh_PrintStringCb("Fail Invalid Argument\r\n");
+ }
+ else
+ {
+ BLEMesh_PrintStringCb("Fail\r\n");
+ }
}
@@ -898,5 +1027,5 @@ MOBLE_RESULT Appli_Sensor_Init(void)
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 5e94fc344..613d14df5 100644
--- 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
@@ -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
@@ -23,118 +23,118 @@
/* 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;
- MOBLEUINT8 FastCadenceLow;
- MOBLEUINT8 FastCadenceHigh;
- // float FastCadenceLow;
-// float FastCadenceHigh;
-}Sensor_CadenceSet_t;
-
-typedef struct
-{
- MOBLEUINT16 Property_ID;
- MOBLEUINT16 RawValueX;
- MOBLEUINT16 RawValueWidth;
- MOBLEUINT16 RawValueY;
-}Sensor_Column_param_t;
-
-/* Sensor Series */
-struct Sensor_SeriesData
-{
- MOBLEUINT16 RawValueX;
- MOBLEUINT16 RawColumnWidth;
- MOBLEUINT16 RawValueY;
-};
-
-typedef struct
-{
- MOBLEUINT16 Property_ID;
- struct Sensor_SeriesData SeriesData[SENSOR_SERIES_VALUE];
-}Sensor_Series_param_t ;
-
-#pragma pack(4)
-
-MOBLE_RESULT Appli_Sensor_Cadence_Set(Sensor_CadenceParam_t* pCadence_param,
- MOBLEUINT16 property_ID,
- MOBLEUINT32 length);
-MOBLE_RESULT Appli_Sensor_Cadence_Get(MOBLEUINT8* sensor_DataCadence,
- 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,
- MOBLEUINT16 prop_ID,
- MOBLEUINT32 length);
-MOBLE_RESULT Appli_Sensor_Setting_Set(Sensor_SettingParam_t* pSensor_SettingParam,
- MOBLEUINT8 OptionalValid,
- MOBLEUINT16 prop_ID);
-MOBLE_RESULT Appli_Sensor_Series_Status(MOBLEUINT8* sensor_Series,
- MOBLEUINT32* pLength,
- MOBLEUINT16 prop_ID,
- MOBLEUINT32 length);
-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,
- MOBLEUINT16 prop_ID);
+#include "sensors.h"
+#include "mesh_cfg.h"
+
+/* Exported functions ------------------------------------------------------- */
+void Appli_Sensor_CadenceGet(sensor_CadenceCbParam_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_CadenceSet(sensor_CadenceCbParam_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_CadenceSetUnack(sensor_CadenceCbParam_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_SettingsGet(sensor_SettingsCbParams_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_SettingGet(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_SettingSet(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_SettingSetUnack(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_DescriptorGet(MOBLEUINT8 pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Get (MOBLEUINT16 prop_ID,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_ColumnGet(sensor_ColumnCbParams_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_SeriesGet(sensor_SeriesCbParams_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Sensor_ReadDescriptor(MOBLEUINT8 sensorOffset,
+ sensor_DescriptorCbParams_t* pDescriptorParams);
+MOBLE_RESULT Appli_Sensor_ReadValue(MOBLEUINT8 sensorOffset,
+ sensor_ValueCbParams_t* pValueParams);
+MOBLE_RESULT Appli_Sensor_ReadColumn(MOBLEUINT8 sensorOffset,
+ MOBLEUINT8 columnOffset,
+ sensor_ColumnCbParams_t* pColumnParams);
+MOBLE_RESULT Appli_Sensor_ReadSeries(MOBLEUINT8 sensorOffset,
+ sensor_SeriesCbParams_t* pSeriesParams);
+MOBLEUINT8 Appli_Sensor_IsFastCadence(MOBLEUINT8 sensorOffset,
+ void* pFastCadenceLow,
+ void* pFastCadenceHigh);
+MOBLEUINT8 Appli_Sensor_IsStatusTrigger(MOBLEUINT8 sensorOffset,
+ status_trigger_type_e triggerType,
+ void* pDeltaDown,
+ void* pDeltaUp);
MOBLE_RESULT Appli_Sensor_Init(void);
-void Sensor_Process(void);
-void Sensor_LC_Light_Publish(void);
-
+//void Appli_Sensor_SerialCmd(char *rcvdStringBuff, uint16_t rcvdStringSize);
+MOBLE_RESULT Appli_Sensor_Update(MOBLEUINT8 sensorOffset, MOBLEUINT32 value);
+
+void Appli_Sensor_Descriptor_Status(const MOBLEUINT8 *pDescriptor,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Cadence_Status(const MOBLEUINT8 *pCadence,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Settings_Status(const MOBLEUINT8 *pSettings,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Setting_Status(const MOBLEUINT8 *pSetting,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Status(const MOBLEUINT8 *pStatus,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Column_Status(const MOBLEUINT8 *pColumn,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Series_Status(const MOBLEUINT8 *pSeries,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Sensor_Update(MOBLEUINT8 sensorOffset,
+ MOBLEUINT32 value);
+void Appli_Sensor_SerialCmd(char *rcvdStringBuff,
+ uint16_t rcvdStringSize);
#endif /* __APPLI_SENSOR_H */
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_sensors_client.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_sensors_client.c
new file mode 100644
index 000000000..aecf584d4
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_sensors_client.c
@@ -0,0 +1,153 @@
+/**
+******************************************************************************
+* @file appli_sensors_client.c
+* @author BLE Mesh Team
+* @brief Application interface for Generic Mesh Models
+******************************************************************************
+* @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 "hal_common.h"
+#include "types.h"
+#include "appli_sensor.h"
+#include "appli_light.h"
+#include "common.h"
+#include "mesh_cfg_usr.h"
+#include "appli_nvm.h"
+#include "appli_mesh.h"
+#include "sensors_client.h"
+#include "appli_sensors_client.h"
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+
+
+/* Private functions ---------------------------------------------------------*/
+/**
+* @brief Appli_SensorsClient_API: This function is a Wrapper to call Sensors Client API depending on opcode received in input
+* @param elementIndex: Index of the element
+* @param msg_opcode: opcode of the desired API
+* @param msg_params: buffer containing the desired API parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_SensorsClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8 *msg_params)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+ switch(msg_opcode){
+/******************************************************************************/
+#ifdef ENABLE_SENSOR_MODEL_CLIENT
+/******************************************************************************/
+ case SENSOR_DESCRIPTOR_GET:
+ {
+ result = SensorsClient_Descriptor_Get(elementIndex, msg_params);
+ break;
+ }
+ case SENSOR_CADENCE_GET:
+ {
+ result = SensorsClient_Cadence_Get(elementIndex, msg_params);
+ break;
+ }
+ case SENSOR_CADENCE_SET:
+ {
+ //TODO: Set dynamic data size depending on Sensor DATA LENTGH: length = 4 + 4 + 2* SensorDataLength
+ result = SensorsClient_Cadence_Set(elementIndex,
+ msg_params,
+ 10); //(sizeof(sensor_CadenceCbParam_t)-3));
+ break;
+ }
+ case SENSOR_CADENCE_SET_UNACK:
+ {
+ //TODO: Set dynamic data size depending on Sensor DATA LENTGH: length = 4 + 4 + 2 * SensorDataLength
+ result = SensorsClient_Cadence_Set_Unack(elementIndex,
+ msg_params,
+ 10); //(sizeof(sensor_CadenceCbParam_t)-3));
+ break;
+ }
+ case SENSOR_SETTINGS_GET:
+ {
+ result = SensorsClient_Settings_Get(elementIndex, msg_params);
+ break;
+ }
+
+ case SENSOR_SETTING_GET:
+ {
+ result = SensorsClient_Setting_Get(elementIndex, msg_params, sizeof(sensor_SettingsCbParams_t));
+ break;
+ }
+ case SENSOR_SETTING_SET:
+ {
+ //TODO: Set dynamic data size depending on Sensor DATA LENTGH: length = 4 + SensorDataLength
+ result = SensorsClient_Setting_Set(elementIndex,
+ msg_params,
+ 6);
+ break;
+ }
+ case SENSOR_SETTING_SET_UNACK:
+ {
+ //TODO: Set dynamic data size depending on Sensor DATA LENTGH: length = 4 + SensorDataLength
+ result = SensorsClient_Setting_Set_Unack(elementIndex,
+ msg_params,
+ 6);
+ break;
+ }
+ case SENSOR_GET:
+ {
+ result = SensorsClient_Get(elementIndex, msg_params);
+ break;
+ }
+ case SENSOR_COLUMN_GET:
+ {
+ result = SensorsClient_Column_Get(elementIndex, msg_params, 4);
+ break;
+ }
+ case SENSOR_SERIES_GET:
+ {
+ result = SensorsClient_Series_Get(elementIndex, msg_params, 4);
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_SENSOR_MODEL_CLIENT */
+/******************************************************************************/
+
+
+ default:
+ {
+ TRACE_M(TF_SENSOR, "OpCode value invalid %d \r\n", msg_opcode);
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+ return result;
+}
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_sensors_client.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_sensors_client.h
new file mode 100644
index 000000000..431b5c691
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/appli_sensors_client.h
@@ -0,0 +1,42 @@
+/**
+******************************************************************************
+* @file appli_sensor_client.h
+* @author BLE Mesh Team
+* @brief Application interface for Sensor Mesh Models
+******************************************************************************
+* @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 __APPLI_SENSOR_CLIENT_H
+#define __APPLI_SENSOR_CLIENT_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "sensors.h"
+#include "mesh_cfg.h"
+
+
+/* Exported macro ------------------------------------------------------------*/
+/* Exported variables ------------------------------------------------------- */
+/* Application Variable-------------------------------------------------------*/
+/* Exported Functions Prototypes ---------------------------------------------*/
+MOBLE_RESULT Appli_ConfigClient_Set(void);
+MOBLE_RESULT Appli_SensorsClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8 *msg_params);
+
+
+
+
+#endif /* __APPLI_SENSOR_CLIENT_H */
+
+/******************* (C) COPYRIGHT 2020 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
index 38004a61d..55a67d8a2 100644
--- 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
@@ -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
@@ -30,23 +30,34 @@
#include "mesh_cfg.h"
#include <string.h>
-
-/** @addtogroup MODEL_VENDOR
+/** @addtogroup ST_BLE_Mesh
* @{
*/
-/** @addtogroup Vendor_Model_Callbacks
+/** @addtogroup Application_Mesh_Models
* @{
*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
+typedef struct
+{
+ MOBLE_ADDRESS dst;
+ MOBLEUINT8 data[VENDOR_DATA_BUFFER_SIZE];
+ MOBLEUINT32 length;
+ MOBLEUINT8 elementIndex;
+} APPLI_SEND_BIG_DATA_PACKET;
+
/* Private variables ---------------------------------------------------------*/
-MOBLEUINT8 ResponseBuffer[VENDOR_DATA_BYTE];
+MOBLEUINT8 ResponseBuffer[VENDOR_DATA_BUFFER_SIZE];
MOBLEUINT16 BuffLength;
+APPLI_SEND_BIG_DATA_PACKET Appli_VendorBigData;
+
+/*Variable to enable OTA for received vendor command*/
extern MOBLEUINT8 Appli_LedState;
extern uint16_t DUTY;
+extern MOBLEUINT8 NumberOfElements;
MOBLEUINT32 TestHitCounter = 0;
extern Appli_LightPwmValue_t Appli_LightPwmValue;
@@ -268,18 +279,17 @@ MOBLE_RESULT Appli_Vendor_Test(MOBLEUINT8 const *data, MOBLEUINT32 length)
* @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
+* @param elementIndex : selected element where '0' is first element
* @retval MOBLE_RESULT status of result
*/
MOBLE_RESULT Appli_Vendor_LEDControl( MOBLEUINT8 const *data, MOBLEUINT32 length,
- MOBLEUINT8 elementNumber , MOBLE_ADDRESS dst_peer)
+ MOBLEUINT8 elementIndex , 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,"#03-%02hx!\n\r",data[0]);
switch(subCommand)
@@ -291,139 +301,102 @@ MOBLE_RESULT Appli_Vendor_LEDControl( MOBLEUINT8 const *data, MOBLEUINT32 length
*/
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 Need to write the commands as per the element selected*/
+
+ TRACE_M(TF_VENDOR,"Appli_LED_Control callback received for elementIndex %d \r\n", elementIndex);
+ Appli_LedState = *(data+1); /* Toggle the state of the Blue LED */
+ if( Appli_LedState == 1)
{
- /* user application code */
+ BSP_LED_On(LED_BLUE);
}
- else if(elementNumber == THIRD_ELEMENT)
+ else
{
- /* user application code */
- }
+ BSP_LED_Off(LED_BLUE);
+ }
break;
}
/* Toggle Command */
case APPLI_CMD_TOGGLE:
{
- if(elementNumber == FIRST_ELEMENT)
+ /*User Need to write the commands as per the element selected*/
+
+ TRACE_M(TF_VENDOR,"Appli_LED_Toggle callback received for elementIndex %d \r\n", elementIndex);
+ if(Appli_LedState == 1)
{
- if(Appli_LedState == 1)
- {
- Appli_LightPwmValue.IntensityValue = LED_OFF_VALUE;
+ 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) */
+ 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) */
+ 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 */
+ Appli_LedState = 0;
+ BSP_LED_Off(LED_BLUE);
}
- else if(elementNumber == THIRD_ELEMENT)
+ else
{
- /* user application code */
+ Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ Appli_LedState = 1;
+ BSP_LED_On(LED_BLUE);
}
+
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 */
- }
+ /*User Need to write the commands as per the element selected*/
+
+ TRACE_M(TF_VENDOR,"Appli_LED_ON callback received for elementIndex %d \r\n", elementIndex);
+ 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;
+
break;
}
/* Off Command */
case APPLI_CMD_OFF:
{
- if(elementNumber == FIRST_ELEMENT)
- {
- Appli_LightPwmValue.IntensityValue = LED_OFF_VALUE;
+ /*User Need to write the commands as per the element selected*/
+
+ TRACE_M(TF_VENDOR,"Appli_LED_OFF callback received for elementIndex %d \r\n", elementIndex);
+ 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) */
+ 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) */
+ 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 */
- }
+ Appli_LedState = 0;
+ BSP_LED_Off(LED_BLUE);
break;
}
/* intensity command */
case APPLI_CMD_LED_INTENSITY:
{
- if(elementNumber == FIRST_ELEMENT)
- {
- intensityValue = data[2] << 8;
- intensityValue |= data[1];
+ /*User Need to write the commands as per the element selected*/
+
+ TRACE_M(TF_VENDOR,"Appli_LED_Intensity callback received for elementIndex %d \r\n", elementIndex);
+ 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)
+ duty = PwmValueMapping(intensityValue , 0x7FFF ,0);
+ Appli_LightPwmValue.IntensityValue = duty;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ if(duty > 16000)
{
- /* user application code */
+ BSP_LED_On(LED_BLUE);
}
- else if(elementNumber == THIRD_ELEMENT)
+ else
{
- /* user application code */
+ BSP_LED_Off(LED_BLUE);
}
- break;
- }
+ break;
+ }
/* Default case - Not valid command */
default:
{
@@ -457,26 +430,32 @@ MOBLE_RESULT Appli_Vendor_LEDControl( MOBLEUINT8 const *data, MOBLEUINT32 length
*/
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,"#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;
+ MOBLE_RESULT status = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 subCmd = data[0];
+ /*First Byte is sending the Sub Command*/
+ ResponseBuffer[0]=subCmd;
+
+ TRACE_M(TF_VENDOR, "#0E-%02hx %02lx! \n\r",data[0], length);
+ for(MOBLEUINT16 i=0; i<length; i++)
+ {
+ TRACE_I(TF_VENDOR,"%02hx ",data[i]);
+ }
+ TRACE_I(TF_VENDOR,"\n\r");
+ switch(subCmd)
+ {
+ case APPLI_STRING_WRITE:
+ {
+ memcpy(&ResponseBuffer,data,length);
+ BuffLength = length;
+ break;
+ }
+ default:
+ {
+ status = MOBLE_RESULT_FALSE;
+ break;
+ }
+ }
+ return status;
}
/**
@@ -494,6 +473,58 @@ void Appli_GetTestValue (MOBLEUINT8 *responseValue)
TestHitCounter = 0;
}
/**
+* @brief Process the Vendor LED Control Command
+* @param data: Pointer to the data received from peer_addr
+* @param length: Length of the data
+* @param elementIndex : selected element where '0' is first element
+* @param dst_peer : Destination address
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_Vendor_SetBigDataPacket(MOBLEUINT8 *data, MOBLEUINT32 length,
+ MOBLEUINT8 elementIndex , MOBLE_ADDRESS dst_peer)
+{
+ MOBLE_RESULT status = MOBLE_RESULT_SUCCESS;
+
+ if (length > VENDOR_DATA_BUFFER_SIZE)
+ {
+ status = MOBLE_RESULT_INVALIDARG;
+ }
+ memmove(Appli_VendorBigData.data, data, length);
+ Appli_VendorBigData.dst = dst_peer;
+ Appli_VendorBigData.length = length;
+ Appli_VendorBigData.elementIndex = elementIndex;
+ return status;
+}
+/**
+* @brief Send Vendor big data packet
+* @param void
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_Vendor_SendBigDataPacket(void)
+{
+ MOBLE_RESULT status = MOBLE_RESULT_SUCCESS;
+
+ if(BLEMesh_TrsptIsBusyState())
+ {
+ BSP_LED_On(LED_BLUE);
+ status = MOBLE_RESULT_FALSE;
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+ status = BLEMesh_SetRemoteData(Appli_VendorBigData.dst,
+ Appli_VendorBigData.elementIndex,
+ 0x000E,
+ Appli_VendorBigData.data,
+ Appli_VendorBigData.length,
+ MOBLE_FALSE,
+ MOBLE_TRUE);
+
+ }
+ return status;
+}
+
+/**
* @}
*/
@@ -501,5 +532,5 @@ void Appli_GetTestValue (MOBLEUINT8 *responseValue)
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 2b9390099..8b8e60aa6 100644
--- 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
@@ -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
@@ -36,8 +36,10 @@ 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);
-
+MOBLE_RESULT Appli_Vendor_SendBigDataPacket(void);
+MOBLE_RESULT Appli_Vendor_SetBigDataPacket(MOBLEUINT8 *data, MOBLEUINT32 length,
+ MOBLEUINT8 elementIndex , MOBLE_ADDRESS dst_peer);
#endif /* __APPLI_VENDOR_H */
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 730c40219..704a08d80 100644
--- 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
@@ -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
@@ -44,12 +44,10 @@
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****/
+/******************* (C) COPYRIGHT 2020 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
deleted file mode 100644
index e6fb50af9..000000000
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/mesh_cfg.h
+++ /dev/null
@@ -1,277 +0,0 @@
-/**
- ******************************************************************************
- * @file mesh_cfg.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_H
-#define __MESH_CFG_H
-
-/* Includes ------------------------------------------------------------------*/
-#include "mesh_cfg_usr.h"
-#include "app_conf.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
-
-/*
-* TRACE_M includes function name and clock
-*/
-void TraceHeader(const char* func_name, int mode);
-#define TraceB0(func_name, ...)
-#if ( CFG_DEBUG_TRACE != 0 )
-#define TraceB1(func_name, ...) do {TraceHeader(func_name, 0); printf( __VA_ARGS__);} while(0)
-#else
-#define TraceB1(func_name, ...)
-#endif
-#define TraceBX(flags, func_name, ...) TraceB ##flags(func_name, ##__VA_ARGS__)
-#define TRACE_M(flag, ...) TraceBX(flag, __func__, ##__VA_ARGS__)
-
-/*
-* TRACE_I does not include function name and clock
-*/
-#define TraceC0(...)
-#if ( CFG_DEBUG_TRACE != 0 )
-#define TraceC1(...) do { printf( __VA_ARGS__);} while(0)
-#else
-#define TraceC1(...)
-#endif
-//#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 DEVICE_NAME_PARAMS \
-{ \
- DEVICE_NAME_SIZE, \
- Device_Name \
-}
-
-#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 defined (ENABLE_PROVISIONER_FEATURE) && defined (DYNAMIC_PROVISIONER)
-#error "Please select one Provisioner Option"
-#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 device_name_params_t DeviceNameParams;
-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_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
index 3a8ed93fb..bf903bc5f 100644
--- 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
@@ -3,11 +3,11 @@
******************************************************************************
* @file mesh_cfg_usr.h
* @author BLE Mesh Team
- * @brief Header file for mesh_usr_cfg.c
+ * @brief user configurable settings
******************************************************************************
* @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
@@ -38,6 +38,80 @@
//#define ENABLE_PROVISIONER_FEATURE
#define DYNAMIC_PROVISIONER
+/*
+* 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_NO_OOB
+//#define ENABLE_AUTH_TYPE_STATIC_OOB
+//#define ENABLE_AUTH_TYPE_OUTPUT_OOB
+//#define ENABLE_AUTH_TYPE_INPUT_OOB
+
+/* Static OOB Configurations */
+#define STATIC_OOB_SIZE 16U
+
+/* Output OOB Configurations */
+#define OUTPUT_OOB_SIZE 1U
+#define OUTPUT_OOB_ACTION OUTPUT_OOB_ACTION_BIT_BLINK
+
+/* Input OOB Configurations */
+#define INPUT_OOB_SIZE 1U
+#define INPUT_OOB_ACTION INPUT_OOB_ACTION_BIT_PUSH
+
+/******************************************************************************/
+/* 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_SIG_MODELS_AT_COMMANDS 1
+#define ENABLE_VENDOR_MODELS_AT_COMMANDS 0
+#define ENABLE_UT 1
+
+/* Provisioner feature related configuration */
+#if defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER)
+#define PROVISIONER_ROOT_ADDR_DEFAULT 0x0001
+
+/*
+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
+
+/* Enables the UUID saving per Node - Currenly Not Supported */
+#define ENABLE_SAVE_UUID_PER_NODE 0
+
+#define ENABLE_SERIAL_PRVN 1
+
+#define CLIENT_MAX_SIG_MODELS_PER_ELEMENT 12 /* Number of SIG Models for Node under provisioning */
+#define CLIENT_MAX_VENDOR_MODELS_PER_ELEMENT 1 /* Number of Vendor Models for Node under provisioning */
+#define CLIENT_MAX_ELEMENTS_PER_NODE 1 /* Number of Elements per Node */
+
+/*
+* 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
+
+#endif
+
+/* Macro to test the Flash saving data and retrieval process */
+#define ENABLE_NVM_TEST
+
/* Macros Used for user defined serial print data for models.
Either use 0 to disable or 1 to enable
@ TF_GENERIC -> Generic server
@@ -81,20 +155,22 @@ Either use 0 to disable or 1 to enable
#define TF_HANDLER 1
#define TF_INIT 1
#define TF_MISC 1
+#define TF_SERIAL_CTRL 1
/* Disabled by default */
#define TF_COMMON 0
#define TF_GENERIC_M 0
-#define TF_GENERIC_CLIENT_M 0
-#define TF_SENSOR_M 0
+#define TF_GENERIC_CLIENT_M 1
+#define TF_SENSOR_M 1
+#define TF_SENSOR_CLIENT_M 1
#define TF_LIGHT_M 0
-#define TF_LIGHT_CLIENT_M 0
+#define TF_LIGHT_CLIENT_M 1
#define TF_LIGHT_LC_M 0
#define TF_VENDOR_M 0
#define TF_CONFIG_CLIENT_M 0
#define TF_NEIGHBOUR 0
#define TF_MEMORY 0
#define TF_BEACON 0
-#define TF_SERIAL_CTRL 1
+#define TF_VENDOR_APPLI_TEST 0 /* Vendor commands testing */
/*******************************************************************************
*** Following section helps to define Device Name during Provisioning *********
@@ -122,6 +198,11 @@ Either use 0 to disable or 1 to enable
//#define ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF_SETUP (1)
//#define ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME (1)
+//#define ENABLE_GENERIC_MODEL_CLIENT_ONOFF (1)
+//#define ENABLE_GENERIC_MODEL_CLIENT_LEVEL (1)
+//#define ENABLE_GENERIC_MODEL_CLIENT_POWER_ONOFF (1)
+//#define ENABLE_GENERIC_MODEL_CLIENT_DEFAULT_TRANSITION_TIME (1)
+
/* The Following Models are not available in this version, will be developed in
next version.
*/
@@ -156,11 +237,16 @@ Either use 0 to disable or 1 to enable
//#define ENABLE_LIGHT_MODEL_SERVER_HSL_HUE (1)
//#define ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION (1)
+//#define ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS (1)
+//#define ENABLE_LIGHT_MODEL_CLIENT_CTL (1)
+//#define ENABLE_LIGHT_MODEL_CLIENT_HSL (1)
+
/*
The following Models are managed in different file light_lc.c in middleware
*/
//#define ENABLE_LIGHT_MODEL_SERVER_LC (1)
-//#define ENABLE_LIGHT_MODEL_SERVER_LC_SETUP (1)
+
+//#define ENABLE_LIGHT_MODEL_CLIENT_LC (1)
/******************************************************************************/
/* Define the following Macros to enable the usage of the Sensor Models */
@@ -171,7 +257,8 @@ Either use 0 to disable or 1 to enable
/******************************************************************************/
//#define ENABLE_SENSOR_MODEL_SERVER (1)
-//#define ENABLE_SENSOR_MODEL_SERVER_SETUP (1)
+
+//#define ENABLE_SENSOR_MODEL_CLIENT (1)
/******************************************************************************/
/* Define the following Macros to enable the usage of the time and */
@@ -194,13 +281,10 @@ 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 (1)
#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)
/******************************************************************************/
@@ -211,32 +295,12 @@ or by Vendor Model.
@ 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
+//#define GENERIC_CLIENT_MODEL_PUBLISH
+//#define LIGHT_CLIENT_MODEL_PUBLISH
-#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 3
+//#define NUMBER_OF_SENSOR 1
//#define ENABLE_OCCUPANCY_SENSOR
/*
Macro is responsible for enabling and desabling the sensor publication.
@@ -277,18 +341,16 @@ this should be avoided to ensure flash longevity
//#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.
+
+/* Macros defined for the number of bytes saved, number of bytes dedicated for ganeric
+ model and light model.
*/
#define APP_NVM_GENERIC_MODEL_SIZE 16U
-#define APP_NVM_LIGHT_MODEL_SIZE 32U
-#define APP_NVM_MODEL_SIZE 50U
+#define APP_NVM_LIGHT_MODEL_SIZE 48U/*32U*/
+#define APP_NVM_MODELDATA_PER_ELEMENT_SIZE (APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE)
+//#define APP_NVM_MODEL_SIZE 50U
+#define APP_NVM_MODEL_SIZE (APP_NVM_MODELDATA_PER_ELEMENT_SIZE * APPLICATION_NUMBER_OF_ELEMENTS)
+//#define APP_NVM_MODEL_ALL_ELEMENTS_SIZE
/*Macros are defined for the selection of the number of led and type of lighting
@@ -310,24 +372,15 @@ this should be avoided to ensure flash longevity
/* 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
+/* Max SIG Models per element */
+#define USER_SIG_MODELS_MAX_COUNT 17
+/* Max Vendor Models per element */
+#define USER_VENDOR_MODELS_MAX_COUNT 1
/* Contains a 16-bit company identifier assigned by the Bluetooth SIG
@@ -378,57 +431,6 @@ For STMicroelectronics : it is 0x0030 */
/*
-* 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
*/
@@ -609,91 +611,6 @@ For STMicroelectronics : it is 0x0030 */
#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 ---------------------------------------------*/
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
index ce2370722..2435a9b32 100644
--- 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
@@ -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
@@ -42,7 +42,9 @@
#include "config_client.h"
#include "generic_client.h"
#include "light_client.h"
+#include "sensors_client.h"
#include "appli_light_client.h"
+#include "appli_sensors_client.h"
/** @addtogroup ST_BLE_Mesh
* @{
@@ -59,6 +61,9 @@ typedef struct
MOBLE_ADDRESS peer;
MOBLE_ADDRESS dst;
MOBLEUINT8 command;
+ MOBLEUINT8 elementIndex;
+ MOBLEUINT8 appKeyOffset;
+ MOBLEUINT8 netKeyOffset;
MOBLEUINT8 data[DATA_BUFFER_LENGTH]; /* 8-Bytes response packet */
MOBLEUINT32 length;
} APPLI_SEND_RESPONSE_MODULE;
@@ -78,18 +83,48 @@ typedef struct
/* Private variables ---------------------------------------------------------*/
+MOBLEUINT8 Led_Value = 0;
+
+MOBLEUINT8 ButtonIndex_Value = 0;
+
APPLI_PENDING_PACKETS Appli_PendingPackets = {0};
-__attribute__((aligned(4)))
-const MOBLE_VENDOR_CB_MAP vendor_cb =
+MOBLEUINT8 pGeneric_OnOffParam[sizeof(Generic_OnOffParam_t)];
+MOBLEUINT8 pGeneric_LevelParam[sizeof(Generic_LevelParam_t)];
+MOBLEUINT8 pGeneric_DeltaLevelParam[sizeof(Generic_DeltaLevelParam_t)];
+MOBLEUINT8 pGeneric_MoveLevelParam[sizeof(Generic_LevelMoveParam_t)];
+MOBLEUINT8 pGeneric_PowerOnOffParam[sizeof(Generic_PowerOnOffParam_t)];
+MOBLEUINT8 pGeneric_DefaultTransitionTimeParam[sizeof(Generic_DefaultTransitionParam_t)];
+
+MOBLEUINT8 pLightnessParam[sizeof(Light_LightnessParam_t)];
+MOBLEUINT8 pLightnessRangeParam[sizeof(Light_LightnessRangeParam_t)];
+
+MOBLEUINT8 pLightCtlParam[sizeof(Light_CtlParam_t)];
+MOBLEUINT8 pLightCtlTemperatureParam[sizeof(Light_CtlTemperatureParam_t)];
+MOBLEUINT8 pLightCtlTemperatureRangeParam[sizeof(Light_CtlTemperatureRangeParam_t)];
+MOBLEUINT8 pLightCtlDefaultParam[sizeof(Light_CtlDefaultParam_t)];
+
+MOBLEUINT8 pLightHslParam[sizeof(Light_HslParam_t)];
+MOBLEUINT8 pLightHslRangeParam[sizeof(Light_HslRangeParam_t)];
+MOBLEUINT8 pLightHslHueParam[sizeof(Light_HslHueParam_t)];
+MOBLEUINT8 pLightHslSaturationParam[sizeof(Light_HslSaturationParam_t)];
+
+MOBLEUINT8 pLightLCModeParam[sizeof(Light_LC_ModeParam_t)];
+MOBLEUINT8 pLightLCOccupancyModeParam[sizeof(Light_LC_ModeParam_t)];
+MOBLEUINT8 pLightLCOnOffParam[sizeof(Light_LC_OnOffParam_t)];
+MOBLEUINT8 pLightLCPropertyParam[6];
+
+MOBLEUINT8 pSensorsCadenceParam[sizeof(sensor_CadenceCbParam_t)];
+MOBLEUINT8 pSensorsSettingParam[sizeof(sensor_SettingCbParams_t)];
+
+__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 =
+__attribute__((aligned(4)))const Appli_Vendor_cb_t VendorAppli_cb =
{
/*Vendor Commads*/
Appli_Vendor_LEDControl,
@@ -100,8 +135,7 @@ const Appli_Vendor_cb_t VendorAppli_cb =
Appli_Vendor_Data_write
};
-__attribute__((aligned(4)))
-const Appli_Generic_cb_t GenericAppli_cb =
+__attribute__((aligned(4)))const Appli_Generic_cb_t GenericAppli_cb =
{
/* Generic OnOff callbacks */
Appli_Generic_OnOff_Set,
@@ -124,8 +158,7 @@ const Appli_Generic_cb_t GenericAppli_cb =
Appli_Generic_DefaultTransitionTime_Status
};
-__attribute__((aligned(4)))
-const Appli_Generic_State_cb_t Appli_GenericState_cb =
+__attribute__((aligned(4)))const Appli_Generic_State_cb_t Appli_GenericState_cb =
{
/* Generic Get On Off status */
@@ -139,8 +172,7 @@ const Appli_Generic_State_cb_t Appli_GenericState_cb =
Appli_Generic_GetDefaultTransitionStatus
};
-__attribute__((aligned(4)))
-const Appli_Light_GetStatus_cb_t Appli_Light_GetStatus_cb =
+__attribute__((aligned(4)))const Appli_Light_GetStatus_cb_t Appli_Light_GetStatus_cb =
{
Appli_Light_GetLightnessStatus,
Appli_Light_GetLightnessLinearStatus,
@@ -148,10 +180,12 @@ const Appli_Light_GetStatus_cb_t Appli_Light_GetStatus_cb =
Appli_Light_GetLightnessLastStatus,
Appli_Light_GetLightnessRangeStatus,
Appli_Light_GetCtlLightStatus,
+ Appli_Light_GetCtlTargetStatus,
Appli_Light_GetCtlTemperatureStatus,
Appli_Light_GetCtlTemperatureRange,
Appli_Light_GetCtlDefaultStatus,
Appli_Light_GetHslStatus,
+ Appli_Light_GetHslTargetStatus,
Appli_Light_GetHslHueStatus,
Appli_Light_GetHslSaturationStatus,
Appli_Light_GetHslHueRange,
@@ -160,8 +194,7 @@ const Appli_Light_GetStatus_cb_t Appli_Light_GetStatus_cb =
};
-__attribute__((aligned(4)))
-const Appli_Light_cb_t LightAppli_cb =
+__attribute__((aligned(4)))const Appli_Light_cb_t LightAppli_cb =
{
/* Light Lightness callbacks */
Appli_Light_Lightness_Set,
@@ -173,6 +206,9 @@ const Appli_Light_cb_t LightAppli_cb =
Appli_Light_Lightness_Default_Set,
Appli_Light_Lightness_Default_Status,
+ Appli_Light_Lightness_Last_Set,
+ Appli_Light_Lightness_Last_Status,
+
Appli_Light_Lightness_Range_Set,
Appli_Light_Lightness_Range_Status,
@@ -205,17 +241,19 @@ const Appli_Light_cb_t LightAppli_cb =
};
-__attribute__((aligned(4)))
-const Appli_Light_Ctrl_cb_t LightLCAppli_cb =
+#if 0
+__attribute__((aligned(4)))const Appli_Light_Ctrl_cb_t LightLCAppli_cb =
{
/* Light LC mode set callbacks */
Appli_LightLC_Mode_Set,
+ Appli_LightLC_Mode_Status,
Appli_LightLC_OM_Set,
+ Appli_LightLC_OM_Status,
Appli_LightLC_OnOff_Set,
+ Appli_LightLC_OnOff_Status,
};
-__attribute__((aligned(4)))
-const Appli_LightLC_GetStatus_cb_t Appli_LightLC_GetStatus_cb =
+__attribute__((aligned(4)))const Appli_LightLC_GetStatus_cb_t Appli_LightLC_GetStatus_cb =
{
Appli_LightLC_Get_ModeStatus,
Appli_LightLC_Get_OMModeStatus,
@@ -223,33 +261,44 @@ const Appli_LightLC_GetStatus_cb_t Appli_LightLC_GetStatus_cb =
Appli_LightLC_Get_AmbientLuxLevelOutput,
Appli_Light_LC_PIRegulatorOutput,
};
+#endif
-#ifdef ENABLE_SENSOR_MODEL_SERVER
-
-__attribute__((aligned(4)))
-const Appli_Sensor_cb_t SensorAppli_cb =
+__attribute__((aligned(4)))const sensor_server_cb_t SensorAppli_cb =
{
- /* Sensor Model callbacks */
- Appli_Sensor_Cadence_Set,
- Appli_Sensor_Data_Status,
- Appli_Sensor_Descriptor_Status ,
- Appli_Sensor_Setting_Set,
+ Appli_Sensor_CadenceGet,
+ Appli_Sensor_CadenceSet,
+ Appli_Sensor_CadenceSetUnack,
+ Appli_Sensor_SettingsGet,
+ Appli_Sensor_SettingGet,
+ Appli_Sensor_SettingSet,
+ Appli_Sensor_SettingSetUnack,
+ Appli_Sensor_DescriptorGet,
+ Appli_Sensor_Get,
+ Appli_Sensor_ColumnGet,
+ Appli_Sensor_SeriesGet,
+ Appli_Sensor_ReadDescriptor,
+ Appli_Sensor_ReadValue,
+ Appli_Sensor_ReadColumn,
+ Appli_Sensor_ReadSeries,
+ Appli_Sensor_IsFastCadence,
+ Appli_Sensor_IsStatusTrigger,
+ Appli_Sensor_Descriptor_Status,
+ Appli_Sensor_Cadence_Status,
+ Appli_Sensor_Settings_Status,
+ Appli_Sensor_Setting_Status,
+ Appli_Sensor_Status,
Appli_Sensor_Column_Status,
Appli_Sensor_Series_Status
};
-__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 Appli_Sensor_GetStatus_cb_t Appli_Sensor_GetStatus_cb =
+//{
+// // Appli_Sensor_GetSettingStatus,
+// Appli_Sensor_GetSetting_IDStatus,
+//};
-__attribute__((aligned(4)))
-const MODEL_SIG_cb_t Model_SIG_cb[] =
+__attribute__((aligned(4)))const MODEL_SIG_cb_t Model_SIG_cb[] =
{
#ifdef ENABLE_GENERIC_MODEL_SERVER
{
@@ -266,6 +315,7 @@ const MODEL_SIG_cb_t Model_SIG_cb[] =
LightModelServer_ProcessMessageCb
},
#endif
+
#ifdef ENABLE_SENSOR_MODEL_SERVER
{
SensorModelServer_GetOpcodeTableCb,
@@ -273,6 +323,7 @@ const MODEL_SIG_cb_t Model_SIG_cb[] =
SensorModelServer_ProcessMessageCb
},
#endif
+
#ifdef ENABLE_TIME_SCENE_MODEL_SERVER
{
Time_SceneModelServer_GetOpcodeTableCb,
@@ -280,13 +331,15 @@ const MODEL_SIG_cb_t Model_SIG_cb[] =
Time_SceneModelServer_ProcessMessageCb
},
#endif
+
#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
{
- Light_LC_ModelServer_GetOpcodeTableCb,
- Light_LC_ModelServer_GetStatusRequestCb,
- Light_LC_ModelServer_ProcessMessageCb
+ LightLcServer_GetOpcodeTableCb,
+ LightLcServer_GetStatusRequestCb,
+ LightLcServer_ProcessMessageCb
},
#endif
+
#ifdef ENABLE_GENERIC_MODEL_CLIENT
{
GenericModelClient_GetOpcodeTableCb,
@@ -294,6 +347,7 @@ const MODEL_SIG_cb_t Model_SIG_cb[] =
GenericModelClient_ProcessMessageCb
},
#endif
+
#ifdef ENABLE_CONFIG_MODEL_CLIENT
{
ConfigClientModel_GetOpcodeTableCb,
@@ -309,15 +363,29 @@ const MODEL_SIG_cb_t Model_SIG_cb[] =
},
#endif
- { 0, 0,0 }
+#ifdef ENABLE_SENSOR_MODEL_CLIENT
+ {
+ SensorsModelClient_GetOpcodeTableCb,
+ SensorsModelClient_GetStatusRequestCb,
+ SensorsModelClient_ProcessMessageCb
+ },
+#endif
+
+ {
+ 0, 0, 0
+ }
};
-__attribute__((aligned(4))) const APPLI_SAVE_MODEL_STATE_CB SaveModelState_cb = AppliNvm_SaveModelState;
+__attribute__((aligned(4)))const APPLI_SAVE_MODEL_STATE_CB SaveModelState_cb = AppliNvm_SaveModelState;
+
+#if 0
+__attribute__((aligned(4)))const APPLI_SAVE_MODEL_TEST_STATE_CB SaveModelTestState_cb = AppliNVM_Save_FlashTesting;
+__attribute__((aligned(4)))const APPLI_RETRIEVE_MODEL_TEST_STATE_CB RetrieveModelTestState_cb = AppliNVM_Retrieve_FlashTesting;
+#endif
#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[] =
+__attribute__((aligned(4)))const MODEL_Vendor_cb_t Model_Vendor_cb[] =
{
#ifdef ENABLE_VENDOR_MODEL_SERVER
{
@@ -341,7 +409,7 @@ void GetApplicationVendorModels(const MODEL_Vendor_cb_t** pModelsTable, MOBLEUIN
*pModelsTable = Model_Vendor_cb ;
*VendorModelscount = MODEL_VENDOR_COUNT;
- TRACE_M(TF_VENDOR,"GetApplicationVendorModels \r\n");
+ TRACE_M(TF_VENDOR_M, "GetApplicationVendorModels \r\n");
}
/**
@@ -354,7 +422,7 @@ void BLEMesh_ModelsInit(void)
#ifdef ENABLE_SAVE_MODEL_STATE_NVM
- MOBLEUINT8 modelStateLoad_Size;
+ MOBLEUINT16 modelStateLoad_Size;
MOBLEUINT8 modelStateLoadBuff[APP_NVM_MODEL_SIZE];
#ifdef CLIENT
@@ -362,28 +430,39 @@ void BLEMesh_ModelsInit(void)
MOBLEUINT8 PrvnlStateLoadBuff[16];
#endif
+#if 0
+#ifdef ENABLE_NVM_TEST
+ /* Testing of flash code */
+ Device_FlashTesting();
+#endif
+#endif
+
+ /* Inintialise the light model range states with default values */
+ Light_ModelRangeInit();
+
/* Callbacks used by BlueNRG-Mesh Models */
BLEMesh_SetSIGModelsCbMap(Model_SIG_cb, MODEL_SIG_COUNT);
+#if defined ENABLE_SENSOR_MODEL_SERVER && !defined CUSTOM_BOARD_PWM_SELECTION
+ /* Initialization of sensors */
+ Appli_Sensor_Init();
+#endif
+
+ Appli_Light_LCs_Init();
+#endif
+
/* 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
+#ifdef CLIENT
+ AppliPrvnNvm_LoadData(PrvnlStateLoadBuff,&PrvnStateLoad_Size);
+#endif
+
}
/**
@@ -418,7 +497,7 @@ void BLEMesh_ModelsProcess(void)
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
- Light_control_Process();
+ Light_LC_Process();
#endif
}
@@ -433,23 +512,498 @@ void BLEMesh_ModelsCommand(void)
Vendor_Publish(BLEMesh_GetAddress());
#endif
+#if defined(GENERIC_CLIENT_MODEL_PUBLISH) || defined(LIGHT_CLIENT_MODEL_PUBLISH)
+ Led_Value ^= APPLI_LED_ON;
+ pGeneric_OnOffParam[0] = Led_Value; // OnOff parameter byte 0 : The target value of the Generic Onoff state
+
+ pLightLCModeParam[0] = Led_Value;
+ pLightLCOccupancyModeParam[0] = Led_Value;
+ pLightLCOnOffParam[0] = Led_Value;
+
+ //This Switch-case allows to quickly set the different Models Messages parameters in order to demonstrate Client APIs functionning
+ switch (ButtonIndex_Value){
+ case 0:
+ ButtonIndex_Value=0x1;
+
+ pGeneric_LevelParam[0]= 0xE8; // Level parameter byte 0 : The target value of the Generic Level state
+ pGeneric_LevelParam[1]= 0x03; // Level parameter byte 1 : The target value of the Generic Level state
+
+ pGeneric_DeltaLevelParam[0]= 0xE8; // Delta Level parameter byte 0 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[1]= 0x03; // Delta Level parameter byte 1 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[2]= 0x00; // Delta Level parameter byte 2 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[3]= 0x00; // Delta Level parameter byte 3 : The Delta change of the Generic Level state
+
+ pGeneric_MoveLevelParam[0]= 0xE8; //Move Delta Level parameter byte 0 : The Delta Level step to calculate Move speed for the Generic Level state
+ pGeneric_MoveLevelParam[1]= 0x03; //Move Delta Level parameter byte 1 : The Delta Level step to calculate Move speed for the Generic Level state
+
+ pGeneric_DefaultTransitionTimeParam[0]=0x0F; //Transition time parameter byte 0 : The value of the Generic Default Transition Time state
+
+ pGeneric_PowerOnOffParam[0]=0x1; //OnPowerUp parameter byte 0 : The value of the Generic OnPowerUp state.
+
+ pLightnessParam[0] = 0xE8; //Lightness parameter byte 0 : The target value of the Light Lightness Actual/Linear/Default state
+ pLightnessParam[1] = 0x03; //Lightness parameter byte 1 : The target value of the Light Lightness Actual/Linear/Default state
+
+ pLightnessRangeParam[0] = 0xE8; //Lightness Range Min parameter byte 0 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[1] = 0x03; //Lightness Range Min parameter byte 1 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[2] = 0x88; //Lightness Range Max parameter byte 0 : The value of the Lightness Range Max field of the Light Lightness Range state
+ pLightnessRangeParam[3] = 0x13; //Lightness Range Max parameter byte 1 : The value of the Lightness Range Max field of the Light Lightness Range state
+
+ pLightCtlParam[0] = 0xE8; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness state
+ pLightCtlParam[1] = 0x03; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness state
+ pLightCtlParam[2] = 0xE8; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlParam[3] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlParam[4] = 0xE8; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlParam[5] = 0x03; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureParam[0] = 0xE8; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[1] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[2] = 0xE8; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlTemperatureParam[3] = 0x03; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureRangeParam[0] = 0xE8; //Temperature Range Min parameter byte 0 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[1] = 0x03; //Temperature Range Min parameter byte 1 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[2] = 0x88; //Temperature Range Max parameter byte 0 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[3] = 0x13; //Temperature Range Max parameter byte 1 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+
+ pLightCtlDefaultParam[0] = 0xE8; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[1] = 0x03; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[2] = 0xE8; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[3] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[4] = 0xE8; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV Default state
+ pLightCtlDefaultParam[5] = 0x03; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV Default state
+
+ pLightHslParam[0] = 0xE8; //HSL Lightness parameter byte 0 : The target value of the Light HSL Lightness state
+ pLightHslParam[1] = 0x03; //HSL Lightness parameter byte 1 : The target value of the Light HSL Lightness state
+ pLightHslParam[2] = 0xE8; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslParam[3] = 0x03; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+ pLightHslParam[4] = 0xE8; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslParam[5] = 0x03; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ pLightHslRangeParam[0] = 0xE8; //HSL Hue Range Min parameter byte 0 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[1] = 0x03; //HSL Hue Range Min parameter byte 1 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[2] = 0x88; //HSL Hue Range Max parameter byte 0 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[3] = 0x13; //HSL Hue Range Max parameter byte 1 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[4] = 0x88; //HSL Saturation Min parameter byte 0 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[5] = 0x13; //HSL Saturation Min parameter byte 1 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[6] = 0x70; //HSL Saturation Max parameter byte 0 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+ pLightHslRangeParam[7] = 0x17; //HSL Saturation Max parameter byte 1 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+
+ pLightHslHueParam[0] = 0xE8; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslHueParam[1] = 0x03; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+
+ pLightHslSaturationParam[0] = 0xE8; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslSaturationParam[1] = 0x03; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ //LIGHT_CONTROL_LUX_LEVEL_ON_ID : 0x202B
+ pLightLCPropertyParam[0]= 0x2B; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[1]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[2]= 0x44; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[3]= 0x44; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[4]= 0x44; // Property ID byte 2 : Property ID identifying a Light LC Property.
+ break;
+
+ case 1:
+ ButtonIndex_Value=0x2;
+
+ pGeneric_LevelParam[0]= 0xff; // Level parameter byte 0 : The target value of the Generic Level state
+ pGeneric_LevelParam[1]= 0x7f; // Level parameter byte 1 : The target value of the Generic Level state
+
+ pGeneric_DeltaLevelParam[0]= 0x10; // Delta Level parameter byte 0 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[1]= 0x27; // Delta Level parameter byte 1 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[2]= 0x00; // Delta Level parameter byte 2 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[3]= 0x00; // Delta Level parameter byte 3 : The Delta change of the Generic Level state
+
+ pGeneric_MoveLevelParam[0]= 0xff; //Move Delta Level parameter byte 0 : The Delta Level step to calculate Move speed for the Generic Level state
+ pGeneric_MoveLevelParam[1]= 0x7f; //Move Delta Level parameter byte 1 : The Delta Level step to calculate Move speed for the Generic Level state
+
+ pGeneric_DefaultTransitionTimeParam[0]=0x10; //Transition time parameter byte 0 : The value of the Generic Default Transition Time state
+
+ pGeneric_PowerOnOffParam[0]=0x2; //OnPowerUp parameter byte 0 : The value of the Generic OnPowerUp state.
+
+ pLightnessParam[0] = 0xff; //Lightness parameter byte 0 : The target value of the Light Lightness Actual/Linear/Default state
+ pLightnessParam[1] = 0xff; //Lightness parameter byte 1 : The target value of the Light Lightness Actual/Linear/Default state
+
+ pLightnessRangeParam[0] = 0x00; //Lightness Range Min parameter byte 0 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[1] = 0x00; //Lightness Range Min parameter byte 1 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[2] = 0xff; //Lightness Range Max parameter byte 0 : The value of the Lightness Range Max field of the Light Lightness Range state
+ pLightnessRangeParam[3] = 0xff; //Lightness Range Max parameter byte 1 : The value of the Lightness Range Max field of the Light Lightness Range state
+
+ pLightCtlParam[0] = 0xff; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness state
+ pLightCtlParam[1] = 0xff; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness state
+ pLightCtlParam[2] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlParam[3] = 0x4e; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlParam[4] = 0xff; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlParam[5] = 0x7f; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureParam[0] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[1] = 0x4e; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[2] = 0xff; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlTemperatureParam[3] = 0x7f; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureRangeParam[0] = 0x19; //Temperature Range Min parameter byte 0 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[1] = 0x4e; //Temperature Range Min parameter byte 1 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[2] = 0x20; //Temperature Range Max parameter byte 0 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[3] = 0x4e; //Temperature Range Max parameter byte 1 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+
+ pLightCtlDefaultParam[0] = 0xff; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[1] = 0xff; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[2] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[3] = 0x4e; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[4] = 0xff; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV Default state
+ pLightCtlDefaultParam[5] = 0x7f; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV Default state
+
+ pLightHslParam[0] = 0xff; //HSL Lightness parameter byte 0 : The target value of the Light HSL Lightness state
+ pLightHslParam[1] = 0xff; //HSL Lightness parameter byte 1 : The target value of the Light HSL Lightness state
+ pLightHslParam[2] = 0xee; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslParam[3] = 0xee; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+ pLightHslParam[4] = 0xdd; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslParam[5] = 0xdd; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ pLightHslRangeParam[0] = 0x00; //HSL Hue Range Min parameter byte 0 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[1] = 0xf0; //HSL Hue Range Min parameter byte 1 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[2] = 0xff; //HSL Hue Range Max parameter byte 0 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[3] = 0xff; //HSL Hue Range Max parameter byte 1 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[4] = 0x00; //HSL Saturation Min parameter byte 0 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[5] = 0xe0; //HSL Saturation Min parameter byte 1 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[6] = 0xff; //HSL Saturation Max parameter byte 0 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+ pLightHslRangeParam[7] = 0xef; //HSL Saturation Max parameter byte 1 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+
+ pLightHslHueParam[0] = 0xff; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslHueParam[1] = 0xff; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+
+ pLightHslSaturationParam[0] = 0xff; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslSaturationParam[1] = 0xff; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ //LIGHT_CONTROL_LUX_LEVEL_ON_ID : 0x202B
+ pLightLCPropertyParam[0]= 0x2B; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[1]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[2]= 0x01; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[3]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[4]= 0x10; // Property ID byte 2 : Property ID identifying a Light LC Property.
+ break;
+
+ case 2:
+ ButtonIndex_Value=0x0;
+
+ pGeneric_LevelParam[0]= 0x00; // Level parameter byte 0 : The target value of the Generic Level state
+ pGeneric_LevelParam[1]= 0x00; // Level parameter byte 1 : The target value of the Generic Level state
+
+ pGeneric_DeltaLevelParam[0]= 0x00; // Delta Level parameter byte 0 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[1]= 0x00; // Delta Level parameter byte 1 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[2]= 0x00; // Delta Level parameter byte 2 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[3]= 0x00; // Delta Level parameter byte 3 : The Delta change of the Generic Level state
+
+ pGeneric_MoveLevelParam[0]= 0x00; //Move Delta Level parameter byte 0 : The Delta Level step to calculate Move speed for the Generic Level state
+ pGeneric_MoveLevelParam[1]= 0x00; //Move Delta Level parameter byte 1 : The Delta Level step to calculate Move speed for the Generic Level state
+
+ pGeneric_DefaultTransitionTimeParam[0]=0x00; //Transition time parameter byte 0 : The value of the Generic Default Transition Time state
+
+ pGeneric_PowerOnOffParam[0]=0x0; //OnPowerUp parameter byte 0 : The value of the Generic OnPowerUp state.
+
+ pLightnessParam[0] = 0x00; //Lightness parameter byte 0 : The target value of the Light Lightness Actual/Linear/Default state
+ pLightnessParam[1] = 0x00; //Lightness parameter byte 1 : The target value of the Light Lightness Actual/Linear/Default state
+
+ pLightnessRangeParam[0] = 0x00; //Lightness Range Min parameter byte 0 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[1] = 0x00; //Lightness Range Min parameter byte 1 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[2] = 0x00; //Lightness Range Max parameter byte 0 : The value of the Lightness Range Max field of the Light Lightness Range state
+ pLightnessRangeParam[3] = 0x10; //Lightness Range Max parameter byte 1 : The value of the Lightness Range Max field of the Light Lightness Range state
+
+ pLightCtlParam[0] = 0x00; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness state
+ pLightCtlParam[1] = 0x00; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness state
+ pLightCtlParam[2] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlParam[3] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlParam[4] = 0x00; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlParam[5] = 0x00; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureParam[0] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[1] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[2] = 0x00; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlTemperatureParam[3] = 0x00; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureRangeParam[0] = 0x20; //Temperature Range Min parameter byte 0 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[1] = 0x03; //Temperature Range Min parameter byte 1 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[2] = 0x21; //Temperature Range Max parameter byte 0 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[3] = 0x03; //Temperature Range Max parameter byte 1 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+
+ pLightCtlDefaultParam[0] = 0x00; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[1] = 0x00; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[2] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[3] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[4] = 0x00; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV Default state
+ pLightCtlDefaultParam[5] = 0x00; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV Default state
+
+ pLightHslParam[0] = 0x00; //HSL Lightness parameter byte 0 : The target value of the Light HSL Lightness state
+ pLightHslParam[1] = 0x00; //HSL Lightness parameter byte 1 : The target value of the Light HSL Lightness state
+ pLightHslParam[2] = 0x00; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslParam[3] = 0x00; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+ pLightHslParam[4] = 0x00; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslParam[5] = 0x00; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ pLightHslRangeParam[0] = 0x00; //HSL Hue Range Min parameter byte 0 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[1] = 0x00; //HSL Hue Range Min parameter byte 1 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[2] = 0x00; //HSL Hue Range Max parameter byte 0 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[3] = 0x10; //HSL Hue Range Max parameter byte 1 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[4] = 0x00; //HSL Saturation Min parameter byte 0 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[5] = 0x00; //HSL Saturation Min parameter byte 1 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[6] = 0x00; //HSL Saturation Max parameter byte 0 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+ pLightHslRangeParam[7] = 0x20; //HSL Saturation Max parameter byte 1 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+
+ pLightHslHueParam[0] = 0x00; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslHueParam[1] = 0x00; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+
+ pLightHslSaturationParam[0] = 0x00; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslSaturationParam[1] = 0x00; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ //LIGHT_CONTROL_LUX_LEVEL_ON_ID : 0x202B
+ pLightLCPropertyParam[0]= 0x2B; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[1]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[2]= 0x00; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[3]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[4]= 0x00; // Property ID byte 2 : Property ID identifying a Light LC Property.
+ break;
+
+ default:
+ break;
+ }
+
+
#ifdef GENERIC_CLIENT_MODEL_PUBLISH
- Appli_GenericClient_OnOff_Set();
+ /** GENERIC ONOFF **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API ONOFF SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_ON_OFF_SET_ACK, pGeneric_OnOffParam);
+
+ TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API ONOFF SET UNACK ------------- \r\n");
+ Appli_GenericClient_API(0, GENERIC_ON_OFF_SET_UNACK, pGeneric_OnOffParam);
+
+ /** GENERIC LEVEL **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API LEVEL SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_LEVEL_SET_ACK, pGeneric_LevelParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API LEVEL SET UNACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_LEVEL_SET_UNACK, pGeneric_LevelParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API DELTA LEVEL SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_DELTA_SET, pGeneric_DeltaLevelParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API DELTA LEVEL SET UNACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_DELTA_SET_UNACK, pGeneric_DeltaLevelParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API MOVE DELTA LEVEL SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_MOVE_SET, pGeneric_MoveLevelParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API MOVE DELTA LEVEL SET UNACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_MOVE_SET_UNACK, pGeneric_MoveLevelParam);
+
+ /** GENERIC POWER ONOFF **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API POWER ON OFF SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_POWER_ON_OFF_SET, pGeneric_PowerOnOffParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API POWER ON OFF SET UNACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_POWER_ON_OFF_SET_UNACK, pGeneric_PowerOnOffParam);
+
+ /** GENERIC TRANSITION TIME **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API DEFAULT TRANSITION TIME SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_DEFAULT_TRANSITION_TIME_SET, pGeneric_DefaultTransitionTimeParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API DEFAULT TRANSITION TIME SET UNACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_DEFAULT_TRANSITION_TIME_SET_UNACK, pGeneric_DefaultTransitionTimeParam);
+
+
+
+#if 1 /* TODO FAGOTV: Initialize Present Ambient Temparature Sensor in sensor_cfg_usr.h */
+ //PRESENT_AMBIENT_TEMPERATURE_PID : 0x004F
+ pSensorsCadenceParam[0]= 0x4F; // Property ID byte 0 : Property ID for the sensor.
+ pSensorsCadenceParam[1]= 0x00; // Property ID byte 1 : Property ID for the sensor.
+
+ pSensorsCadenceParam[2]= 0x81; // Fast Cadence Period Divisor bits 0-7: Divisor for the Publish Period.
+ // Status Trigger Type bit 8 : Defines the unit and format of the Status Trigger Delta fields.
+ pSensorsCadenceParam[3]= 0x11; // Status Trigger Delta Down byte 0 : Delta down value that triggers a status message.
+ pSensorsCadenceParam[4]= 0x11; // Status Trigger Delta Down byte 1 : Delta down value that triggers a status message.
+
+ pSensorsCadenceParam[5]= 0x22; // Status Trigger Delta Up byte 0 : Delta down value that triggers a status message.
+ pSensorsCadenceParam[6]= 0x22; // Status Trigger Delta Up byte 1 : Delta down value that triggers a status message.
+
+ pSensorsCadenceParam[7]= 0x10; // Status Min Interval byte 0 : Minimum interval between two consecutive Status messages.
+
+ pSensorsCadenceParam[8]= 0x33; // Fast Cadence Low byte 0 : Low value for the fast cadence range.
+
+ pSensorsCadenceParam[9]= 0x44; // Fast Cadence High byte 0 : High value for the fast cadence range.
+
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR CADENCE SET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_CADENCE_SET, pSensorsCadenceParam);
+
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR CADENCE SET UNACK ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_CADENCE_SET_UNACK, pSensorsCadenceParam);
+
+ /** SENSOR SETTING**/
+ /*
+ PRESENT_AMBIENT_TEMPERATURE_PID : 0x004F
+ Second Property PID : 0x00AD
+ */
+ pSensorsSettingParam[0]= 0x4F; // Property ID byte 0 : Property ID for the sensor
+ pSensorsSettingParam[1]= 0x00; // Property ID byte 1 : Property ID for the sensor
+ pSensorsSettingParam[2]= 0xAD; // Sensor Setting Property ID byte 0 : Property ID for the sensor setting
+ pSensorsSettingParam[3]= 0x00; // Sensor Setting Property ID byte 1 : Property ID for the sensor setting
+
+ switch (ButtonIndex_Value){
+ case 0:
+ pSensorsSettingParam[4]= 0x10; // Sensor Setting Property ID byte 0 : Property ID for the sensor setting
+ //pSensorsSettingParam[5]= 0x10; // Sensor Setting Property ID byte 1 : Property ID for the sensor setting
+ break;
+ case 1:
+ pSensorsSettingParam[4]= 0x20; // Sensor Setting Property ID byte 0 : Property ID for the sensor setting
+ //pSensorsSettingParam[5]= 0x20; // Sensor Setting Property ID byte 1 : Property ID for the sensor setting
+ break;
+ case 2:
+ pSensorsSettingParam[4]= 0x0F; // Sensor Setting Property ID byte 0 : Property ID for the sensor setting
+ //pSensorsSettingParam[5]= 0x00; // Sensor Setting Property ID byte 1 : Property ID for the sensor setting
+ break;
+ default:
+ break;
+ }
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR SETTING SET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_SETTING_SET, pSensorsSettingParam);
+
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR SETTING SET UNACK ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_SETTING_SET_UNACK, pSensorsSettingParam);
+#endif
+
+#endif
+
+#ifdef LIGHT_CLIENT_MODEL_PUBLISH
+ /** LIGHT LIGHTNESS **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_SET, pLightnessParam);
+//
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_SET_UNACK, pLightnessParam);
+
+ /** LIGHT LIGHTNESS LINEAR **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS SET LINEAR ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_LINEAR_SET, pLightnessParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS SET LINEAR UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_LINEAR_SET_UNACK, pLightnessParam);
+
+ /** LIGHT LIGHTNESS DEFAULT **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS DEFAULT SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_DEFAULT_SET, pLightnessParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS DEFAULT SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_DEFAULT_SET_UNACK, pLightnessParam);
+
+ /** LIGHT LIGHTNESS RANGE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS RANGE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_RANGE_SET, pLightnessRangeParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS RANGE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_RANGE_SET_UNACK, pLightnessRangeParam);
+
+ /** LIGHT LIGHTNESS CTL **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_SET, pLightCtlParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_SET_UNACK, pLightCtlParam);
+
+ /** LIGHT LIGHTNESS CTL TEMPERATURE**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_SET, pLightCtlTemperatureParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_SET_UNACK, pLightCtlTemperatureParam);
+
+ /** LIGHT LIGHTNESS CTL TEMPERATURE RANGE**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE RANGE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_RANGE_SET, pLightCtlTemperatureRangeParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE RANGE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_RANGE_SET_UNACK, pLightCtlTemperatureRangeParam);
+
+ /** LIGHT LIGHTNESS CTL DEFAULT**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL DEFAULT SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_DEFAULT_SET, pLightCtlDefaultParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL DEFAULT SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_DEFAULT_SET_UNACK, pLightCtlDefaultParam);
+
+ /** LIGHT LIGHTNESS HSL **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_SET, pLightHslParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_SET_UNACK, pLightHslParam);
+
+ /** LIGHT LIGHTNESS HSL DEFAULT **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL DEFAULT SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_DEFAULT_SET, pLightHslParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL DEFAULT SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_DEFAULT_SET_UNACK, pLightHslParam);
+
+ /** LIGHT LIGHTNESS HSL RANGE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL RANGE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_RANGE_SET, pLightHslRangeParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL RANGE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_RANGE_SET_UNACK, pLightHslRangeParam);
+
+ /** LIGHT LIGHTNESS HSL HUE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL HUE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_HUE_SET, pLightHslHueParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL HUE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_HUE_SET_UNACK, pLightHslHueParam);
+
+ /** LIGHT LIGHTNESS HSL SATURATION **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL SATURATION SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_SATURATION_SET, pLightHslSaturationParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL SATURATION SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_SATURATION_SET_UNACK, pLightHslSaturationParam);
+
+ /** LIGHT LC MODE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC MODE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_MODE_SET, pLightLCModeParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC MODE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_MODE_SET_UNACK, pLightLCModeParam);
+
+ /** LIGHT LC OM **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC OM SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_OM_SET, pLightLCOccupancyModeParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC OM SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_OM_SET_UNACK, pLightLCOccupancyModeParam);
+
+ /** LIGHT LC ONOFF **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC ONOFF SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_ON_OFF_SET, pLightLCOnOffParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC ONOFF SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_ON_OFF_SET_UNACK, pLightLCOnOffParam);
+
+ /** LIGHT LC PROPERTY **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC PROPERTY SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_PROPERTY_SET, pLightLCPropertyParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC PROPERTY SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_PROPERTY_SET_UNACK, pLightLCPropertyParam);
+#endif
#endif
-#ifndef CLIENT
/* if CLIENT and SERVER => Publish is already done in CLIENT */
#ifdef GENERIC_SERVER_MODEL_PUBLISH
+#ifndef GENERIC_CLIENT_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
+* @retval MOBLEUINT8 : elementNumber
*/
MOBLEUINT8 BLEMesh_ModelsGetElementNumber(MOBLE_ADDRESS dst_peer)
{
@@ -464,46 +1018,35 @@ MOBLEUINT8 BLEMesh_ModelsGetElementNumber(MOBLE_ADDRESS dst_peer)
}
/**
-* @brief Check Subscription of Elements for Group Address for selected Model
+* @brief Get the Element Index for selected Model
* @param dst_peer : Destination Address received
-* @param elementNumber : Number of element to check Subscription
-* @retval MOBLE_RESULT status of result
+* @retval MOBLEUINT8 : elementIndex
*/
-MOBLE_RESULT BLEMesh_ModelsCheckSubscription(MOBLE_ADDRESS dst_peer, \
- MOBLEUINT8 elementNumber)
+MOBLEUINT8 BLEMesh_ModelsGetElementIndex(MOBLE_ADDRESS dst_peer)
{
- 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);
+ MOBLE_ADDRESS nodeAddress;
+ MOBLEUINT8 elementIndex;
- for(uint8_t list=0; list<length; list++)
- {
- if(dst_peer == subscriptionList[list])
- {
- status = MOBLE_RESULT_SUCCESS;
- break;
- }
- }
+ nodeAddress = BLEMesh_GetAddress();
+ elementIndex =(dst_peer - nodeAddress);
- return status;
+ return elementIndex;
}
+
/**
* @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 *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* @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,
+void BLEMesh_ModelsDelayPacket(MODEL_MessageHeader_t *pmsgParams,
MOBLEUINT8 command,
MOBLEUINT8 const * data,
MOBLEUINT32 length)
@@ -541,8 +1084,11 @@ void BLEMesh_ModelsDelayPacket(MOBLE_ADDRESS peer,
}
}
- Appli_PendingPackets.head->peer = peer;
- Appli_PendingPackets.head->dst = dst;
+ Appli_PendingPackets.head->peer = pmsgParams->peer_addr;
+ Appli_PendingPackets.head->dst = pmsgParams->dst_peer;
+ Appli_PendingPackets.head->elementIndex = pmsgParams->elementIndex;
+ Appli_PendingPackets.head->appKeyOffset = pmsgParams->rcvdAppKeyOffset;
+ Appli_PendingPackets.head->netKeyOffset = pmsgParams->rcvdNetKeyOffset;
Appli_PendingPackets.head->command = command;
Appli_PendingPackets.head->length = length;
for (MOBLEUINT8 count=0; count<length; count++)
@@ -558,6 +1104,7 @@ void BLEMesh_ModelsDelayPacket(MOBLE_ADDRESS peer,
void BLEMesh_ModelsSendDelayedPacket(void)
{
APPLI_SEND_RESPONSE_MODULE* ptr;
+ MODEL_MessageHeader_t msgParam;
MOBLEUINT8 temp_index;
if ((Appli_PendingPackets.packet_count != 0) &&
@@ -571,9 +1118,17 @@ void BLEMesh_ModelsSendDelayedPacket(void)
-count)%MAX_PENDING_PACKETS_QUE_SIZE;
ptr = Appli_PendingPackets.packet + temp_index;
+ /* Initialize the messageParam*/
+ msgParam.dst_peer = ptr->dst;
+ msgParam.peer_addr = ptr->peer;
+ msgParam.elementIndex = 0;
+ msgParam.rcvdAppKeyOffset = 0;
+ msgParam.rcvdNetKeyOffset = 0;
+ msgParam.rssi = 0;
+ msgParam.ttl = 0;
+
VendorModel_SendResponse(VENDOR_STMICRO_CID,
- ptr->peer,
- ptr->dst,
+ &msgParam,
ptr->command,
ptr->data,
ptr->length);
@@ -587,14 +1142,14 @@ void BLEMesh_ModelsSendDelayedPacket(void)
* 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 elementIdx element index
* @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,
+MOBLE_RESULT MeshClient_SetRemotePublication(MOBLEUINT32 modelId, MOBLEUINT8 elementIdx,
MOBLEUINT16 msg_opcode, MOBLEUINT8 const *msg_buff,
MOBLEUINT32 length, MOBLEBOOL ack_flag,
MOBLEUINT8 isVendor)
@@ -604,7 +1159,7 @@ MOBLE_RESULT MeshClient_SetRemotePublication(MOBLEUINT32 modelId, MOBLEUINT16 el
srcAddress = BLEMesh_GetAddress();
srcAddress += elementIdx; /* Get the Address to send in the message */
- return BLEMesh_SetRemotePublication(GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
+ return BLEMesh_SetRemotePublication(modelId,
srcAddress ,
msg_opcode ,
msg_buff, length,
@@ -634,4 +1189,4 @@ __weak void Test_Process(void)
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 486e0bcec..f00d2d28d 100644
--- 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
@@ -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
@@ -33,18 +33,19 @@
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 BLEMesh_ModelsGetElementIndex(MOBLE_ADDRESS dst_peer);
+void BLEMesh_ModelsDelayPacket(MODEL_MessageHeader_t *pmsgParams, 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,
+MOBLE_RESULT MeshClient_SetRemotePublication(MOBLEUINT32 modelId, MOBLEUINT8 elementIdx,
MOBLEUINT16 msg_opcode, MOBLEUINT8 const *msg_buff,
MOBLEUINT32 length, MOBLEBOOL ack_flag,
MOBLEUINT8 isVendor);
#endif /* __MODELS_H */
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index f47772522..12df6a87f 100644
--- 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
@@ -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
@@ -440,4 +440,4 @@ MOBLE_RESULT PalNvmProcess(void)
return MOBLE_RESULT_SUCCESS;
}
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/sensor_cfg_usr.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/sensor_cfg_usr.h
new file mode 100644
index 000000000..bf18873cd
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/sensor_cfg_usr.h
@@ -0,0 +1,685 @@
+/**
+******************************************************************************
+* @file sensor_cfg_usr.h
+* @author BLE Mesh Team
+* @brief sensor server initialization parameters
+******************************************************************************
+* @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 __SENSOR_USR_CFG_H
+#define __SENSOR_USR_CFG_H
+
+/**
+* Maximum count of settings that can be supported by a sensor
+* E.g., 5 sensors
+* 1st sensor has 2 settings
+* 2nd sensor has 3 settings
+* 3rd sensor has 2 settings
+* 4th sensor has 1 setting
+* 5th sensor has 2 settings
+* This value is max(2, 3, 2, 1, 2) = 3
+* value is >=1
+*/
+#define SENSOR_MAX_SETTINGS_COUNT 2
+
+/**
+* Maximum count of series column that is supported by a sensor
+* E.g., 2 sensors supporting series column
+* One sensor supports 2 columns while other sensor supports 20 columns
+* This value is max(2, 20) = 20
+* value is >=1
+*/
+#define SENSOR_MAX_SERIES_COUNT 1
+
+/**
+* Total sensors count on all elements
+* It is sum of sensors count on all elements
+* Sensor init fails in case of mismatch with sensor server initialization parameters
+*/
+#define TOTAL_SENSORS_COUNT 2
+
+/**
+* Sum of sensor settings on all sensors on all elements
+* Sensor init fails in case of mismatch with sensor server initialization parameters
+*/
+#define TOTAL_SENSOR_SETTINGS_COUNT 4
+
+/**
+* Sum of sensor series columns on all sensors on all elements
+* Sensor init fails in case of mismatch with sensor server initialization parameters
+*/
+#define TOTAL_SENSOR_SERIES_COLUMN_COUNT 0
+
+
+/**
+* This structure contains sensor setting initialization parameters
+*/
+typedef struct
+{
+ uint16_t settingPropertyId;
+ uint8_t settingAccess;
+ uint32_t settingRaw;
+}sensor_settings_init_params_t;
+
+
+/**
+* This structure contains sensor series column initialization parameters
+*/
+typedef struct
+{
+ uint32_t rawX;
+ uint32_t columnWidth;
+}sensor_series_column_init_params_t;
+
+
+/**
+* This structure contains sensor initialization parameters
+*/
+typedef struct
+{
+ uint8_t elementIdx;
+ uint16_t propertyId;
+ uint16_t positiveTolerance;
+ uint16_t negativeTolerance;
+ uint8_t samplingFunction;
+ uint8_t measurementPeriod;
+ uint8_t updateInterval;
+ uint8_t dataLength;
+ uint8_t cadenceState;
+ uint32_t valuesRange;
+ uint8_t settingsCount;
+ sensor_settings_init_params_t settings[SENSOR_MAX_SETTINGS_COUNT];
+ uint16_t seriesCount;
+ sensor_series_column_init_params_t seriesColumn[SENSOR_MAX_SERIES_COUNT];
+}sensor_init_params_t;
+
+
+/**
+* This structure contains sensor server initialization parameters
+*/
+typedef struct
+{
+ uint8_t sensorsCount;
+ sensor_init_params_t sensorInitParams[TOTAL_SENSORS_COUNT];
+} sensor_server_init_params_t;
+
+
+/**
+* Below section represents initialization parameters of sensors supported
+* Define sensors in ascending order of element index followed by ascending
+* order of Property IDs else initialization of sensor structure would fail
+* Single element can support one instance of sensor PID, there can't be multiple
+* instances of same PID on same element
+* For e.g. 10 sensors with PID (PID1 < PIDn ... < PID7) supported on 3 elements
+* with element index (0, 1 and 2) in below fashion
+* Element index 0 supports sensors corresponding to PID3, PID4, PID6 and PID7
+* Element index 1 supports sensors corresponding to PID2, PID4, PID5 and PID6
+* Element index 2 supports sensors corresponding to PID1, PID5
+* Corrector order of naming sensors (SENSORX) is
+* Element index 0 -> SENSOR1(PID3), SENSOR2(PID4), SENSOR3(PID6) and SENSOR4(PID7)
+* Element index 1 -> SENSOR5(PID2), SENSOR6(PID4), SENSOR7(PID5), and SENSOR8(PID6)
+* Element index 2 -> SENSOR9(PID1), and SENSOR10(PID5)
+*/
+
+/* Sensor 1 initialization */
+
+#define SENSOR1_ELEMENT_IDX 0
+#define SENSOR1_PROPERTY_ID PRESENT_AMBIENT_TEMPERATURE_PID
+#define SENSOR1_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR1_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR1_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR1_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR1_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR1_DATA_LENGTH 1
+#define SENSOR1_CADENCE_STATE SENSOR_CADENCE_SUPPORTED
+#define SENSOR1_VALUES_RANGE 254
+#define SENSOR1_SETTINGS_COUNT 2
+#define SENSOR1_SETTING1_PROPERTY_ID 0x00BB
+#define SENSOR1_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR1_SETTING1_RAW 0
+#define SENSOR1_SETTING2_PROPERTY_ID 0x00AD
+#define SENSOR1_SETTING2_ACCESS SENSOR_SETTING_ACCESS_READ_WRITE
+#define SENSOR1_SETTING2_RAW 0
+#define SENSOR1_SERIES_COUNT 0
+
+#define SENSOR1_SETTINGS1_INIT_PARAMS \
+{\
+ SENSOR1_SETTING1_PROPERTY_ID,\
+ SENSOR1_SETTING1_ACCESS,\
+ SENSOR1_SETTING1_RAW \
+}
+
+#define SENSOR1_SETTINGS2_INIT_PARAMS \
+{\
+ SENSOR1_SETTING2_PROPERTY_ID,\
+ SENSOR1_SETTING2_ACCESS,\
+ SENSOR1_SETTING2_RAW \
+}
+
+#define SENSOR1_INIT_PARAMS \
+{\
+ SENSOR1_ELEMENT_IDX,\
+ SENSOR1_PROPERTY_ID,\
+ SENSOR1_POSITIVE_TOLERANCE,\
+ SENSOR1_NEGATIVE_TOLERANCE,\
+ SENSOR1_SAMPLING_FUNCTION,\
+ SENSOR1_MEASUREMENT_PERIOD,\
+ SENSOR1_UPDATE_INTERVAL,\
+ SENSOR1_DATA_LENGTH,\
+ SENSOR1_CADENCE_STATE,\
+ SENSOR1_VALUES_RANGE,\
+ SENSOR1_SETTINGS_COUNT,\
+ {\
+ SENSOR1_SETTINGS1_INIT_PARAMS,\
+ SENSOR1_SETTINGS2_INIT_PARAMS\
+ },\
+ SENSOR1_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+/* Sensor 2 initialization */
+
+#define SENSOR2_ELEMENT_IDX 0
+#define SENSOR2_PROPERTY_ID PRESSURE_PID
+#define SENSOR2_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR2_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR2_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR2_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR2_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR2_DATA_LENGTH 4
+#define SENSOR2_CADENCE_STATE SENSOR_CADENCE_NOT_SUPPORTED
+#define SENSOR2_VALUES_RANGE 500
+#define SENSOR2_SETTINGS_COUNT 2
+#define SENSOR2_SETTING1_PROPERTY_ID 0x0AAA
+#define SENSOR2_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR2_SETTING1_RAW 35666
+#define SENSOR2_SETTING2_PROPERTY_ID 0x0AAC
+#define SENSOR2_SETTING2_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR2_SETTING2_RAW 33666
+#define SENSOR2_SERIES_COUNT 0
+
+#define SENSOR2_SETTINGS1_INIT_PARAMS \
+{\
+ SENSOR2_SETTING1_PROPERTY_ID,\
+ SENSOR2_SETTING1_ACCESS,\
+ SENSOR2_SETTING1_RAW\
+}
+
+#define SENSOR2_SETTINGS2_INIT_PARAMS \
+{\
+ SENSOR2_SETTING2_PROPERTY_ID,\
+ SENSOR2_SETTING2_ACCESS,\
+ SENSOR2_SETTING2_RAW\
+}
+
+#define SENSOR2_INIT_PARAMS \
+{\
+ SENSOR2_ELEMENT_IDX,\
+ SENSOR2_PROPERTY_ID,\
+ SENSOR2_POSITIVE_TOLERANCE,\
+ SENSOR2_NEGATIVE_TOLERANCE,\
+ SENSOR2_SAMPLING_FUNCTION,\
+ SENSOR2_MEASUREMENT_PERIOD,\
+ SENSOR2_UPDATE_INTERVAL,\
+ SENSOR2_DATA_LENGTH,\
+ SENSOR2_CADENCE_STATE,\
+ SENSOR2_VALUES_RANGE,\
+ SENSOR2_SETTINGS_COUNT,\
+ {\
+ SENSOR2_SETTINGS1_INIT_PARAMS,\
+ SENSOR2_SETTINGS2_INIT_PARAMS\
+ },\
+ SENSOR2_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+/**
+* Combined defined of all sensors intialization parameters
+*/
+
+#define SENSOR_SERVER_INIT_PARAMS \
+{\
+ TOTAL_SENSORS_COUNT,\
+ {\
+ SENSOR1_INIT_PARAMS,\
+ SENSOR2_INIT_PARAMS,\
+ }\
+}
+#endif /* __SENSOR_USR_CFG_H */
+
+/*
+
+Example for multiple sensors with series column support
+
+#define SENSOR_MAX_SETTINGS_COUNT 3
+#define SENSOR_MAX_SERIES_COUNT 20
+#define TOTAL_SENSORS_COUNT 5
+#define TOTAL_SENSOR_SETTINGS_COUNT 9
+#define TOTAL_SENSOR_SERIES_COLUMN_COUNT 22
+
+#define SENSOR1_ELEMENT_IDX 0
+#define SENSOR1_PROPERTY_ID PEOPLE_COUNT_PID
+#define SENSOR1_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR1_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR1_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR1_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR1_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR1_DATA_LENGTH 2
+#define SENSOR1_CADENCE_STATE SENSOR_CADENCE_SUPPORTED
+#define SENSOR1_VALUES_RANGE 1000
+#define SENSOR1_SETTINGS_COUNT 3
+#define SENSOR1_SETTING1_PROPERTY_ID 0x000A
+#define SENSOR1_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR1_SETTING1_RAW 234
+#define SENSOR1_SETTING2_PROPERTY_ID 0x000C
+#define SENSOR1_SETTING2_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR1_SETTING2_RAW 246
+#define SENSOR1_SETTING3_PROPERTY_ID 0x0010
+#define SENSOR1_SETTING3_ACCESS SENSOR_SETTING_ACCESS_READ_WRITE
+#define SENSOR1_SETTING3_RAW 278
+#define SENSOR1_SERIES_COUNT 0
+
+#define SENSOR1_SETTINGS1_INIT_PARAMS \
+{\
+ SENSOR1_SETTING1_PROPERTY_ID,\
+ SENSOR1_SETTING1_ACCESS,\
+ SENSOR1_SETTING1_RAW\
+}
+
+#define SENSOR1_SETTINGS2_INIT_PARAMS \
+{\
+ SENSOR1_SETTING2_PROPERTY_ID,\
+ SENSOR1_SETTING2_ACCESS,\
+ SENSOR1_SETTING2_RAW\
+}
+
+#define SENSOR1_SETTINGS3_INIT_PARAMS \
+{\
+ SENSOR1_SETTING3_PROPERTY_ID,\
+ SENSOR1_SETTING3_ACCESS,\
+ SENSOR1_SETTING3_RAW\
+}
+
+#define SENSOR1_INIT_PARAMS \
+{\
+ SENSOR1_ELEMENT_IDX,\
+ SENSOR1_PROPERTY_ID,\
+ SENSOR1_POSITIVE_TOLERANCE,\
+ SENSOR1_NEGATIVE_TOLERANCE,\
+ SENSOR1_SAMPLING_FUNCTION,\
+ SENSOR1_MEASUREMENT_PERIOD,\
+ SENSOR1_UPDATE_INTERVAL,\
+ SENSOR1_DATA_LENGTH,\
+ SENSOR1_CADENCE_STATE,\
+ SENSOR1_VALUES_RANGE,\
+ SENSOR1_SETTINGS_COUNT,\
+ {\
+ SENSOR1_SETTINGS1_INIT_PARAMS,\
+ SENSOR1_SETTINGS2_INIT_PARAMS,\
+ SENSOR1_SETTINGS3_INIT_PARAMS\
+ },\
+ SENSOR1_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+#define SENSOR2_ELEMENT_IDX 0
+#define SENSOR2_PROPERTY_ID DESIRED_AMBIENT_TEMPERATURE_PID
+#define SENSOR2_POSITIVE_TOLERANCE 0xabc
+#define SENSOR2_NEGATIVE_TOLERANCE 0xdef
+#define SENSOR2_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_RMS
+#define SENSOR2_MEASUREMENT_PERIOD 0x04
+#define SENSOR2_UPDATE_INTERVAL 0x05
+#define SENSOR2_DATA_LENGTH 1
+#define SENSOR2_CADENCE_STATE SENSOR_CADENCE_SUPPORTED
+#define SENSOR2_VALUES_RANGE 100
+#define SENSOR2_SETTINGS_COUNT 2
+#define SENSOR2_SETTING1_PROPERTY_ID 0x00BB
+#define SENSOR2_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR2_SETTING1_RAW 345
+#define SENSOR2_SETTING2_PROPERTY_ID 0x00AD
+#define SENSOR2_SETTING2_ACCESS SENSOR_SETTING_ACCESS_READ_WRITE
+#define SENSOR2_SETTING2_RAW 435
+#define SENSOR2_SERIES_COUNT 0
+
+#define SENSOR2_SETTINGS1_INIT_PARAMS \
+{\
+ SENSOR2_SETTING1_PROPERTY_ID,\
+ SENSOR2_SETTING1_ACCESS,\
+ SENSOR2_SETTING1_RAW\
+}
+
+#define SENSOR2_SETTINGS2_INIT_PARAMS \
+{\
+ SENSOR2_SETTING2_PROPERTY_ID,\
+ SENSOR2_SETTING2_ACCESS,\
+ SENSOR2_SETTING2_RAW \
+}
+
+#define SENSOR2_INIT_PARAMS \
+{\
+ SENSOR2_ELEMENT_IDX,\
+ SENSOR2_PROPERTY_ID,\
+ SENSOR2_POSITIVE_TOLERANCE,\
+ SENSOR2_NEGATIVE_TOLERANCE,\
+ SENSOR2_SAMPLING_FUNCTION,\
+ SENSOR2_MEASUREMENT_PERIOD,\
+ SENSOR2_UPDATE_INTERVAL,\
+ SENSOR2_DATA_LENGTH,\
+ SENSOR2_CADENCE_STATE,\
+ SENSOR2_VALUES_RANGE,\
+ SENSOR2_SETTINGS_COUNT,\
+ {\
+ SENSOR2_SETTINGS1_INIT_PARAMS,\
+ SENSOR2_SETTINGS2_INIT_PARAMS\
+ },\
+ SENSOR2_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+#define SENSOR3_ELEMENT_IDX 0
+#define SENSOR3_PROPERTY_ID PRESSURE_PID
+#define SENSOR3_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR3_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR3_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR3_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR3_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR3_DATA_LENGTH 2
+#define SENSOR3_CADENCE_STATE SENSOR_CADENCE_NOT_SUPPORTED
+#define SENSOR3_VALUES_RANGE 500
+#define SENSOR3_SETTINGS_COUNT 2
+#define SENSOR3_SETTING1_PROPERTY_ID 0x0AAA
+#define SENSOR3_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR3_SETTING1_RAW 35666
+#define SENSOR3_SETTING2_PROPERTY_ID 0x0AAC
+#define SENSOR3_SETTING2_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR3_SETTING2_RAW 33666
+#define SENSOR3_SERIES_COUNT 20
+#define SENSOR3_SERIES1_RAWX 0
+#define SENSOR3_SERIES1_CW 10
+#define SENSOR3_SERIES2_RAWX 23
+#define SENSOR3_SERIES2_CW 10
+#define SENSOR3_SERIES3_RAWX 34
+#define SENSOR3_SERIES3_CW 10
+#define SENSOR3_SERIES4_RAWX 35
+#define SENSOR3_SERIES4_CW 10
+#define SENSOR3_SERIES5_RAWX 36
+#define SENSOR3_SERIES5_CW 10
+#define SENSOR3_SERIES6_RAWX 40
+#define SENSOR3_SERIES6_CW 10
+#define SENSOR3_SERIES7_RAWX 41
+#define SENSOR3_SERIES7_CW 10
+#define SENSOR3_SERIES8_RAWX 42
+#define SENSOR3_SERIES8_CW 10
+#define SENSOR3_SERIES9_RAWX 43
+#define SENSOR3_SERIES9_CW 10
+#define SENSOR3_SERIES10_RAWX 45
+#define SENSOR3_SERIES10_CW 10
+#define SENSOR3_SERIES11_RAWX 46
+#define SENSOR3_SERIES11_CW 10
+#define SENSOR3_SERIES12_RAWX 47
+#define SENSOR3_SERIES12_CW 10
+#define SENSOR3_SERIES13_RAWX 48
+#define SENSOR3_SERIES13_CW 10
+#define SENSOR3_SERIES14_RAWX 49
+#define SENSOR3_SERIES14_CW 10
+#define SENSOR3_SERIES15_RAWX 50
+#define SENSOR3_SERIES15_CW 10
+#define SENSOR3_SERIES16_RAWX 51
+#define SENSOR3_SERIES16_CW 10
+#define SENSOR3_SERIES17_RAWX 52
+#define SENSOR3_SERIES17_CW 10
+#define SENSOR3_SERIES18_RAWX 53
+#define SENSOR3_SERIES18_CW 10
+#define SENSOR3_SERIES19_RAWX 55
+#define SENSOR3_SERIES19_CW 10
+#define SENSOR3_SERIES20_RAWX 89
+#define SENSOR3_SERIES20_CW 10
+
+#define SENSOR3_SETTINGS1_INIT_PARAMS \
+{\
+ SENSOR3_SETTING1_PROPERTY_ID,\
+ SENSOR3_SETTING1_ACCESS,\
+ SENSOR3_SETTING1_RAW\
+}
+
+#define SENSOR3_SETTINGS2_INIT_PARAMS \
+{\
+ SENSOR3_SETTING2_PROPERTY_ID,\
+ SENSOR3_SETTING2_ACCESS,\
+ SENSOR3_SETTING2_RAW\
+}
+
+#define SENSOR3_COLUMN1_INIT_PARAMS {SENSOR3_SERIES1_RAWX,SENSOR3_SERIES1_CW}
+#define SENSOR3_COLUMN2_INIT_PARAMS {SENSOR3_SERIES2_RAWX,SENSOR3_SERIES2_CW}
+#define SENSOR3_COLUMN3_INIT_PARAMS {SENSOR3_SERIES3_RAWX,SENSOR3_SERIES3_CW}
+#define SENSOR3_COLUMN4_INIT_PARAMS {SENSOR3_SERIES4_RAWX,SENSOR3_SERIES4_CW}
+#define SENSOR3_COLUMN5_INIT_PARAMS {SENSOR3_SERIES5_RAWX,SENSOR3_SERIES5_CW}
+#define SENSOR3_COLUMN6_INIT_PARAMS {SENSOR3_SERIES6_RAWX,SENSOR3_SERIES6_CW}
+#define SENSOR3_COLUMN7_INIT_PARAMS {SENSOR3_SERIES7_RAWX,SENSOR3_SERIES7_CW}
+#define SENSOR3_COLUMN8_INIT_PARAMS {SENSOR3_SERIES8_RAWX,SENSOR3_SERIES8_CW}
+#define SENSOR3_COLUMN9_INIT_PARAMS {SENSOR3_SERIES9_RAWX,SENSOR3_SERIES9_CW}
+#define SENSOR3_COLUMN10_INIT_PARAMS {SENSOR3_SERIES10_RAWX,SENSOR3_SERIES10_CW}
+#define SENSOR3_COLUMN11_INIT_PARAMS {SENSOR3_SERIES11_RAWX,SENSOR3_SERIES11_CW}
+#define SENSOR3_COLUMN12_INIT_PARAMS {SENSOR3_SERIES12_RAWX,SENSOR3_SERIES12_CW}
+#define SENSOR3_COLUMN13_INIT_PARAMS {SENSOR3_SERIES13_RAWX,SENSOR3_SERIES13_CW}
+#define SENSOR3_COLUMN14_INIT_PARAMS {SENSOR3_SERIES14_RAWX,SENSOR3_SERIES14_CW}
+#define SENSOR3_COLUMN15_INIT_PARAMS {SENSOR3_SERIES15_RAWX,SENSOR3_SERIES15_CW}
+#define SENSOR3_COLUMN16_INIT_PARAMS {SENSOR3_SERIES16_RAWX,SENSOR3_SERIES16_CW}
+#define SENSOR3_COLUMN17_INIT_PARAMS {SENSOR3_SERIES17_RAWX,SENSOR3_SERIES17_CW}
+#define SENSOR3_COLUMN18_INIT_PARAMS {SENSOR3_SERIES18_RAWX,SENSOR3_SERIES18_CW}
+#define SENSOR3_COLUMN19_INIT_PARAMS {SENSOR3_SERIES19_RAWX,SENSOR3_SERIES19_CW}
+#define SENSOR3_COLUMN20_INIT_PARAMS {SENSOR3_SERIES20_RAWX,SENSOR3_SERIES20_CW}
+
+#define SENSOR3_INIT_PARAMS \
+{\
+ SENSOR3_ELEMENT_IDX,\
+ SENSOR3_PROPERTY_ID,\
+ SENSOR3_POSITIVE_TOLERANCE,\
+ SENSOR3_NEGATIVE_TOLERANCE,\
+ SENSOR3_SAMPLING_FUNCTION,\
+ SENSOR3_MEASUREMENT_PERIOD,\
+ SENSOR3_UPDATE_INTERVAL,\
+ SENSOR3_DATA_LENGTH,\
+ SENSOR3_CADENCE_STATE,\
+ SENSOR3_VALUES_RANGE,\
+ SENSOR3_SETTINGS_COUNT,\
+ {\
+ SENSOR3_SETTINGS1_INIT_PARAMS,\
+ SENSOR3_SETTINGS2_INIT_PARAMS\
+ },\
+ SENSOR3_SERIES_COUNT,\
+ {\
+ SENSOR3_COLUMN1_INIT_PARAMS,\
+ SENSOR3_COLUMN2_INIT_PARAMS,\
+ SENSOR3_COLUMN3_INIT_PARAMS,\
+ SENSOR3_COLUMN4_INIT_PARAMS,\
+ SENSOR3_COLUMN5_INIT_PARAMS,\
+ SENSOR3_COLUMN6_INIT_PARAMS,\
+ SENSOR3_COLUMN7_INIT_PARAMS,\
+ SENSOR3_COLUMN8_INIT_PARAMS,\
+ SENSOR3_COLUMN9_INIT_PARAMS,\
+ SENSOR3_COLUMN10_INIT_PARAMS,\
+ SENSOR3_COLUMN11_INIT_PARAMS,\
+ SENSOR3_COLUMN12_INIT_PARAMS,\
+ SENSOR3_COLUMN13_INIT_PARAMS,\
+ SENSOR3_COLUMN14_INIT_PARAMS,\
+ SENSOR3_COLUMN15_INIT_PARAMS,\
+ SENSOR3_COLUMN16_INIT_PARAMS,\
+ SENSOR3_COLUMN17_INIT_PARAMS,\
+ SENSOR3_COLUMN18_INIT_PARAMS,\
+ SENSOR3_COLUMN19_INIT_PARAMS,\
+ SENSOR3_COLUMN20_INIT_PARAMS}\
+}
+
+#define SENSOR4_ELEMENT_IDX 0
+#define SENSOR4_PROPERTY_ID HUMIDITY_PID
+#define SENSOR4_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR4_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR4_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR4_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR4_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR4_DATA_LENGTH 2
+#define SENSOR4_CADENCE_STATE SENSOR_CADENCE_SUPPORTED
+#define SENSOR4_VALUES_RANGE 200
+#define SENSOR4_SETTINGS_COUNT 1
+#define SENSOR4_SETTING1_PROPERTY_ID 0xAAAA
+#define SENSOR4_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ_WRITE
+#define SENSOR4_SETTING1_RAW 35666
+#define SENSOR4_SERIES_COUNT 0
+
+#define SENSOR4_SETTINGS_INIT_PARAMS \
+{\
+ SENSOR4_SETTING1_PROPERTY_ID,\
+ SENSOR4_SETTING1_ACCESS,\
+ SENSOR4_SETTING1_RAW\
+}
+
+#define SENSOR4_INIT_PARAMS \
+{\
+ SENSOR4_ELEMENT_IDX,\
+ SENSOR4_PROPERTY_ID,\
+ SENSOR4_POSITIVE_TOLERANCE,\
+ SENSOR4_NEGATIVE_TOLERANCE,\
+ SENSOR4_SAMPLING_FUNCTION,\
+ SENSOR4_MEASUREMENT_PERIOD,\
+ SENSOR4_UPDATE_INTERVAL,\
+ SENSOR4_DATA_LENGTH,\
+ SENSOR4_CADENCE_STATE,\
+ SENSOR4_VALUES_RANGE,\
+ SENSOR4_SETTINGS_COUNT,\
+ {\
+ SENSOR4_SETTINGS_INIT_PARAMS\
+ },\
+ SENSOR4_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+#define SENSOR5_ELEMENT_IDX 0
+#define SENSOR5_PROPERTY_ID TIME_OF_FLIGHT_PID
+#define SENSOR5_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR5_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR5_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR5_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR5_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR5_DATA_LENGTH 2
+#define SENSOR5_CADENCE_STATE SENSOR_CADENCE_NOT_SUPPORTED
+#define SENSOR5_VALUES_RANGE 0
+#define SENSOR5_SETTINGS_COUNT 1
+#define SENSOR5_SETTING1_PROPERTY_ID 0xAAFA
+#define SENSOR5_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR5_SETTING1_RAW 35666
+#define SENSOR5_SERIES_COUNT 2
+#define SENSOR5_SERIES1_RAWX 20
+#define SENSOR5_SERIES1_CW 30
+#define SENSOR5_SERIES2_RAWX 50
+#define SENSOR5_SERIES2_CW 40
+
+#define SENSOR5_SETTINGS_INIT_PARAMS \
+{\
+ SENSOR5_SETTING1_PROPERTY_ID,\
+ SENSOR5_SETTING1_ACCESS,\
+ SENSOR5_SETTING1_RAW\
+}
+
+#define SENSOR5_COLUMN1_INIT_PARAMS {SENSOR5_SERIES1_RAWX,SENSOR5_SERIES1_CW}
+#define SENSOR5_COLUMN2_INIT_PARAMS {SENSOR5_SERIES2_RAWX,SENSOR5_SERIES2_CW}
+
+#define SENSOR5_INIT_PARAMS \
+{\
+ SENSOR5_ELEMENT_IDX,\
+ SENSOR5_PROPERTY_ID,\
+ SENSOR5_POSITIVE_TOLERANCE,\
+ SENSOR5_NEGATIVE_TOLERANCE,\
+ SENSOR5_SAMPLING_FUNCTION,\
+ SENSOR5_MEASUREMENT_PERIOD,\
+ SENSOR5_UPDATE_INTERVAL,\
+ SENSOR5_DATA_LENGTH,\
+ SENSOR5_CADENCE_STATE,\
+ SENSOR5_VALUES_RANGE,\
+ SENSOR5_SETTINGS_COUNT,\
+ {\
+ SENSOR5_SETTINGS_INIT_PARAMS\
+ },\
+ SENSOR5_SERIES_COUNT,\
+ {\
+ SENSOR5_COLUMN1_INIT_PARAMS,\
+ SENSOR5_COLUMN2_INIT_PARAMS\
+ }\
+}
+
+#define SENSOR6_ELEMENT_IDX 0
+#define SENSOR6_PROPERTY_ID PRESENCE_PID
+#define SENSOR6_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR6_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR6_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR6_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR6_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR6_DATA_LENGTH 1
+#define SENSOR6_CADENCE_STATE SENSOR_CADENCE_NOT_SUPPORTED
+#define SENSOR6_VALUES_RANGE 0
+#define SENSOR6_SETTINGS_COUNT 0
+#define SENSOR6_SERIES_COUNT 0
+
+#define SENSOR6_SETTINGS_INIT_PARAMS \
+{\
+ {\
+ {0}\
+ }\
+}
+
+#define SENSOR6_INIT_PARAMS \
+{\
+ SENSOR6_ELEMENT_IDX,\
+ SENSOR6_PROPERTY_ID,\
+ SENSOR6_POSITIVE_TOLERANCE,\
+ SENSOR6_NEGATIVE_TOLERANCE,\
+ SENSOR6_SAMPLING_FUNCTION,\
+ SENSOR6_MEASUREMENT_PERIOD,\
+ SENSOR6_UPDATE_INTERVAL,\
+ SENSOR6_DATA_LENGTH,\
+ SENSOR6_CADENCE_STATE,\
+ SENSOR6_VALUES_RANGE,\
+ SENSOR6_SETTINGS_COUNT,\
+ {\
+ {0}\
+ },\
+ SENSOR6_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+#define SENSOR_SERVER_INIT_PARAMS \
+{\
+ TOTAL_SENSORS_COUNT,\
+ {\
+ SENSOR1_INIT_PARAMS,\
+ SENSOR2_INIT_PARAMS,\
+ SENSOR3_INIT_PARAMS,\
+ SENSOR4_INIT_PARAMS,\
+ SENSOR5_INIT_PARAMS\
+ }\
+}
+*/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/tl_dbg_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/tl_dbg_conf.h
new file mode 100644
index 000000000..b468b2863
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingProvisioner/STM32_WPAN/app/tl_dbg_conf.h
@@ -0,0 +1,126 @@
+/**
+ ******************************************************************************
+ * File Name : tl_dbg_conf.h
+ * Description : Debug configuration file for stm32wpan transport layer 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
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __TL_DBG_CONF_H
+#define __TL_DBG_CONF_H
+
+/* USER CODE BEGIN Tl_Conf */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_conf.h" /* required as some configuration used in dbg_trace.h are set there */
+#include "dbg_trace.h"
+#include "hw_if.h"
+
+/**
+ * Enable or Disable traces
+ * The raw data output is the hci binary packet format as specified by the BT specification *
+ */
+#define TL_SHCI_CMD_DBG_EN 0 /* Reports System commands sent to CPU2 and the command response */
+#define TL_SHCI_CMD_DBG_RAW_EN 0 /* Reports raw data System commands sent to CPU2 and the command response */
+#define TL_SHCI_EVT_DBG_EN 0 /* Reports System Asynchronous Events received from CPU2 */
+#define TL_SHCI_EVT_DBG_RAW_EN 0 /* Reports raw data System Asynchronous Events received from CPU2 */
+
+#define TL_HCI_CMD_DBG_EN 0 /* Reports BLE command sent to CPU2 and the command response */
+#define TL_HCI_CMD_DBG_RAW_EN 0 /* Reports raw data BLE command sent to CPU2 and the command response */
+#define TL_HCI_EVT_DBG_EN 0 /* Reports BLE Asynchronous Events received from CPU2 */
+#define TL_HCI_EVT_DBG_RAW_EN 0 /* Reports raw data BLE Asynchronous Events received from CPU2 */
+
+#define TL_MM_DBG_EN 0 /* Reports the informations of the buffer released to CPU2 */
+
+/**
+ * Macro definition
+ */
+
+/**
+ * System Transport Layer
+ */
+#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_CMD_DBG_RAW_EN != 0)
+#define TL_SHCI_CMD_DBG_RAW(_PDATA_, _SIZE_) HW_UART_Transmit(hw_uart1, (uint8_t*)_PDATA_, _SIZE_, (~0))
+#else
+#define TL_SHCI_CMD_DBG_RAW(...)
+#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
+
+#if (TL_SHCI_EVT_DBG_RAW_EN != 0)
+#define TL_SHCI_EVT_DBG_RAW(_PDATA_, _SIZE_) HW_UART_Transmit(hw_uart1, (uint8_t*)_PDATA_, _SIZE_, (~0))
+#else
+#define TL_SHCI_EVT_DBG_RAW(...)
+#endif
+
+/**
+ * BLE Transport Layer
+ */
+#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_CMD_DBG_RAW_EN != 0)
+#define TL_HCI_CMD_DBG_RAW(_PDATA_, _SIZE_) HW_UART_Transmit(hw_uart1, (uint8_t*)_PDATA_, _SIZE_, (~0))
+#else
+#define TL_HCI_CMD_DBG_RAW(...)
+#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
+
+#if (TL_HCI_EVT_DBG_RAW_EN != 0)
+#define TL_HCI_EVT_DBG_RAW(_PDATA_, _SIZE_) HW_UART_Transmit(hw_uart1, (uint8_t*)_PDATA_, _SIZE_, (~0))
+#else
+#define TL_HCI_EVT_DBG_RAW(...)
+#endif
+
+/**
+ * Memory Manager - Released buffer tracing
+ */
+#if (TL_MM_DBG_EN != 0)
+#define TL_MM_DBG_MSG PRINT_MESG_DBG
+#else
+#define TL_MM_DBG_MSG(...)
+#endif
+
+/* USER CODE END Tl_Conf */
+
+#endif /*__TL_DBG_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
index a58b95cad..e7049681d 100644
--- 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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_MultiAppAt/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Inc/app_common.h
index 4defc5d7a..23a9cc8d9 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Inc/app_common.h
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Inc/app_conf.h
index 3908111ba..2908bbf37 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Inc/app_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Inc/app_conf.h
@@ -48,9 +48,9 @@
/**
* Define IO Authentication
*/
-#define CFG_BONDING_MODE (1)
+#define CFG_BONDING_MODE (0)
#define CFG_FIXED_PIN (111111)
-#define CFG_USED_FIXED_PIN (0)
+#define CFG_USED_FIXED_PIN (1)
#define CFG_ENCRYPTION_KEY_SIZE_MAX (16)
#define CFG_ENCRYPTION_KEY_SIZE_MIN (8)
@@ -74,6 +74,29 @@
#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)
+
+/**
* Define PHY
*/
#define ALL_PHYS_PREFERENCE 0x00
@@ -204,7 +227,7 @@ typedef enum {
* Maximum number of simultaneous connections that the device will support.
* Valid values are from 1 to 8
*/
-#define CFG_BLE_NUM_LINK 8
+#define CFG_BLE_NUM_LINK 2
/**
* Maximum number of Services that can be stored in the GATT database.
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Inc/hw_conf.h
index bd949bad9..e9527fae1 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Inc/hw_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Inc/hw_conf.h
@@ -1,13 +1,13 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
- * File Name : hw_conf.h
- * Description : Hardware configuration file for BLE
- * middleWare.
+ * @file hw_conf.h
+ * @author MCD Application Team
+ * @brief Configuration of hardware interface
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -24,14 +24,16 @@
#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
* 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.
+* Once the Semaphore has been released, there shall be at least 1us before it can be taken again. This is required
+* to give the opportunity to CPU2 to take it.
* 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()
@@ -134,10 +136,10 @@
*****************************************************************************/
#define CFG_HW_LPUART1_ENABLED 1
-#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 0
+#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 1
-#define CFG_HW_USART1_ENABLED 0
-#define CFG_HW_USART1_DMA_TX_SUPPORTED 0
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
/**
* LPUART1
@@ -148,7 +150,7 @@
/** < The application shall check the selected source clock is enable */
#define CFG_HW_LPUART1_SOURCE_CLOCK RCC_LPUART1CLKSOURCE_SYSCLK
-#define CFG_HW_LPUART1_BAUDRATE 9600
+#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
@@ -187,9 +189,9 @@
#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
+#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
@@ -239,9 +241,9 @@
#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
+#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 */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Inc/stm32wbxx_it.h
index efab9af25..4d7078cd3 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Inc/stm32wbxx_it.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Inc/stm32wbxx_it.h
@@ -25,7 +25,7 @@
#ifdef __cplusplus
extern "C" {
-#endif
+#endif
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Src/app_entry.c
index 255ec6e81..ab9b8cb5e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Src/app_entry.c
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "main.h"
@@ -91,12 +92,12 @@ static void Mode_Selec( void );
/* USER CODE END PFP */
-APP_Mode_t APP_MODE;
+APP_Mode_t app_mode;
/* Functions Definition ------------------------------------------------------*/
void APPE_Init( void )
{
- APP_MODE = NO_APP;
+ app_mode = NO_APP;
SystemPower_Config(); /**< Configure the system Power Mode */
@@ -143,22 +144,29 @@ void APPE_Init( void )
*************************************************************/
static void Mode_Selec( void )
{
+
+ if(LL_RCC_IsActiveFlag_SFTRST() == 0)
+ {
+ *(volatile uint32_t*) SRAM1_BASE = 0;
+ }
+ LL_RCC_ClearResetFlags();
+
switch(*(uint32_t*)SRAM1_BASE)
{
case SRAM1_BASE_P2P_SERVER :
- APP_MODE = P2P_SERVER;
+ app_mode = P2P_SERVER;
break;
case SRAM1_BASE_P2P_CLIENT :
- APP_MODE = P2P_CLIENT;
+ app_mode = P2P_CLIENT;
break;
case SRAM1_BASE_HEART_RATE :
- APP_MODE = HEART_RATE;
+ app_mode = HEART_RATE;
break;
default :
- APP_MODE = NO_APP;
+ app_mode = NO_APP;
break;
}
}
@@ -229,7 +237,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
@@ -240,7 +248,7 @@ static void APPE_SysUserEvtRx( void * pPayload )
/* Traces channel initialization */
APPD_EnableCPU2();
- switch(APP_MODE)
+ switch(app_mode)
{
case P2P_SERVER :
APP_BLE_SV_Init( );
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Src/main.c
index 074b03bb3..de64081e4 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Src/main.c
@@ -37,6 +37,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "app_entry.h"
@@ -166,11 +167,10 @@ void SystemClock_Config(void)
/** Configure LSE Drive Capability
*/
__HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
- /** Configure the main internal regulator output voltage
+ /** Configure the main internal regulator output voltage
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
- /** Initializes the RCC Oscillators according to the specified parameters
- * in the RCC_OscInitTypeDef structure.
+ /** Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
|RCC_OSCILLATORTYPE_LSE;
@@ -183,7 +183,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
@@ -199,7 +199,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Initializes the peripherals clocks
+ /** Initializes the peripherals clocks
*/
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
|RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
@@ -388,10 +388,10 @@ static void MX_RTC_Init(void)
}
-/**
+/**
* Enable DMA controller clock
*/
-static void MX_DMA_Init(void)
+static void MX_DMA_Init(void)
{
/* DMA controller clock enable */
@@ -627,7 +627,7 @@ void Error_Handler(void)
* @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) */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Src/stm32wbxx_hal_msp.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Src/stm32wbxx_hal_msp.c
index 6504134f3..87614ca60 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Src/stm32wbxx_hal_msp.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Src/stm32wbxx_hal_msp.c
@@ -95,9 +95,9 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
/* USER CODE END LPUART1_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_LPUART1_CLK_ENABLE();
-
+
__HAL_RCC_GPIOA_CLK_ENABLE();
- /**LPUART1 GPIO Configuration
+ /**LPUART1 GPIO Configuration
PA2 ------> LPUART1_TX
PA3 ------> LPUART1_RX
PA6 ------> LPUART1_CTS
@@ -148,13 +148,13 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
/* 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
+ /**USART1 GPIO Configuration
PA11 ------> USART1_CTS
PB6 ------> USART1_TX
- PB7 ------> USART1_RX
+ PB7 ------> USART1_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
@@ -213,8 +213,8 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
/* USER CODE END LPUART1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_LPUART1_CLK_DISABLE();
-
- /**LPUART1 GPIO Configuration
+
+ /**LPUART1 GPIO Configuration
PA2 ------> LPUART1_TX
PA3 ------> LPUART1_RX
PA6 ------> LPUART1_CTS
@@ -237,11 +237,11 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
/* USER CODE END USART1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_USART1_CLK_DISABLE();
-
- /**USART1 GPIO Configuration
+
+ /**USART1 GPIO Configuration
PA11 ------> USART1_CTS
PB6 ------> USART1_TX
- PB7 ------> USART1_RX
+ PB7 ------> USART1_RX
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11);
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Src/stm32wbxx_it.c
index 1cf530225..cb0b6d47e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Src/stm32wbxx_it.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/Core/Src/stm32wbxx_it.c
@@ -69,7 +69,7 @@ extern UART_HandleTypeDef huart1;
/* USER CODE END EV */
/******************************************************************************/
-/* Cortex Processor Interruption and Exception Handlers */
+/* Cortex Processor Interruption and Exception Handlers */
/******************************************************************************/
/**
* @brief This function handles Non maskable interrupt.
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/app_ble_cl.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/app_ble_cl.c
index 938714570..f0bc92eb8 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/app_ble_cl.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/app_ble_cl.c
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
@@ -72,18 +73,6 @@ uint8_t mitm_mode;
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
@@ -740,7 +729,6 @@ static void Ble_Tl_Init( void )
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];
@@ -837,26 +825,21 @@ static void Ble_Tl_Init( void )
* 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 = 0;
- for (index = 0; index < 16; index++)
- {
- BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.OOB_Data[index] = (uint8_t) index;
- }
+ 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;
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
);
/**
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/app_ble_common.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/app_ble_common.c
index e0f1ae62b..2101401a1 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/app_ble_common.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/app_ble_common.c
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
@@ -35,7 +36,7 @@
#include "stm32_lpm.h"
#include "otp.h"
-extern APP_Mode_t APP_MODE;
+extern APP_Mode_t app_mode;
/* Private includes ----------------------------------------------------------*/
/* Private typedef -----------------------------------------------------------*/
@@ -57,7 +58,7 @@ void APP_BLE_Common_Init( void )
SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
{
- switch(APP_MODE){
+ switch(app_mode){
case P2P_SERVER :
SVCCTL_App_SV_Notification(pckt);
break;
@@ -75,11 +76,20 @@ SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
void SVCCTL_SvcInit(void)
{
- if(APP_MODE == HEART_RATE) DIS_Init();
+ if(app_mode == HEART_RATE)
+ {
+ DIS_Init();
+ }
- if(APP_MODE == HEART_RATE) HRS_Init();
+ if(app_mode == HEART_RATE)
+ {
+ HRS_Init();
+ }
- if(APP_MODE == P2P_SERVER || APP_MODE == P2P_CLIENT) P2PS_STM_Init();
+ if((app_mode == P2P_SERVER) || (app_mode == P2P_CLIENT))
+ {
+ P2PS_STM_Init();
+ }
return;
}
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/app_ble_hr.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/app_ble_hr.c
index 1c2382902..7b380b0fb 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/app_ble_hr.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/app_ble_hr.c
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
@@ -65,19 +66,7 @@ typedef struct _tSecurityParams
/**
* 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];
+ uint8_t bonding_mode;
/**
* this variable indicates whether to use a fixed pin
@@ -614,7 +603,6 @@ static void Ble_Tl_Init( void )
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];
@@ -745,26 +733,21 @@ static void Ble_Tl_Init( void )
* 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 = 1111;
- BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode = 0;
- for (index = 0; index < 16; index++)
- {
- BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.OOB_Data[index] = (uint8_t) index;
- }
+ 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;
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
);
/**
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/app_ble_sv.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/app_ble_sv.c
index 111410638..9095dc1df 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/app_ble_sv.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/app_ble_sv.c
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
@@ -67,19 +68,7 @@ typedef struct _tSecurityParams
/**
* 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];
+ uint8_t bonding_mode;
/**
* this variable indicates whether to use a fixed pin
@@ -779,7 +768,6 @@ static void Ble_Tl_Init( void )
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];
@@ -887,26 +875,21 @@ static void Ble_Tl_Init( void )
* 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 = 1111;
- BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode = 0;
- for (index = 0; index < 16; index++)
- {
- BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.OOB_Data[index] = (uint8_t) index;
- }
+ 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;
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
);
/**
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/dis_app.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/dis_app.c
index a47c2ac11..59c66fad3 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/dis_app.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/dis_app.c
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "ble.h"
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/hrs_app.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/hrs_app.c
index 3634970d7..8dbad464e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/hrs_app.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/hrs_app.c
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/p2p_client_app.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/p2p_client_app.c
index 58d2e9221..6648246d6 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/p2p_client_app.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/p2p_client_app.c
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/p2p_server_app.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/p2p_server_app.c
index 1d718154f..66d93c0cf 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/p2p_server_app.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/p2p_server_app.c
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "app_common.h"
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/uart_app.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/uart_app.c
index 67a1cdc6f..0cb65c29f 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/uart_app.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MultiAppAt/STM32_WPAN/App/uart_app.c
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "app_common.h"
@@ -37,7 +38,7 @@ extern void MX_LPUART1_UART_Init(void);
extern UART_HandleTypeDef hlpuart1;
#endif
-extern APP_Mode_t APP_MODE;
+extern APP_Mode_t app_mode;
extern APP_BLE_ConnStatus_t SV_Connection_Status;
extern APP_BLE_ConnStatus_t CL_Connection_Status;
@@ -256,15 +257,15 @@ static void at_cmd_analysing( void )
break;
case AT_SV :
Next_Mode = P2P_SERVER;
- if(APP_MODE == P2P_SERVER) UART_App_SendData("\r\nERROR\r\n", 9);
+ if(app_mode == P2P_SERVER) UART_App_SendData("\r\nERROR\r\n", 9);
else {
/* Switch to P2P Server */
disconnection_status = TO_SWITCH_APP;
- if((APP_MODE == HEART_RATE) && (HR_Connection_Status == APP_BLE_CONNECTED_SERVER))
+ if((app_mode == HEART_RATE) && (HR_Connection_Status == APP_BLE_CONNECTED_SERVER))
{
UTIL_SEQ_SetTask( 1<<CFG_TASK_HR_GAP_DISCON_ID, CFG_SCH_PRIO_0);
}
- else if((APP_MODE == P2P_CLIENT) && (CL_Connection_Status == APP_BLE_CONNECTED_CLIENT))
+ else if((app_mode == P2P_CLIENT) && (CL_Connection_Status == APP_BLE_CONNECTED_CLIENT))
{
UTIL_SEQ_SetTask( 1<<CFG_TASK_CL_GAP_DISCON_ID, CFG_SCH_PRIO_0);
}
@@ -275,21 +276,21 @@ static void at_cmd_analysing( void )
}
break;
case AT_SV_ADV_START :
- if( APP_MODE != P2P_SERVER ) UART_App_SendData("\r\nERROR\r\n", 9);
+ if( app_mode != P2P_SERVER ) UART_App_SendData("\r\nERROR\r\n", 9);
else {
/* Request advertising */
UTIL_SEQ_SetTask(1 << CFG_TASK_ADV_REQ_ID, CFG_SCH_PRIO_0);
}
break;
case AT_SV_ADV_STOP :
- if( APP_MODE != P2P_SERVER ) UART_App_SendData("\r\nERROR\r\n", 9);
+ if( app_mode != P2P_SERVER ) UART_App_SendData("\r\nERROR\r\n", 9);
else {
/* Cancel advertising */
UTIL_SEQ_SetTask(1 << CFG_TASK_ADV_CANCEL_ID, CFG_SCH_PRIO_0);
}
break;
case AT_SV_NOTIFY :
- if((APP_MODE != P2P_SERVER) || (param != PARAM)) UART_App_SendData("\r\nERROR\r\n", 9);
+ if((app_mode != P2P_SERVER) || (param != PARAM)) UART_App_SendData("\r\nERROR\r\n", 9);
else {
if((pDataRx[12] == '=') && (pDataRx[17] == '\r'))
{
@@ -302,7 +303,7 @@ static void at_cmd_analysing( void )
}
break;
case AT_SV_CONN_UPD :
- if(APP_MODE != P2P_SERVER) UART_App_SendData("\r\nERROR\r\n", 9);
+ if(app_mode != P2P_SERVER) UART_App_SendData("\r\nERROR\r\n", 9);
else {
uint8_t lenConnUpdStr;
lenConnUpdStr = (indexRx-1)-(14+1); /* indexRx - 1 to compensate the indexRx++ when filling the pDataRx buffer */
@@ -325,15 +326,15 @@ static void at_cmd_analysing( void )
break;
case AT_CL :
Next_Mode = P2P_CLIENT;
- if(APP_MODE == P2P_CLIENT) UART_App_SendData("\r\nERROR\r\n", 9);
+ if(app_mode == P2P_CLIENT) UART_App_SendData("\r\nERROR\r\n", 9);
else {
/* Switch to P2P Client */
disconnection_status = TO_SWITCH_APP;
- if((APP_MODE == HEART_RATE) && (HR_Connection_Status == APP_BLE_CONNECTED_SERVER))
+ if((app_mode == HEART_RATE) && (HR_Connection_Status == APP_BLE_CONNECTED_SERVER))
{
UTIL_SEQ_SetTask( 1<<CFG_TASK_HR_GAP_DISCON_ID, CFG_SCH_PRIO_0);
}
- else if((APP_MODE == P2P_SERVER) && (SV_Connection_Status == APP_BLE_CONNECTED_SERVER))
+ else if((app_mode == P2P_SERVER) && (SV_Connection_Status == APP_BLE_CONNECTED_SERVER))
{
UTIL_SEQ_SetTask( 1<<CFG_TASK_SV_GAP_DISCON_ID, CFG_SCH_PRIO_0);
}
@@ -344,7 +345,7 @@ static void at_cmd_analysing( void )
}
break;
case AT_CL_WRITE :
- if(APP_MODE != P2P_CLIENT || (param != PARAM)) UART_App_SendData("\r\nERROR\r\n", 9);
+ if(app_mode != P2P_CLIENT || (param != PARAM)) UART_App_SendData("\r\nERROR\r\n", 9);
else {
if((pDataRx[11] == '=') && (pDataRx[16] == '\r'))
{
@@ -357,7 +358,7 @@ static void at_cmd_analysing( void )
}
break;
case AT_CL_SCAN :
- if( APP_MODE != P2P_CLIENT ) UART_App_SendData("\r\nERROR\r\n", 9);
+ if( app_mode != P2P_CLIENT ) UART_App_SendData("\r\nERROR\r\n", 9);
else {
/* Clear BD Address buffer in order to be able to re-send the BD addresses discovered during a previous scan on the UART */
for(i = 0; i < 5; i++)
@@ -373,7 +374,7 @@ static void at_cmd_analysing( void )
}
break;
case AT_CL_CONN :
- if((APP_MODE != P2P_CLIENT) || (param != PARAM)) UART_App_SendData("\r\nERROR\r\n", 9); //Make sure we are in P2P Client mode and the parameter is set
+ if((app_mode != P2P_CLIENT) || (param != PARAM)) UART_App_SendData("\r\nERROR\r\n", 9); //Make sure we are in P2P Client mode and the parameter is set
else {
if((pDataRx[10] == '=') && (pDataRx[23] == '\r'))
{
@@ -387,7 +388,7 @@ static void at_cmd_analysing( void )
}
break;
case AT_CL_DISCONN :
- if((APP_MODE != P2P_CLIENT) || (CL_Connection_Status != APP_BLE_CONNECTED_CLIENT)) UART_App_SendData("\r\nERROR\r\n", 9); //Make sure we are in P2P Client mode and the Client is connected to a Server
+ if((app_mode != P2P_CLIENT) || (CL_Connection_Status != APP_BLE_CONNECTED_CLIENT)) UART_App_SendData("\r\nERROR\r\n", 9); //Make sure we are in P2P Client mode and the Client is connected to a Server
else {
disconnection_status = FROM_AT_CMD;
/* Disconnect from the connected device */
@@ -395,7 +396,7 @@ static void at_cmd_analysing( void )
}
break;
case AT_CL_AUTOCONN :
- if((APP_MODE != P2P_CLIENT) || (param != PARAM)) UART_App_SendData("\r\nERROR\r\n", 9); //Make sure we are in P2P Client mode and the parameter is set
+ if((app_mode != P2P_CLIENT) || (param != PARAM)) UART_App_SendData("\r\nERROR\r\n", 9); //Make sure we are in P2P Client mode and the parameter is set
else {
if((pDataRx[14] == '=') && (pDataRx[27] == '\r'))
{
@@ -410,14 +411,14 @@ static void at_cmd_analysing( void )
}
break;
case AT_CL_EN :
- if(APP_MODE != P2P_CLIENT) UART_App_SendData("\r\nERROR\r\n", 9);
+ if(app_mode != P2P_CLIENT) UART_App_SendData("\r\nERROR\r\n", 9);
else {
/* Enable notifications */
Enable_Notification();
}
break;
case AT_CL_DIS :
- if(APP_MODE != P2P_CLIENT) UART_App_SendData("\r\nERROR\r\n", 9);
+ if(app_mode != P2P_CLIENT) UART_App_SendData("\r\nERROR\r\n", 9);
else {
/* Disable notifications */
Disable_Notification();
@@ -425,15 +426,15 @@ static void at_cmd_analysing( void )
break;
case AT_HR :
Next_Mode = HEART_RATE;
- if(APP_MODE == HEART_RATE) UART_App_SendData("\r\nERROR\r\n", 9);
+ if(app_mode == HEART_RATE) UART_App_SendData("\r\nERROR\r\n", 9);
else {
/* Switch to Heart Rate */
disconnection_status = TO_SWITCH_APP;
- if((APP_MODE == P2P_SERVER) && (SV_Connection_Status == APP_BLE_CONNECTED_SERVER))
+ if((app_mode == P2P_SERVER) && (SV_Connection_Status == APP_BLE_CONNECTED_SERVER))
{
UTIL_SEQ_SetTask( 1<<CFG_TASK_SV_GAP_DISCON_ID, CFG_SCH_PRIO_0);
}
- else if((APP_MODE == P2P_CLIENT) && (CL_Connection_Status == APP_BLE_CONNECTED_CLIENT))
+ else if((app_mode == P2P_CLIENT) && (CL_Connection_Status == APP_BLE_CONNECTED_CLIENT))
{
UTIL_SEQ_SetTask( 1<<CFG_TASK_CL_GAP_DISCON_ID, CFG_SCH_PRIO_0);
}
@@ -444,7 +445,7 @@ static void at_cmd_analysing( void )
}
break;
case AT_HR_NOTIFY :
- if((APP_MODE != HEART_RATE) || (param != PARAM) || (multi_param.state != MULTI_PARAM)) UART_App_SendData("\r\nERROR\r\n", 9);
+ if((app_mode != HEART_RATE) || (param != PARAM) || (multi_param.state != MULTI_PARAM)) UART_App_SendData("\r\nERROR\r\n", 9);
else {
if(pDataRx[12] == '=')
{
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 10c61f9ac..e7049681d 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
@@ -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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,11 +183,17 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/Core/Inc/app_common.h
index 9dbfbba05..7e66ee35a 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/Core/Inc/app_common.h
@@ -67,9 +67,13 @@ extern "C"
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/Core/Inc/app_conf.h
index da6926062..aad5c597c 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/Core/Inc/app_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/Core/Inc/app_conf.h
@@ -135,7 +135,7 @@
* Maximum number of simultaneous connections that the device will support.
* Valid values are from 1 to 8
*/
-#define CFG_BLE_NUM_LINK 8
+#define CFG_BLE_NUM_LINK 2
/**
* Maximum number of Services that can be stored in the GATT database.
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/Core/Inc/hw_conf.h
index 078755183..b703e7393 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/Core/Inc/hw_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/Core/Inc/hw_conf.h
@@ -1,36 +1,39 @@
+/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file hw_conf.h
* @author MCD Application Team
* @brief Configuration of hardware interface
- ******************************************************************************
- * @attention
- *
+ ******************************************************************************
+ * @attention
+ *
* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under Ultimate Liberty license
- * SLA0044, the "License"; You may not use this file except in compliance with
- * the License. You may obtain a copy of the License at:
- * www.st.com/SLA0044
- *
- ******************************************************************************
- */
-
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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
+#ifndef HW_CONF_H
+#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
* 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.
+* Once the Semaphore has been released, there shall be at least 1us before it can be taken again. This is required
+* to give the opportunity to CPU2 to take it.
* 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()
@@ -83,7 +86,7 @@
* wakeup timer.
* This setting is the preemptpriority part of the NVIC.
*/
-#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+#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
@@ -91,7 +94,7 @@
* 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 CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
/**
* Define a critical section in the Timer server
@@ -107,35 +110,35 @@
* 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
+#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
- */
+ * 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_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
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
/**
* LPUART1
@@ -241,6 +244,6 @@
#define CFG_HW_USART1_TX_DMA_IRQn DMA2_Channel4_IRQn
#define CFG_HW_USART1_DMA_TX_IRQHandler DMA2_Channel4_IRQHandler
-#endif /*__HW_CONF_H */
+#endif /*HW_CONF_H */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/Core/Inc/main.h
index bbe71a4da..c4e49e649 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/Core/Inc/main.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/Core/Inc/main.h
@@ -31,7 +31,8 @@
extern RTC_HandleTypeDef hrtc; /**< RTC handler declaration */
/* Exported macro ------------------------------------------------------------*/
-/* Exported functions ------------------------------------------------------- */
+/* Exported functions prototypes ---------------------------------------------*/
+void Error_Handler(void);
#endif /* __MAIN_H */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/Core/Src/app_entry.c
index f4a797e26..d076d67aa 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/Core/Src/app_entry.c
@@ -192,7 +192,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/Core/Src/main.c
index 25a8c45e0..6cfa224ac 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/Core/Src/main.c
@@ -40,6 +40,7 @@
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
+#include "main.h"
#include "app_entry.h"
#include "stm32_lpm.h"
#include "stm32_seq.h"
@@ -317,4 +318,33 @@ void HAL_Delay(uint32_t Delay)
}
}
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/**
+ * @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_Ota/STM32_WPAN/App/app_ble.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/STM32_WPAN/App/app_ble.c
index 01dfeec3b..42fe36c9f 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/STM32_WPAN/App/app_ble.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/STM32_WPAN/App/app_ble.c
@@ -21,6 +21,7 @@
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
+#include "main.h"
#include "dbg_trace.h"
#include "ble.h"
#include "tl.h"
@@ -136,7 +137,10 @@ void APP_BLE_Init( void )
/**
* Starts the BLE Stack on CPU2
*/
- SHCI_C2_BLE_Init( &ble_init_cmd_packet );
+ if (SHCI_C2_BLE_Init( &ble_init_cmd_packet ) != SHCI_Success)
+ {
+ Error_Handler();
+ }
/**
* Initialization of HCI & GATT & GAP layer
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 10c61f9ac..e7049681d 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
@@ -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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,11 +183,17 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/readme.txt
index d57ac14a9..a87c6cd15 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/readme.txt
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Ota/readme.txt
@@ -99,7 +99,7 @@ For application binary update example:
- BLE_HeartRate_ota_reference.bin or BLE_p2pServer_ota_reference.bin have to be copied into Smart phone directory
- Start download
- New Application is running and can be connected
-
+
For Wireless FW binary update example:
- At Startup, the Ble_Ota application advertises "STM_OTA"
- with Smart Phone "ST BLE Sensor" application, scan and connect to "STM_OTA" Application.
@@ -109,6 +109,9 @@ For Wireless FW binary update example:
(please refer to UM2551 - STM32CubeWB Nucleo demonstration firmware, chapter 4.3)
- Start download in free area of non secure Flash memory
- New Application is running and can be connected
+
++ Known limitation: Debug configuration of BLE_Ota CubeIDE project is not supported by current BLE_Ota application settings
+as generated binary in debug mode is too big for allocated 24kB Flash sectors (between 0x8000000-0x8006000).
For more details refer to the Application Note:
AN5289 - Building a Wireless application
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Inc/app_common.h
index 4defc5d7a..23a9cc8d9 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Inc/app_common.h
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Inc/app_conf.h
index 2093b9aec..43b23e8c7 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Inc/app_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Inc/app_conf.h
@@ -56,7 +56,7 @@
* Maximum number of simultaneous connections that the device will support.
* Valid values are from 1 to 8
*/
-#define CFG_BLE_NUM_LINK 8
+#define CFG_BLE_NUM_LINK 2
/**
* Maximum number of Services that can be stored in the GATT database.
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Inc/hw_conf.h
index cee4bbae6..92c6dbf2b 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Inc/hw_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Inc/hw_conf.h
@@ -1,13 +1,13 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
- * File Name : hw_conf.h
- * Description : Hardware configuration file for BLE
- * middleWare.
+ * @file hw_conf.h
+ * @author MCD Application Team
+ * @brief Configuration of hardware interface
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -24,14 +24,16 @@
#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
* 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.
+* Once the Semaphore has been released, there shall be at least 1us before it can be taken again. This is required
+* to give the opportunity to CPU2 to take it.
* 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()
@@ -132,7 +134,6 @@
/******************************************************************************
* HW UART
*****************************************************************************/
-
#define CFG_HW_LPUART1_ENABLED 0
#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 0
@@ -140,6 +141,58 @@
#define CFG_HW_USART1_DMA_TX_SUPPORTED 0
/**
+ * 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
@@ -187,9 +240,9 @@
#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
+#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 */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Inc/stm32wbxx_it.h
index a13b7f7c1..bdf9838a0 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Inc/stm32wbxx_it.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Inc/stm32wbxx_it.h
@@ -25,7 +25,7 @@
#ifdef __cplusplus
extern "C" {
-#endif
+#endif
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Src/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Src/hw_ipcc.c
index 721c42fde..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Src/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Src/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
@@ -39,6 +39,33 @@ 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 LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 -----------------------------------------------*/
/******************************************************************************
@@ -50,6 +77,52 @@ void HW_IPCC_Rx_Handler( void )
{
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 LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_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();
@@ -68,6 +141,27 @@ void HW_IPCC_Tx_Handler( void )
{
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 LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_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();
@@ -89,11 +183,17 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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
@@ -209,6 +309,318 @@ __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 */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_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 ) )
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Src/main.c
index c0a151c0c..cca9509a2 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Src/main.c
@@ -37,6 +37,7 @@ detailed procedure to change the Wireless Coprocessor binary.
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
@@ -293,11 +294,10 @@ void SystemClock_Config(void)
/** Configure LSE Drive Capability
*/
__HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
- /** Configure the main internal regulator output voltage
+ /** Configure the main internal regulator output voltage
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
- /** Initializes the RCC Oscillators according to the specified parameters
- * in the RCC_OscInitTypeDef structure.
+ /** Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
|RCC_OSCILLATORTYPE_LSE;
@@ -310,7 +310,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
@@ -326,7 +326,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Initializes the peripherals clocks
+ /** Initializes the peripherals clocks
*/
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP;
PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
@@ -765,7 +765,7 @@ static void SYS_UserEventReceivedCallback( void * pData )
APP_FLAG_SET(APP_FLAG_WIRELESS_FW_RUNNING);
/* RF stack installed and ready */
}
- else if (p_sys_ready_event->sysevt_ready_rsp == RSS_FW_RUNNING)
+ else if (p_sys_ready_event->sysevt_ready_rsp == FUS_FW_RUNNING)
{
APP_FLAG_SET(APP_FLAG_FUS_FW_RUNNING);
APP_FLAG_RESET(APP_FLAG_WIRELESS_FW_RUNNING);
@@ -1038,7 +1038,7 @@ void Error_Handler(void)
* @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) */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Src/stm32wbxx_it.c
index 72f09f372..55e1e5b61 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Src/stm32wbxx_it.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Peripheral_Lite/Src/stm32wbxx_it.c
@@ -66,7 +66,7 @@
/* USER CODE END EV */
/******************************************************************************/
-/* Cortex Processor Interruption and Exception Handlers */
+/* Cortex Processor Interruption and Exception Handlers */
/******************************************************************************/
/**
* @brief This function handles Non maskable interrupt.
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Inc/app_common.h
index 79439597f..d580f0365 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Inc/app_common.h
@@ -67,9 +67,13 @@ extern "C"
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Inc/app_conf.h
index b72709c6b..89bd0f1eb 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Inc/app_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Inc/app_conf.h
@@ -51,7 +51,7 @@
*/
#define CFG_BONDING_MODE (1)
#define CFG_FIXED_PIN (111111)
-#define CFG_USED_FIXED_PIN (0)
+#define CFG_USED_FIXED_PIN (1)
#define CFG_ENCRYPTION_KEY_SIZE_MAX (16)
#define CFG_ENCRYPTION_KEY_SIZE_MIN (8)
@@ -74,7 +74,28 @@
#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_NOT_SUPPORTED
+/**
+ * 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)
/**
* Identity root key used to derive LTK and CSRK
@@ -106,7 +127,7 @@
* Maximum number of simultaneous connections that the device will support.
* Valid values are from 1 to 8
*/
-#define CFG_BLE_NUM_LINK 8
+#define CFG_BLE_NUM_LINK 2
/**
* Maximum number of Services that can be stored in the GATT database.
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Inc/hw_conf.h
index 18d8e28f8..c88acf2f0 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Inc/hw_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Inc/hw_conf.h
@@ -1,36 +1,39 @@
+/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file hw_conf.h
* @author MCD Application Team
* @brief Configuration of hardware interface
- ******************************************************************************
- * @attention
- *
+ ******************************************************************************
+ * @attention
+ *
* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under Ultimate Liberty license
- * SLA0044, the "License"; You may not use this file except in compliance with
- * the License. You may obtain a copy of the License at:
- * www.st.com/SLA0044
- *
- ******************************************************************************
- */
-
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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
+#ifndef HW_CONF_H
+#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
* 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.
+* Once the Semaphore has been released, there shall be at least 1us before it can be taken again. This is required
+* to give the opportunity to CPU2 to take it.
* 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()
@@ -69,7 +72,6 @@
/* Index of the semaphore used to access the RNG */
#define CFG_HW_RNG_SEMID 0
-
/******************************************************************************
* HW TIMER SERVER
*****************************************************************************/
@@ -84,7 +86,7 @@
* wakeup timer.
* This setting is the preemptpriority part of the NVIC.
*/
-#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+#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
@@ -92,7 +94,7 @@
* 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 CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
/**
* Define a critical section in the Timer server
@@ -108,25 +110,25 @@
* 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
+#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
- */
+ * 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
/******************************************************************************
@@ -135,8 +137,8 @@
#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 0
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
/**
* LPUART1
@@ -242,6 +244,6 @@
#define CFG_HW_USART1_TX_DMA_IRQn DMA2_Channel4_IRQn
#define CFG_HW_USART1_DMA_TX_IRQHandler DMA2_Channel4_IRQHandler
-#endif /*__HW_CONF_H */
+#endif /*HW_CONF_H */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Inc/main.h
index bbe71a4da..d104dcb7e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Inc/main.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Inc/main.h
@@ -32,6 +32,7 @@ extern RTC_HandleTypeDef hrtc; /**< RTC handler declaration */
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
+void Error_Handler(void);
#endif /* __MAIN_H */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Src/app_entry.c
index e87586d6b..d6fb21b78 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Src/app_entry.c
@@ -189,7 +189,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Src/main.c
index 25a8c45e0..950b9675f 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/Core/Src/main.c
@@ -38,6 +38,8 @@
/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
#include "app_common.h"
#include "app_entry.h"
@@ -317,4 +319,12 @@ void HAL_Delay(uint32_t Delay)
}
}
+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 */
+}
+
/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/STM32_WPAN/App/app_ble.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/STM32_WPAN/App/app_ble.c
index b532ecb93..a89e8df49 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/STM32_WPAN/App/app_ble.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_Proximity/STM32_WPAN/App/app_ble.c
@@ -19,6 +19,7 @@
/* Includes ------------------------------------------------------------------*/
+#include "main.h"
#include "app_common.h"
#include "dbg_trace.h"
@@ -59,18 +60,6 @@ typedef struct _tSecurityParams
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
@@ -268,7 +257,10 @@ void APP_BLE_Init( void )
/**
* Starts the BLE Stack on CPU2
*/
- SHCI_C2_BLE_Init( &ble_init_cmd_packet );
+ if (SHCI_C2_BLE_Init( &ble_init_cmd_packet ) != SHCI_Success)
+ {
+ Error_Handler();
+ }
/**
* Initialization of HCI & GATT & GAP layer
@@ -475,7 +467,6 @@ static void Ble_Tl_Init( void )
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];
@@ -574,26 +565,21 @@ static void Ble_Hci_Gap_Gatt_Init(void){
* 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;
- }
+ 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;
aci_gap_set_authentication_requirement(BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode,
BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode,
- 0,
- 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
);
/**
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 a58b95cad..e7049681d 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/Core/Inc/app_common.h
index 836f40dcf..cf8a5baa6 100644
--- 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
@@ -66,9 +66,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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
index 029afda79..aa8be1f56 100644
--- 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
@@ -206,7 +206,7 @@
* Maximum number of simultaneous connections that the device will support.
* Valid values are from 1 to 8
*/
-#define CFG_BLE_NUM_LINK 8
+#define CFG_BLE_NUM_LINK 2
/**
* Maximum number of Services that can be stored in the GATT database.
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
index 1ea46c74b..e9527fae1 100644
--- 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
@@ -1,13 +1,13 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
- * File Name : hw_conf.h
- * Description : Hardware configuration file for BLE
- * middleWare.
+ * @file hw_conf.h
+ * @author MCD Application Team
+ * @brief Configuration of hardware interface
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -32,6 +32,8 @@
* 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.
+* Once the Semaphore has been released, there shall be at least 1us before it can be taken again. This is required
+* to give the opportunity to CPU2 to take it.
* 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()
@@ -187,9 +189,9 @@
#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
+#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
@@ -239,9 +241,9 @@
#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
+#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 */
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
index 7da099ee2..bdc3e950c 100644
--- 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
@@ -25,7 +25,7 @@
#ifdef __cplusplus
extern "C" {
-#endif
+#endif
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
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
index aa75a01f2..14ed65c22 100644
--- 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
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "app_common.h"
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
index a7faf8853..5a0b5f1bb 100644
--- 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
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "main.h"
@@ -191,7 +192,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
@@ -199,21 +200,26 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
static void APPE_SysUserEvtRx( void * pPayload )
{
TL_AsynchEvt_t *p_sys_event;
-
SHCI_C2_CONFIG_Cmd_Param_t config_param = {0};
+ WirelessFwInfo_t WirelessInfo;
p_sys_event = (TL_AsynchEvt_t*)(((tSHCI_UserEvtRxParam*)pPayload)->pckt->evtserial.evt.payload);
+ /* Read the firmware version of both the wireless firmware and the FUS */
+ SHCI_GetWirelessFwInfo( &WirelessInfo );
+ APP_DBG_MSG("Wireless Firmware version %d.%d.%d\n", WirelessInfo.VersionMajor, WirelessInfo.VersionMinor, WirelessInfo.VersionSub);
+ APP_DBG_MSG("Wireless Firmware build %d\n", WirelessInfo.VersionReleaseType);
+ APP_DBG_MSG("FUS version %d.%d.%d\n\n", WirelessInfo.FusVersionMinor, WirelessInfo.FusVersionMinor, WirelessInfo.FusVersionSub);
+
switch(p_sys_event->subevtcode)
{
case SHCI_SUB_EVT_CODE_READY:
- APP_DBG_MSG("SHCI_SUB_EVT_CODE_READY WITH PARAMETER %x \n", ((SHCI_C2_Ready_Evt_t*)p_sys_event->payload)->sysevt_ready_rsp );
-
if(((SHCI_C2_Ready_Evt_t*)p_sys_event->payload)->sysevt_ready_rsp == WIRELESS_FW_RUNNING)
{
/**
* The wireless firmware is running on the CPU2
*/
+ APP_DBG_MSG("SHCI_SUB_EVT_CODE_READY - WIRELESS_FW_RUNNING \n");
/* Traces channel initialization */
APPD_EnableCPU2( );
@@ -222,7 +228,7 @@ static void APPE_SysUserEvtRx( void * pPayload )
config_param.PayloadCmdSize = SHCI_C2_CONFIG_PAYLOAD_CMD_SIZE;
config_param.EvtMask1 = SHCI_C2_CONFIG_EVTMASK1_BIT0_ERROR_NOTIF_ENABLE
+ SHCI_C2_CONFIG_EVTMASK1_BIT1_BLE_NVM_RAM_UPDATE_ENABLE
- + SHCI_C2_CONFIG_EVTMASK1_BIT2_OT_NVM_RAM_UPDATE_ENABLE
+ + SHCI_C2_CONFIG_EVTMASK1_BIT2_THREAD_NVM_RAM_UPDATE_ENABLE
+ SHCI_C2_CONFIG_EVTMASK1_BIT3_NVM_START_WRITE_ENABLE
+ SHCI_C2_CONFIG_EVTMASK1_BIT4_NVM_END_WRITE_ENABLE
+ SHCI_C2_CONFIG_EVTMASK1_BIT5_NVM_START_ERASE_ENABLE
@@ -239,6 +245,7 @@ static void APPE_SysUserEvtRx( void * pPayload )
* The FUS firmware is running on the CPU2
* In the scope of this application, there should be no case when we get here
*/
+ APP_DBG_MSG("SHCI_SUB_EVT_CODE_READY - FUS_FW_RUNNING \n");
/* The packet shall not be released as this is not supported by the FUS */
((tSHCI_UserEvtRxParam*)pPayload)->status = SHCI_TL_UserEventFlow_Disable;
@@ -250,19 +257,19 @@ static void APPE_SysUserEvtRx( void * pPayload )
break;
case SHCI_SUB_EVT_BLE_NVM_RAM_UPDATE:
- APP_DBG_MSG("SHCI_SUB_EVT_BLE_NVM_RAM_UPDATE : StartAddress = %x , Size = %x\n",
+ APP_DBG_MSG("SHCI_SUB_EVT_BLE_NVM_RAM_UPDATE : StartAddress = %lx , Size = %ld\n",
((SHCI_C2_BleNvmRamUpdate_Evt_t*)p_sys_event->payload)->StartAddress,
((SHCI_C2_BleNvmRamUpdate_Evt_t*)p_sys_event->payload)->Size);
break;
- case SHCI_SUB_EVT_OT_NVM_RAM_UPDATE:
- APP_DBG_MSG("SHCI_SUB_EVT_OT_NVM_RAM_UPDATE : StartAddress = %x , Size = %x\n",
- ((SHCI_C2_OtNvmRamUpdate_Evt_t*)p_sys_event->payload)->StartAddress,
- ((SHCI_C2_OtNvmRamUpdate_Evt_t*)p_sys_event->payload)->Size);
+ case SHCI_SUB_EVT_THREAD_NVM_RAM_UPDATE:
+ APP_DBG_MSG("SHCI_SUB_EVT_THREAD_NVM_RAM_UPDATE : StartAddress = %lx , Size = %ld\n",
+ ((SHCI_C2_ThreadNvmRamUpdate_Evt_t*)p_sys_event->payload)->StartAddress,
+ ((SHCI_C2_ThreadNvmRamUpdate_Evt_t*)p_sys_event->payload)->Size);
break;
case SHCI_SUB_EVT_NVM_START_WRITE:
- APP_DBG_MSG("SHCI_SUB_EVT_NVM_START_WRITE : NumberOfWords = %x\n",
+ APP_DBG_MSG("SHCI_SUB_EVT_NVM_START_WRITE : NumberOfWords = %ld\n",
((SHCI_C2_NvmStartWrite_Evt_t*)p_sys_event->payload)->NumberOfWords);
break;
@@ -271,7 +278,7 @@ static void APPE_SysUserEvtRx( void * pPayload )
break;
case SHCI_SUB_EVT_NVM_START_ERASE:
- APP_DBG_MSG("SHCI_SUB_EVT_NVM_START_WRITE : NumberOfSectors = %x\n",
+ APP_DBG_MSG("SHCI_SUB_EVT_NVM_START_WRITE : NumberOfSectors = %ld\n",
((SHCI_C2_NvmStartErase_Evt_t*)p_sys_event->payload)->NumberOfSectors);
break;
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
index 97daec80f..fffe89652 100644
--- 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
@@ -37,6 +37,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "app_entry.h"
@@ -165,11 +166,10 @@ void SystemClock_Config(void)
*/
HAL_PWR_EnableBkUpAccess();
__HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
- /** Configure the main internal regulator output voltage
+ /** Configure the main internal regulator output voltage
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
- /** Initializes the RCC Oscillators according to the specified parameters
- * in the RCC_OscInitTypeDef structure.
+ /** Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
|RCC_OSCILLATORTYPE_LSE;
@@ -182,7 +182,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
@@ -198,7 +198,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Initializes the peripherals clocks
+ /** Initializes the peripherals clocks
*/
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
|RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
@@ -372,10 +372,10 @@ static void MX_RTC_Init(void)
}
-/**
+/**
* Enable DMA controller clock
*/
-static void MX_DMA_Init(void)
+static void MX_DMA_Init(void)
{
/* DMA controller clock enable */
@@ -612,7 +612,7 @@ void Error_Handler(void)
* @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) */
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
index caf33b24b..0fd13443f 100644
--- 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
@@ -98,9 +98,9 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
/* USER CODE END LPUART1_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_LPUART1_CLK_ENABLE();
-
+
__HAL_RCC_GPIOA_CLK_ENABLE();
- /**LPUART1 GPIO Configuration
+ /**LPUART1 GPIO Configuration
PA2 ------> LPUART1_TX
PA3 ------> LPUART1_RX
PA6 ------> LPUART1_CTS
@@ -161,13 +161,13 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
/* 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
+ /**USART1 GPIO Configuration
PA11 ------> USART1_CTS
PB6 ------> USART1_TX
- PB7 ------> USART1_RX
+ PB7 ------> USART1_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
@@ -226,8 +226,8 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
/* USER CODE END LPUART1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_LPUART1_CLK_DISABLE();
-
- /**LPUART1 GPIO Configuration
+
+ /**LPUART1 GPIO Configuration
PA2 ------> LPUART1_TX
PA3 ------> LPUART1_RX
PA6 ------> LPUART1_CTS
@@ -250,11 +250,11 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
/* USER CODE END USART1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_USART1_CLK_DISABLE();
-
- /**USART1 GPIO Configuration
+
+ /**USART1 GPIO Configuration
PA11 ------> USART1_CTS
PB6 ------> USART1_TX
- PB7 ------> USART1_RX
+ PB7 ------> USART1_RX
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11);
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
index 10395524b..14f005825 100644
--- 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
@@ -69,7 +69,7 @@ extern UART_HandleTypeDef huart1;
/* USER CODE END EV */
/******************************************************************************/
-/* Cortex Processor Interruption and Exception Handlers */
+/* Cortex Processor Interruption and Exception Handlers */
/******************************************************************************/
/**
* @brief This function handles Non maskable interrupt.
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
index e0c5824be..7551bfe05 100644
--- 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
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
@@ -453,7 +454,10 @@ void APP_BLE_Init( void )
/**
* Starts the BLE Stack on CPU2
*/
- SHCI_C2_BLE_Init( &ble_init_cmd_packet );
+ if (SHCI_C2_BLE_Init( &ble_init_cmd_packet ) != SHCI_Success)
+ {
+ Error_Handler();
+ }
/**
* Initialization of HCI & GATT & GAP layer
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
index e0bb30565..5c95b3afe 100644
--- 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
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "app_common.h"
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
index a58b95cad..e7049681d 100644
--- 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/readme.txt
index 294bfd938..460cde4ee 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/readme.txt
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_RfWithFlash/readme.txt
@@ -20,7 +20,7 @@
@par Example Description
-This example is to demonstrate the capability to erase/write the flash while a Point-to-Point communication using BLE component is active.
+How 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.
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pClient/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pClient/readme.txt
index 4feba503e..ab85a169c 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pClient/readme.txt
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pClient/readme.txt
@@ -20,13 +20,12 @@
@par Application Description
-This example is to demonstrate Point-to-Point communication using BLE component.
+How to demonstrate Point-to-Point communication using BLE component (as GATT client).
Two STM32WB55xx boards are used, one acting as GATT client, and one as GATT server.
For example, BLE_p2pClient application is downloaded in a Nucleo board (MB1355C) and BLE P2P_Server application in a USB DONGLE board (MB1293C).
-
@par Keywords
Connectivity, BLE, IPCC, HSEM, RTC, UART, PWR, BLE protocol, BLE pairing, BLE profile, Dual core
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 1531848b4..609c04f84 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
@@ -20,7 +20,7 @@
@par Application Description
-This example is to demonstrate Point-to-Point communication using BLE component.
+How to demonstrate Point-to-Point communication using BLE component (as GATT server).
Two STM32WB55xx boards are used, one acting as GATT client, and one as GATT server.
For example, BLE_P2PClient application is downloaded in a USB DONGLE board (MB1293C) and BLE_p2pServer application in a Nucleo board (MB1355C).
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 836f40dcf..cf8a5baa6 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
@@ -66,9 +66,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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 8679b9480..4a60494e4 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
@@ -187,7 +187,7 @@
* Maximum number of simultaneous connections that the device will support.
* Valid values are from 1 to 8
*/
-#define CFG_BLE_NUM_LINK 8
+#define CFG_BLE_NUM_LINK 2
/**
* Maximum number of Services that can be stored in the GATT database.
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 1ea46c74b..e9527fae1 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
@@ -1,13 +1,13 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
- * File Name : hw_conf.h
- * Description : Hardware configuration file for BLE
- * middleWare.
+ * @file hw_conf.h
+ * @author MCD Application Team
+ * @brief Configuration of hardware interface
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
@@ -32,6 +32,8 @@
* 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.
+* Once the Semaphore has been released, there shall be at least 1us before it can be taken again. This is required
+* to give the opportunity to CPU2 to take it.
* 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()
@@ -187,9 +189,9 @@
#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
+#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
@@ -239,9 +241,9 @@
#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
+#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 */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/stm32wbxx_it.h
index c6f85a75b..cf6cc65e7 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/stm32wbxx_it.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Inc/stm32wbxx_it.h
@@ -25,7 +25,7 @@
#ifdef __cplusplus
extern "C" {
-#endif
+#endif
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
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 aa75a01f2..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
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "app_common.h"
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 d5e9e8552..491367bbb 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
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "main.h"
@@ -189,7 +190,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
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 f288d5fc9..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
@@ -37,6 +37,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "app_entry.h"
@@ -165,11 +166,10 @@ void SystemClock_Config(void)
*/
HAL_PWR_EnableBkUpAccess();
__HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
- /** Configure the main internal regulator output voltage
+ /** Configure the main internal regulator output voltage
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
- /** Initializes the RCC Oscillators according to the specified parameters
- * in the RCC_OscInitTypeDef structure.
+ /** Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
|RCC_OSCILLATORTYPE_LSE;
@@ -182,7 +182,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
@@ -198,7 +198,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Initializes the peripherals clocks
+ /** Initializes the peripherals clocks
*/
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
|RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
@@ -376,10 +376,10 @@ static void MX_RTC_Init(void)
}
-/**
+/**
* Enable DMA controller clock
*/
-static void MX_DMA_Init(void)
+static void MX_DMA_Init(void)
{
/* DMA controller clock enable */
@@ -616,7 +616,7 @@ void Error_Handler(void)
* @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) */
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 9307e5c50..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
@@ -96,9 +96,9 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
/* USER CODE END LPUART1_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_LPUART1_CLK_ENABLE();
-
+
__HAL_RCC_GPIOA_CLK_ENABLE();
- /**LPUART1 GPIO Configuration
+ /**LPUART1 GPIO Configuration
PA2 ------> LPUART1_TX
PA3 ------> LPUART1_RX
PA6 ------> LPUART1_CTS
@@ -159,13 +159,13 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
/* 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
+ /**USART1 GPIO Configuration
PA11 ------> USART1_CTS
PB6 ------> USART1_TX
- PB7 ------> USART1_RX
+ PB7 ------> USART1_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
@@ -224,8 +224,8 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
/* USER CODE END LPUART1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_LPUART1_CLK_DISABLE();
-
- /**LPUART1 GPIO Configuration
+
+ /**LPUART1 GPIO Configuration
PA2 ------> LPUART1_TX
PA3 ------> LPUART1_RX
PA6 ------> LPUART1_CTS
@@ -248,11 +248,11 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
/* USER CODE END USART1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_USART1_CLK_DISABLE();
-
- /**USART1 GPIO Configuration
+
+ /**USART1 GPIO Configuration
PA11 ------> USART1_CTS
PB6 ------> USART1_TX
- PB7 ------> USART1_RX
+ PB7 ------> USART1_RX
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11);
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/stm32wbxx_it.c
index 3c8702cbc..2a345be14 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/stm32wbxx_it.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/Core/Src/stm32wbxx_it.c
@@ -69,7 +69,7 @@ extern UART_HandleTypeDef huart1;
/* USER CODE END EV */
/******************************************************************************/
-/* Cortex Processor Interruption and Exception Handlers */
+/* Cortex Processor Interruption and Exception Handlers */
/******************************************************************************/
/**
* @brief This function handles Non maskable interrupt.
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 14cc43273..fe3d92875 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
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
@@ -63,18 +64,6 @@ typedef struct _tSecurityParams
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
@@ -423,7 +412,10 @@ void APP_BLE_Init( void )
/**
* Starts the BLE Stack on CPU2
*/
- SHCI_C2_BLE_Init( &ble_init_cmd_packet );
+ if (SHCI_C2_BLE_Init( &ble_init_cmd_packet ) != SHCI_Success)
+ {
+ Error_Handler();
+ }
/**
* Initialization of HCI & GATT & GAP layer
@@ -785,7 +777,6 @@ static void Ble_Tl_Init( void )
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];
@@ -893,16 +884,11 @@ static void Ble_Hci_Gap_Gatt_Init(void){
* 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,
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/App/p2p_server_app.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/App/p2p_server_app.c
index e0bb30565..5c95b3afe 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/App/p2p_server_app.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/STM32_WPAN/App/p2p_server_app.c
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "app_common.h"
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 a58b95cad..e7049681d 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer_ota/readme.txt
index f2a770ba9..f05fcabc7 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
@@ -20,7 +20,7 @@
@par Application Description
-This example is to demonstrate Point-to-Point communication using BLE component.
+How to demonstrate Point-to-Point communication using BLE component (peripherical as GATT server) to be downloaded with BLE OTA application.
Two STM32WB55xx boards are used, one acting as GATT client, and one as GATT server.
For example, BLE P2P_Client application is downloaded in a USB DONGLE board (MB1293C) and BLE_p2pServer_ota application in a Nucleo board (MB1355C).
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/app_common.h
new file mode 100644
index 000000000..0d38b869d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/app_common.h
@@ -0,0 +1,124 @@
+/**
+ ******************************************************************************
+ * @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"
+#include "stm_logging.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 *
+ * -------------------------------- */
+
+#ifndef MAX
+#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+
+#ifndef MIN
+#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
+
+#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_Thread/Ble_Thread_Dyn/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/app_conf.h
new file mode 100644
index 000000000..1cab963e1
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/app_conf.h
@@ -0,0 +1,625 @@
+/**
+ ******************************************************************************
+ * 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
+ ******************************************************************************/
+
+/**< 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 (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
+
+
+/**
+* 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
+
+/******************************************************************************
+ * 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 BLE_PREP_WRITE_X_ATT(CFG_BLE_MAX_ATT_MTU)
+
+/**
+ * Number of allocated memory blocks
+ */
+#define CFG_BLE_MBLOCK_COUNT (BLE_MBLOCKS_CALC(CFG_BLE_PREPARE_WRITE_LIST_SIZE, CFG_BLE_MAX_ATT_MTU, CFG_BLE_NUM_LINK))
+
+/**
+ * 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
+ ******************************************************************************/
+#define CFG_DEBUG_TRACE_UART hw_uart1
+#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 */
+
+/* FOR DEBUGGING ONLY ! */
+//#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
+
+#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
+ *****************************************************************************/
+
+ /**
+ * 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_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
+ ******************************************************************************/
+
+/**
+ * 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
+{
+ /* BLE */
+ CFG_TASK_ADV_CANCEL_ID,
+ CFG_TASK_SW1_BUTTON_PUSHED_ID,
+ CFG_TASK_HCI_ASYNCH_EVT_ID,
+
+ /* Thread */
+ CFG_TASK_COAP_MSG_BUTTON,
+ CFG_TASK_MSG_FROM_M0_TO_M4,
+ CFG_TASK_SEND_CLI_TO_M0,
+ CFG_TASK_COAP_SEND_MSG,
+ CFG_TASK_SET_THREAD_MODE,
+
+ /* Concurrent System */
+ CFG_Task_Switch_Protocol,
+
+ 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_SCH_PRIO_1,
+ CFG_PRIO_NBR,
+} CFG_SCH_Prio_Id_t;
+
+#define TASK_COAP_MSG_BUTTON (1U << CFG_TASK_COAP_MSG_BUTTON)
+#define TASK_MSG_FROM_M0_TO_M4 (1U << CFG_TASK_MSG_FROM_M0_TO_M4)
+#define TASK_COAP_SEND_MSG (1U << CFG_TASK_COAP_SEND_MSG)
+#define TASK_SET_THREAD_MODE (1U << CFG_TASK_SET_THREAD_MODE)
+/**
+ * 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,
+ /* THREAD */
+ CFG_EVT_ACK_FROM_M0_EVT,
+ CFG_EVT_SYNCHRO_BYPASS_IDLE,
+ CFG_Evt_ThreadStop,
+} 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)
+
+/******************************************************************************
+ * 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_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
+
+
+typedef enum
+{
+ BUTTON_1 = 0x1,
+} button_type_t;
+
+#endif /* APP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/app_entry.h
new file mode 100644
index 000000000..1e7fcbf1f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/app_entry.h
@@ -0,0 +1,53 @@
+
+/**
+ ******************************************************************************
+ * @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
+
+#include "stm32wbxx_hal.h"
+#include "stm32_seq.h"
+#include "tl.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+ /* Exported types ------------------------------------------------------------*/
+ /* Exported constants --------------------------------------------------------*/
+ /* External variables --------------------------------------------------------*/
+ /* Exported macros -----------------------------------------------------------*/
+ /* Exported functions ------------------------------------------------------- */
+ void APPE_Init( void );
+ void APP_ENTRY_RegisterCmdBuffer(TL_CmdPacket_t* p_buffer);
+ void APP_ENTRY_ProcessMsgM0ToM4(void);
+ void APP_ENTRY_Init_CFG_CLI_UART(void);
+ void APP_ENTRY_TL_THREAD_INIT(void);
+ void UTIL_SEQ_EvtIdle( UTIL_SEQ_bm_t task_id_bm, UTIL_SEQ_bm_t evt_waited_bm );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __APP_ENTRY_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/hw_conf.h
new file mode 100644
index 000000000..3a86a4e83
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/hw_conf.h
@@ -0,0 +1,249 @@
+/**
+ ******************************************************************************
+ * @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 */
+#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.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/hw_if.h
new file mode 100644
index 000000000..271a222a9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/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_Thread/Ble_Thread_Dyn/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/main.h
new file mode 100644
index 000000000..bbe71a4da
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/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_Thread/Ble_Thread_Dyn/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/stm32_lpm_if.h
new file mode 100644
index 000000000..d8e67947f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/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_Thread/Ble_Thread_Dyn/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/stm32wbxx_hal_conf.h
new file mode 100644
index 000000000..f37437884
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/stm32wbxx_hal_conf.h
@@ -0,0 +1,349 @@
+/**
+ ******************************************************************************
+ * @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_Thread/Ble_Thread_Dyn/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/stm32wbxx_it.h
new file mode 100644
index 000000000..46179c211
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/stm32wbxx_it.h
@@ -0,0 +1,62 @@
+/**
+ ******************************************************************************
+ * @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 IPCC_C1_RX_IRQHandler(void);
+void IPCC_C1_TX_IRQHandler(void);
+void EXTI4_IRQHandler(void);
+void EXTI0_IRQHandler(void);
+void EXTI1_IRQHandler(void);
+void USART1_IRQHandler(void);
+void DMA2_Channel4_IRQHandler(void);
+void CFG_HW_USART1_DMA_TX_IRQHandler( void );
+void RTC_WKUP_IRQHandler(void);
+void LPUART1_IRQHandler(void);
+void DMA1_Channel4_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_Thread/Ble_Thread_Dyn/Core/Inc/stm_logging.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/stm_logging.h
new file mode 100644
index 000000000..43bc513d6
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/stm_logging.h
@@ -0,0 +1,67 @@
+/**
+ ******************************************************************************
+ * @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.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Inc/utilities_conf.h
new file mode 100644
index 000000000..4dde3509a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/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_Thread/Ble_Thread_Dyn/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Src/app_entry.c
new file mode 100644
index 000000000..38612be55
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Src/app_entry.c
@@ -0,0 +1,516 @@
+/* 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 "dbg_trace.h"
+#include "shci_tl.h"
+#include "stm32_lpm.h"
+#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 */
+
+/* Private defines -----------------------------------------------------------*/
+/* POOL_SIZE = 2(TL_PacketHeader_t) + 258 (3(TL_EVT_HDR_SIZE) + 255(Payload 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 macros ------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+
+extern RTC_HandleTypeDef hrtc; /**< RTC handler declaration */
+
+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];
+
+/* Global variables ----------------------------------------------------------*/
+
+/* Global function prototypes -----------------------------------------------*/
+#if(CFG_DEBUG_TRACE != 0)
+size_t DbgTraceWrite(int handle, const unsigned char * buf, size_t bufSize);
+#endif
+
+/* USER CODE BEGIN GFP */
+
+/* USER CODE END GFP */
+
+/* Private functions 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 */
+
+static void displayConcurrentMode(void);
+
+/* Functions Definition ------------------------------------------------------*/
+void APPE_Init( void )
+{
+ /* Configure the system Power Mode */
+ SystemPower_Config();
+
+ /* Initialize the TimerServer */
+ HW_TS_Init(hw_ts_InitMode_Full, &hrtc);
+
+/* USER CODE BEGIN APPE_Init_1 */
+ /* initialize debugger module if supported and debug trace if activated */
+ Init_Debug();
+
+ /* Display Dynamic concurrent mode (BLE and Thread) */
+ displayConcurrentMode();
+
+ /**
+ * 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 */
+ /* Initialize all transport layers and start CPU2 which will send back a ready event to CPU1 */
+ appe_Tl_Init();
+
+ /**
+ * 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;
+}
+
+static void displayConcurrentMode()
+{
+ APP_DBG("Dynamic Concurrent Mode BLE/OpenThread starting...");
+}
+
+/*************************************************************
+ *
+ * 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 EXTI lines */
+ LL_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+ LL_C2_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+
+#else
+ /* Disable debugger EXTI lines */
+ LL_EXTI_DisableIT_32_63(LL_EXTI_LINE_48);
+ LL_C2_EXTI_DisableIT_32_63(LL_EXTI_LINE_48);
+
+ 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();
+
+ /**
+ * Do not keep debugger enabled while in any low power mode
+ */
+ 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 )
+{
+ // Before going to stop or standby modes, do the settings so that system clock and IP80215.4 clock
+ // start on HSI automatically
+ LL_RCC_HSI_EnableAutoFromStop();
+
+ /**
+ * 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( );
+
+ /* 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
+ */
+ HAL_PWREx_EnableVddUSB();
+#endif
+
+ /* Enable RAM1 (because OT instance.o is located here for Concurrent Mode */
+ LL_C2_AHB1_GRP1_EnableClock(LL_C2_AHB1_GRP1_PERIPH_SRAM1);
+ LL_C2_AHB1_GRP1_EnableClockSleep(LL_C2_AHB1_GRP1_PERIPH_SRAM1);
+
+ 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 == FUS_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( );
+
+ /* In the Context of Dynamic Concurrent mode, the Init and start of each stack must be split and executed
+ * in the following order :
+ * APP_BLE_Init_Dyn_1() : BLE Stack Init until it's ready to start ADV
+ * APP_THREAD_Init_Dyn_1() : Thread Stack Init until it's ready to be configured (default channel, PID, etc...)
+ * APP_BLE_Init_Dyn_2() : Start ADV
+ * APP_THREAD_Init_Dyn_2() : Thread Stack configuration (default channel, PID, etc...) to be able to start scanning
+ * or joining a Thread Network
+ */
+ APP_DBG("1- Initialisation of BLE Stack...");
+ APP_BLE_Init_Dyn_1();
+ APP_DBG("2- Initialisation of OpenThread Stack. FW info :");
+ APP_THREAD_Init_Dyn_1();
+
+ APP_DBG("3- Start BLE ADV...");
+ APP_BLE_Init_Dyn_2();
+ APP_DBG("4- Configure OpenThread (Channel, PANID, IPv6 stack, ...) and Start it...");
+ APP_THREAD_Init_Dyn_2();
+
+#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;
+}
+
+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);
+
+ BSP_LED_On(LED_GREEN);
+#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:
+ /* Block all tasks and wait until the event CFG_Evt_AckFromM0Evt is scheduled */
+ 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 :
+ 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_ID, CFG_SCH_PRIO_0);
+ return;
+}
+
+void shci_cmd_resp_release(uint32_t flag)
+{
+ UNUSED(flag);
+ UTIL_SEQ_SetEvt(1U << CFG_IDLEEVT_HCI_CMD_EVT_RSP_ID);
+ return;
+}
+
+void shci_cmd_resp_wait(uint32_t timeout)
+{
+ UNUSED(timeout);
+ UTIL_SEQ_WaitEvt(1U << CFG_IDLEEVT_HCI_CMD_EVT_RSP_ID);
+ 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 Initialization of the trace mechanism
+ * @param None
+ * @retval None
+ */
+#if(CFG_DEBUG_TRACE != 0)
+void DbgOutputInit( void )
+{
+#if (CFG_HW_USART1_ENABLED == 1)
+ HW_UART_Init(CFG_DEBUG_TRACE_UART);
+#endif
+ 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
+
+/**
+ * @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:
+ APP_DBG("BUTTON 1 PUSHED ! : COAP MESSAGE SENDING");
+ UTIL_SEQ_SetTask(TASK_COAP_MSG_BUTTON,CFG_SCH_PRIO_0);
+ break;
+
+ case BUTTON_SW2_PIN:
+ APP_DBG("BUTTON 2 PUSHED ! : BLE BELL TOGGLE");
+ /* Set "Switch Protocol" Task */
+ APP_BLE_Key_Button1_Action();
+ break;
+
+ case BUTTON_SW3_PIN:
+ APP_DBG("BUTTON 3 PUSHED ! : NO ACTION MAPPED ON SW3");
+ APP_BLE_Key_Button3_Action();
+ break;
+
+ default:
+ break;
+ }
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Src/hw_timerserver.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Src/hw_timerserver.c
new file mode 100644
index 000000000..c842ba55e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/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_Thread/Ble_Thread_Dyn/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Src/hw_uart.c
new file mode 100644
index 000000000..7d28f9582
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Src/hw_uart.c
@@ -0,0 +1,465 @@
+/**
+ ******************************************************************************
+ * @file hw_uart.c
+ * @author MCD Application Team
+ * @brief hardware access
+ ******************************************************************************
+ * @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 "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{ \
+ /* Enable GPIO clock */ \
+ CFG_HW_##__USART_BASE__##_TX_PORT_CLK_ENABLE(); \
+ \
+ /* Enable USART clock */ \
+ __HAL_RCC_##__USART_BASE__##_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); \
+ \
+ 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); \
+ \
+ 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); \
+ \
+ 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)
+{
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+
+ 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.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Src/main.c
new file mode 100644
index 000000000..3b3d8d233
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Src/main.c
@@ -0,0 +1,320 @@
+/**
+ ******************************************************************************
+ * @file : main.c
+ * @brief : Main program body
+ *
+ @verbatim
+ ==============================================================================
+ ##### IMPORTANT NOTE #####
+ ==============================================================================
+
+ This application requests having the stm32wb5x_BLE_Thread_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"
+
+/* 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 );
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Main program
+ * @param None
+ * @retval None
+ */
+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 Init_Exti( void )
+{
+ /**< Disable all wakeup interrupt on CPU1 except LPUART(25), IPCC(36), HSEM(38) */
+ LL_EXTI_DisableIT_0_31( (~0) & (~(LL_EXTI_LINE_25)) );
+ 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; /**< 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
+ */
+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
+
+ /**
+ * 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;
+}
+
+/*************************************************************
+ *
+ * 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_Thread/Ble_Thread_Dyn/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Src/stm32_lpm_if.c
new file mode 100644
index 000000000..27141b2a2
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Src/stm32_lpm_if.c
@@ -0,0 +1,295 @@
+/* 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
+ */
+ Switch_On_HSI( );
+ }
+ }
+ else
+ {
+ /**
+ * The switch on HSI before entering Stop Mode is required
+ */
+ 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_Thread/Ble_Thread_Dyn/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Src/stm32wbxx_it.c
new file mode 100644
index 000000000..8c7f63d4c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Src/stm32wbxx_it.c
@@ -0,0 +1,188 @@
+/**
+ ******************************************************************************
+ * @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 "stm32wbxx_it.h"
+#include "app_common.h"
+
+/* CONCURRENT MODE BLE/THREAD */
+/* External variables -----------------------------------------------------------*/
+extern uint8_t ThreadEnable;
+
+/* /THREAD */
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+/* 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)
+{
+ /* 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();
+}
+
+ 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 External line
+ * interrupt request.
+ * @param None
+ * @retval None
+ */
+void PUSH_BUTTON_SW1_EXTI_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW1_PIN);
+}
+
+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);
+}
+
+#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
+
+
+/******************************************************************************/
+/* STM32L0xx Peripherals Interrupt Handlers */
+/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */
+/* available peripheral interrupt handler's name please refer to the startup */
+/* file (startup_stm32l0xx.s). */
+/******************************************************************************/
+/**
+ * @brief This function handles RTC Auto wake-up interrupt request.
+ * @param None
+ * @retval None
+ */
+void RTC_WKUP_IRQHandler(void)
+{
+ HW_TS_RTC_Wakeup_Handler();
+}
+
+
+
+
+
+
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Src/stm_logging.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Src/stm_logging.c
new file mode 100644
index 000000000..485e84742
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Src/stm_logging.c
@@ -0,0 +1,213 @@
+
+/**
+ ******************************************************************************
+ * @file stm_logging.c
+ * @author MCD Application Team
+ * @brief 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 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/BLE_Thread/Ble_Thread_Dyn/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/Core/Src/system_stm32wbxx.c
new file mode 100644
index 000000000..e3025c7f9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/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_Thread/Ble_Thread_Dyn/EWARM/ble_thread_dyn.ewd b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/EWARM/ble_thread_dyn.ewd
new file mode 100644
index 000000000..fd91c3f46
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/EWARM/ble_thread_dyn.ewd
@@ -0,0 +1,1419 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>no_ota</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>$PROJ_DIR$\enableCPU2.mac</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>0</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>1</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>7.60.2.11347</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>1</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>1</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state>C:\work\THREAD\GIT_THREAD\stm32wb_M0_Firmware\Projects\Multi\Application\EWARM\stm32wbxx_ble_thread_host\ble_thread_host.eww</state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state>ble_thread_host</state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state>Production</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>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></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>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>4</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>1</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>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></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>2</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>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>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>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>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <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>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_Thread/Ble_Thread_Dyn/EWARM/ble_thread_dyn.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/EWARM/ble_thread_dyn.ewp
new file mode 100644
index 000000000..15778da4c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/EWARM/ble_thread_dyn.ewp
@@ -0,0 +1,1389 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>no_ota</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>1</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>STM32WB55xx</state>
+ <state>ST_OT_DEBUG</state>
+ <state>OPENTHREAD_CONFIG_FILE=&lt;openthread_api_config_concurrent.h&gt;</state>
+ <state>THREAD_WB</state>
+ <state>DYNAMIC_MODE</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\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</state>
+ <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$\..\..\..\..\..\..\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</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\ble</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\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>
+ </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>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>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_it.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm_logging.c</name>
+ </file>
+ </group>
+ </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\app_thread.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>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\system_stm32wbxx.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_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_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_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>
+ </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\p2p_stm.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>
+ <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\openthread_api_wb.h</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/BLE_Thread/Ble_Thread_Dyn/EWARM/ble_thread_dyn.eww b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/EWARM/ble_thread_dyn.eww
new file mode 100644
index 000000000..a0fb7e4e2
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/EWARM/ble_thread_dyn.eww
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workspace>
+ <project>
+ <path>$WS_DIR$\ble_thread_dyn.ewp</path>
+ </project>
+ <batchBuild />
+</workspace>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/EWARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..79b0e7edd
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/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/BLE_Thread/Ble_Thread_Dyn/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/EWARM/stm32wb55xx_flash_cm4.icf
new file mode 100644
index 000000000..1e5877770
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/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__ = 0x20027FFF;
+/*-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_Thread/Ble_Thread_Dyn/STM32_WPAN/App/app_ble.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/app_ble.c
new file mode 100644
index 000000000..db50f200f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/app_ble.c
@@ -0,0 +1,1148 @@
+/* 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 "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"
+
+/* 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;
+
+ 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
+
+/* 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;
+
+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 */,
+ CFG_FEATURE_THREAD_SWITCH /* 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
+
+/* 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 );
+#ifndef DYNAMIC_MODE
+static void Adv_Cancel_Req( void );
+#endif
+static void Switch_OFF_GPIO( void );
+#if(L2CAP_REQUEST_NEW_CONN_PARAM != 0)
+static void BLE_SVC_L2CAP_Conn_Update(uint16_t Connection_Handle);
+#endif
+
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APP_BLE_Init_Dyn_1( 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_CANCEL_ID, UTIL_SEQ_RFU, Adv_Cancel);
+ /**
+ * 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();
+#ifndef DYNAMIC_MODE
+ /**
+ * 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);
+#endif
+ /**
+ * 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);
+ return;
+}
+
+void APP_BLE_Init_Dyn_2( void ) {
+ /**
+ * 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
+ */
+#ifndef DYNAMIC_MODE
+ Adv_Request(APP_BLE_FAST_ADV);
+#else
+ Adv_Request(APP_BLE_LP_ADV);
+#endif
+/* 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;
+
+ 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");
+ 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 */
+
+ /* 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 0x0004:
+ /* 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;
+}
+
+/* USER CODE BEGIN FD*/
+void APP_BLE_Key_Button1_Action(void)
+{
+ P2PS_APP_SW1_Button_Action();
+}
+
+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);
+
+ }
+ return;
+#endif
+}
+
+void APP_BLE_Key_Button3_Action(void)
+{
+}
+
+void APP_BLE_Stop(void)
+{
+ /* BLE STOP Procedure */
+ aci_hal_stack_reset();
+
+ APP_DBG("INSERT SOME WAIT");
+ HAL_Delay(100);
+
+ /* Stop Advertising Timer */
+ HW_TS_Stop(BleApplicationContext.Advertising_mgr_timer_Id);
+ HW_TS_Delete(BleApplicationContext.Advertising_mgr_timer_Id);
+}
+/* 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 = "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();
+ }
+}
+
+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");
+ }
+ 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("\n\rSuccessfully Start Low Power Advertising \n\r");
+ }
+ }
+ else
+ {
+ if (New_Status == APP_BLE_FAST_ADV)
+ {
+ APP_DBG_MSG("Start Fast Advertising Failed , result: %d \n\r", 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;
+}
+
+#ifndef DYNAMIC_MODE
+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;
+}
+#endif
+
+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
+
+/* 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_Thread/Ble_Thread_Dyn/STM32_WPAN/App/app_ble.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/app_ble.h
new file mode 100644
index 000000000..2daaab3d7
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/app_ble.h
@@ -0,0 +1,92 @@
+/* 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 ---------------------------------------------*/
+#ifndef DYNAMIC_MODE
+ void APP_BLE_Init( void );
+#else
+ void APP_BLE_Init_Dyn_1( void );
+ void APP_BLE_Init_Dyn_2( void );
+#endif
+ 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);
+void APP_BLE_Stop(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_Thread/Ble_Thread_Dyn/STM32_WPAN/App/app_thread.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/app_thread.c
new file mode 100644
index 000000000..5a8194ab9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/app_thread.c
@@ -0,0 +1,1004 @@
+/**
+ ******************************************************************************
+ * @file app_thread.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
+ *
+ ******************************************************************************
+ */
+
+
+/* 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 defines -----------------------------------------------------------*/
+#define C_SIZE_CMD_STRING 256U
+#define C_PANID 0x2222U
+#define C_CHANNEL_NB 12U
+#define C_RESSOURCE "light"
+
+#define COAP_SEND_TIMEOUT (1*100*1000/CFG_TS_TICK_VAL) /**< 1s */
+#define THREAD_CHANGE_MODE_TIMEOUT (1*1000*1000/CFG_TS_TICK_VAL) /**< 1s */
+#define THREAD_LINK_POLL_PERIOD (5*1000*1000/CFG_TS_TICK_VAL) /**< 5s */
+
+#define OT_AUTOSTART_MODE 1 // Automatic OT start and COAP after reset
+ // ste to 0 for GRL testing
+/* 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);
+
+static void Send_CLI_To_M0(void);
+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) */
+
+/* USER CODE BEGIN PFP */
+static void APP_THREAD_SendCoapMsg(void);
+static void APP_THREAD_SendCoapMulticastRequest(uint8_t command);
+static void APP_THREAD_CoapRequestHandler(void * pContext,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo);
+
+static void APP_THREAD_SetSleepyEndDeviceMode(void);
+static void APP_THREAD_CoapTimingElapsed(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;
+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_Ressource = {C_RESSOURCE, APP_THREAD_CoapRequestHandler,"myCtx", NULL};
+static otMessageInfo OT_MessageInfo = {0};
+static uint8_t OT_Command = 0;
+static otCoapHeader OT_Header = {0};
+static uint8_t OT_ReceivedCommand = 0;
+static otMessage * pOT_Message = NULL;
+static otLinkModeConfig OT_LinkMode = {0};
+static uint32_t sleepyEndDeviceFlag = FALSE;
+static uint8_t sedCoapTimerID;
+static uint8_t setThreadModeTimerID;
+
+/* Debug */
+static uint32_t DebugRxCoapCpt = 0;
+static uint32_t DebugTxCoapCpt = 0;
+/* USER CODE END PV */
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Main entry point for the Thread Application
+ * @param none
+ * @retval None
+ */
+void APP_THREAD_Init_Dyn_1( 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);
+ UTIL_SEQ_RegTask( 1<<(uint32_t)CFG_TASK_COAP_MSG_BUTTON, UTIL_SEQ_RFU, APP_THREAD_SendCoapMsg);
+
+ UTIL_SEQ_RegTask( 1<<(uint32_t)CFG_TASK_COAP_SEND_MSG, UTIL_SEQ_RFU,APP_THREAD_SendCoapMsg);
+ UTIL_SEQ_RegTask( 1<<(uint32_t)CFG_TASK_SET_THREAD_MODE, UTIL_SEQ_RFU,APP_THREAD_SetSleepyEndDeviceMode);
+}
+
+void APP_THREAD_Init_Dyn_2(void) {
+ /* Initialize and configure the Thread device*/
+ APP_THREAD_DeviceConfig();
+
+ /**
+ * Create timer to handle COAP request sending
+ */
+ HW_TS_Create(CFG_TIM_PROC_ID_ISR, &sedCoapTimerID, hw_ts_Repeated, APP_THREAD_CoapTimingElapsed);
+ /* Allow the 800_15_4 IP to enter in low power mode */
+}
+
+void APP_THREAD_Stop(void)
+{
+ otError error;
+ /* STOP THREAD */
+ error = otThreadSetEnabled(NULL, false);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_STOP,error);
+ }
+}
+
+void APP_THREAD_CleanCallbacks(void)
+{
+ otRemoveStateChangeCallback(NULL, APP_THREAD_StateNotif, NULL);
+ otCoapRemoveResource(NULL, &OT_Ressource);
+
+ /* Remove Timers if any */
+ HW_TS_Delete(setThreadModeTimerID);
+ HW_TS_Delete(sedCoapTimerID);
+}
+
+/**
+ * @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("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_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_TIMER_INIT :
+ APP_THREAD_TraceError("ERROR : ERR_TIMER_INIT ",ErrCode);
+ break;
+ case ERR_TIMER_START :
+ APP_THREAD_TraceError("ERROR : ERR_TIMER_START ",ErrCode);
+ break;
+ case ERR_THREAD_CHECK_WIRELESS :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_CHECK_WIRELESS ",ErrCode);
+ break;
+ default :
+ APP_THREAD_TraceError("ERROR Unknown ",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;
+#ifndef DYNAMIC_MODE
+ /* Configure the standard values */
+ error = otInstanceErasePersistentInfo(NULL);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_ERASE_PERSISTENT_INFO,error);
+ }
+#endif
+ otInstanceFinalize(NULL);
+ otInstanceInitSingle();
+ error = otSetStateChangedCallback(NULL, APP_THREAD_StateNotif, NULL);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_SET_STATE_CB,error);
+ }
+#if OT_AUTOSTART_MODE
+ 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);
+ }
+#ifdef DYNAMIC_MODE
+ error = otThreadSetEnabled(NULL, true);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_START,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_Ressource);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_COAP_ADD_RESSOURCE,error);
+ }
+#endif
+#endif
+}
+
+/**
+ * @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);
+ 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);
+ APP_DBG_MSG("\r\n M4: SET CFG_Evt_ThreadStop in Thread_Change_Notification \r\n\n");
+ APP_DBG("THREAD: Disabled");
+ UTIL_SEQ_SetEvt(1<<CFG_Evt_ThreadStop);
+ break;
+ case OT_DEVICE_ROLE_DETACHED:
+ BSP_LED_Off(LED2);
+ BSP_LED_Off(LED3);
+ APP_DBG("THREAD: Detached");
+ break;
+ case OT_DEVICE_ROLE_CHILD:
+ BSP_LED_Off(LED2);
+ BSP_LED_On(LED3);
+ APP_DBG("THREAD: Child");
+ //HW_TS_Start(setThreadModeTimerID, (uint32_t)THREAD_CHANGE_MODE_TIMEOUT);
+ HW_TS_Start(sedCoapTimerID, (uint32_t)COAP_SEND_TIMEOUT);
+ break;
+ case OT_DEVICE_ROLE_ROUTER :
+ BSP_LED_Off(LED2);
+ BSP_LED_On(LED3);
+ APP_DBG("THREAD: Router");
+ //HW_TS_Start(setThreadModeTimerID, (uint32_t)THREAD_CHANGE_MODE_TIMEOUT);
+ HW_TS_Start(sedCoapTimerID, (uint32_t)COAP_SEND_TIMEOUT);
+ break;
+ case OT_DEVICE_ROLE_LEADER :
+ BSP_LED_On(LED2);
+ BSP_LED_Off(LED3);
+#if OT_AUTOSTART_MODE
+ HW_TS_Start(sedCoapTimerID, (uint32_t)COAP_SEND_TIMEOUT);
+#endif
+ APP_DBG("THREAD: Leader");
+ break;
+ default:
+ BSP_LED_Off(LED2);
+ BSP_LED_Off(LED3);
+ break;
+ }
+ }
+}
+
+/**
+ * @brief Task associated to the push button.
+ * @param None
+ * @retval None
+ */
+static void APP_THREAD_SendCoapMsg(void)
+{
+ APP_DBG("APP_THREAD_SendCoapMsg");
+ APP_THREAD_SendCoapMulticastRequest(1);
+}
+/**
+ * @brief Handler called when the server receives a COAP request.
+ * @param pContext : Context
+ * @param pHeader : Header
+ * @param pMessage : Message
+ * @param pMessageInfo : Message information
+ * @retval None
+ */
+static void APP_THREAD_CoapRequestHandler(void * pContext,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo)
+{
+ do
+ {
+ if (otCoapHeaderGetType(pHeader) != OT_COAP_TYPE_NON_CONFIRMABLE)
+ {
+ break;
+ }
+
+ if (otCoapHeaderGetCode(pHeader) != OT_COAP_CODE_PUT)
+ {
+ break;
+ }
+
+ if (otMessageRead(pMessage, otMessageGetOffset(pMessage), &OT_ReceivedCommand, 1U) != 1U)
+ {
+ APP_THREAD_Error(ERR_THREAD_MESSAGE_READ, 0);
+ }
+
+ if (OT_ReceivedCommand == 1U)
+ {
+ BSP_LED_Toggle(LED3);
+ APP_DBG("**** Recept COAP nb **** %d ",DebugRxCoapCpt++);
+ }
+
+ } while (false);
+}
+
+/**
+ * @brief Send a COAP multicast request to all the devices which are connected
+ * on the Thread network
+ * @param command : Command associated to the COAP request.
+ * @retval None
+ */
+static void APP_THREAD_SendCoapMulticastRequest(uint8_t command)
+{
+ otError error = OT_ERROR_NONE;
+
+ OT_Command = command;
+
+ /* Forbid the 800_15_4 IP to enter in low power mode.
+ *
+ * Reason for that...
+ * As soon as the M0 is receiving an ot cmd, it wake up the IP 802_15_4,
+ * send the command and put back the IP 802_15_4 in sleep mode when possible.
+ * If the application send too much ot_cmd commands sequentially, the IP 802_15_4
+ * will wake up and sleep at a non reasonable speed. It is why it is advised
+ * to control when the IP 802_15_4 radio is allowed to enter in low power.
+ */
+ //SHCI_C2_RADIO_AllowLowPower(THREAD_IP,FALSE);
+
+ /* Send the COAP request */
+ do
+ {
+ otCoapHeaderInit(&OT_Header, OT_COAP_TYPE_NON_CONFIRMABLE, OT_COAP_CODE_PUT);
+ otCoapHeaderAppendUriPathOptions(&OT_Header,C_RESSOURCE);
+ otCoapHeaderSetPayloadMarker(&OT_Header);
+
+ pOT_Message = otCoapNewMessage(NULL, &OT_Header);
+ if (pOT_Message == NULL)
+ {
+ break;
+ }
+
+ error = otMessageAppend(pOT_Message, &OT_Command, sizeof(command));
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_COAP_APPEND,error);
+ break;
+ }
+
+ 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);
+
+ error = otCoapSendRequest(NULL,
+ pOT_Message,
+ &OT_MessageInfo,
+ NULL,
+ NULL);
+ } while (false);
+
+ APP_DBG("*** Send COAP nb **** %d",DebugTxCoapCpt++);
+
+ if (error != OT_ERROR_NONE && pOT_Message != NULL)
+ {
+ otMessageFree(pOT_Message);
+ APP_THREAD_Error(ERR_THREAD_COAP_SEND_REQUEST,error);
+ }
+
+ /* Allow the 800_15_4 IP to enter in low power mode */
+ //SHCI_C2_RADIO_AllowLowPower(THREAD_IP,TRUE);
+}
+
+
+/**
+ * @brief This function is used to set the sleepyEndDevice mode
+ * and configure its pool period.
+ *
+ * @param None
+ * @retval None
+ */
+static void APP_THREAD_SetSleepyEndDeviceMode(void)
+{
+ otError error = OT_ERROR_NONE;
+
+ APP_DBG("Set pool period to %d seconds", THREAD_LINK_POLL_PERIOD);
+
+ /* Set the pool period to 5 sec. It means that when the device will enter
+ * in 'sleepy end device' mode, it will send an ACK_Request every 5 sec.
+ * This message will act as keep alive message.
+ */
+ otLinkSetPollPeriod(NULL, THREAD_LINK_POLL_PERIOD);
+
+ /* Set the sleepy end device mode */
+ OT_LinkMode.mRxOnWhenIdle = 0;
+ OT_LinkMode.mSecureDataRequests = 1U;
+ OT_LinkMode.mDeviceType = 0;
+ OT_LinkMode.mNetworkData = 1U;
+
+ error = otThreadSetLinkMode(NULL,OT_LinkMode);
+ if (error != OT_ERROR_NONE)
+ APP_THREAD_Error(ERR_THREAD_LINK_MODE,error);
+
+ /* After reaching the child or router state, the system
+ * a) sets the 'sleepy end device' mode
+ * b) perform a Thread stop
+ * c) perform a Thread start.
+ *
+ * NOTE : According to the Thread specification, it is necessary to set the
+ * mode before starting Thread.
+ *
+ * A Child that has attached to its Parent indicating it is an FTD MUST NOT use Child UpdateRequest
+ * to modify its mode to MTD.
+ * As a result, you need to first detach from the network before switching from FTD to MTD at runtime,
+ * then reattach.
+ *
+ */
+ if (sleepyEndDeviceFlag == FALSE)
+ {
+ error = otThreadSetEnabled(NULL, false);
+ if (error != OT_ERROR_NONE)
+ APP_THREAD_Error(ERR_THREAD_LINK_MODE,error);
+ error = otThreadSetEnabled(NULL, true);
+ if (error != OT_ERROR_NONE)
+ APP_THREAD_Error(ERR_THREAD_LINK_MODE,error);
+ sleepyEndDeviceFlag = TRUE;
+ }
+
+ APP_DBG("Start CoAP timer for data sending");
+ /* Start the timer */
+#if OT_AUTOSTART_MODE
+ HW_TS_Start(sedCoapTimerID, (uint32_t)COAP_SEND_TIMEOUT);
+#endif
+}
+
+static void APP_THREAD_CoapTimingElapsed( void )
+{
+ UTIL_SEQ_SetTask(TASK_COAP_SEND_MSG,CFG_SCH_PRIO_1);
+}
+
+/**
+ * @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 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_DYAMIC :
+ APP_DBG("FW Type : Dynamic 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
+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_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)
+ HW_UART_Init(CFG_CLI_UART);
+ 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) */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/app_thread.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/app_thread.h
new file mode 100644
index 000000000..baefdeea1
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/app_thread.h
@@ -0,0 +1,108 @@
+
+/**
+ ******************************************************************************
+ * @file app_thread.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
+ *
+ ******************************************************************************
+ */
+
+
+/* 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 = 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_SETUP = 24U,
+ ERR_THREAD_LINK_MODE = 25U,
+ ERR_TIMER_INIT = 26U,
+ ERR_TIMER_START = 27U,
+ ERR_THREAD_ERASE_PERSISTENT_INFO = 28U,
+ ERR_THREAD_STOP = 29U,
+ ERR_THREAD_CHECK_WIRELESS
+} ErrAppliIdEnum_t;
+
+ /* Exported constants --------------------------------------------------------*/
+/* ---------------------------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+/* ---------------------------------------------------------------------------*/
+#ifndef DYNAMIC_MODE
+void APP_THREAD_Init( void );
+#else
+void APP_THREAD_Init_Dyn_1(void);
+void APP_THREAD_Init_Dyn_2(void);
+#endif
+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);
+
+void APP_THREAD_Stop(void);
+void APP_THREAD_CleanCallbacks(void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* APP_THREAD_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/ble_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/ble_conf.h
new file mode 100644
index 000000000..538713f85
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/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) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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_Thread/Ble_Thread_Dyn/STM32_WPAN/App/ble_dbg_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/ble_dbg_conf.h
new file mode 100644
index 000000000..bec936bbe
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/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) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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_Thread/Ble_Thread_Dyn/STM32_WPAN/App/p2p_server_app.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/p2p_server_app.c
new file mode 100644
index 000000000..7ca76bb29
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/p2p_server_app.c
@@ -0,0 +1,398 @@
+/* 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 "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 */
+ }
+ /* Switch to Thread */
+ 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(" \n\r");
+ /* Set "Switch Protocol" Task */
+ UTIL_SEQ_SetTask(1<<CFG_Task_Switch_Protocol,CFG_SCH_PRIO_0);
+ }
+ }
+#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_Thread/Ble_Thread_Dyn/STM32_WPAN/App/p2p_server_app.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/p2p_server_app.h
new file mode 100644
index 000000000..11e27d8a2
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/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) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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_Thread/Ble_Thread_Dyn/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/Target/hw_ipcc.c
new file mode 100644
index 000000000..e7049681d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/Target/hw_ipcc.c
@@ -0,0 +1,675 @@
+/**
+ ******************************************************************************
+ * 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 LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_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 LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_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 )
+{
+ /**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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 */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_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_Thread/Ble_Thread_Dyn/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/readme.txt
new file mode 100644
index 000000000..b69233d01
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn/readme.txt
@@ -0,0 +1,188 @@
+/**
+ @page Ble_Thread_Dyn example
+
+ @verbatim
+ ******************************************************************************
+ * @file BLE_Thread/Ble_Thread_Dyn/readme.txt
+ * @author MCD Application Team
+ * @brief Example of application using BLE and Thread protocols in Dynamic
+ * Concurrent mode.
+ ******************************************************************************
+ *
+ * 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
+
+How to use BLE application and Thread application in dynamic concurrent mode.
+
+This application requires at least 2 STM32WB55xx-Nucleo board with Dynamic Concurrent Mode Application.
+Dynamic means that application can perform at the same time BLE or Thread activities.
+
+The idea is to present a demo with a Thread Network (at least 2 Nucleo Boards
+running Ble_Thread_Dynamic application),and a a BLE connection between 1 Nucleo board running Ble_Zigbee_Dynamic application [2] with either a
+smartphone running "ST BLE Sensor" Application (available on App Store and Google Play), or another
+Nucleo board running a BLE_p2pClient application.
+
+The STM32WB55xx-Nucleo board running Ble_Thread_Dynamic application is capable
+of BLE and OpenThread activity at the same time.
+
+@par Keywords
+
+COAP,THREAD,BLE
+
+@par Directory contents
+
+ - BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/app_ble.h Header for app_ble.c module
+ - BLE_Thread/Ble_Thread_Dyn/Core/Core/Inc/app_common.h Header for all modules with common definition
+ - BLE_Thread/Ble_Thread_Dyn/Core/Core/Inc/app_conf.h Parameters configuration file of the application
+ - BLE_Thread/Ble_Thread_Dyn/Core/Core/Inc/app_entry.h Parameters configuration file of the application
+ - BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/app_thread.h Header for app_thread.c module
+ - BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/ble_conf.h BLE Services configuration
+ - BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/ble_dbg_conf.h BLE Traces configuration of the BLE services
+ - BLE_Thread/Ble_Thread_Dyn/Core/Core/Inc/hw_conf.h Configuration file of the HW
+ - BLE_Thread/Ble_Thread_Dyn/Core/Inc/main.h Header for main.c module
+ - BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/p2p_server_app.h Header for BLE P2P Server application
+ - BLE_Thread/Ble_Thread_Dyn/Core/Inc/stm32wbxx_hal_conf.h HAL configuration file
+ - BLE_Thread/Ble_Thread_Dyn/Core/Inc/stm32wbxx_it.h Interrupt handlers header file
+ - BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/app_ble.c BLE Profile implementation
+ - BLE_Thread/Ble_Thread_Dyn/Core/Core/Src/app_entry.c Initialization of the application
+ - BLE_Thread/Ble_Thread_Dyn/Core/Src/app_thread.c Thread application implementation
+ - BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/Target/hw_ipcc.c IPCC Driver
+ - BLE_Thread/Ble_Thread_Dyn/Core/Core/Src/stm32_lpm_if.c Low Power Manager Interface
+ - BLE_Thread/Ble_Thread_Dyn/Core/Core/Src/hw_timerserver.c Timer Server based on RTC
+ - BLE_Thread/Ble_Thread_Dyn/Core/Core/Src/hw_uart.c UART Driver
+ - BLE_Thread/Ble_Thread_Dyn/Core/Src/main.c Main program
+ - BLE_Thread/Ble_Thread_Dyn/STM32_WPAN/App/p2p_server_app.c BLE P2P Server application implementation
+ - BLE_Thread/Ble_Thread_Dyn/Core/Src/stm32wbxx_it.c Interrupt handlers
+ - BLE_Thread/Ble_Thread_Dyn/Core/Src/system_stm32wbxx.c stm32wbxx system source file
+
+
+@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 ?
+
+This application requests having the STM32WB5x_BLE_Thread_dynamic_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 load the proper
+Wireless Coprocessor binary.
+
+
+Minimum requirements for the demo:
+- 2 STM32WB55xx-Nucleo board in BLE Thread Dynamic Concurrent mode
+- 1 STM32WB55xx-Nucleo board running a BLE_p2pClient application
+-- OR
+- 2 STM32WB55xx-Nucleo board in BLE Thread Dynamic Concurrent mode
+- 1 Smartphone (Android/IOS) with "ST BLE Sensor" Phone Application (available on App Store and Google Play)
+ 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
+
+In order to make the program work, you must do the following:
+ - Connect each STM32WB55xx-Nucleo boards to your PC
+ - Open your preferred toolchain
+ - Rebuild all files and load your image into target memory
+ - Run the example
+
+ If you want to control this application, you can directly send and
+ retrieve OpenThread Cli commands connecting an HyperTerminal via an UART RS232 cable using
+ the following connections :
+ RXD : CN10(Pin35)
+ TXD : CN10(Pin37)with the ST_Link cable.
+ (Refer to the THREAD_Cli_Cmd application for more details)
+
+ For the Cli control and 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
+
+**** START DEMO ****
+By default, after a reset, the board will start both protocols BLE and OpenThread.
+So you BLE activity and OpenThread activity can be done in parallel :
+
+**** BLE ACTIVITY ****
+The BLE activity demonstrates a Point-to-Point communication using BLE component.
+The Peripheral device (P2P Server) starts advertising after reset.
+
+
+a)If using a Nucleo board (running a BLE_p2pClient application [3]),instead of a phone, you can start scanning by
+pressing the SW1 button the BLUE LED will light up on. After scanning complete, this Nucleo board connects itself to the
+P2P server on BLE/Thread dynamic node, and sends a BLE toggle when pressing SW1.
+As a result the RED LED toggles on the BLE/Thread device, each time the SW1 button is pressed on BLE_p2pClient board.
+
+b) If using a smartphone, then the ST BLE Sensor App (smart Phone Application) scans and can connect to the P2P Server
+by selecting = "P2PZBSRV1" entry. Once connected, the application starts to search the P2P Services & Characteristics.
+Led Button service, Led Characteristic and Button Characteristic are discovered at this stage
+(this service is ST specific).
+Once the smartphone is connected, the user can interact with the board by pressing
+"LED1 CONTROL" field which toggles LED1 (Blue) on the board.
+You can also use the button 2 on the Nucleo board to send a message to the smartphone application to toggle the bell icon
+on the UI.
+
+
+**** THREAD ACTIVITY ****
+After reset, OpenThread is started and nodes tries to build up a Thread network or attach to a existing one
+(at least 2 boards running THREAD_FTD_Coap_Multicast application).
+
+In a Thread network, 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 at least two devices, one device will act as a Leader (Router)
+and the other will act as child or router.
+
+After the network building, one board will be in Leader mode the other one will be in Child/Router mode.
+The leader will then start to send every seconds a multicast COAP Message which will toggle LED3 (Red) of the receivers.
+Button 1 is also dedicated to multicast COAP message sending, with same effect on receivers and can be used whatever
+the node role in the network.
+If you want to control this application, you can directly send and
+retrieve OpenThread Cli commands connecting an HyperTerminal with the ST_Link cable.
+(Refer to the THREAD_Cli_Cmd application for more details)
+User can trigger a channel scan for instance.
+
+**** BUTTON/LED SUMMARY ****
+LED Mapping :
+- LED 1 Blue : BLE dedicated, toggle on ST BLE Sensor App request
+- LED 2 Green : reflect Radio Activity (On:BLE, Off:15.4)
+- LED 3 Red : 15.4 dedicated, Toggle on COAP message reception
+
+Button Mapping :
+- Button 1 : Send a Multicast COAP Message to toggle Other's node Red LED 3
+- Button 2 : Send a BLE Message to BLE Sensor App to toggle bell icon
+
+ * <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
+ */
+ \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/app_common.h
new file mode 100644
index 000000000..0d38b869d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/app_common.h
@@ -0,0 +1,124 @@
+/**
+ ******************************************************************************
+ * @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"
+#include "stm_logging.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 *
+ * -------------------------------- */
+
+#ifndef MAX
+#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+
+#ifndef MIN
+#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
+
+#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_Thread/Ble_Thread_Dyn_SED/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/app_conf.h
new file mode 100644
index 000000000..4f6185c6e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/app_conf.h
@@ -0,0 +1,625 @@
+/**
+ ******************************************************************************
+ * 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
+ ******************************************************************************/
+
+/**< 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 (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
+
+
+/**
+* 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
+
+/******************************************************************************
+ * 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 BLE_PREP_WRITE_X_ATT(CFG_BLE_MAX_ATT_MTU)
+
+/**
+ * Number of allocated memory blocks
+ */
+#define CFG_BLE_MBLOCK_COUNT (BLE_MBLOCKS_CALC(CFG_BLE_PREPARE_WRITE_LIST_SIZE, CFG_BLE_MAX_ATT_MTU, CFG_BLE_NUM_LINK))
+
+/**
+ * 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
+ ******************************************************************************/
+#define CFG_DEBUG_TRACE_UART hw_uart1
+#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 1
+
+#if (CFG_FULL_LOW_POWER == 1)
+#undef CFG_LPM_SUPPORTED
+#define CFG_LPM_SUPPORTED 1
+#endif /* CFG_FULL_LOW_POWER */
+
+/* FOR DEBUGGING ONLY ! */
+//#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
+
+#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
+ *****************************************************************************/
+
+ /**
+ * 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_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
+ ******************************************************************************/
+
+/**
+ * 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
+{
+ /* BLE */
+ CFG_TASK_ADV_CANCEL_ID,
+ CFG_TASK_SW1_BUTTON_PUSHED_ID,
+ CFG_TASK_HCI_ASYNCH_EVT_ID,
+
+ /* Thread */
+ CFG_TASK_COAP_MSG_BUTTON,
+ CFG_TASK_MSG_FROM_M0_TO_M4,
+ CFG_TASK_SEND_CLI_TO_M0,
+ CFG_TASK_COAP_SEND_MSG,
+ CFG_TASK_SET_THREAD_MODE,
+
+ /* Concurrent System */
+ CFG_Task_Switch_Protocol,
+
+ 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_SCH_PRIO_1,
+ CFG_PRIO_NBR,
+} CFG_SCH_Prio_Id_t;
+
+#define TASK_COAP_MSG_BUTTON (1U << CFG_TASK_COAP_MSG_BUTTON)
+#define TASK_MSG_FROM_M0_TO_M4 (1U << CFG_TASK_MSG_FROM_M0_TO_M4)
+#define TASK_COAP_SEND_MSG (1U << CFG_TASK_COAP_SEND_MSG)
+#define TASK_SET_THREAD_MODE (1U << CFG_TASK_SET_THREAD_MODE)
+/**
+ * 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,
+ /* THREAD */
+ CFG_EVT_ACK_FROM_M0_EVT,
+ CFG_EVT_SYNCHRO_BYPASS_IDLE,
+ CFG_Evt_ThreadStop,
+} 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)
+
+/******************************************************************************
+ * 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_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
+
+
+typedef enum
+{
+ BUTTON_1 = 0x1,
+} button_type_t;
+
+#endif /* APP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/app_entry.h
new file mode 100644
index 000000000..1e7fcbf1f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/app_entry.h
@@ -0,0 +1,53 @@
+
+/**
+ ******************************************************************************
+ * @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
+
+#include "stm32wbxx_hal.h"
+#include "stm32_seq.h"
+#include "tl.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+ /* Exported types ------------------------------------------------------------*/
+ /* Exported constants --------------------------------------------------------*/
+ /* External variables --------------------------------------------------------*/
+ /* Exported macros -----------------------------------------------------------*/
+ /* Exported functions ------------------------------------------------------- */
+ void APPE_Init( void );
+ void APP_ENTRY_RegisterCmdBuffer(TL_CmdPacket_t* p_buffer);
+ void APP_ENTRY_ProcessMsgM0ToM4(void);
+ void APP_ENTRY_Init_CFG_CLI_UART(void);
+ void APP_ENTRY_TL_THREAD_INIT(void);
+ void UTIL_SEQ_EvtIdle( UTIL_SEQ_bm_t task_id_bm, UTIL_SEQ_bm_t evt_waited_bm );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __APP_ENTRY_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/hw_conf.h
new file mode 100644
index 000000000..3a86a4e83
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/hw_conf.h
@@ -0,0 +1,249 @@
+/**
+ ******************************************************************************
+ * @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 */
+#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.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/hw_if.h
new file mode 100644
index 000000000..271a222a9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_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/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/main.h
new file mode 100644
index 000000000..bbe71a4da
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/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_Thread/Ble_Thread_Dyn_SED/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/stm32_lpm_if.h
new file mode 100644
index 000000000..d8e67947f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_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/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/stm32wbxx_hal_conf.h
new file mode 100644
index 000000000..f37437884
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/stm32wbxx_hal_conf.h
@@ -0,0 +1,349 @@
+/**
+ ******************************************************************************
+ * @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_Thread/Ble_Thread_Dyn_SED/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/stm32wbxx_it.h
new file mode 100644
index 000000000..46179c211
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/stm32wbxx_it.h
@@ -0,0 +1,62 @@
+/**
+ ******************************************************************************
+ * @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 IPCC_C1_RX_IRQHandler(void);
+void IPCC_C1_TX_IRQHandler(void);
+void EXTI4_IRQHandler(void);
+void EXTI0_IRQHandler(void);
+void EXTI1_IRQHandler(void);
+void USART1_IRQHandler(void);
+void DMA2_Channel4_IRQHandler(void);
+void CFG_HW_USART1_DMA_TX_IRQHandler( void );
+void RTC_WKUP_IRQHandler(void);
+void LPUART1_IRQHandler(void);
+void DMA1_Channel4_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_Thread/Ble_Thread_Dyn_SED/Core/Inc/stm_logging.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/stm_logging.h
new file mode 100644
index 000000000..43bc513d6
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/stm_logging.h
@@ -0,0 +1,67 @@
+/**
+ ******************************************************************************
+ * @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.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/utilities_conf.h
new file mode 100644
index 000000000..4dde3509a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_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/BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/app_entry.c
new file mode 100644
index 000000000..38612be55
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/app_entry.c
@@ -0,0 +1,516 @@
+/* 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 "dbg_trace.h"
+#include "shci_tl.h"
+#include "stm32_lpm.h"
+#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 */
+
+/* Private defines -----------------------------------------------------------*/
+/* POOL_SIZE = 2(TL_PacketHeader_t) + 258 (3(TL_EVT_HDR_SIZE) + 255(Payload 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 macros ------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+
+extern RTC_HandleTypeDef hrtc; /**< RTC handler declaration */
+
+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];
+
+/* Global variables ----------------------------------------------------------*/
+
+/* Global function prototypes -----------------------------------------------*/
+#if(CFG_DEBUG_TRACE != 0)
+size_t DbgTraceWrite(int handle, const unsigned char * buf, size_t bufSize);
+#endif
+
+/* USER CODE BEGIN GFP */
+
+/* USER CODE END GFP */
+
+/* Private functions 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 */
+
+static void displayConcurrentMode(void);
+
+/* Functions Definition ------------------------------------------------------*/
+void APPE_Init( void )
+{
+ /* Configure the system Power Mode */
+ SystemPower_Config();
+
+ /* Initialize the TimerServer */
+ HW_TS_Init(hw_ts_InitMode_Full, &hrtc);
+
+/* USER CODE BEGIN APPE_Init_1 */
+ /* initialize debugger module if supported and debug trace if activated */
+ Init_Debug();
+
+ /* Display Dynamic concurrent mode (BLE and Thread) */
+ displayConcurrentMode();
+
+ /**
+ * 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 */
+ /* Initialize all transport layers and start CPU2 which will send back a ready event to CPU1 */
+ appe_Tl_Init();
+
+ /**
+ * 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;
+}
+
+static void displayConcurrentMode()
+{
+ APP_DBG("Dynamic Concurrent Mode BLE/OpenThread starting...");
+}
+
+/*************************************************************
+ *
+ * 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 EXTI lines */
+ LL_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+ LL_C2_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+
+#else
+ /* Disable debugger EXTI lines */
+ LL_EXTI_DisableIT_32_63(LL_EXTI_LINE_48);
+ LL_C2_EXTI_DisableIT_32_63(LL_EXTI_LINE_48);
+
+ 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();
+
+ /**
+ * Do not keep debugger enabled while in any low power mode
+ */
+ 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 )
+{
+ // Before going to stop or standby modes, do the settings so that system clock and IP80215.4 clock
+ // start on HSI automatically
+ LL_RCC_HSI_EnableAutoFromStop();
+
+ /**
+ * 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( );
+
+ /* 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
+ */
+ HAL_PWREx_EnableVddUSB();
+#endif
+
+ /* Enable RAM1 (because OT instance.o is located here for Concurrent Mode */
+ LL_C2_AHB1_GRP1_EnableClock(LL_C2_AHB1_GRP1_PERIPH_SRAM1);
+ LL_C2_AHB1_GRP1_EnableClockSleep(LL_C2_AHB1_GRP1_PERIPH_SRAM1);
+
+ 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 == FUS_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( );
+
+ /* In the Context of Dynamic Concurrent mode, the Init and start of each stack must be split and executed
+ * in the following order :
+ * APP_BLE_Init_Dyn_1() : BLE Stack Init until it's ready to start ADV
+ * APP_THREAD_Init_Dyn_1() : Thread Stack Init until it's ready to be configured (default channel, PID, etc...)
+ * APP_BLE_Init_Dyn_2() : Start ADV
+ * APP_THREAD_Init_Dyn_2() : Thread Stack configuration (default channel, PID, etc...) to be able to start scanning
+ * or joining a Thread Network
+ */
+ APP_DBG("1- Initialisation of BLE Stack...");
+ APP_BLE_Init_Dyn_1();
+ APP_DBG("2- Initialisation of OpenThread Stack. FW info :");
+ APP_THREAD_Init_Dyn_1();
+
+ APP_DBG("3- Start BLE ADV...");
+ APP_BLE_Init_Dyn_2();
+ APP_DBG("4- Configure OpenThread (Channel, PANID, IPv6 stack, ...) and Start it...");
+ APP_THREAD_Init_Dyn_2();
+
+#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;
+}
+
+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);
+
+ BSP_LED_On(LED_GREEN);
+#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:
+ /* Block all tasks and wait until the event CFG_Evt_AckFromM0Evt is scheduled */
+ 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 :
+ 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_ID, CFG_SCH_PRIO_0);
+ return;
+}
+
+void shci_cmd_resp_release(uint32_t flag)
+{
+ UNUSED(flag);
+ UTIL_SEQ_SetEvt(1U << CFG_IDLEEVT_HCI_CMD_EVT_RSP_ID);
+ return;
+}
+
+void shci_cmd_resp_wait(uint32_t timeout)
+{
+ UNUSED(timeout);
+ UTIL_SEQ_WaitEvt(1U << CFG_IDLEEVT_HCI_CMD_EVT_RSP_ID);
+ 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 Initialization of the trace mechanism
+ * @param None
+ * @retval None
+ */
+#if(CFG_DEBUG_TRACE != 0)
+void DbgOutputInit( void )
+{
+#if (CFG_HW_USART1_ENABLED == 1)
+ HW_UART_Init(CFG_DEBUG_TRACE_UART);
+#endif
+ 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
+
+/**
+ * @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:
+ APP_DBG("BUTTON 1 PUSHED ! : COAP MESSAGE SENDING");
+ UTIL_SEQ_SetTask(TASK_COAP_MSG_BUTTON,CFG_SCH_PRIO_0);
+ break;
+
+ case BUTTON_SW2_PIN:
+ APP_DBG("BUTTON 2 PUSHED ! : BLE BELL TOGGLE");
+ /* Set "Switch Protocol" Task */
+ APP_BLE_Key_Button1_Action();
+ break;
+
+ case BUTTON_SW3_PIN:
+ APP_DBG("BUTTON 3 PUSHED ! : NO ACTION MAPPED ON SW3");
+ APP_BLE_Key_Button3_Action();
+ break;
+
+ default:
+ break;
+ }
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/hw_timerserver.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/hw_timerserver.c
new file mode 100644
index 000000000..c842ba55e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_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/BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/hw_uart.c
new file mode 100644
index 000000000..7d28f9582
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/hw_uart.c
@@ -0,0 +1,465 @@
+/**
+ ******************************************************************************
+ * @file hw_uart.c
+ * @author MCD Application Team
+ * @brief hardware access
+ ******************************************************************************
+ * @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 "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{ \
+ /* Enable GPIO clock */ \
+ CFG_HW_##__USART_BASE__##_TX_PORT_CLK_ENABLE(); \
+ \
+ /* Enable USART clock */ \
+ __HAL_RCC_##__USART_BASE__##_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); \
+ \
+ 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); \
+ \
+ 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); \
+ \
+ 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)
+{
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+
+ 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.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/main.c
new file mode 100644
index 000000000..3b3d8d233
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/main.c
@@ -0,0 +1,320 @@
+/**
+ ******************************************************************************
+ * @file : main.c
+ * @brief : Main program body
+ *
+ @verbatim
+ ==============================================================================
+ ##### IMPORTANT NOTE #####
+ ==============================================================================
+
+ This application requests having the stm32wb5x_BLE_Thread_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"
+
+/* 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 );
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Main program
+ * @param None
+ * @retval None
+ */
+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 Init_Exti( void )
+{
+ /**< Disable all wakeup interrupt on CPU1 except LPUART(25), IPCC(36), HSEM(38) */
+ LL_EXTI_DisableIT_0_31( (~0) & (~(LL_EXTI_LINE_25)) );
+ 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; /**< 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
+ */
+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
+
+ /**
+ * 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;
+}
+
+/*************************************************************
+ *
+ * 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_Thread/Ble_Thread_Dyn_SED/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/stm32_lpm_if.c
new file mode 100644
index 000000000..27141b2a2
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/stm32_lpm_if.c
@@ -0,0 +1,295 @@
+/* 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
+ */
+ Switch_On_HSI( );
+ }
+ }
+ else
+ {
+ /**
+ * The switch on HSI before entering Stop Mode is required
+ */
+ 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_Thread/Ble_Thread_Dyn_SED/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/stm32wbxx_it.c
new file mode 100644
index 000000000..8c7f63d4c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/stm32wbxx_it.c
@@ -0,0 +1,188 @@
+/**
+ ******************************************************************************
+ * @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 "stm32wbxx_it.h"
+#include "app_common.h"
+
+/* CONCURRENT MODE BLE/THREAD */
+/* External variables -----------------------------------------------------------*/
+extern uint8_t ThreadEnable;
+
+/* /THREAD */
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+/* 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)
+{
+ /* 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();
+}
+
+ 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 External line
+ * interrupt request.
+ * @param None
+ * @retval None
+ */
+void PUSH_BUTTON_SW1_EXTI_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW1_PIN);
+}
+
+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);
+}
+
+#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
+
+
+/******************************************************************************/
+/* STM32L0xx Peripherals Interrupt Handlers */
+/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */
+/* available peripheral interrupt handler's name please refer to the startup */
+/* file (startup_stm32l0xx.s). */
+/******************************************************************************/
+/**
+ * @brief This function handles RTC Auto wake-up interrupt request.
+ * @param None
+ * @retval None
+ */
+void RTC_WKUP_IRQHandler(void)
+{
+ HW_TS_RTC_Wakeup_Handler();
+}
+
+
+
+
+
+
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/stm_logging.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/stm_logging.c
new file mode 100644
index 000000000..485e84742
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/stm_logging.c
@@ -0,0 +1,213 @@
+
+/**
+ ******************************************************************************
+ * @file stm_logging.c
+ * @author MCD Application Team
+ * @brief 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 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/BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/system_stm32wbxx.c
new file mode 100644
index 000000000..e3025c7f9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/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_Thread/Ble_Thread_Dyn_SED/EWARM/ble_thread_Dyn_SED.ewd b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/EWARM/ble_thread_Dyn_SED.ewd
new file mode 100644
index 000000000..fd91c3f46
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/EWARM/ble_thread_Dyn_SED.ewd
@@ -0,0 +1,1419 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>no_ota</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>$PROJ_DIR$\enableCPU2.mac</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>0</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>1</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>7.60.2.11347</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>1</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>1</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state>C:\work\THREAD\GIT_THREAD\stm32wb_M0_Firmware\Projects\Multi\Application\EWARM\stm32wbxx_ble_thread_host\ble_thread_host.eww</state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state>ble_thread_host</state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state>Production</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>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></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>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>4</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>1</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>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></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>2</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>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>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>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>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <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>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_Thread/Ble_Thread_Dyn_SED/EWARM/ble_thread_Dyn_SED.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/EWARM/ble_thread_Dyn_SED.ewp
new file mode 100644
index 000000000..15778da4c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/EWARM/ble_thread_Dyn_SED.ewp
@@ -0,0 +1,1389 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>no_ota</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>1</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>STM32WB55xx</state>
+ <state>ST_OT_DEBUG</state>
+ <state>OPENTHREAD_CONFIG_FILE=&lt;openthread_api_config_concurrent.h&gt;</state>
+ <state>THREAD_WB</state>
+ <state>DYNAMIC_MODE</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\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</state>
+ <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$\..\..\..\..\..\..\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</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\ble</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\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>
+ </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>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>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_it.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\stm_logging.c</name>
+ </file>
+ </group>
+ </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\app_thread.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>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\system_stm32wbxx.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_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_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_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>
+ </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\p2p_stm.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>
+ <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\openthread_api_wb.h</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/BLE_Thread/Ble_Thread_Dyn_SED/EWARM/ble_thread_Dyn_SED.eww b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/EWARM/ble_thread_Dyn_SED.eww
new file mode 100644
index 000000000..c3fa0d1ce
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/EWARM/ble_thread_Dyn_SED.eww
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workspace>
+ <project>
+ <path>$WS_DIR$\ble_thread_Dyn_SED.ewp</path>
+ </project>
+ <batchBuild />
+</workspace>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/EWARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..79b0e7edd
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/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/BLE_Thread/Ble_Thread_Dyn_SED/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/EWARM/stm32wb55xx_flash_cm4.icf
new file mode 100644
index 000000000..1e5877770
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/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__ = 0x20027FFF;
+/*-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_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/app_ble.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/app_ble.c
new file mode 100644
index 000000000..db50f200f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/app_ble.c
@@ -0,0 +1,1148 @@
+/* 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 "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"
+
+/* 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;
+
+ 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
+
+/* 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;
+
+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 */,
+ CFG_FEATURE_THREAD_SWITCH /* 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
+
+/* 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 );
+#ifndef DYNAMIC_MODE
+static void Adv_Cancel_Req( void );
+#endif
+static void Switch_OFF_GPIO( void );
+#if(L2CAP_REQUEST_NEW_CONN_PARAM != 0)
+static void BLE_SVC_L2CAP_Conn_Update(uint16_t Connection_Handle);
+#endif
+
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APP_BLE_Init_Dyn_1( 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_CANCEL_ID, UTIL_SEQ_RFU, Adv_Cancel);
+ /**
+ * 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();
+#ifndef DYNAMIC_MODE
+ /**
+ * 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);
+#endif
+ /**
+ * 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);
+ return;
+}
+
+void APP_BLE_Init_Dyn_2( void ) {
+ /**
+ * 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
+ */
+#ifndef DYNAMIC_MODE
+ Adv_Request(APP_BLE_FAST_ADV);
+#else
+ Adv_Request(APP_BLE_LP_ADV);
+#endif
+/* 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;
+
+ 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");
+ 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 */
+
+ /* 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 0x0004:
+ /* 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;
+}
+
+/* USER CODE BEGIN FD*/
+void APP_BLE_Key_Button1_Action(void)
+{
+ P2PS_APP_SW1_Button_Action();
+}
+
+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);
+
+ }
+ return;
+#endif
+}
+
+void APP_BLE_Key_Button3_Action(void)
+{
+}
+
+void APP_BLE_Stop(void)
+{
+ /* BLE STOP Procedure */
+ aci_hal_stack_reset();
+
+ APP_DBG("INSERT SOME WAIT");
+ HAL_Delay(100);
+
+ /* Stop Advertising Timer */
+ HW_TS_Stop(BleApplicationContext.Advertising_mgr_timer_Id);
+ HW_TS_Delete(BleApplicationContext.Advertising_mgr_timer_Id);
+}
+/* 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 = "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();
+ }
+}
+
+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");
+ }
+ 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("\n\rSuccessfully Start Low Power Advertising \n\r");
+ }
+ }
+ else
+ {
+ if (New_Status == APP_BLE_FAST_ADV)
+ {
+ APP_DBG_MSG("Start Fast Advertising Failed , result: %d \n\r", 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;
+}
+
+#ifndef DYNAMIC_MODE
+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;
+}
+#endif
+
+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
+
+/* 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_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/app_ble.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/app_ble.h
new file mode 100644
index 000000000..2daaab3d7
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/app_ble.h
@@ -0,0 +1,92 @@
+/* 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 ---------------------------------------------*/
+#ifndef DYNAMIC_MODE
+ void APP_BLE_Init( void );
+#else
+ void APP_BLE_Init_Dyn_1( void );
+ void APP_BLE_Init_Dyn_2( void );
+#endif
+ 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);
+void APP_BLE_Stop(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_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/app_thread.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/app_thread.c
new file mode 100644
index 000000000..544f4ae59
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/app_thread.c
@@ -0,0 +1,1029 @@
+/**
+ ******************************************************************************
+ * @file app_thread.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
+ *
+ ******************************************************************************
+ */
+
+
+/* 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 defines -----------------------------------------------------------*/
+#define C_SIZE_CMD_STRING 256U
+#define C_PANID 0x2222U
+#define C_CHANNEL_NB 12U
+#define C_RESSOURCE "light"
+
+#define COAP_SEND_TIMEOUT (1*1000*1000/CFG_TS_TICK_VAL) /**< 1s */
+#define THREAD_CHANGE_MODE_TIMEOUT (1*1000*1000/CFG_TS_TICK_VAL) /**< 1s */
+#define THREAD_LINK_POLL_PERIOD (5*1000*1000/CFG_TS_TICK_VAL) /**< 5s */
+
+#define OT_AUTOSTART_MODE 1 // Automatic OT start and COAP after reset
+ // set to 0 for GRL testing
+#define OT_COAP_START 0 // Automatic COAP start
+/* 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) */
+
+/* USER CODE BEGIN PFP */
+static void APP_THREAD_SendCoapMsg(void);
+static void APP_THREAD_SendCoapMulticastRequest(uint8_t command);
+static void APP_THREAD_CoapRequestHandler(void * pContext,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo);
+
+static void APP_THREAD_SetSleepyEndDeviceMode(void);
+static void APP_THREAD_CoapTimingElapsed(void);
+static void APP_THREAD_SetThreadMode( 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;
+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_Ressource = {C_RESSOURCE, APP_THREAD_CoapRequestHandler,"myCtx", NULL};
+static otMessageInfo OT_MessageInfo = {0};
+static uint8_t OT_Command = 0;
+static otCoapHeader OT_Header = {0};
+static uint8_t OT_ReceivedCommand = 0;
+static otMessage * pOT_Message = NULL;
+static otLinkModeConfig OT_LinkMode = {0};
+static uint32_t sleepyEndDeviceFlag = FALSE;
+static uint8_t sedCoapTimerID;
+static uint8_t setThreadModeTimerID;
+
+/* Debug */
+static uint32_t DebugRxCoapCpt = 0;
+static uint32_t DebugTxCoapCpt = 0;
+/* USER CODE END PV */
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Main entry point for the Thread Application
+ * @param none
+ * @retval None
+ */
+void APP_THREAD_Init_Dyn_1( void )
+{
+ /* USER CODE BEGIN APP_THREAD_INIT_1 */
+ /* Do not allow stop mode before Thread is initialized */
+ UTIL_LPM_SetStopMode(1 << CFG_LPM_APP_THREAD, UTIL_LPM_DISABLE);
+ /* 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);
+ UTIL_SEQ_RegTask( 1<<(uint32_t)CFG_TASK_COAP_MSG_BUTTON, UTIL_SEQ_RFU, APP_THREAD_SendCoapMsg);
+
+ UTIL_SEQ_RegTask( 1<<(uint32_t)CFG_TASK_COAP_SEND_MSG, UTIL_SEQ_RFU,APP_THREAD_SendCoapMsg);
+ UTIL_SEQ_RegTask( 1<<(uint32_t)CFG_TASK_SET_THREAD_MODE, UTIL_SEQ_RFU,APP_THREAD_SetSleepyEndDeviceMode);
+}
+
+void APP_THREAD_Init_Dyn_2(void) {
+ /* Initialize and configure the Thread device*/
+ APP_THREAD_DeviceConfig();
+
+ /**
+ * Create timer to handle COAP request sending
+ */
+ HW_TS_Create(CFG_TIM_PROC_ID_ISR, &sedCoapTimerID, hw_ts_Repeated, APP_THREAD_CoapTimingElapsed);
+ /* Allow the 800_15_4 IP to enter in low power mode */
+ SHCI_C2_RADIO_AllowLowPower(THREAD_IP,/*TRUE*/ FALSE);
+
+ /**
+ * Create timer to change Thread Mode to SED
+ */
+ HW_TS_Create(CFG_TIM_PROC_ID_ISR, &setThreadModeTimerID, hw_ts_SingleShot, APP_THREAD_SetThreadMode);
+
+/* Allow stop mode after Thread initialization*/
+ UTIL_LPM_SetStopMode(1 << CFG_LPM_APP_THREAD, UTIL_LPM_ENABLE);
+
+}
+
+void APP_THREAD_Stop(void)
+{
+ otError error;
+ /* STOP THREAD */
+ error = otThreadSetEnabled(NULL, false);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_STOP,error);
+ }
+}
+
+void APP_THREAD_CleanCallbacks(void)
+{
+ otRemoveStateChangeCallback(NULL, APP_THREAD_StateNotif, NULL);
+ otCoapRemoveResource(NULL, &OT_Ressource);
+
+ /* Remove Timers if any */
+ HW_TS_Delete(setThreadModeTimerID);
+ HW_TS_Delete(sedCoapTimerID);
+}
+
+/**
+ * @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("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_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_TIMER_INIT :
+ APP_THREAD_TraceError("ERROR : ERR_TIMER_INIT ",ErrCode);
+ break;
+ case ERR_TIMER_START :
+ APP_THREAD_TraceError("ERROR : ERR_TIMER_START ",ErrCode);
+ break;
+ case ERR_THREAD_CHECK_WIRELESS :
+ APP_THREAD_TraceError("ERROR : ERR_THREAD_CHECK_WIRELESS ",ErrCode);
+ break;
+ default :
+ APP_THREAD_TraceError("ERROR Unknown ",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;
+#ifndef DYNAMIC_MODE
+ /* Configure the standard values */
+ error = otInstanceErasePersistentInfo(NULL);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_ERASE_PERSISTENT_INFO,error);
+ }
+#endif
+ otInstanceFinalize(NULL);
+ otInstanceInitSingle();
+ error = otSetStateChangedCallback(NULL, APP_THREAD_StateNotif, NULL);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_SET_STATE_CB,error);
+ }
+#if OT_AUTOSTART_MODE
+ 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);
+ }
+#ifdef DYNAMIC_MODE
+ error = otThreadSetEnabled(NULL, true);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_START,error);
+ }
+#if 1
+ /* 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_Ressource);
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_COAP_ADD_RESSOURCE,error);
+ }
+#endif
+#endif
+#endif
+}
+
+/**
+ * @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);
+ 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);
+ APP_DBG_MSG("\r\n M4: SET CFG_Evt_ThreadStop in Thread_Change_Notification \r\n\n");
+ APP_DBG("THREAD: Disabled");
+ UTIL_SEQ_SetEvt(1<<CFG_Evt_ThreadStop);
+ break;
+ case OT_DEVICE_ROLE_DETACHED:
+ BSP_LED_Off(LED2);
+ BSP_LED_Off(LED3);
+ APP_DBG("THREAD: Detached");
+ break;
+ case OT_DEVICE_ROLE_CHILD:
+ BSP_LED_Off(LED2);
+ BSP_LED_On(LED3);
+ APP_DBG("THREAD: Child");
+ HW_TS_Start(setThreadModeTimerID, (uint32_t)THREAD_CHANGE_MODE_TIMEOUT);
+ break;
+ case OT_DEVICE_ROLE_ROUTER :
+ BSP_LED_Off(LED2);
+ BSP_LED_On(LED3);
+ APP_DBG("THREAD: Router");
+ // HW_TS_Start(setThreadModeTimerID, (uint32_t)THREAD_CHANGE_MODE_TIMEOUT);
+ break;
+ case OT_DEVICE_ROLE_LEADER :
+ BSP_LED_On(LED2);
+ BSP_LED_Off(LED3);
+#if OT_AUTOSTART_MODE && OT_COAP_START
+ HW_TS_Start(sedCoapTimerID, (uint32_t)COAP_SEND_TIMEOUT);
+#endif
+ APP_DBG("THREAD: Leader");
+ break;
+ default:
+ BSP_LED_Off(LED2);
+ BSP_LED_Off(LED3);
+ break;
+ }
+ }
+}
+
+/**
+ * @brief Task associated to the push button.
+ * @param None
+ * @retval None
+ */
+static void APP_THREAD_SendCoapMsg(void)
+{
+ APP_DBG("APP_THREAD_SendCoapMsg");
+ APP_THREAD_SendCoapMulticastRequest(1);
+}
+/**
+ * @brief Handler called when the server receives a COAP request.
+ * @param pContext : Context
+ * @param pHeader : Header
+ * @param pMessage : Message
+ * @param pMessageInfo : Message information
+ * @retval None
+ */
+static void APP_THREAD_CoapRequestHandler(void * pContext,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo)
+{
+ do
+ {
+ if (otCoapHeaderGetType(pHeader) != OT_COAP_TYPE_NON_CONFIRMABLE)
+ {
+ break;
+ }
+
+ if (otCoapHeaderGetCode(pHeader) != OT_COAP_CODE_PUT)
+ {
+ break;
+ }
+
+ if (otMessageRead(pMessage, otMessageGetOffset(pMessage), &OT_ReceivedCommand, 1U) != 1U)
+ {
+ APP_THREAD_Error(ERR_THREAD_MESSAGE_READ, 0);
+ }
+
+ if (OT_ReceivedCommand == 1U)
+ {
+ BSP_LED_Toggle(LED3);
+ APP_DBG("**** Recept COAP nb **** %d ",DebugRxCoapCpt++);
+ }
+
+ } while (false);
+}
+
+/**
+ * @brief Send a COAP multicast request to all the devices which are connected
+ * on the Thread network
+ * @param command : Command associated to the COAP request.
+ * @retval None
+ */
+static void APP_THREAD_SendCoapMulticastRequest(uint8_t command)
+{
+ otError error = OT_ERROR_NONE;
+
+ OT_Command = command;
+
+ /* Forbid the 800_15_4 IP to enter in low power mode.
+ *
+ * Reason for that...
+ * As soon as the M0 is receiving an ot cmd, it wake up the IP 802_15_4,
+ * send the command and put back the IP 802_15_4 in sleep mode when possible.
+ * If the application send too much ot_cmd commands sequentially, the IP 802_15_4
+ * will wake up and sleep at a non reasonable speed. It is why it is advised
+ * to control when the IP 802_15_4 radio is allowed to enter in low power.
+ */
+ SHCI_C2_RADIO_AllowLowPower(THREAD_IP,FALSE);
+
+ /* Send the COAP request */
+ do
+ {
+ otCoapHeaderInit(&OT_Header, OT_COAP_TYPE_NON_CONFIRMABLE, OT_COAP_CODE_PUT);
+ otCoapHeaderAppendUriPathOptions(&OT_Header,C_RESSOURCE);
+ otCoapHeaderSetPayloadMarker(&OT_Header);
+
+ pOT_Message = otCoapNewMessage(NULL, &OT_Header);
+ if (pOT_Message == NULL)
+ {
+ break;
+ }
+
+ error = otMessageAppend(pOT_Message, &OT_Command, sizeof(command));
+ if (error != OT_ERROR_NONE)
+ {
+ APP_THREAD_Error(ERR_THREAD_COAP_APPEND,error);
+ break;
+ }
+
+ 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);
+
+ error = otCoapSendRequest(NULL,
+ pOT_Message,
+ &OT_MessageInfo,
+ NULL,
+ NULL);
+ } while (false);
+
+ APP_DBG("*** Send COAP nb **** %d",DebugTxCoapCpt++);
+
+ if (error != OT_ERROR_NONE && pOT_Message != NULL)
+ {
+ otMessageFree(pOT_Message);
+ APP_THREAD_Error(ERR_THREAD_COAP_SEND_REQUEST,error);
+ }
+
+ /* Allow the 800_15_4 IP to enter in low power mode */
+ SHCI_C2_RADIO_AllowLowPower(THREAD_IP,TRUE);
+}
+
+
+/**
+ * @brief This function is used to set the sleepyEndDevice mode
+ * and configure its pool period.
+ *
+ * @param None
+ * @retval None
+ */
+static void APP_THREAD_SetSleepyEndDeviceMode(void)
+{
+ otError error = OT_ERROR_NONE;
+
+ APP_DBG("Set pool period to %d seconds", THREAD_LINK_POLL_PERIOD);
+
+ /* Set the pool period to 5 sec. It means that when the device will enter
+ * in 'sleepy end device' mode, it will send an ACK_Request every 5 sec.
+ * This message will act as keep alive message.
+ */
+ otLinkSetPollPeriod(NULL, THREAD_LINK_POLL_PERIOD);
+
+ /* Set the sleepy end device mode */
+ OT_LinkMode.mRxOnWhenIdle = 0;
+ OT_LinkMode.mSecureDataRequests = 1U;
+ OT_LinkMode.mDeviceType = 0;
+ OT_LinkMode.mNetworkData = 1U;
+
+ error = otThreadSetLinkMode(NULL,OT_LinkMode);
+ if (error != OT_ERROR_NONE)
+ APP_THREAD_Error(ERR_THREAD_LINK_MODE,error);
+
+ /* After reaching the child or router state, the system
+ * a) sets the 'sleepy end device' mode
+ * b) perform a Thread stop
+ * c) perform a Thread start.
+ *
+ * NOTE : According to the Thread specification, it is necessary to set the
+ * mode before starting Thread.
+ *
+ * A Child that has attached to its Parent indicating it is an FTD MUST NOT use Child UpdateRequest
+ * to modify its mode to MTD.
+ * As a result, you need to first detach from the network before switching from FTD to MTD at runtime,
+ * then reattach.
+ *
+ */
+ if (sleepyEndDeviceFlag == FALSE)
+ {
+ error = otThreadSetEnabled(NULL, false);
+ if (error != OT_ERROR_NONE)
+ APP_THREAD_Error(ERR_THREAD_LINK_MODE,error);
+ error = otThreadSetEnabled(NULL, true);
+ if (error != OT_ERROR_NONE)
+ APP_THREAD_Error(ERR_THREAD_LINK_MODE,error);
+ sleepyEndDeviceFlag = TRUE;
+ }
+
+ APP_DBG("Start CoAP timer for data sending");
+ /* Start the timer */
+//#if OT_AUTOSTART_MODE && OT_COAP_START
+ HW_TS_Start(sedCoapTimerID, (uint32_t)COAP_SEND_TIMEOUT);
+//#endif
+}
+
+static void APP_THREAD_CoapTimingElapsed( void )
+{
+ UTIL_SEQ_SetTask(TASK_COAP_SEND_MSG,CFG_SCH_PRIO_1);
+}
+
+static void APP_THREAD_SetThreadMode( void )
+{
+ UTIL_SEQ_SetTask(TASK_SET_THREAD_MODE,CFG_SCH_PRIO_1);
+}
+
+/**
+ *
+ * @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 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_DYAMIC :
+ APP_DBG("FW Type : Dynamic 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);
+}
+
+// GAS
+//extern char CommandString[256];
+// uint8_t aRxBuffer[256];
+
+#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)
+ HW_UART_Init(CFG_CLI_UART);
+ 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) */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/app_thread.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/app_thread.h
new file mode 100644
index 000000000..baefdeea1
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/app_thread.h
@@ -0,0 +1,108 @@
+
+/**
+ ******************************************************************************
+ * @file app_thread.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
+ *
+ ******************************************************************************
+ */
+
+
+/* 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 = 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_SETUP = 24U,
+ ERR_THREAD_LINK_MODE = 25U,
+ ERR_TIMER_INIT = 26U,
+ ERR_TIMER_START = 27U,
+ ERR_THREAD_ERASE_PERSISTENT_INFO = 28U,
+ ERR_THREAD_STOP = 29U,
+ ERR_THREAD_CHECK_WIRELESS
+} ErrAppliIdEnum_t;
+
+ /* Exported constants --------------------------------------------------------*/
+/* ---------------------------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+/* ---------------------------------------------------------------------------*/
+#ifndef DYNAMIC_MODE
+void APP_THREAD_Init( void );
+#else
+void APP_THREAD_Init_Dyn_1(void);
+void APP_THREAD_Init_Dyn_2(void);
+#endif
+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);
+
+void APP_THREAD_Stop(void);
+void APP_THREAD_CleanCallbacks(void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* APP_THREAD_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/ble_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/ble_conf.h
new file mode 100644
index 000000000..538713f85
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/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) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/ble_dbg_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/ble_dbg_conf.h
new file mode 100644
index 000000000..bec936bbe
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/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) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/p2p_server_app.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/p2p_server_app.c
new file mode 100644
index 000000000..7ca76bb29
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/p2p_server_app.c
@@ -0,0 +1,398 @@
+/* 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 "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 */
+ }
+ /* Switch to Thread */
+ 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(" \n\r");
+ /* Set "Switch Protocol" Task */
+ UTIL_SEQ_SetTask(1<<CFG_Task_Switch_Protocol,CFG_SCH_PRIO_0);
+ }
+ }
+#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_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/p2p_server_app.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/p2p_server_app.h
new file mode 100644
index 000000000..11e27d8a2
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/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) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/Target/hw_ipcc.c
new file mode 100644
index 000000000..e7049681d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/Target/hw_ipcc.c
@@ -0,0 +1,675 @@
+/**
+ ******************************************************************************
+ * 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 LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_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 LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_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 )
+{
+ /**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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 */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_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_Thread/Ble_Thread_Dyn_SED/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/readme.txt
new file mode 100644
index 000000000..19c241d2d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Dyn_SED/readme.txt
@@ -0,0 +1,164 @@
+/**
+ @page Ble_Thread_Dyn_SED example
+
+ @verbatim
+ ******************************************************************************
+ * @file BLE_Thread/Ble_Thread_Dyn_SED/readme.txt
+ * @author MCD Application Team
+ * @brief Example of application using BLE and Thread protocols in Dynamic
+ * Concurrent mode.
+ ******************************************************************************
+ *
+ * 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
+
+How to use BLE application and Thread application in dynamic concurrent mode.
+
+This application requires 1 STM32WB55xx-Nucleo board with Dynamic Concurrent Mode Application and at least one STM32WB55xx-Nucleo with Thread FTP and Coap generic application.
+Dynamic means that application can perform at the same time BLE or Thread activities.
+
+The idea is to present a demo with a Thread Network (1 Nucleo Boards
+running Ble_Thread_Dynamic application and at least 1 Nucleo Boards running Thread FTD COAP Generic Application),and a a BLE connection between a smartphone running "ST BLE Sensor" Application (available on App Store and Google Play), or another
+Nucleo board running a BLE_p2pClient application.
+
+The STM32WB55xx-Nucleo board running Ble_Thread_Dynamic application is capable
+of BLE and OpenThread activity at the same time.
+
+@par Keywords
+
+COAP,THREAD,BLE
+
+@par Directory contents
+
+ - BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/app_ble.h Header for app_ble.c module
+ - BLE_Thread/Ble_Thread_Dyn_SED/Core/Core/Inc/app_common.h Header for all modules with common definition
+ - BLE_Thread/Ble_Thread_Dyn_SED/Core/Core/Inc/app_conf.h Parameters configuration file of the application
+ - BLE_Thread/Ble_Thread_Dyn_SED/Core/Core/Inc/app_entry.h Parameters configuration file of the application
+ - BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/app_thread.h Header for app_thread.c module
+ - BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/ble_conf.h BLE Services configuration
+ - BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/ble_dbg_conf.h BLE Traces configuration of the BLE services
+ - BLE_Thread/Ble_Thread_Dyn_SED/Core/Core/Inc/hw_conf.h Configuration file of the HW
+ - BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/main.h Header for main.c module
+ - BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/p2p_server_app.h Header for BLE P2P Server application
+ - BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/stm32wbxx_hal_conf.h HAL configuration file
+ - BLE_Thread/Ble_Thread_Dyn_SED/Core/Inc/stm32wbxx_it.h Interrupt handlers header file
+ - BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/app_ble.c BLE Profile implementation
+ - BLE_Thread/Ble_Thread_Dyn_SED/Core/Core/Src/app_entry.c Initialization of the application
+ - BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/app_thread.c Thread application implementation
+ - BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/Target/hw_ipcc.c IPCC Driver
+ - BLE_Thread/Ble_Thread_Dyn_SED/Core/Core/Src/stm32_lpm_if.c Low Power Manager Interface
+ - BLE_Thread/Ble_Thread_Dyn_SED/Core/Core/Src/hw_timerserver.c Timer Server based on RTC
+ - BLE_Thread/Ble_Thread_Dyn_SED/Core/Core/Src/hw_uart.c UART Driver
+ - BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/main.c Main program
+ - BLE_Thread/Ble_Thread_Dyn_SED/STM32_WPAN/App/p2p_server_app.c BLE P2P Server application implementation
+ - BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/stm32wbxx_it.c Interrupt handlers
+ - BLE_Thread/Ble_Thread_Dyn_SED/Core/Src/system_stm32wbxx.c stm32wbxx system source file
+
+
+@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 ?
+
+This application requests having the STM32WB5x_BLE_Thread_dynamic_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 load the proper
+Wireless Coprocessor binary.
+
+
+Minimum requirements for the demo:
+- 1 STM32WB55xx-Nucleo board in BLE Thread Dynamic Concurrent mode
+- 1 STM32WB55xx-Nucleo board running Thread FTD COAP Generic Application
+- 1 Smartphone (Android/IOS) with "ST BLE Sensor" Phone Application (available on App Store and Google Play)
+ 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
+
+In order to make the program work, you must do the following:
+ - Connect each STM32WB55xx-Nucleo boards to your PC
+ - Open your preferred toolchain
+ - Rebuild all files and load your image into target memory
+ - Run the example
+
+ If you want to control this application, you can directly send and
+ retrieve OpenThread Cli commands connecting an HyperTerminal via an UART RS232 cable using
+ the following connections :
+ RXD : CN10(Pin35)
+ TXD : CN10(Pin37)with the ST_Link cable.
+ (Refer to the THREAD_Cli_Cmd application for more details)
+
+ For the Cli control and 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
+
+**** START DEMO ****
+First start the board running Thread FTD COAP Generic Application which will turn into a Leader role (RED LED)
+Then start the board with Ble_Thread_Dyn_SED, it'll join the Leader and receive child role. As soon as it receives child role it'll start SED features and start Low Power.
+This can be checked with a power shield or any power meter.
+By default, after a reset, the board will start both protocols BLE and OpenThread.
+So you BLE activity and OpenThread activity can be done in parallel :
+
+**** BLE ACTIVITY ****
+The BLE activity demonstrates a Point-to-Point communication using BLE component.
+The Peripheral device (P2P Server) starts advertising after reset.
+
+
+If using a smartphone, then the ST BLE Sensor App (smart Phone Application) scans and can connect to the P2P Server
+by selecting = "P2PZBSRV1" entry. Once connected, the application starts to search the P2P Services & Characteristics.
+Led Button service, Led Characteristic and Button Characteristic are discovered at this stage
+(this service is ST specific).
+
+
+**** THREAD ACTIVITY ****
+After reset, OpenThread is started and nodes tries to build up a Thread network or attach to a existing one
+(at least 1 boards running THREAD_FTD_Coap_Multicast application).
+
+In a Thread network, 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 at least two devices, one device will act as a Leader (Router)
+and the other will act as child.
+
+After the network building, one board will be in Leader mode the other one will be in Child mode.
+The SED will then start to send every seconds a multicast COAP Message which will toggle LED3 (Red) of the receivers.
+
+
+ * <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
+ */
+ \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/Core/Inc/app_common.h
index ad5ea9c1d..0d38b869d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/Core/Inc/app_common.h
@@ -69,9 +69,13 @@ extern "C"
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/Core/Src/app_entry.c
index 6bf79c1f5..7e4b8e592 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/Core/Src/app_entry.c
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "main.h"
@@ -334,7 +335,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/STM32_WPAN/App/app_ble.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/STM32_WPAN/App/app_ble.c
index b403b8657..4fdd25ba5 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/STM32_WPAN/App/app_ble.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/STM32_WPAN/App/app_ble.c
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/STM32_WPAN/App/app_thread.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/STM32_WPAN/App/app_thread.c
index 690d5d626..356289177 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/STM32_WPAN/App/app_thread.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/STM32_WPAN/App/app_thread.c
@@ -70,14 +70,10 @@ static void RxCpltCallback(void);
/* USER CODE BEGIN PFP */
static void APP_THREAD_SendCoapMsg(void);
static void APP_THREAD_SendCoapMulticastRequest(uint8_t command);
-static void APP_THREAD_DummyReqHandler(void * p_context,
- otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo);
-static void APP_THREAD_CoapRequestHandler(otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo);
-
+static void APP_THREAD_CoapRequestHandler(void * pContext,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo);
static void APP_THREAD_SetSleepyEndDeviceMode(void);
static void APP_THREAD_CoapTimingElapsed(void);
static void APP_THREAD_SetThreadMode(void);
@@ -108,7 +104,7 @@ PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ThreadNotifRspEvtBuffer[size
PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t ThreadCliCmdBuffer;
/* USER CODE BEGIN PV */
-static otCoapResource OT_Ressource = {C_RESSOURCE, APP_THREAD_DummyReqHandler, (void*)APP_THREAD_CoapRequestHandler, NULL};
+static otCoapResource OT_Ressource = {C_RESSOURCE, APP_THREAD_CoapRequestHandler,"myCtx", NULL};
static otMessageInfo OT_MessageInfo = {0};
static uint8_t OT_Command = 0;
static otCoapHeader OT_Header = {0};
@@ -393,20 +389,6 @@ static void APP_THREAD_StateNotif(uint32_t NotifFlags, void *pContext)
}
}
-
-
-/**
- * @brief Dummy request handler
- * @param
- * @retval None
- */
-static void APP_THREAD_DummyReqHandler(void * p_context,
- otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo)
-{
-}
-
/**
* @brief Task associated to the push button.
* @param None
@@ -419,14 +401,16 @@ static void APP_THREAD_SendCoapMsg(void)
}
/**
* @brief Handler called when the server receives a COAP request.
+ * @param pContext : Context
* @param pHeader : Header
* @param pMessage : Message
* @param pMessageInfo : Message information
* @retval None
*/
-static void APP_THREAD_CoapRequestHandler(otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo)
+static void APP_THREAD_CoapRequestHandler(void * pContext,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo)
{
do
{
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/STM32_WPAN/App/p2p_server_app.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/STM32_WPAN/App/p2p_server_app.c
index 369375a22..7ca76bb29 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/STM32_WPAN/App/p2p_server_app.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Thread/Ble_Thread_Static/STM32_WPAN/App/p2p_server_app.c
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "dbg_trace.h"
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 a58b95cad..e7049681d 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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_Dyn/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/app_common.h
new file mode 100644
index 000000000..0d38b869d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/app_common.h
@@ -0,0 +1,124 @@
+/**
+ ******************************************************************************
+ * @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"
+#include "stm_logging.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 *
+ * -------------------------------- */
+
+#ifndef MAX
+#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+
+#ifndef MIN
+#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
+
+#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_Zigbee/BLE_Zigbee_Dyn/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/app_conf.h
new file mode 100644
index 000000000..db7e3e242
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/app_conf.h
@@ -0,0 +1,640 @@
+/**
+ ******************************************************************************
+ * 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
+ ******************************************************************************/
+
+/**< 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 CFG_LP_CONN_ADV_INTERVAL_MIN (0x12c0*2) /**< 3s */
+//#define CFG_LP_CONN_ADV_INTERVAL_MAX (0x1900*2) /**< 4s */
+
+/**
+ * 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
+
+
+/**
+* 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 CFG_LED_SUPPORTED 1
+#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
+
+
+#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 0 /* 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
+
+/******************************************************************************
+ * 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
+ ******************************************************************************/
+#define CFG_DEBUG_TRACE_UART hw_uart1
+#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
+ *****************************************************************************/
+
+/**
+
+ * 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
+
+#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
+
+/******************************************************************************
+ * 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
+{
+ /* BLE */
+ CFG_TASK_ADV_CANCEL_ID,
+ CFG_TASK_SW1_BUTTON_PUSHED_ID,
+ CFG_TASK_HCI_ASYNCH_EVT_ID,
+ CFG_TASK_APP_BLE_START,
+ CFG_TASK_APP_ADV_START,
+
+ /* Zigbee */
+ CFG_TASK_NOTIFY_FROM_M0_TO_M4,
+ CFG_TASK_REQUEST_FROM_M0_TO_M4,
+ CFG_TASK_ZIGBEE_NETWORK_FORM,
+ CFG_TASK_BUTTON_SW1,
+ CFG_TASK_BUTTON_SW2,
+ CFG_TASK_BUTTON_SW3,
+ CFG_TASK_TOGGLE_ON_OFF,
+ CFG_TASK_DBG_NWK_STATUS,
+
+ 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_SCH_PRIO_1,
+ CFG_PRIO_NBR,
+} CFG_SCH_Prio_Id_t;
+
+#define TASK_COAP_MSG_BUTTON (1U << CFG_TASK_COAP_MSG_BUTTON)
+#define TASK_MSG_FROM_M0_TO_M4 (1U << CFG_TASK_MSG_FROM_M0_TO_M4)
+/**
+ * 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,
+ /* Zigbee */
+ CFG_EVT_ACK_FROM_M0_EVT,
+ CFG_EVT_SYNCHRO_BYPASS_IDLE,
+ CFG_EVT_ZIGBEE_STOP,
+ CFG_EVT_ON_OFF_RSP,
+ CFG_EVT_ZIGBEE_STARTUP_ENDED,
+} CFG_IdleEvt_Id_t;
+
+#define EVENT_ON_OFF_RSP (1U << CFG_EVT_ON_OFF_RSP)
+#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
+
+/* 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
+ ******************************************************************************/
+#undef CFG_LED_SUPPORTED
+#undef CFG_BUTTON_SUPPORTED
+#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 */
+
+/******************************************************************************
+ * 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
+
+
+typedef enum
+{
+ BUTTON_1 = 0x1,
+} button_type_t;
+
+#endif /* APP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/app_entry.h
new file mode 100644
index 000000000..1e7fcbf1f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/app_entry.h
@@ -0,0 +1,53 @@
+
+/**
+ ******************************************************************************
+ * @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
+
+#include "stm32wbxx_hal.h"
+#include "stm32_seq.h"
+#include "tl.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+ /* Exported types ------------------------------------------------------------*/
+ /* Exported constants --------------------------------------------------------*/
+ /* External variables --------------------------------------------------------*/
+ /* Exported macros -----------------------------------------------------------*/
+ /* Exported functions ------------------------------------------------------- */
+ void APPE_Init( void );
+ void APP_ENTRY_RegisterCmdBuffer(TL_CmdPacket_t* p_buffer);
+ void APP_ENTRY_ProcessMsgM0ToM4(void);
+ void APP_ENTRY_Init_CFG_CLI_UART(void);
+ void APP_ENTRY_TL_THREAD_INIT(void);
+ void UTIL_SEQ_EvtIdle( UTIL_SEQ_bm_t task_id_bm, UTIL_SEQ_bm_t evt_waited_bm );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __APP_ENTRY_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/hw_conf.h
new file mode 100644
index 000000000..b76dd2494
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/hw_conf.h
@@ -0,0 +1,221 @@
+/**
+ ******************************************************************************
+ * @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 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 */
+#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.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/hw_if.h
new file mode 100644
index 000000000..271a222a9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/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_Zigbee/BLE_Zigbee_Dyn/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/main.h
new file mode 100644
index 000000000..bbe71a4da
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/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_Zigbee/BLE_Zigbee_Dyn/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/stm32_lpm_if.h
new file mode 100644
index 000000000..d8e67947f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/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_Zigbee/BLE_Zigbee_Dyn/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/stm32wbxx_hal_conf.h
new file mode 100644
index 000000000..f37437884
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/stm32wbxx_hal_conf.h
@@ -0,0 +1,349 @@
+/**
+ ******************************************************************************
+ * @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_Zigbee/BLE_Zigbee_Dyn/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/stm32wbxx_it.h
new file mode 100644
index 000000000..46179c211
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/stm32wbxx_it.h
@@ -0,0 +1,62 @@
+/**
+ ******************************************************************************
+ * @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 IPCC_C1_RX_IRQHandler(void);
+void IPCC_C1_TX_IRQHandler(void);
+void EXTI4_IRQHandler(void);
+void EXTI0_IRQHandler(void);
+void EXTI1_IRQHandler(void);
+void USART1_IRQHandler(void);
+void DMA2_Channel4_IRQHandler(void);
+void CFG_HW_USART1_DMA_TX_IRQHandler( void );
+void RTC_WKUP_IRQHandler(void);
+void LPUART1_IRQHandler(void);
+void DMA1_Channel4_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_Zigbee/BLE_Zigbee_Dyn/Core/Inc/stm_logging.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/stm_logging.h
new file mode 100644
index 000000000..8a6af65d6
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/stm_logging.h
@@ -0,0 +1,66 @@
+/**
+ ******************************************************************************
+ * @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.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Inc/utilities_conf.h
new file mode 100644
index 000000000..4dde3509a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/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_Zigbee/BLE_Zigbee_Dyn/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Src/app_entry.c
new file mode 100644
index 000000000..afd6ffc97
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Src/app_entry.c
@@ -0,0 +1,504 @@
+/**
+ ******************************************************************************
+ * @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_zigbee.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 "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 */
+
+/* Private defines -----------------------------------------------------------*/
+/* POOL_SIZE = 2(TL_PacketHeader_t) + 258 (3(TL_EVT_HDR_SIZE) + 255(Payload size)) */
+#define POOL_SIZE (CFG_TLBLE_EVT_QUEUE_LENGTH*4*DIVC(( sizeof(TL_PacketHeader_t) + TL_BLE_EVENT_FRAME_SIZE ), 4))
+#define T_1S_NB_TICKS (1*1000*1000/CFG_TS_TICK_VAL) /**< 1s */
+#define T_1MS_NB_TICKS (1*1000/CFG_TS_TICK_VAL) /**< 1s */
+#define T_50MS (50*T_1MS_NB_TICKS)
+#define T_100MS (100*T_1MS_NB_TICKS)
+#define T_200MS (200*T_1MS_NB_TICKS)
+#define T_2S (2*T_1S_NB_TICKS)
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+/* Private variables ---------------------------------------------------------*/
+
+extern RTC_HandleTypeDef hrtc; /**< RTC handler declaration */
+extern uint8_t ZbStackType; /* ZB stack type, static or dynamic */
+
+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;
+
+/* Global variables ----------------------------------------------------------*/
+
+/* 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();
+
+ APP_DBG("ConcurrentMode = %d", ConcurrentMode);
+
+ /**
+ * 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();
+
+ 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 BLE or Zigbee Stack
+ * This system event is received with APPE_UserEvtRx()
+ */
+
+ 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
+ /* Disable debugger EXTI lines */
+ LL_EXTI_DisableIT_32_63(LL_EXTI_LINE_48);
+ LL_C2_EXTI_DisableIT_32_63(LL_EXTI_LINE_48);
+
+ 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 )
+{
+ // Before going to stop or standby modes, do the settings so that system clock and IP80215.4 clock
+ // start on HSI automatically
+ LL_RCC_HSI_EnableAutoFromStop();
+
+ /**
+ * 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( );
+ /* Initialize the CPU2 reset value before starting CPU2 with C2BOOT */
+ LL_C2_PWR_SetPowerMode(LL_PWR_MODE_SHUTDOWN);
+
+ /* 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
+ */
+ 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 == FUS_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_DBG("==> Start_BLE"); /* Start BLE first */
+ APP_BLE_Init();
+
+ APP_DBG("==> Start Zigbee stack & Networking");
+ APP_ZIGBEE_Init();
+
+ switch (ZbStackType) { /* Check ZB stack type */
+ case INFO_STACK_TYPE_ZIGBEE_FFD: /* Start ZB only */
+ case INFO_STACK_TYPE_ZIGBEE_RFD: /* Start ZB only */
+ case INFO_STACK_TYPE_BLE_ZIGBEE_FFD_STATIC: /* Start ZB only */
+ case INFO_STACK_TYPE_BLE_ZIGBEE_RFD_STATIC: /* Start ZB only */
+ break;
+ case INFO_STACK_TYPE_BLE_ZIGBEE_FFD_DYNAMIC: /* Start ZB/BLE Dynamic mode */
+ case INFO_STACK_TYPE_BLE_ZIGBEE_RFD_DYNAMIC: /* Start ZB/BLE Dynamic mode */
+ APP_DBG("==> Start_BLE Advertising");
+ UTIL_SEQ_SetTask(1U << CFG_TASK_APP_BLE_START, CFG_SCH_PRIO_1);
+ break;
+ default:
+ /* No Zigbee device supported ! */
+ APP_DBG("FW Type : No ZB STACK type detected");
+ break;
+ }
+
+#if ( CFG_LPM_SUPPORTED == 1)
+ /* ZB stack is initialized, low power mode will be enabled later (zb_interface.c) */
+ UTIL_LPM_SetStopMode(1U << CFG_LPM_APP, UTIL_LPM_DISABLE);
+#endif
+
+ 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_ID, CFG_SCH_PRIO_0);
+ return;
+}
+
+void shci_cmd_resp_release(uint32_t flag)
+{
+ UNUSED(flag);
+ UTIL_SEQ_SetEvt(1U << CFG_IDLEEVT_HCI_CMD_EVT_RSP_ID);
+ return;
+}
+
+void shci_cmd_resp_wait(uint32_t timeout)
+{
+ UNUSED(timeout);
+ UTIL_SEQ_WaitEvt(1U << CFG_IDLEEVT_HCI_CMD_EVT_RSP_ID);
+ 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 Initialization 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 */
+/**
+ * @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:
+ if (1) {
+ APP_DBG("BUTTON 1 PUSHED ! : ZIGBEE MESSAGE SENDING");
+ UTIL_SEQ_SetTask(1U << CFG_TASK_BUTTON_SW1, CFG_SCH_PRIO_1);
+ } else {
+ APP_BLE_Key_Button1_Action();
+ }
+ break;
+
+ case BUTTON_SW2_PIN:
+ APP_DBG("BUTTON 2 PUSHED ! : Request Connection Update");
+ UTIL_SEQ_SetTask(1U << CFG_TASK_BUTTON_SW2, CFG_SCH_PRIO_1);
+ break;
+
+ case BUTTON_SW3_PIN:
+ APP_DBG("BUTTON 3 PUSHED ! : Request Connection Update");
+ UTIL_SEQ_SetTask(1U << CFG_TASK_BUTTON_SW3, CFG_SCH_PRIO_1);
+
+ /* Start BLE App + Advertising */
+// APP_DBG("==> Start_BLE Advertising");
+// UTIL_SEQ_SetTask(1U << CFG_TASK_APP_BLE_START, CFG_SCH_PRIO_1);
+
+ 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_Zigbee/BLE_Zigbee_Dyn/Core/Src/hw_timerserver.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Src/hw_timerserver.c
new file mode 100644
index 000000000..c842ba55e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/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_Zigbee/BLE_Zigbee_Dyn/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Src/hw_uart.c
new file mode 100644
index 000000000..7d28f9582
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Src/hw_uart.c
@@ -0,0 +1,465 @@
+/**
+ ******************************************************************************
+ * @file hw_uart.c
+ * @author MCD Application Team
+ * @brief hardware access
+ ******************************************************************************
+ * @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 "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{ \
+ /* Enable GPIO clock */ \
+ CFG_HW_##__USART_BASE__##_TX_PORT_CLK_ENABLE(); \
+ \
+ /* Enable USART clock */ \
+ __HAL_RCC_##__USART_BASE__##_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); \
+ \
+ 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); \
+ \
+ 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); \
+ \
+ 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)
+{
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+
+ 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.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Src/main.c
new file mode 100644
index 000000000..540e84c08
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Src/main.c
@@ -0,0 +1,321 @@
+/**
+ ******************************************************************************
+ * @file : main.c
+ * @brief : Main program body
+ *
+ @verbatim
+ ==============================================================================
+ ##### IMPORTANT NOTE #####
+ ==============================================================================
+
+ This application requests having the stm32wb5x_BLE_Thread_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"
+
+/* 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 );
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Main program
+ * @param None
+ * @retval None
+ */
+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 Init_Exti( void )
+{
+ /**< Disable all wakeup interrupt on CPU1 except LPUART(25), IPCC(36), HSEM(38) */
+ LL_EXTI_DisableIT_0_31( (~0) & (~(LL_EXTI_LINE_25)) );
+// 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; /**< 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
+ */
+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
+
+ /**
+ * 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;
+}
+
+/*************************************************************
+ *
+ * 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_Zigbee/BLE_Zigbee_Dyn/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Src/stm32_lpm_if.c
new file mode 100644
index 000000000..01d478092
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Src/stm32_lpm_if.c
@@ -0,0 +1,295 @@
+/* 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) 2020 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
+ */
+ Switch_On_HSI( );
+ }
+ }
+ else
+ {
+ /**
+ * The switch on HSI before entering Stop Mode is required
+ */
+ 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_Zigbee/BLE_Zigbee_Dyn/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Src/stm32wbxx_it.c
new file mode 100644
index 000000000..c29aafc7b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Src/stm32wbxx_it.c
@@ -0,0 +1,185 @@
+/**
+ ******************************************************************************
+ * @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 "stm32wbxx_it.h"
+#include "app_common.h"
+
+/* CONCURRENT MODE BLE/THREAD */
+/* External variables -----------------------------------------------------------*/
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+/* 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)
+{
+ /* 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();
+}
+
+ 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 External line
+ * interrupt request.
+ * @param None
+ * @retval None
+ */
+void PUSH_BUTTON_SW1_EXTI_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW1_PIN);
+}
+
+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);
+}
+
+#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
+
+
+/******************************************************************************/
+/* STM32L0xx Peripherals Interrupt Handlers */
+/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */
+/* available peripheral interrupt handler's name please refer to the startup */
+/* file (startup_stm32l0xx.s). */
+/******************************************************************************/
+/**
+ * @brief This function handles RTC Auto wake-up interrupt request.
+ * @param None
+ * @retval None
+ */
+void RTC_WKUP_IRQHandler(void)
+{
+ HW_TS_RTC_Wakeup_Handler();
+}
+
+
+
+
+
+
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Src/stm_logging.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Src/stm_logging.c
new file mode 100644
index 000000000..485e84742
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Src/stm_logging.c
@@ -0,0 +1,213 @@
+
+/**
+ ******************************************************************************
+ * @file stm_logging.c
+ * @author MCD Application Team
+ * @brief 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 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/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/Core/Src/system_stm32wbxx.c
new file mode 100644
index 000000000..e3025c7f9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/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_Zigbee/BLE_Zigbee_Dyn/EWARM/BLE_Zigbee_Dyn.ewd b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/EWARM/BLE_Zigbee_Dyn.ewd
new file mode 100644
index 000000000..79128b05b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/EWARM/BLE_Zigbee_Dyn.ewd
@@ -0,0 +1,1419 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>BLE_Zigbee_Dyn</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>$PROJ_DIR$\enableCPU2.mac</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>0</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>1</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>7.60.2.11347</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></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>1</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>1</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state>C:\work\THREAD\GIT_THREAD\stm32wb_M0_Firmware\Projects\Multi\Application\EWARM\stm32wbxx_ble_thread_host\ble_thread_host.eww</state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state>ble_thread_host</state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state>Production</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>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></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>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>4</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>1</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>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></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>2</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>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>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>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>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <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>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_Zigbee/BLE_Zigbee_Dyn/EWARM/BLE_Zigbee_Dyn.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/EWARM/BLE_Zigbee_Dyn.ewp
new file mode 100644
index 000000000..0dd450e78
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/EWARM/BLE_Zigbee_Dyn.ewp
@@ -0,0 +1,1313 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>BLE_Zigbee_Dyn</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>1</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>STM32WB55xx</state>
+ <state>USE_HAL_DRIVER</state>
+ <state>USE_STM32WBXX_NUCLEO</state>
+ <state>STATIC_MODE</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>1</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>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>1</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/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$\..\..\..\..\..\..\Middlewares/ST/STM32_WPAN/zigbee/stack/include/extras</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares/ST/STM32_WPAN/zigbee/platform</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN</state>
+ <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$\..\..\..\..\..\..\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</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\ble</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\thread\openthread\stack\include</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>1</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>BLE_Zigbee_Dyn.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>BLE_Zigbee_Dyn.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>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_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_ble.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\app_zigbee.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>
+ </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_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_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>
+ </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\p2p_stm.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>
+ <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>platform</name>
+ </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/BLE_Zigbee/BLE_Zigbee_Dyn/EWARM/BLE_Zigbee_Dyn.eww b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/EWARM/BLE_Zigbee_Dyn.eww
new file mode 100644
index 000000000..4588a78f9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/EWARM/BLE_Zigbee_Dyn.eww
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workspace>
+ <project>
+ <path>$WS_DIR$\BLE_Zigbee_Dyn.ewp</path>
+ </project>
+ <batchBuild />
+</workspace>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/EWARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..79b0e7edd
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/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/BLE_Zigbee/BLE_Zigbee_Dyn/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/EWARM/stm32wb55xx_flash_cm4.icf
new file mode 100644
index 000000000..81eded0c7
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/EWARM/stm32wb55xx_flash_cm4.icf
@@ -0,0 +1,41 @@
+/*###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__ = 0x20025FFF;
+
+/*-Sizes-*/
+define symbol __ICFEDIT_size_cstack__ = 0x1000;
+define symbol __ICFEDIT_size_heap__ = 102400; /* Heap increased for Zigbee */
+/**** 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_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/App/app_ble.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/App/app_ble.c
new file mode 100644
index 000000000..6994d1b50
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/App/app_ble.c
@@ -0,0 +1,1266 @@
+/* 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 "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"
+
+/* 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;
+
+ /**
+ * connection interval of the current active connection
+ */
+ uint16_t connectionInterval;
+
+ /**
+ * 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 (90*1000*1000/CFG_TS_TICK_VAL) /**< 90s */
+
+#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];
+static uint16_t c_int_init, c_int;
+static uint8_t first_update = 0;
+
+extern uint32_t disc_cnt;
+
+/**
+* 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;
+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 5
+float tab_conn_interval[SIZE_TAB_CONN_INT] = {15, 50, 90, 125, 250} ; /* 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','Z','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 */,
+ CFG_FEATURE_THREAD_SWITCH /* 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', 'Z', 'B', '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', 'Z', 'B', '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', 'Z', 'B', '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', 'Z', 'B', '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', 'Z', 'B', '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
+
+/* 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 );
+static void APP_BLE_SW2_Process(void);
+static void APP_BLE_SW3_Process(void);
+#if(L2CAP_REQUEST_NEW_CONN_PARAM != 0)
+static void BLE_SVC_L2CAP_Conn_Update(uint16_t Connection_Handle);
+static void BLE_SVC_L2CAP_Conn_Update_val(uint16_t Connection_Handle, uint16_t Connection_Interval);
+#endif
+
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APP_BLE_Init( void )
+{
+/* USER CODE BEGIN APP_BLE_Init */
+
+ 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);
+
+ /* Task associated with BLE Start App */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_APP_BLE_START, UTIL_SEQ_RFU, APP_BLE_Init_App);
+
+ /* Task associated with BLE Start ADV */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_APP_ADV_START, UTIL_SEQ_RFU, APP_BLE_Start_ADV);
+
+ /* Task associated with push button SW1 */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_BUTTON_SW2, UTIL_SEQ_RFU, APP_BLE_SW2_Process);
+
+ /* Task associated with push button SW1 */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_BUTTON_SW3, UTIL_SEQ_RFU, APP_BLE_SW3_Process);
+
+ /**
+ * 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;
+/* USER CODE END APP_BLE_Init */
+ return;
+}
+
+void APP_BLE_Init_App( void )
+{
+ /**
+ * From here, all initialization are BLE application specific
+ */
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_ADV_CANCEL_ID, UTIL_SEQ_RFU, Adv_Cancel);
+ /**
+ * 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);
+ Adv_Request(APP_BLE_LP_ADV);
+
+/* USER CODE END APP_BLE_Init_App */
+ return;
+}
+
+void APP_BLE_Start_ADV( void )
+{
+ /**
+ * 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 END APP_BLE_Init_App */
+ 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;
+
+ 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");
+ disc_cnt++;
+ }
+ /* 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 */
+ hci_le_connection_update_complete_event_rp0 *connection_update_complete = (hci_le_connection_update_complete_event_rp0 *) meta_evt->data;
+ BleApplicationContext.BleApplicationContext_legacy.connectionInterval =
+ connection_update_complete->Conn_Interval;
+ APP_DBG_MSG("CONN_UPDATE_COMPLETE [Conn_Interval=%d ms], latency=%d \n\r",
+ (connection_update_complete->Conn_Interval * 10) / 8, connection_update_complete->Conn_Latency);
+ /* USER CODE END EVT_LE_CONN_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;
+ }
+
+ UTIL_SEQ_SetTask(1 << CFG_TASK_ADV_CANCEL_ID, CFG_SCH_PRIO_0);
+
+ BleApplicationContext.BleApplicationContext_legacy.connectionHandle =
+ connection_complete_event->Connection_Handle;
+
+ APP_DBG_MSG("CONN_COMPLETE [Conn_Interval=%d ms], latency=%d \n\r",
+ (connection_complete_event->Conn_Interval * 10) / 8, connection_complete_event->Conn_Latency);
+
+ BleApplicationContext.BleApplicationContext_legacy.connectionInterval =
+ connection_complete_event->Conn_Interval;
+ /*
+* 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 */
+
+ /* 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 0x0004:
+ /* 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;
+}
+
+/* USER CODE BEGIN FD*/
+static void APP_BLE_SW2_Process(void)
+{
+ APP_BLE_Key_Button2_Action();
+}
+
+static void APP_BLE_SW3_Process(void)
+{
+ APP_BLE_Key_Button3_Action();
+}
+
+void APP_BLE_Key_Button1_Action(void)
+{
+ P2PS_APP_SW1_Button_Action();
+}
+
+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)
+ {
+ c_int = BleApplicationContext.BleApplicationContext_legacy.connectionInterval;
+ if (!first_update) {
+ c_int_init = c_int; /* Memorize initial connection interval */
+ first_update = 1;
+ }
+ APP_DBG_MSG("\n### UPDATE CONNECTION INTERVAL - CI read = %d ms\n", (c_int * 10) / 8);
+ if (c_int > c_int_init + 7) { /* Come back to initial value to prevent connection interval drifting */
+ c_int = c_int_init;
+ }
+ else
+ c_int++;
+
+ BLE_SVC_L2CAP_Conn_Update_val(BleApplicationContext.BleApplicationContext_legacy.connectionHandle, c_int);
+ APP_DBG_MSG("### CONNECTION INTERVAL requested %d ms\n", (c_int * 10) / 8);
+ }
+ return;
+#endif
+}
+
+void APP_BLE_Key_Button3_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);
+ APP_DBG_MSG("### CONNECTION INTERVAL requested %d ms\n", (CONN_P(tab_conn_interval[index_con_int]) * 10) / 8);
+ }
+ return;
+#endif
+}
+
+void APP_BLE_Stop(void)
+{
+ /* BLE STOP Procedure */
+ aci_hal_stack_reset();
+
+ APP_DBG("INSERT SOME WAIT");
+ HAL_Delay(100);
+
+ /* Stop Advertising Timer */
+ HW_TS_Stop(BleApplicationContext.Advertising_mgr_timer_Id);
+ HW_TS_Delete(BleApplicationContext.Advertising_mgr_timer_Id);
+}
+/* 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 = "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();
+ }
+}
+
+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_FAST_ADV)
+ //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");
+ Adv_Request(APP_BLE_LP_ADV);
+ }
+ 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(CI=%d), Successful \r\n\r", (CONN_P(tab_conn_interval[index_con_int]) * 10) /8);
+ }
+ else
+ {
+ APP_DBG_MSG("BLE_SVC_L2CAP_Conn_Update(CI=%d), Failed \r\n\r", (CONN_P(tab_conn_interval[index_con_int]) * 10) /8);
+ }
+ }
+/* USER CODE BEGIN BLE_SVC_L2CAP_Conn_Update_2 */
+
+/* USER CODE END BLE_SVC_L2CAP_Conn_Update_2 */
+ return;
+}
+
+void BLE_SVC_L2CAP_Conn_Update_val(uint16_t Connection_Handle, uint16_t Connection_Interval)
+{
+/* USER CODE BEGIN BLE_SVC_L2CAP_Conn_Update_1 */
+
+/* USER CODE END BLE_SVC_L2CAP_Conn_Update_1 */
+ if(mutex == 1) {
+ mutex = 0;
+ uint16_t interval_min = Connection_Interval;
+ uint16_t interval_max = Connection_Interval;
+ 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(CI=%d), Successful \r\n\r", (Connection_Interval * 10) /8);
+ }
+ else
+ {
+ APP_DBG_MSG("BLE_SVC_L2CAP_Conn_Update(CI=%d), Failed \r\n\r", (Connection_Interval * 10) /8);
+ }
+ }
+/* USER CODE BEGIN BLE_SVC_L2CAP_Conn_Update_2 */
+
+/* USER CODE END BLE_SVC_L2CAP_Conn_Update_2 */
+ 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 */
+
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/App/app_ble.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/App/app_ble.h
new file mode 100644
index 000000000..d0729f77d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/App/app_ble.h
@@ -0,0 +1,90 @@
+/* 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 );
+ void APP_BLE_Init_App( void );
+ void APP_BLE_Start_ADV( 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);
+void APP_BLE_Stop(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_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/App/app_zigbee.c
new file mode 100644
index 000000000..3e4261f9c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/App/app_zigbee.c
@@ -0,0 +1,1170 @@
+/**
+ ******************************************************************************
+ * File Name : App/app_zigbee.c
+ * Description : Zigbee Application.
+ ******************************************************************************
+ * @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 "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 "app_ble.h"
+#include "stm32_lpm.h"
+
+#include <assert.h>
+#include "zcl/zcl.h"
+#include "zcl/zcl.onoff.h"
+#include "zcl/zcl.identify.h"
+
+/* Private defines -----------------------------------------------------------*/
+#define APP_ZIGBEE_STARTUP_FAIL_DELAY 500U
+#define SW1_ENDPOINT 17U
+#define SW1_GROUP_ADDR 0x0001
+#define CHANNEL 13U
+#define CHANNELMASK_12TO14 0x00007000U /* Channels 12-14 */
+#define SED_SLEEP_TIME_30S 1
+
+#define COLOR_DEFAULT "\x1b[0m"
+#define COL_CYAN "\x1b[0;96m"
+#define COL_MAGENTA "\x1b[0;95m"
+#define COL_RED "\x1b[0;91m"
+#define COL_NORM "\x1b[0m"
+
+#define DELAY_5_MS (0.005*1000*1000/CFG_TS_TICK_VAL) /**< 5ms */
+#define DELAY_20_MS (0.02*1000*1000/CFG_TS_TICK_VAL) /**< 20ms */
+#define DELAY_40_MS (0.04*1000*1000/CFG_TS_TICK_VAL) /**< 40ms */
+#define DELAY_50_MS (0.05*1000*1000/CFG_TS_TICK_VAL) /**< 50ms */
+#define DELAY_100_MS (100*1000/CFG_TS_TICK_VAL) /**< 100 ms */
+#define DELAY_300_MS (300000/CFG_TS_TICK_VAL) /**< 500 ms */
+#define DELAY_500_MS (0.5*1000*1000/CFG_TS_TICK_VAL) /**< 500 ms */
+#define DELAY_1_S (1000*1000/CFG_TS_TICK_VAL) /**< 1 s */
+
+#undef TRACE_ZB_FULL_NNT /* undef or comment for public version */
+
+#undef STRESS_TEST /* undef or comment for public version */
+#ifdef STRESS_TEST
+#define TOGGLE_INTERVAL DELAY_20_MS /* 20 ms interval between 2 toggles */
+#else
+#define TOGGLE_INTERVAL DELAY_1_S /* 1 sec interval between 2 toggles */
+#endif
+#define DBG_NWK_STATUS_INTERVAL (DELAY_1_S * 15) /* 15 sec interval to display stats */
+
+
+#define OUTPUT_LINE_MAX_LEN 256
+
+/******************************************************************************
+ * 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
+
+/* 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_OnOff_Toggle(void);
+static void APP_ZIGBEE_Process_OnOff_Toggle();
+
+static void APP_ZIGBEE_DbgNwkStatus();
+static void APP_ZIGBEE_Status_Nnt(void);
+
+static void APP_ZIGBEE_NwkForm(void);
+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 Wait_Getting_Ack_From_M0(void);
+static void Receive_Ack_From_M0(void);
+static void Receive_Notification_From_M0(void);
+
+
+#ifdef WITH_PERSISTANT
+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);
+#endif // WITH_PERSISTANT
+
+static uint32_t APP_ZIGBEE_GetStartNb(void);
+static void APP_ZIGBEE_IncrementStartNb(void);
+static void toggle_cb(struct ZbZclCommandRspT *rsp, void *arg);
+
+/* 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;
+ uint32_t persistNumWrites;
+
+ struct ZbZclClusterT *onoff_client_1;
+};
+static struct zigbee_app_info zigbee_app_info;
+
+static uint32_t join_start_time;
+static double join_time_duration;
+
+static bool ble_sync_request = FALSE;
+
+#ifdef STRESS_TEST
+static uint32_t time_start;
+#endif
+
+/* Public variables -----------------------------------------------*/
+uint8_t ZbStackType; /* ZB stack type, static or dynamic, FFD or RFD */
+uint32_t toggle_cnt = 0;
+uint32_t toggle_fail = 0;
+uint32_t disc_cnt = 0;
+uint8_t Timer_ToggleOnOff_Id;
+uint8_t Timer_DbgNwkStatus_Id;
+
+/* Keep track of number of Zigbee start */
+static uint8_t zigbee_start_nb = 0U;
+static bool zigbee_logging_done = FALSE;
+
+/* Functions Definition ------------------------------------------------------*/
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+
+void APP_ZIGBEE_Init(void)
+{
+ SHCI_CmdStatus_t ZigbeeInitStatus;
+
+ /* Do not allow stop mode before ZB is initialized */
+ UTIL_LPM_SetStopMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE);
+
+ APP_DBG("APP_ZIGBEE_Init");
+ APP_DBG("STARTING ON CHANNEL = %d", CHANNEL);
+
+ /* 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 push button SW1 */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_BUTTON_SW1, UTIL_SEQ_RFU, APP_ZIGBEE_SW1_Process);
+
+ /* Task associated with Toggle On/Off */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_TOGGLE_ON_OFF, UTIL_SEQ_RFU, APP_ZIGBEE_OnOff_Toggle);
+
+ /* Task associated with Dbg Nwk Status */
+UTIL_SEQ_RegTask(1U << CFG_TASK_DBG_NWK_STATUS, UTIL_SEQ_RFU, APP_ZIGBEE_Status_Nnt);
+
+ /* Init the Zigbee on the CPU2 side */
+ ZigbeeInitStatus = SHCI_C2_ZIGBEE_Init();
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(ZigbeeInitStatus);
+
+ /**
+ * Create timer for Toggle On/Off process
+ */
+ HW_TS_Create(CFG_TIM_PROC_ID_ISR, &(Timer_ToggleOnOff_Id), hw_ts_SingleShot, APP_ZIGBEE_Process_OnOff_Toggle);
+ /**
+ * Create timer for Network Status process
+ */
+ HW_TS_Create(CFG_TIM_PROC_ID_ISR, &(Timer_DbgNwkStatus_Id), hw_ts_SingleShot, APP_ZIGBEE_DbgNwkStatus);
+
+ /* Initialize Zigbee stack layers and launch network formation */
+ APP_ZIGBEE_StackLayersInit();
+
+ APP_ZIGBEE_IncrementStartNb();
+
+} /* APP_ZIGBEE_Init */
+
+
+void APP_ZIGBEE_Stop(void)
+{
+ APP_DBG("APP_ZIGBEE_Stop");
+
+ BSP_LED_Off(LED_RED);
+ BSP_LED_Off(LED_GREEN);
+ BSP_LED_Off(LED_BLUE);
+
+ /* Save Persistent data */
+ APP_DBG("Save persistent data");
+#ifdef WITH_PERSISTANT
+ APP_ZIGBEE_persist_save();
+#endif //WITH_PERSISTANT
+
+ /* Zigbee STOP Procedure */
+ /* Free memory allocated by Zigbee stack */
+ 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;
+}
+
+/**
+ * @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 = (enum ZbStatusCodeT) 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;
+
+ join_start_time = HAL_GetTick();
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, CFG_SCH_PRIO_0);
+}
+
+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_ONOFF_SWITCH;
+
+ /* Endpoint: SW1_ENDPOINT */
+ req.endpoint = SW1_ENDPOINT;
+ ZbZclAddEndpoint(zigbee_app_info.zb, &req, &conf);
+ assert(conf.status == ZB_STATUS_SUCCESS);
+
+ /* OnOff 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);
+
+} /* config_endpoints */
+
+/**
+ * @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;
+
+ if (zigbee_logging_done == FALSE)
+ {
+ /* 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);
+ zigbee_logging_done = TRUE;
+ }
+
+ /* Attempt to join a zigbee network */
+ ZbStartupConfigGetProDefaults(&config);
+
+ zigbee_app_info.startupControl = ZbStartTypeJoin;
+ config.startupControl = zigbee_app_info.startupControl;
+
+ /* 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*/
+ //config.channelList.list[0].channelMask = CHANNELMASK_12TO14; /* Channels in use*/
+
+ APP_DBG("Network config : APP_STARTUP_CENTRALIZED_ROUTER");
+
+ APP_DBG("*** zigbee_start_nb value = %d ***", APP_ZIGBEE_GetStartNb());
+#ifdef WITH_PERSISTANT
+ if(APP_ZIGBEE_GetStartNb() < 2U)
+#endif
+ {
+ /* 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)\n", status);
+ zigbee_app_info.join_status = status;
+
+ if (status == ZB_STATUS_SUCCESS) {
+ join_time_duration = (double)(HAL_GetTick() - join_start_time)/1000;
+ APP_DBG("%s==> JOIN SUCCESS, Duration = (%.2f seconds)%s\n", COL_MAGENTA, join_time_duration, COL_NORM);
+ zigbee_app_info.join_delay = 0U;
+ zigbee_app_info.init_after_join = true;
+ 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;
+ }
+ }
+#ifdef WITH_PERSISTANT
+ 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!");
+ }
+ }
+#endif //WITH_PERSISTANT
+ }
+
+ /* 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 /* JOIN successful */
+ {
+ zigbee_app_info.init_after_join = false;
+
+ /* Do it only first time */
+ if(APP_ZIGBEE_GetStartNb() == 1U)
+ {
+ /* Assign ourselves to the group addresses */
+ APP_ZIGBEE_ConfigGroupAddr();
+
+ /* 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));
+
+ APP_DBG("==> Start_ZB Task Toggle");
+ /* Next toggle after TOGGLE_INTERVAL */
+ HW_TS_Start(Timer_ToggleOnOff_Id, (uint32_t)TOGGLE_INTERVAL);
+
+ switch (ZbStackType) { /* Check ZB stack type */
+ case INFO_STACK_TYPE_BLE_ZIGBEE_RFD_DYNAMIC: /* Start ZB/BLE Dynamic mode */
+ case INFO_STACK_TYPE_BLE_ZIGBEE_FFD_DYNAMIC: /* Start ZB/BLE Dynamic mode */
+ /* Next network status after DBG_NWK_STATUS_INTERVAL */
+ HW_TS_Start(Timer_DbgNwkStatus_Id, (uint32_t)DBG_NWK_STATUS_INTERVAL);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+}
+
+/**
+ * @brief Set group addressing mode
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_ConfigGroupAddr(void)
+{
+ ZbApsmeAddGroupReqT req;
+ ZbApsmeAddGroupConfT conf;
+
+ memset(&req, 0, sizeof(req));
+ req.endpt = SW1_ENDPOINT;
+ req.groupAddr = SW1_GROUP_ADDR;
+ ZbApsmeAddGroupReq(zigbee_app_info.zb, &req, &conf);
+
+} /* APP_ZIGBEE_ConfigGroupAddr */
+
+/*************************************************************
+ * 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;
+} /* 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;
+ }
+
+ while (info->active) {
+ UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+ }
+
+ 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
+ * @retval None
+ */
+#ifdef WITH_PERSISTANT
+enum ZbStatusCodeT APP_ZIGBEE_ZbStartupPersist(struct ZigBeeT *zb)
+{
+ 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;
+
+}
+
+/**
+ * @brief Load persitent data
+ * @param bufLen : pointer on buffer length
+ * @retval None
+ */
+static const void * APP_ZIGBEE_persist_load(unsigned int *bufLen)
+{
+ 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;
+}
+
+/**
+ * @brief Delete first word of persistent data (size = 0 meaning no data)
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_persist_delete(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");
+ }
+}
+
+/**
+ * @brief Free buffer
+ * @param buf : pointer on buffer to free
+ * @retval None
+ */
+static void APP_ZIGBEE_persist_buf_free(const void *buf)
+{
+ free((void *)buf);
+}
+
+/**
+ * @brief Save persistent data in FLASH (Or Flash Emulation in RAM)
+ * @param None
+ * @retval None
+ */
+bool APP_ZIGBEE_persist_save(void)
+{
+ 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);
+ return false;
+ }
+
+ buf = malloc(ST_PERSIST_MAX_ALLOC_SZ);
+ if (buf == NULL) {
+ APP_DBG("APP_ZIGBEE_persist_save: memory exhausted");
+ return false;
+ }
+
+ len = ZbPersistGet(zigbee_app_info.zb, buf, len);
+
+ /* 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);
+ 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);
+ return false;
+ }
+
+ free(buf);
+
+ zigbee_app_info.persistNumWrites++;
+ APP_DBG("APP_ZIGBEE_persist_save: Persistence written (num writes = %d)", zigbee_app_info.persistNumWrites);
+ return true;
+}
+#endif //WITH_PERSISTANT
+
+
+
+/**
+ * @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);
+
+ ZbStackType = p_wireless_info->StackType; /* Memorize ZB stack type */
+ switch (p_wireless_info->StackType) {
+ case INFO_STACK_TYPE_BLE_ZIGBEE_FFD_STATIC:
+ APP_DBG("FW Type : STACK_TYPE_BLE_ZIGBEE_FFD_STATIC");
+ break;
+ case INFO_STACK_TYPE_BLE_ZIGBEE_FFD_DYNAMIC:
+ APP_DBG("FW Type : STACK_TYPE_BLE_ZIGBEE_FFD_DYNAMIC");
+ break;
+ case INFO_STACK_TYPE_BLE_ZIGBEE_RFD_STATIC:
+ APP_DBG("FW Type : STACK_TYPE_BLE_ZIGBEE_RFD_STATIC");
+ break;
+ case INFO_STACK_TYPE_BLE_ZIGBEE_RFD_DYNAMIC:
+ APP_DBG("FW Type : STACK_TYPE_BLE_ZIGBEE_RFD_DYNAMIC");
+ break;
+ 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 */
+
+static void APP_ZIGBEE_SW1_Process(void)
+{
+ struct ZbApsAddrT dst;
+
+ memset(&dst, 0, sizeof(dst));
+ dst.mode = ZB_APSDE_ADDRMODE_GROUP;
+ dst.endpoint = SW1_ENDPOINT;
+ dst.nwkAddr = SW1_GROUP_ADDR;
+
+ APP_DBG("==> SENDING TOGGLE TO GROUP 0x0001");
+ if (ZbZclOnOffClientToggleReq(zigbee_app_info.onoff_client_1, &dst, NULL, NULL) != ZCL_STATUS_SUCCESS) {
+ APP_DBG("Error, ZbZclOnOffClientToggleReq failed (SW1_ENDPOINT)");
+ }
+}
+
+static void APP_ZIGBEE_Process_OnOff_Toggle(void)
+{
+ UTIL_SEQ_SetTask(1U << CFG_TASK_TOGGLE_ON_OFF, CFG_SCH_PRIO_1);
+}
+
+static void APP_ZIGBEE_DbgNwkStatus(void)
+{
+ UTIL_SEQ_SetTask(1U << CFG_TASK_DBG_NWK_STATUS, CFG_SCH_PRIO_1);
+}
+
+static void APP_ZIGBEE_OnOff_Toggle(void)
+{
+ struct ZbApsAddrT dst;
+
+ memset(&dst, 0, sizeof(dst));
+ dst.mode = ZB_APSDE_ADDRMODE_SHORT;
+ dst.endpoint = SW1_ENDPOINT;
+ dst.nwkAddr = 0x0;
+#ifdef STRESS_TEST
+ uint32_t time;
+
+ if (toggle_cnt == 0) {
+ time_start = HAL_GetTick();
+ }
+#endif
+
+ if (ZbZclOnOffClientToggleReq(zigbee_app_info.onoff_client_1, &dst, toggle_cb, NULL) != ZCL_STATUS_SUCCESS)
+ {
+ APP_DBG("Error, ZbZclOnOffClientToggleReq failed (SW1_ENDPOINT)");
+ }
+#ifdef STRESS_TEST
+ printf("T");
+ toggle_cnt++;
+ if ((toggle_cnt % 10) == 0) printf("\n");
+ UTIL_SEQ_WaitEvt(EVENT_ON_OFF_RSP);
+ if ((toggle_cnt % 200) == 0) {
+ time = HAL_GetTick() - time_start;
+ APP_DBG_FULL(LOG_LEVEL_INFO, APPLI_LOG_REGION_GENERAL, "\n==> Nb TOGGLE ON/OFF sent: %d (%d Fail - %.2f%%) - %d BLE Disc - Toggle freq = %.2f ms %s",
+ toggle_cnt, toggle_fail, (float)(toggle_fail * 100)/(float)toggle_cnt, disc_cnt, (float)time/(float)toggle_cnt, COLOR_DEFAULT);
+ }
+#else
+ toggle_cnt++;
+ UTIL_SEQ_WaitEvt(EVENT_ON_OFF_RSP);
+ APP_DBG_FULL(LOG_LEVEL_INFO, APPLI_LOG_REGION_GENERAL, "==> Nb TOGGLE ON/OFF sent: %d (%d Fail - %.2f%%) - %d BLE Disc %s",
+ toggle_cnt, toggle_fail, (float)(toggle_fail * 100)/(float)toggle_cnt, disc_cnt, COLOR_DEFAULT);
+#endif /* STRESS_TEST */
+ /* Next toggle after TOGGLE_INTERVAL */
+ HW_TS_Start(Timer_ToggleOnOff_Id, (uint32_t)TOGGLE_INTERVAL);
+ /* Enabling Stop mode */
+#if (CFG_FULL_LOW_POWER == 1)
+ UTIL_LPM_SetStopMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
+#endif /* CFG_FULL_LOW_POWER */
+}
+
+
+static void toggle_cb(struct ZbZclCommandRspT *rsp, void *arg)
+{
+ if(rsp->status != ZCL_STATUS_SUCCESS)
+ {
+#ifndef STRESS_TEST
+ APP_DBG("TOGGLE RSP FAIL status %d",rsp->status);
+#else
+ printf("-");
+#endif
+ toggle_fail++;
+ }
+ else
+ {
+#ifndef STRESS_TEST
+ APP_DBG("TOGGLE RSP SUCCESS from %#08llx",rsp->src.extAddr);
+#else
+ printf("+");
+#endif
+ }
+ UTIL_SEQ_SetEvt(EVENT_ON_OFF_RSP);
+}
+
+#ifdef TRACE_ZB_FULL_NNT
+const char *
+ZbNwk_NeighborRelationshipToStr(enum ZbNwkNeighborRelT relationship)
+{
+ const char *str;
+
+ switch (relationship) {
+ case ZB_NWK_NEIGHBOR_REL_PARENT:
+ str = "Parent";
+ break;
+
+ case ZB_NWK_NEIGHBOR_REL_CHILD:
+ str = "Child";
+ break;
+
+ case ZB_NWK_NEIGHBOR_REL_SIBLING:
+ str = "Sibling";
+ break;
+
+ case ZB_NWK_NEIGHBOR_REL_NONE:
+ str = "None";
+ break;
+
+ case ZB_NWK_NEIGHBOR_REL_PREV_CHILD:
+ str = "Prev Child";
+ break;
+
+ case ZB_NWK_NEIGHBOR_REL_UNAUTH_CHILD:
+ str = "Unauth Child";
+ break;
+
+ case ZB_NWK_NEIGHBOR_REL_PEND_ASSOCIATE:
+ case ZB_NWK_NEIGHBOR_REL_PEND_ORPHAN:
+ str = "Pend Child";
+ break;
+
+ default:
+ str = "Reserved";
+ break;
+ } /* switch */
+ return (str);
+}
+
+const char *
+ZbNwk_NeighborDeviceTypeToStr(enum ZbNwkNeighborTypeT deviceType)
+{
+ const char *str;
+ switch (deviceType) {
+ case ZB_NWK_NEIGHBOR_TYPE_COORD:
+ str = "Crd";
+ break;
+
+ case ZB_NWK_NEIGHBOR_TYPE_ROUTER:
+ str = "Rtr";
+ break;
+
+ case ZB_NWK_NEIGHBOR_TYPE_END_DEV:
+ str = "End";
+ break;
+
+ case ZB_NWK_NEIGHBOR_TYPE_UNKNOWN:
+ default:
+ str = "Unk";
+ break;
+ } /* switch */
+ return (str);
+}
+#endif /* ifdef TRACE_ZB_FULL_NNT */
+
+static void APP_ZIGBEE_Status_Nnt(void)
+{
+ struct ZbNwkNeighborT neighbor;
+ uint64_t epid;
+ unsigned int i;
+#ifdef TRACE_ZB_FULL_NNT
+ unsigned int tempLen;
+ unsigned int nnt_index = 0;
+ char temp[256];
+#endif
+
+ epid = 0;
+ ZbNwkGet(zigbee_app_info.zb, ZB_NWK_NIB_ID_ExtendedPanId, &epid, sizeof(uint64_t));
+
+#ifdef TRACE_ZB_FULL_NNT
+ APP_DBG("-- ZigBee Network Neighbor Table ----------------------------------------------");
+ tempLen = 0;
+ tempLen += snprintf(&temp[tempLen], OUTPUT_LINE_MAX_LEN - tempLen, " %-23s", "EXTADDR");
+ tempLen += snprintf(&temp[tempLen], OUTPUT_LINE_MAX_LEN - tempLen, " %-7s", "NWKADDR");
+ tempLen += snprintf(&temp[tempLen], OUTPUT_LINE_MAX_LEN - tempLen, " %-4s", "TYPE");
+ tempLen += snprintf(&temp[tempLen], OUTPUT_LINE_MAX_LEN - tempLen, " %-6s", "RXIDLE");
+ tempLen += snprintf(&temp[tempLen], OUTPUT_LINE_MAX_LEN - tempLen, " %-12s", "RELATION");
+ tempLen += snprintf(&temp[tempLen], OUTPUT_LINE_MAX_LEN - tempLen, " %6s", "TXFAIL");
+ tempLen += snprintf(&temp[tempLen], OUTPUT_LINE_MAX_LEN - tempLen, " %4s", "AGE");
+ tempLen += snprintf(&temp[tempLen], OUTPUT_LINE_MAX_LEN - tempLen, " %4s", "LQI");
+ tempLen += snprintf(&temp[tempLen], OUTPUT_LINE_MAX_LEN - tempLen, " %4s", "COST");
+ APP_DBG("%s", temp);
+#endif
+
+ for (i = 0;; i++) {
+ if (epid == 0) {
+ /* The NNT doesn't make much sense if we haven't joined/formed a network.
+ * Skip it and use the discovery table instead. */
+ break;
+ }
+ if (ZbNwkGetIndex(zigbee_app_info.zb, ZB_NWK_NIB_ID_NeighborTable, &neighbor, sizeof(neighbor), i) != ZB_NWK_STATUS_SUCCESS) {
+ break;
+ }
+ /* Skip unused entries. */
+ if (neighbor.nwkAddr == ZB_NWK_ADDR_UNDEFINED) {
+ continue;
+ }
+#ifdef TRACE_ZB_FULL_NNT
+ nnt_index++;
+
+ tempLen = 0;
+ tempLen += snprintf(&temp[tempLen], OUTPUT_LINE_MAX_LEN - tempLen, "%3d ", nnt_index);
+
+ /* EXTADDR */
+ if (neighbor.extAddr) {
+ tempLen += snprintf(&temp[tempLen], OUTPUT_LINE_MAX_LEN - tempLen, "0x%016" PRIx64 " ", neighbor.extAddr);
+ }
+ else {
+ tempLen += snprintf(&temp[tempLen], OUTPUT_LINE_MAX_LEN - tempLen, "%-23s", " ");
+ }
+ /* NWKADDR */
+ tempLen += snprintf(&temp[tempLen], OUTPUT_LINE_MAX_LEN - tempLen, " 0x%04x ", neighbor.nwkAddr);
+ /* TYPE */
+ tempLen += snprintf(&temp[tempLen], OUTPUT_LINE_MAX_LEN - tempLen, " %-4s", ZbNwk_NeighborDeviceTypeToStr(neighbor.deviceType));
+ /* RXIDLE */
+ tempLen += snprintf(&temp[tempLen], OUTPUT_LINE_MAX_LEN - tempLen, " %-6s", neighbor.rxOnWhenIdle ? "True" : "False");
+ /* RELATION */
+ tempLen += snprintf(&temp[tempLen], OUTPUT_LINE_MAX_LEN - tempLen, " %-12s", ZbNwk_NeighborRelationshipToStr(neighbor.relationship));
+ /* TXFAIL */
+ tempLen += snprintf(&temp[tempLen], OUTPUT_LINE_MAX_LEN - tempLen, " %6d", neighbor.txFailure);
+ /* AGE */
+ tempLen += snprintf(&temp[tempLen], OUTPUT_LINE_MAX_LEN - tempLen, " %4d", neighbor.age);
+ /* LQI */
+ tempLen += snprintf(&temp[tempLen], OUTPUT_LINE_MAX_LEN - tempLen, " %4d", neighbor.lqi);
+ /* COST */
+ tempLen += snprintf(&temp[tempLen], OUTPUT_LINE_MAX_LEN - tempLen, " %4d", neighbor.outgoingCost);
+
+ APP_DBG("%s", temp);
+#endif
+
+ if (neighbor.age == 4) { /* If AGE 4 twice in a row, force update BLE connection interval */
+ if (ble_sync_request) {
+ APP_BLE_Key_Button2_Action(); /* update BLE connection interval */
+ ble_sync_request = FALSE;
+ }
+ else ble_sync_request = TRUE;
+ }
+ else {
+ ble_sync_request = FALSE;
+ }
+ } /* for */
+
+ /* Next network status after DBG_NWK_STATUS_INTERVAL */
+ HW_TS_Start(Timer_DbgNwkStatus_Id, (uint32_t)DBG_NWK_STATUS_INTERVAL);
+}
+
+
+/*************************************************************
+ *
+ * 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/BLE_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/App/app_zigbee.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/App/app_zigbee.h
new file mode 100644
index 000000000..88ad973f2
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/App/app_zigbee.h
@@ -0,0 +1,66 @@
+/* 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"
+#include "zigbee.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);
+void APP_ZIGBEE_Stop(void);
+enum ZbStatusCodeT APP_ZIGBEE_ZbStartupPersist(struct ZigBeeT *zb);
+bool APP_ZIGBEE_persist_save(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/BLE_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/App/ble_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/App/ble_conf.h
new file mode 100644
index 000000000..538713f85
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/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) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/App/ble_dbg_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/App/ble_dbg_conf.h
new file mode 100644
index 000000000..1f9b21135
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/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) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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 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_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/App/p2p_server_app.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/App/p2p_server_app.c
new file mode 100644
index 000000000..bde504398
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/App/p2p_server_app.c
@@ -0,0 +1,397 @@
+/* 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 "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_RED);
+ //APP_DBG_MSG("-- P2P APPLICATION SERVER : LED1 ON\n");
+ APP_DBG_MSG("+");
+ P2P_Server_App_Context.LedControl.Led1=0x01; /* LED1 ON */
+ }
+ if(pNotification->DataTransfered.pPayload[1] == 0x00)
+ {
+ BSP_LED_Off(LED_RED);
+ //APP_DBG_MSG("-- P2P APPLICATION SERVER : LED1 OFF\n");
+ APP_DBG_MSG("-");
+ 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_RED);
+ //APP_DBG_MSG("-- P2P APPLICATION SERVER 1 : LED1 ON\n");
+ //APP_DBG_MSG("+");
+ P2P_Server_App_Context.LedControl.Led1=0x01; /* LED1 ON */
+ }
+ if(pNotification->DataTransfered.pPayload[1] == 0x00)
+ {
+ BSP_LED_Off(LED_RED);
+ //APP_DBG_MSG("-- P2P APPLICATION SERVER 1 : LED1 OFF\n");
+ P2P_Server_App_Context.LedControl.Led1=0x00; /* LED1 OFF */
+ }
+ /* Switch to Thread */
+ if(pNotification->DataTransfered.pPayload[1] == 0x02)
+ {
+ BSP_LED_Off(LED_BLUE);
+ APP_DBG("SYSTEM: SWITCH TO Zigbee");
+ 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);
+ }
+ }
+#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_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/App/p2p_server_app.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/App/p2p_server_app.h
new file mode 100644
index 000000000..11e27d8a2
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/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) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/Target/hw_ipcc.c
new file mode 100644
index 000000000..e7049681d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/STM32_WPAN/Target/hw_ipcc.c
@@ -0,0 +1,675 @@
+/**
+ ******************************************************************************
+ * 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 LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_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 LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_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 )
+{
+ /**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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 */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_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_Zigbee/BLE_Zigbee_Dyn/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/readme.txt
new file mode 100644
index 000000000..e0d1eda6d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn/readme.txt
@@ -0,0 +1,149 @@
+/**
+ @page BLE_Zigbee_Dynamic example
+
+ @verbatim
+ ******************************************************************************
+ * @file BLE_Zigbee/BLE_Zigbee_Dynamic/readme.txt
+ * @author MCD Application Team
+ * @brief Example of application using BLE and Zigbee protocols in dynamic
+ * concurrent mode.
+ ******************************************************************************
+ *
+ * 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
+
+How to use BLE application and Zigbee application in dynamic concurrent mode.
+
+The idea is to present a demo with a Zigbee Network (at least 2 Nucleo Boards, Zb coordinator
+running Zigbee_OnOff_Server_Coord application[1] and router running Ble_Zigbee_Dynamic application[2]),
+and a BLE connection between 1 Nucleo board running Ble_Zigbee_Dynamic application [2] with either a
+smartphone running "ST BLE Sensor" Application (available on App Store and Google Play), or another
+Nucleo board running a BLE_p2pClient application[3].
+The STM32WB55xx-Nucleo board running Ble_Zigbee_Dynamic application is capable of switching
+dynamically and transparently from BLE network to Zigbee network and vice-versa.
+
+The demo architecture is summarized in the following figure:
+
+ ______________ ______________ ______________
+ / \ / \ / \
+ | | | | | |
+ | SW1 => BLE Toggle | Dynamic mode | ZB Toggle | |
+ | BLE App |===========> | BLE/ZB App |============>| ZB App |
+ | | | | | |
+ | | | (ZB router) | | (ZB coord.) |
+ \______________/ \______________/ \______________/
+ [3] [2] [1]
+
+ @par Keywords
+
+Zigbee, BLE
+
+@par Directory contents
+
+
+@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 ?
+
+This application requests having the STM32WB5x_BLE_Zigbee_dynamic_fw.bin binary flashed on the M0 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 load the proper
+Wireless Coprocessor binary.
+
+
+Minimum requirements for the demo:
+- 1 STM32WB55xx-Nucleo board in BLE Zigbee Dynamic Concurrent mode [2]
+- 1 STM32WB55xx-Nucleo board or more for creating Zigbee Network [1]
+ (see example Zigbee_OnOff_Server_Coord and Zigbee_OnOff_Client_Router for more details on how to use it)
+- 1 STM32WB55xx-Nucleo board running a BLE_p2pClient application[3]
+-- OR
+- 1 Smartphone (Android/IOS) with "ST BLE Sensor" Phone Application (available on App Store and Google Play)
+ 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
+
+In order to make the program work, you must do the following:
+ - Connect 1 STM32WB55xx-Nucleo boards to your PC
+ - Open your preferred toolchain
+ - Rebuild all files and load your image into target memory
+ - Run the example
+
+ if you want to get the traces in real time, you can connects an HyperTerminal
+ via an UART RS232 cable using the following connections :
+ RXD : CN10(Pin35)
+ TXD : CN10(Pin37)
+
+**** START DEMO ****
+By default, after a reset, the ZB/BLE board [2] will start with both BLE and Zigbee modes activated.
+
+The BLE example implements Point-to-Point communication using BLE component.
+1- The ZB/BLE device (P2P Server) starts BLE advertising (Green LED toggling) and simultaneously starts to join the Zigbee Network.
+2- The node will then attach the existing Zigbee network (Zb coordinator running Zigbee_OnOff_Server_Coord application [1]).
+The blue led turns ON when the Zigbee join is successful.
+3- When the Zigbee connection is establised, the Zigbee router will send every second a ZB ON_OFF toggle to the ZB coordinator [1]
+-- The RED Led toggles on the coordinator [1]. It is also possible to force the toggeling of the RED Led on the coordinator [1] via the push button SW1 on Board [2].
+4- The BLE connection will be started as follows, depending if your BLE device is a smartphone or a 3rd Nucleo board:
+4.1 If using a smartphone, then the ST BLE Sensor App (smart Phone Application) scans and can connect to the P2P Server
+by selecting = "P2PZBSRV1" entry.
+-- Once connected, the application starts to search the P2P Services & Characteristics.
+-- Led Button service, Led Characteristic and Button Characteristic are discovered at this stage (this service is ST specific).
+-- Pressing the LED button on the App will turn On or Off the BLUE Led on the ZB/BLE device [2]
+4.2 If using a 3rd Nucleo board (running a BLE_p2pClient application [3]), you can start scanning by pressing the SW1 button
+-- the BLUE LED will light up on [3]
+-- After scanning complete, the 3rd Nucleo board [3] connects to the P2P server on BLE/ZB [2] dynamic node, and sends a BLE toggle when pressing SW1.
+-- As a result the RED LED toggles on the BLE/ZB device [2], at each SW1 button press on BLE board [3].
+
+ ______________ ______________ ______________
+ / \ / \ / \
+ | | | | | |
+ | SW1 => BLE Toggle | Dynamic mode | ZB Toggle | |
+ | | | BLE/ZB App | (every sec)| |
+ | | | | and/or | |
+ | | | | via SW1 | |
+ | BLE App |===========> | SW1 |============>| ZB App |
+ | | | | | |
+ | | | (ZB router) | | (ZB coord.) |
+ \______________/ \______________/ \______________/
+ [3] [2] [1]
+
+This Demo illustrates the simultaneous BLE and ZB connections, with the RED Led toggling on ZB/BLE device [2], reflecting BLE activity, and the RED Led toggling on the ZB coordinator[1], reflecting ZB activity.
+
+On BLE Disconnection, the STM32WB55xx-Nucleo board [3] will restart advertising.
+
+
+ * <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
+ */
+ \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/app_common.h
new file mode 100644
index 000000000..ad5ea9c1d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/app_common.h
@@ -0,0 +1,120 @@
+/**
+ ******************************************************************************
+ * @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"
+#include "stm_logging.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_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/app_conf.h
new file mode 100644
index 000000000..77de1d0e6
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/app_conf.h
@@ -0,0 +1,642 @@
+/**
+ ******************************************************************************
+ * 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
+ ******************************************************************************/
+
+/**< 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 (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
+
+
+/**
+* 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 CFG_LED_SUPPORTED 1
+#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
+
+
+#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
+
+/******************************************************************************
+ * 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 )
+
+
+/******************************************************************************
+ * 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 (0x30000U )
+#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)
+
+
+/******************************************************************************
+ * UART interfaces
+ ******************************************************************************/
+#define CFG_DEBUG_TRACE_UART hw_uart1
+#define CFG_CLI_UART 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
+
+/**
+ * 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
+{
+ /* BLE */
+ CFG_TASK_ADV_CANCEL_ID,
+ CFG_TASK_SW1_BUTTON_PUSHED_ID,
+ CFG_TASK_HCI_ASYNCH_EVT_ID,
+ CFG_TASK_APP_BLE_START,
+ CFG_TASK_APP_ADV_START,
+
+ /* Zigbee */
+ CFG_TASK_NOTIFY_FROM_M0_TO_M4,
+ CFG_TASK_REQUEST_FROM_M0_TO_M4,
+ CFG_TASK_ZIGBEE_NETWORK_FORM,
+ CFG_TIM_WAIT_BEOFRE_NVM_CLEAR,
+ CFG_TASK_BUTTON_SW1,
+ CFG_TASK_BUTTON_SW2,
+
+ /* Concurrent System */
+ CFG_Task_Switch_Protocol,
+
+ 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_SCH_PRIO_1,
+ CFG_PRIO_NBR,
+} CFG_SCH_Prio_Id_t;
+
+#define TASK_COAP_MSG_BUTTON (1U << CFG_TASK_COAP_MSG_BUTTON)
+#define TASK_MSG_FROM_M0_TO_M4 (1U << CFG_TASK_MSG_FROM_M0_TO_M4)
+/**
+ * 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,
+ /* Zigbee */
+ CFG_EVT_ACK_FROM_M0_EVT,
+ CFG_EVT_SYNCHRO_BYPASS_IDLE,
+ CFG_EVT_ZIGBEE_STOP,
+ CFG_EVT_ON_OFF_RSP,
+ CFG_EVT_ZIGBEE_STARTUP_ENDED,
+ CFG_IDLEEVT_FLASH_OPER_ALLOWED,
+ CFG_EVT_DYN_MODE_WAIT_NEXT_802154_EVT,
+
+ /* BLE Adv */
+ CFG_EVT_BLE_LP_ADV_ENABLED,
+ CFG_EVT_BLE_FAST_ADV_ENABLED,
+} CFG_IdleEvt_Id_t;
+
+#define EVENT_ON_OFF_RSP (1U << CFG_EVT_ON_OFF_RSP)
+#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_BLE_LP_ADV_ENABLED (1U << CFG_EVT_BLE_LP_ADV_ENABLED)
+#define EVENT_BLE_FAST_ADV_ENABLED (1U << CFG_EVT_BLE_FAST_ADV_ENABLED)
+#define EVENT_DYN_MODE_WAIT_NEXT_802154_EVT (1U << CFG_EVT_DYN_MODE_WAIT_NEXT_802154_EVT)
+
+/******************************************************************************
+ * 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_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
+
+
+typedef enum
+{
+ BUTTON_1 = 0x1,
+} button_type_t;
+
+#endif /* APP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/app_entry.h
new file mode 100644
index 000000000..1e7fcbf1f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/app_entry.h
@@ -0,0 +1,53 @@
+
+/**
+ ******************************************************************************
+ * @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
+
+#include "stm32wbxx_hal.h"
+#include "stm32_seq.h"
+#include "tl.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+ /* Exported types ------------------------------------------------------------*/
+ /* Exported constants --------------------------------------------------------*/
+ /* External variables --------------------------------------------------------*/
+ /* Exported macros -----------------------------------------------------------*/
+ /* Exported functions ------------------------------------------------------- */
+ void APPE_Init( void );
+ void APP_ENTRY_RegisterCmdBuffer(TL_CmdPacket_t* p_buffer);
+ void APP_ENTRY_ProcessMsgM0ToM4(void);
+ void APP_ENTRY_Init_CFG_CLI_UART(void);
+ void APP_ENTRY_TL_THREAD_INIT(void);
+ void UTIL_SEQ_EvtIdle( UTIL_SEQ_bm_t task_id_bm, UTIL_SEQ_bm_t evt_waited_bm );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __APP_ENTRY_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/ee.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/ee.h
new file mode 100644
index 000000000..2be1fc4dd
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/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/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/ee_cfg.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/ee_cfg.h
new file mode 100644
index 000000000..891b81f2c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/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/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/flash_driver.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/flash_driver.h
new file mode 100644
index 000000000..6fe437c7d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/flash_driver.h
@@ -0,0 +1,198 @@
+/* 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);
+
+
+ /**
+ * 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 relative_time: BLE next event relative time (too short for the requested FLASH operation).
+ * @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 DYN_CONCURRENT_MODE_WaitUntilNext_802154_Evt(uint32_t relative_time);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*FLASH_DRIVER_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/hw_conf.h
new file mode 100644
index 000000000..7ad86ef24
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/hw_conf.h
@@ -0,0 +1,241 @@
+/**
+ ******************************************************************************
+ * @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 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 */
+#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.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/hw_if.h
new file mode 100644
index 000000000..271a222a9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/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_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/main.h
new file mode 100644
index 000000000..bbe71a4da
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/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_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/stm32_lpm_if.h
new file mode 100644
index 000000000..d8e67947f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/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_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/stm32wbxx_hal_conf.h
new file mode 100644
index 000000000..f37437884
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/stm32wbxx_hal_conf.h
@@ -0,0 +1,349 @@
+/**
+ ******************************************************************************
+ * @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_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/stm32wbxx_it.h
new file mode 100644
index 000000000..46179c211
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/stm32wbxx_it.h
@@ -0,0 +1,62 @@
+/**
+ ******************************************************************************
+ * @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 IPCC_C1_RX_IRQHandler(void);
+void IPCC_C1_TX_IRQHandler(void);
+void EXTI4_IRQHandler(void);
+void EXTI0_IRQHandler(void);
+void EXTI1_IRQHandler(void);
+void USART1_IRQHandler(void);
+void DMA2_Channel4_IRQHandler(void);
+void CFG_HW_USART1_DMA_TX_IRQHandler( void );
+void RTC_WKUP_IRQHandler(void);
+void LPUART1_IRQHandler(void);
+void DMA1_Channel4_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_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/stm_logging.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/stm_logging.h
new file mode 100644
index 000000000..bf6d777b4
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/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.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Inc/utilities_conf.h
new file mode 100644
index 000000000..4dde3509a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/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_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/app_entry.c
new file mode 100644
index 000000000..db52f7978
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/app_entry.c
@@ -0,0 +1,494 @@
+/**
+ ******************************************************************************
+ * @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_zigbee.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 "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 */
+
+/* Private defines -----------------------------------------------------------*/
+/* POOL_SIZE = 2(TL_PacketHeader_t) + 258 (3(TL_EVT_HDR_SIZE) + 255(Payload size)) */
+#define POOL_SIZE (CFG_TLBLE_EVT_QUEUE_LENGTH*4*DIVC(( sizeof(TL_PacketHeader_t) + TL_BLE_EVENT_FRAME_SIZE ), 4))
+#define T_1S_NB_TICKS (1*1000*1000/CFG_TS_TICK_VAL) /**< 1s */
+#define T_1MS_NB_TICKS (1*1000/CFG_TS_TICK_VAL) /**< 1s */
+#define T_50MS (50*T_1MS_NB_TICKS)
+#define T_100MS (100*T_1MS_NB_TICKS)
+#define T_200MS (200*T_1MS_NB_TICKS)
+#define T_2S (2*T_1S_NB_TICKS)
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+/* Private variables ---------------------------------------------------------*/
+
+extern RTC_HandleTypeDef hrtc; /**< RTC handler declaration */
+extern uint8_t ZbStackType; /* ZB stack type, static or dynamic */
+
+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) */
+
+/* As the NVM is used for data persistence, BLE has to be started first.
+ Indeed, we need BLE to be running for being able to organize FLASH operations
+ and respect BLE timming */
+static SHCI_C2_CONCURRENT_Mode_Param_t ConcurrentMode = BLE_ENABLE;
+
+/* Global variables ----------------------------------------------------------*/
+
+/* 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_Tl_Init( void );
+/* USER CODE BEGIN PFP */
+static void Led_Init( void );
+static void Button_Init( void );
+/* USER CODE END PFP */
+
+static void Process_Start_ZB(void);
+
+
+/* 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();
+
+ APP_DBG("ConcurrentMode = %d", ConcurrentMode);
+
+ /* Task to start Zigbee process */
+ UTIL_SEQ_RegTask( 1<<CFG_Task_Switch_Protocol, UTIL_SEQ_RFU, Process_Start_ZB);
+
+ /**
+ * 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();
+
+ 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 BLE or Zigbee Stack
+ * This system event is received with APPE_UserEvtRx()
+ */
+
+ return;
+}
+
+/** Scheduler tasks **/
+static void Process_Start_ZB(void)
+{
+ if (1) {
+ //if (ConcurrentMode == BLE_ENABLE) {
+ APP_DBG("Process_Start_Zigbee");
+
+ APP_ZIGBEE_Init_Step2();
+
+ }
+}
+
+/*************************************************************
+ *
+ * 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_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 )
+{
+ 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:
+
+ /* Traces channel initialization */
+ TL_TRACES_Init( );
+
+ if (ConcurrentMode == BLE_ENABLE) {
+ /* Start Zigbee first */
+ APP_DBG("==> Start_BLE");
+ APP_BLE_Init_Step1();
+ APP_BLE_Init_Step2();
+
+ APP_DBG("==> Start Zigbee");
+ APP_ZIGBEE_Init_Step1();
+ switch (ZbStackType) { /* Check ZB stack type */
+ case INFO_STACK_TYPE_BLE_ZIGBEE_FFD_STATIC: /* Start ZB only */
+ APP_DBG("==> Start Zigbee Networking");
+ APP_ZIGBEE_Init_Step2();
+ break;
+ case INFO_STACK_TYPE_BLE_ZIGBEE_FFD_DYNAMIC: /* Start ZB/BLE Dynamic mode */
+ HAL_Delay(100);
+ APP_DBG("==> Start_BLE Advertising");
+ UTIL_SEQ_SetTask(1U << CFG_TASK_APP_BLE_START, CFG_SCH_PRIO_1);
+ HAL_Delay(100);
+ APP_DBG("==> Start Zigbee Networking");
+ APP_ZIGBEE_Init_Step2();
+ break;
+ default:
+ /* No Zigbee device supported ! */
+ APP_DBG("FW Type : No ZB STACK type detected");
+ break;
+ }
+ } else {
+ /* Cannot start Zigbee first when using NVM */
+ return;
+ }
+
+ case SHCI_SUB_EVT_CODE_CONCURRENT_802154_EVT:
+ APP_ZIGBEE_WaitUntilNext_802154_Evt_cb();
+ break;
+ }
+
+// UTIL_LPM_SetOffMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
+
+ return;
+}
+
+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);
+
+ //BSP_LED_On(LED_GREEN);
+#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_ID, CFG_SCH_PRIO_0);
+ return;
+}
+
+void shci_cmd_resp_release(uint32_t flag)
+{
+ UNUSED(flag);
+ UTIL_SEQ_SetEvt(1U << CFG_IDLEEVT_HCI_CMD_EVT_RSP_ID);
+ return;
+}
+
+void shci_cmd_resp_wait(uint32_t timeout)
+{
+ UNUSED(timeout);
+ UTIL_SEQ_WaitEvt(1U << CFG_IDLEEVT_HCI_CMD_EVT_RSP_ID);
+ 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 Initialization 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
+
+/**
+ * @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:
+// APP_DBG("BUTTON 1 PUSHED ! : ZIGBEE/BLE MESSAGE SENDING");
+// UTIL_SEQ_SetTask(1U << CFG_TASK_BUTTON_SW1, CFG_SCH_PRIO_1);
+// //HAL_Delay(T_50MS);
+// //APP_BLE_Key_Button1_Action();
+// break;
+ //if (ConcurrentMode == ZIGBEE_ENABLE) {
+ if (1) {
+ APP_DBG("BUTTON 1 PUSHED ! : ZIGBEE MESSAGE SENDING");
+ UTIL_SEQ_SetTask(1U << CFG_TASK_BUTTON_SW1, CFG_SCH_PRIO_1);
+ } else {
+ APP_BLE_Key_Button1_Action();
+ }
+ break;
+
+ case BUTTON_SW2_PIN:
+ UTIL_SEQ_SetTask(1U << CFG_TASK_BUTTON_SW2, CFG_SCH_PRIO_1);
+ break;
+
+ case BUTTON_SW3_PIN:
+ APP_DBG("BUTTON 3 PUSHED ! : START ADV BLE");
+
+ /* Start BLE App + Advertising */
+ APP_DBG("==> Start_BLE Advertising");
+ UTIL_SEQ_SetTask(1U << CFG_TASK_APP_BLE_START, CFG_SCH_PRIO_1);
+
+ break;
+
+ default:
+ break;
+ }
+ return;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/ee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/ee.c
new file mode 100644
index 000000000..0b74a0fea
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/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/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/flash_driver.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/flash_driver.c
new file mode 100644
index 000000000..01b7cef84
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/flash_driver.c
@@ -0,0 +1,384 @@
+/**
+ ******************************************************************************
+ * 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"
+#include "stdbool.h"
+
+/* Private typedef -----------------------------------------------------------*/
+typedef enum
+{
+ SEM_LOCK_SUCCESSFUL,
+ SEM_LOCK_BUSY,
+}SemStatus_t;
+
+typedef enum
+{
+ FLASH_ERASE,
+ FLASH_WRITE,
+}FlashOperationType_t;
+
+typedef struct
+{
+ uint32_t relative_time;
+}DynConcurrentMode_802154_RemainingTime_t;
+
+/* Private defines -----------------------------------------------------------*/
+/* Private macros ------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+static DynConcurrentMode_802154_RemainingTime_t remaining_time;
+/* Global variables ----------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+static SingleFlashOperationStatus_t ProcessSingleFlashOperation(FlashOperationType_t FlashOperationType,
+ uint32_t SectorNumberOrDestAddress,
+ uint64_t Data);
+static bool DYN_CONCURRENT_MODE_SingleFlashOperationPossible(FlashOperationType_t FlashOperationType);
+
+/* 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;
+ bool concurrent_mode_flash_operation_allowed;
+
+ 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.
+ */
+
+ UTILS_EXIT_CRITICAL_SECTION();
+ /* check if the FLASH operation is possible regarding the BLE timing */
+ concurrent_mode_flash_operation_allowed = DYN_CONCURRENT_MODE_SingleFlashOperationPossible(FlashOperationType);
+ UTILS_ENTER_CRITICAL_SECTION();
+
+ if(FlashOperationType == FLASH_ERASE)
+ {
+ if(concurrent_mode_flash_operation_allowed){
+ HAL_FLASHEx_Erase(&p_erase_init, &page_error);
+ }
+ }
+ else
+ {
+ if(concurrent_mode_flash_operation_allowed){
+ 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);
+ } else if(!concurrent_mode_flash_operation_allowed){
+ waited_sem_status = DYN_CONCURRENT_MODE_WaitUntilNext_802154_Evt(remaining_time.relative_time);
+ }
+ }
+ while( ((cpu2_sem_status != SEM_LOCK_SUCCESSFUL) || (cpu1_sem_status != SEM_LOCK_SUCCESSFUL) || (!concurrent_mode_flash_operation_allowed))
+ && (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;
+}
+
+static bool DYN_CONCURRENT_MODE_SingleFlashOperationPossible(FlashOperationType_t FlashOperationType){
+ SHCI_C2_CONCURRENT_GetNextBleEvtTime_Param_t nextBleEvt;
+ bool result = true;
+
+ memset(&nextBleEvt, 0, sizeof(nextBleEvt));
+ SHCI_C2_CONCURRENT_GetNextBleEvtTime(&nextBleEvt);
+
+ /* Remove IPCC transfer time (300us) => 1ms margin */
+ remaining_time.relative_time = nextBleEvt.relative_time - 1000;
+
+ switch(FlashOperationType){
+ case FLASH_ERASE:
+ if((remaining_time.relative_time)<25*1000){
+ result = false;
+ }
+ break;
+ case FLASH_WRITE:
+ if(remaining_time.relative_time<100){
+ result = false;
+ }
+ break;
+ default:
+ result = false;
+ }
+ return result;
+}
+
+/*************************************************************
+ *
+ * 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;
+}
+
+__WEAK WaitedSemStatus_t DYN_CONCURRENT_MODE_WaitUntilNext_802154_Evt(uint32_t relative_time)
+{
+ /**
+ * There is no sufficient time to perform the requested FLASH operation. The application has to wait the next BLE event.
+ * 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_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/hw_flash.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/hw_flash.c
new file mode 100644
index 000000000..7685048d5
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/hw_flash.c
@@ -0,0 +1,121 @@
+/*****************************************************************************
+ * @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) 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 "common.h"
+#include "stm32_seq.h"
+//#include "dbg_gpio.h"
+#include "hw_flash.h"
+#include "stm32wbxx_hal.h"
+#include "flash_driver.h"
+
+#include "app_common.h"
+#include "shci.h"
+#include "utilities_conf.h"
+
+/*****************************************************************************/
+
+int HW_FLASH_Write(uint32_t address, uint64_t data)
+{
+ /**
+ * Take the semaphore to take ownership of the Flash IP
+ */
+ while(LL_HSEM_1StepLock(HSEM, CFG_HW_FLASH_SEMID));
+
+ HAL_FLASH_Unlock();
+
+ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR |FLASH_FLAG_PGSERR | FLASH_FLAG_OPTVERR);
+
+ /*Enable EOP interupt */
+ __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP);
+ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
+
+ FD_WriteSingleData(address, data);
+
+ /* 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);
+
+ HAL_FLASH_Lock();
+
+ /**
+ * Release the ownership of the Flash IP
+ */
+ LL_HSEM_ReleaseLock(HSEM, CFG_HW_FLASH_SEMID, 0);
+
+ return (HW_OK);
+}
+
+/*****************************************************************************/
+
+int HW_FLASH_Erase(uint32_t page, uint16_t n, int interrupt)
+{
+ UNUSED(interrupt);
+
+ uint32_t loop;
+
+ /**
+ * Take the semaphore to take ownership of the Flash IP
+ */
+ while(LL_HSEM_1StepLock(HSEM, CFG_HW_FLASH_SEMID));
+
+ HAL_FLASH_Unlock();
+
+ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP |FLASH_FLAG_ALL_ERRORS);
+ /* Enable EOP interrupt */
+ __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP);
+
+ /**
+ * 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 = 0; loop < n ; loop++)
+ {
+ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
+
+ FD_EraseSingleSector(page+loop);
+ }
+
+ /* 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));
+
+ /**
+ * 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 (HW_OK);
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE***/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/hw_timerserver.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/hw_timerserver.c
new file mode 100644
index 000000000..c842ba55e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/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_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/hw_uart.c
new file mode 100644
index 000000000..7d28f9582
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/hw_uart.c
@@ -0,0 +1,465 @@
+/**
+ ******************************************************************************
+ * @file hw_uart.c
+ * @author MCD Application Team
+ * @brief hardware access
+ ******************************************************************************
+ * @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 "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{ \
+ /* Enable GPIO clock */ \
+ CFG_HW_##__USART_BASE__##_TX_PORT_CLK_ENABLE(); \
+ \
+ /* Enable USART clock */ \
+ __HAL_RCC_##__USART_BASE__##_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); \
+ \
+ 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); \
+ \
+ 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); \
+ \
+ 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)
+{
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+
+ 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.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/main.c
new file mode 100644
index 000000000..021c1c150
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/main.c
@@ -0,0 +1,320 @@
+/**
+ ******************************************************************************
+ * @file : main.c
+ * @brief : Main program body
+ *
+ @verbatim
+ ==============================================================================
+ ##### IMPORTANT NOTE #####
+ ==============================================================================
+
+ This application requests having the stm32wb5x_BLE_Thread_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"
+
+/* 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 );
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Main program
+ * @param None
+ * @retval None
+ */
+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 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; /**< 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
+ */
+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
+
+ /**
+ * 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;
+}
+
+/*************************************************************
+ *
+ * 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_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/stm32_lpm_if.c
new file mode 100644
index 000000000..f024b61e3
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/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/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/stm32wbxx_it.c
new file mode 100644
index 000000000..8c7f63d4c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/stm32wbxx_it.c
@@ -0,0 +1,188 @@
+/**
+ ******************************************************************************
+ * @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 "stm32wbxx_it.h"
+#include "app_common.h"
+
+/* CONCURRENT MODE BLE/THREAD */
+/* External variables -----------------------------------------------------------*/
+extern uint8_t ThreadEnable;
+
+/* /THREAD */
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+/* 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)
+{
+ /* 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();
+}
+
+ 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 External line
+ * interrupt request.
+ * @param None
+ * @retval None
+ */
+void PUSH_BUTTON_SW1_EXTI_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW1_PIN);
+}
+
+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);
+}
+
+#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
+
+
+/******************************************************************************/
+/* STM32L0xx Peripherals Interrupt Handlers */
+/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */
+/* available peripheral interrupt handler's name please refer to the startup */
+/* file (startup_stm32l0xx.s). */
+/******************************************************************************/
+/**
+ * @brief This function handles RTC Auto wake-up interrupt request.
+ * @param None
+ * @retval None
+ */
+void RTC_WKUP_IRQHandler(void)
+{
+ HW_TS_RTC_Wakeup_Handler();
+}
+
+
+
+
+
+
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/stm_logging.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/stm_logging.c
new file mode 100644
index 000000000..485e84742
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/stm_logging.c
@@ -0,0 +1,213 @@
+
+/**
+ ******************************************************************************
+ * @file stm_logging.c
+ * @author MCD Application Team
+ * @brief 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 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/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/Core/Src/system_stm32wbxx.c
new file mode 100644
index 000000000..e3025c7f9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/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_Zigbee/BLE_Zigbee_Dyn_NVM/EWARM/BLE_Zigbee_Dyn_NVM.ewd b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/EWARM/BLE_Zigbee_Dyn_NVM.ewd
new file mode 100644
index 000000000..7f19f3455
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/EWARM/BLE_Zigbee_Dyn_NVM.ewd
@@ -0,0 +1,1419 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>BLE_Zigbee_Dyn_NVM</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>$PROJ_DIR$\enableCPU2.mac</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>0</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>1</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>7.60.2.11347</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></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>1</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>1</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state>C:\work\THREAD\GIT_THREAD\stm32wb_M0_Firmware\Projects\Multi\Application\EWARM\stm32wbxx_ble_thread_host\ble_thread_host.eww</state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state>ble_thread_host</state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state>Production</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>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></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>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>4</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>1</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>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></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>2</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>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>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>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>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <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>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_Zigbee/BLE_Zigbee_Dyn_NVM/EWARM/BLE_Zigbee_Dyn_NVM.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/EWARM/BLE_Zigbee_Dyn_NVM.ewp
new file mode 100644
index 000000000..85d7080df
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/EWARM/BLE_Zigbee_Dyn_NVM.ewp
@@ -0,0 +1,1331 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>BLE_Zigbee_Dyn_NVM</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>1</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>STM32WB55xx</state>
+ <state>USE_HAL_DRIVER</state>
+ <state>USE_STM32WBXX_NUCLEO</state>
+ <state>STATIC_MODE</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>1</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>1</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/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$\..\..\..\..\..\..\Middlewares/ST/STM32_WPAN/zigbee/stack/include/extras</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares/ST/STM32_WPAN/zigbee/platform</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN</state>
+ <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$\..\..\..\..\..\..\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</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\ble</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\thread\openthread\stack\include</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>1</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>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>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\ee.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\flash_driver.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\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>
+ <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_ble.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\app_zigbee.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>
+ </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_hsem.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_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>
+ </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\p2p_stm.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>
+ <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>platform</name>
+ </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/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/EWARM/BLE_Zigbee_Dyn_NVM.eww b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/EWARM/BLE_Zigbee_Dyn_NVM.eww
new file mode 100644
index 000000000..514309423
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/EWARM/BLE_Zigbee_Dyn_NVM.eww
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workspace>
+ <project>
+ <path>$WS_DIR$\BLE_Zigbee_Dyn_NVM.ewp</path>
+ </project>
+ <batchBuild />
+</workspace>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/EWARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..79b0e7edd
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/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/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/EWARM/stm32wb55xx_flash_cm4.icf
new file mode 100644
index 000000000..0e3fe46db
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/EWARM/stm32wb55xx_flash_cm4.icf
@@ -0,0 +1,41 @@
+/*###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__ = 0x0806FFFF;
+define symbol __ICFEDIT_region_RAM_start__ = 0x20000004;
+define symbol __ICFEDIT_region_RAM_end__ = 0x20025FFF;
+
+/*-Sizes-*/
+define symbol __ICFEDIT_size_cstack__ = 0x1000;
+define symbol __ICFEDIT_size_heap__ = 102400; /* Heap increased for Zigbee */
+/**** 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_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/App/app_ble.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/App/app_ble.c
new file mode 100644
index 000000000..194f0f8b7
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/App/app_ble.c
@@ -0,0 +1,1236 @@
+/* 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 "app_common.h"
+
+#include "dbg_trace.h"
+#include "ble.h"
+#include "tl.h"
+#include "app_ble.h"
+#include "stdbool.h"
+
+#include "stm32_seq.h"
+#include "shci.h"
+#include "stm32_lpm.h"
+#include "otp.h"
+#include "p2p_server_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;
+
+ /**
+ * connection interval of the current active connection
+ */
+ uint16_t connectionInterval;
+
+ /**
+ * 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 (90*1000*1000/CFG_TS_TICK_VAL) /**< 90s */
+
+#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];
+
+extern uint32_t disc_cnt;
+
+/**
+* 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;
+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','Z','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 */,
+ CFG_FEATURE_THREAD_SWITCH /* 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', 'Z', 'B', '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', 'Z', 'B', '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', 'Z', 'B', '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', 'Z', 'B', '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', 'Z', 'B', '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
+
+/* 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 tBleStatus BLE_SVC_L2CAP_Conn_Update(uint16_t Connection_Handle, uint16_t Connection_Interval);
+#endif
+
+uint16_t APP_BLE_GetConnectionInterval(bool *deviceConnected);
+bool APP_BLE_ConnectionUpdate(uint16_t connectionInterval);
+
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APP_BLE_Init_Step1( void )
+{
+/* USER CODE BEGIN 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);
+
+ /* Task associated with BLE Start App */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_APP_BLE_START, UTIL_SEQ_RFU, APP_BLE_Init_App);
+
+ /* Task associated with BLE Start ADV */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_APP_ADV_START, UTIL_SEQ_RFU, APP_BLE_Start_ADV);
+
+ /**
+ * Starts the BLE Stack on CPU2
+ */
+ SHCI_C2_BLE_Init( &ble_init_cmd_packet );
+
+ return;
+ /* USER CODE END APP_BLE_Init_1 */
+}
+
+void APP_BLE_Init_Step2( void )
+{
+ /**
+ * 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;
+/* USER CODE END APP_BLE_Init_2 */
+ return;
+}
+
+void APP_BLE_Init_App( void )
+{
+ /**
+ * From here, all initialization are BLE application specific
+ */
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_ADV_CANCEL_ID, UTIL_SEQ_RFU, Adv_Cancel);
+ /**
+ * 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
+ */
+// if (first_advertising) {
+// first_advertising = FALSE;
+// Adv_Request(APP_BLE_LP_ADV);
+// }
+// else
+ Adv_Request(APP_BLE_FAST_ADV);
+
+/* USER CODE END APP_BLE_Init_App */
+ return;
+}
+
+void APP_BLE_Start_ADV( void )
+{
+ /**
+ * 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);
+
+ UTIL_SEQ_SetEvt(EVENT_BLE_FAST_ADV_ENABLED);
+
+/* USER CODE END APP_BLE_Init_App */
+ 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;
+
+ 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");
+ disc_cnt++;
+ }
+ /* restart advertising */
+ Adv_Request(APP_BLE_FAST_ADV);
+ //Adv_Request(APP_BLE_LP_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 */
+ hci_le_connection_update_complete_event_rp0 *connection_update_complete = (hci_le_connection_update_complete_event_rp0 *) meta_evt->data;
+ BleApplicationContext.BleApplicationContext_legacy.connectionInterval =
+ connection_update_complete->Conn_Interval;
+ APP_DBG_MSG("CONN_UPDATE_COMPLETE [Conn_Interval=%d ms], latency=%d \n\r",
+ (connection_update_complete->Conn_Interval * 10) / 8, connection_update_complete->Conn_Latency);
+ /* USER CODE END EVT_LE_CONN_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;
+ }
+
+ UTIL_SEQ_SetTask(1 << CFG_TASK_ADV_CANCEL_ID, CFG_SCH_PRIO_0);
+
+ BleApplicationContext.BleApplicationContext_legacy.connectionHandle =
+ connection_complete_event->Connection_Handle;
+
+ APP_DBG_MSG("CONN_COMPLETE [Conn_Interval=%d ms], latency=%d \n\r",
+ (connection_complete_event->Conn_Interval * 10) / 8, connection_complete_event->Conn_Latency);
+
+ BleApplicationContext.BleApplicationContext_legacy.connectionInterval =
+ connection_complete_event->Conn_Interval;
+ /*
+* 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 */
+
+ /* 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 0x0004:
+ /* 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;
+}
+
+/* USER CODE BEGIN FD*/
+void APP_BLE_Key_Button1_Action(void)
+{
+ P2PS_APP_SW1_Button_Action();
+}
+
+void APP_BLE_Key_Button2_Action(void)
+{
+}
+
+void APP_BLE_Key_Button3_Action(void)
+{
+}
+
+void APP_BLE_Stop(void)
+{
+ /* BLE STOP Procedure */
+ aci_hal_stack_reset();
+
+ APP_DBG("INSERT SOME WAIT");
+ HAL_Delay(100);
+
+ /* Stop Advertising Timer */
+ HW_TS_Stop(BleApplicationContext.Advertising_mgr_timer_Id);
+ HW_TS_Delete(BleApplicationContext.Advertising_mgr_timer_Id);
+}
+/* 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 = "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();
+ }
+}
+
+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_FAST_ADV)
+ //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");
+ Adv_Request(APP_BLE_LP_ADV);
+ }
+ else
+ {
+ APP_DBG_MSG("** STOP ADVERTISING ** Failed \r\n\r");
+ }
+
+ /* Set Cancel adv event */
+ UTIL_SEQ_SetEvt(EVENT_BLE_LP_ADV_ENABLED);
+ }
+
+/* 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)
+tBleStatus BLE_SVC_L2CAP_Conn_Update(uint16_t Connection_Handle, uint16_t Connection_Interval)
+{
+/* USER CODE BEGIN BLE_SVC_L2CAP_Conn_Update_1 */
+
+/* USER CODE END BLE_SVC_L2CAP_Conn_Update_1 */
+ tBleStatus result;
+ 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;
+
+ interval_min = interval_max = Connection_Interval;
+ 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(CI=%d), Successful \r\n\r", (Connection_Interval * 10) /8);
+ }
+ else
+ {
+ APP_DBG_MSG("BLE_SVC_L2CAP_Conn_Update(CI=%d), Failed \r\n\r", (Connection_Interval * 10) /8);
+ }
+ }
+/* USER CODE BEGIN BLE_SVC_L2CAP_Conn_Update_2 */
+
+/* USER CODE END BLE_SVC_L2CAP_Conn_Update_2 */
+ return result;
+}
+#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 */
+
+/* USER CODE END FD_WRAP_FUNCTIONS */
+
+/**
+ * @brief Get BLE connection interval
+ * @param deviceConnected: boolean pointer that indicates if
+ the device is currently connected.
+ * @retval Connection interval value
+ */
+uint16_t APP_BLE_GetConnectionInterval(bool *deviceConnected){
+ if ( (BleApplicationContext.Device_Connection_Status == APP_BLE_CONNECTED_CLIENT) ||
+ (BleApplicationContext.Device_Connection_Status == APP_BLE_CONNECTED_SERVER) )
+ {
+ *deviceConnected = true;
+ }
+ return BleApplicationContext.BleApplicationContext_legacy.connectionInterval;
+}
+
+/**
+ * @brief Update BLE connection interval
+ * @param connectionInterval: connection interval value.
+ * @retval Boolean status
+ */
+bool APP_BLE_ConnectionUpdate(uint16_t connectionInterval){
+ tBleStatus result;
+ result = BLE_SVC_L2CAP_Conn_Update(BleApplicationContext.BleApplicationContext_legacy.connectionHandle, connectionInterval);
+ if( result == BLE_STATUS_SUCCESS ){
+ return true;
+ } else{
+ return false;
+ }
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/App/app_ble.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/App/app_ble.h
new file mode 100644
index 000000000..217c21ab6
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/App/app_ble.h
@@ -0,0 +1,92 @@
+/* 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 );
+ void APP_BLE_Init_Step1( void );
+ void APP_BLE_Init_Step2( void );
+ void APP_BLE_Init_App( void );
+ void APP_BLE_Start_ADV( 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);
+void APP_BLE_Stop(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_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/App/app_zigbee.c
new file mode 100644
index 000000000..3710365bb
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/App/app_zigbee.c
@@ -0,0 +1,1192 @@
+/**
+ ******************************************************************************
+ * 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.identify.h"
+
+#include "ee.h"
+#include "hw_flash.h"
+#include "flash_driver.h"
+
+#include "app_ble.h"
+
+/* Private defines -----------------------------------------------------------*/
+#define APP_ZIGBEE_STARTUP_FAIL_DELAY 500U
+#define SW1_ENDPOINT 17U
+#define SW1_GROUP_ADDR 0x0001
+#define CHANNEL 13U
+#define HW_TS_SERVER_1MS_NB_TICKS (1*1000/CFG_TS_TICK_VAL)
+
+#define CFG_NVM 1U /* use FLASH */
+//#undef CFG_NVM
+
+#define COLOR_DEFAULT "\x1b[0m"
+#define COL_CYAN "\x1b[0;96m"
+#define COL_MAGENTA "\x1b[0;95m"
+#define COL_RED "\x1b[0;91m"
+#define COL_NORM "\x1b[0m"
+
+/* 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_ConfigGroupAddr(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);
+
+static uint32_t APP_ZIGBEE_GetStartNb(void);
+static void APP_ZIGBEE_IncrementStartNb(void);
+
+static bool APP_ZIGBEE_persist_load(void);
+static bool APP_ZIGBEE_persist_save(void);
+static void APP_ZIGBEE_persist_delete(void);
+static void APP_ZIGBEE_persist_notify_cb(struct ZigBeeT *zb, void *cbarg);
+static enum ZbStatusCodeT APP_ZIGBEE_ZbStartupPersist(struct ZigBeeT *zb);
+static void APP_ZIGBEE_PersistCompleted_callback(enum ZbStatusCodeT status,void *arg);
+
+#ifdef CFG_NVM
+static void APP_ZIGBEE_NVM_Init(void);
+static bool APP_ZIGBEE_NVM_Read(void);
+static bool APP_ZIGBEE_NVM_Write(void);
+static void APP_ZIGBEE_NVM_Erase(void);
+#endif /* CFG_NVM */
+
+/* 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;
+ bool fresh_startup;
+ uint32_t persistNumWrites;
+
+ struct ZbZclClusterT *onoff_client_1;
+};
+static struct zigbee_app_info zigbee_app_info;
+
+static uint32_t join_start_time;
+static double join_time_duration;
+
+/* 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
+};
+__attribute__ ((section(".noinit"))) union cache cache_persistent_data;
+
+/* Public variables -----------------------------------------------*/
+uint8_t ZbStackType; /* ZB stack type, static or dynamic */
+uint32_t toggle_cnt = 0;
+uint32_t toggle_fail = 0;
+uint32_t disc_cnt = 0;
+
+/* Keep track of number of Zigbee start */
+static uint8_t zigbee_start_nb = 0U;
+static bool zigbee_logging_done = FALSE;
+
+uint8_t TS_ID1, TS_ID2;
+
+/* Functions Definition ------------------------------------------------------*/
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+extern uint16_t APP_BLE_GetConnectionInterval(bool *deviceConnected);
+extern bool APP_BLE_ConnectionUpdate(uint16_t connectionInterval);
+
+void APP_ZIGBEE_Init_Step1(void)
+{
+ SHCI_CmdStatus_t ZigbeeInitStatus;
+
+ APP_DBG("APP_ZIGBEE_Init");
+ APP_DBG("STARTING ON CHANNEL = %d", CHANNEL);
+
+ /* 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 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);
+
+ /* Init the Zigbee on the CPU2 side */
+ ZigbeeInitStatus = SHCI_C2_ZIGBEE_Init();
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(ZigbeeInitStatus);
+} /* APP_ZIGBEE_Init_Step1 */
+
+
+void APP_ZIGBEE_Init_Step2(void)
+{
+ /* NVM Init */
+#if CFG_NVM
+ APP_ZIGBEE_NVM_Init();
+#endif
+
+ /* Initialize Zigbee stack layers and launch network formation */
+ APP_ZIGBEE_StackLayersInit();
+
+ APP_ZIGBEE_IncrementStartNb();
+
+} /* APP_ZIGBEE_Init_Step2 */
+
+void APP_ZIGBEE_Stop(void)
+{
+ APP_DBG("APP_ZIGBEE_Stop");
+
+ BSP_LED_Off(LED_RED);
+ BSP_LED_Off(LED_GREEN);
+ BSP_LED_Off(LED_BLUE);
+
+ /* Save Persistent data */
+ APP_DBG("Save persistent data");
+#ifdef WITH_PERSISTANT
+ APP_ZIGBEE_persist_save();
+#endif //WITH_PERSISTANT
+
+ /* Zigbee STOP Procedure */
+ /* Free memory allocated by Zigbee stack */
+ 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;
+}
+
+/**
+ * @brief Initialize Zigbee stack layers
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_StackLayersInit(void)
+{
+ enum ZbStatusCodeT status;
+
+ HAL_Delay(1000);
+ 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 = (enum ZbStatusCodeT) 0x01; /* init to error status */
+ zigbee_app_info.join_delay = HAL_GetTick(); /* now */
+ zigbee_app_info.startupControl = ZbStartTypeJoin;
+
+ /* STEP 1 - TRY to START FROM PERSISTENCE */
+
+ /* define if we need to do a fresh start */
+ zigbee_app_info.fresh_startup = true;
+
+ /* First we disable the persistent notification */
+ ZbPersistNotifyRegister(zigbee_app_info.zb,NULL,NULL);
+
+ /* Call a startup from persistence */
+ status = APP_ZIGBEE_ZbStartupPersist(zigbee_app_info.zb);
+ if(status == ZB_STATUS_SUCCESS)
+ {
+ /* no fresh stratup need anymore */
+ zigbee_app_info.fresh_startup = false;
+ APP_DBG("ZbStartupPersist: SUCCESS, restarted from persistence");
+ BSP_LED_On(LED_GREEN);
+ }
+ else
+ {
+ /* Start-up form persistence failed perform a fresh ZbStartup */
+ APP_DBG("ZbStartupPersist: FAILED to restart from persistence with status: 0x%02x",status);
+ }
+
+ if(zigbee_app_info.fresh_startup)
+ {
+ /* Go for fresh start */
+ join_start_time = HAL_GetTick();
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, CFG_SCH_PRIO_0);
+ }
+}
+
+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_ONOFF_SWITCH;
+
+ /* Endpoint: SW1_ENDPOINT */
+ req.endpoint = SW1_ENDPOINT;
+ ZbZclAddEndpoint(zigbee_app_info.zb, &req, &conf);
+ assert(conf.status == ZB_STATUS_SUCCESS);
+
+ /* OnOff 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);
+
+} /* config_endpoints */
+
+/**
+ * @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;
+
+ if (zigbee_logging_done == FALSE)
+ {
+ /* 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);
+ zigbee_logging_done = TRUE;
+ }
+
+ /* Attempt to join a zigbee network */
+ ZbStartupConfigGetProDefaults(&config);
+
+ APP_DBG("Network config : APP_STARTUP_CENTRALIZED_ROUTER");
+ zigbee_app_info.startupControl = ZbStartTypeJoin;
+ config.startupControl = zigbee_app_info.startupControl;
+
+ /* 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*/
+
+ APP_DBG("*** zigbee_start_nb value = %d ***", APP_ZIGBEE_GetStartNb());
+ {
+ /* 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)\n", status);
+ zigbee_app_info.join_status = status;
+
+ if (status == ZB_STATUS_SUCCESS) {
+ join_time_duration = (double)(HAL_GetTick() - join_start_time)/1000;
+ APP_DBG("%s==> JOIN SUCCESS, Duration = (%.2f seconds)%s\n", COL_MAGENTA, join_time_duration, COL_NORM);
+ zigbee_app_info.join_delay = 0U;
+ zigbee_app_info.init_after_join = true;
+ BSP_LED_On(LED_BLUE);
+
+ /* 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);
+ }
+ 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
+ {
+ zigbee_app_info.init_after_join = false;
+
+ /* Do it only first time */
+ if(APP_ZIGBEE_GetStartNb() == 1U)
+ {
+ /* Assign ourselves to the group addresses */
+ APP_ZIGBEE_ConfigGroupAddr();
+
+ /* 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));
+
+ switch (ZbStackType) { /* Check ZB stack type */
+ case INFO_STACK_TYPE_BLE_ZIGBEE_FFD_STATIC: /* Start ZB only */
+ break;
+ case INFO_STACK_TYPE_BLE_ZIGBEE_FFD_DYNAMIC: /* Start ZB/BLE Dynamic mode */
+ /* Start BLE App + Advertising*/
+ APP_DBG("==> Restart_BLE Advertising");
+ UTIL_SEQ_SetTask(1U << CFG_TASK_APP_ADV_START, CFG_SCH_PRIO_1);
+ break;
+ default:
+ /* No Zigbee device supported ! */
+ APP_DBG("FW Type : No ZB STACK type detected");
+ break;
+ }
+ }
+ }
+}
+
+/**
+ * @brief Set group addressing mode
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_ConfigGroupAddr(void)
+{
+ ZbApsmeAddGroupReqT req;
+ ZbApsmeAddGroupConfT conf;
+
+ memset(&req, 0, sizeof(req));
+ req.endpt = SW1_ENDPOINT;
+ req.groupAddr = SW1_GROUP_ADDR;
+ ZbApsmeAddGroupReq(zigbee_app_info.zb, &req, &conf);
+
+} /* APP_ZIGBEE_ConfigGroupAddr */
+
+/*************************************************************
+ * 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 */
+
+/**
+ * @brief startup wait function
+ * @param zb :Zigbee device object pointer, config: startup config pointer
+ * @param ErrCode
+ * @retval zigbee status stack code
+ */
+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 */
+
+
+static void APP_ZIGBEE_IncrementStartNb(void)
+{
+ zigbee_start_nb++;
+}
+
+static uint32_t APP_ZIGBEE_GetStartNb(void)
+{
+ return zigbee_start_nb;
+}
+
+
+/*************************************************************
+ *
+ * NVM FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief notify to save persitent data callback
+ * @param zb: Zigbee device object pointer, cbarg: callback arg pointer
+ * @retval None
+ */
+static void APP_ZIGBEE_persist_notify_cb(struct ZigBeeT *zb, void *cbarg)
+{
+ APP_DBG("Notification to save persistent data requested from stack");
+ /* Save the persistent data */
+ APP_ZIGBEE_persist_save();
+}
+
+/**
+ * @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,APP_ZIGBEE_PersistCompleted_callback,NULL);
+ }
+ else
+ {
+ /* Failed toi restart from persistence */
+ APP_DBG("APP_ZIGBEE_ZbStartupPersist: no persistence data to restore");
+ status = ZB_STATUS_ALLOC_FAIL;
+ }
+
+ /* Only for debug purpose, depending of persistent data, following traces
+ could display bytes that are irrelevants to on off cluster */
+ if(status == ZB_STATUS_SUCCESS)
+ {
+ /* read the last bytes of data where the ZCL on off persitent data shall be*/
+ uint32_t len = cache_persistent_data.U32_data[0] + 4 ;
+ APP_DBG("ClusterID %02x %02x",cache_persistent_data.U8_data[len-9],cache_persistent_data.U8_data[len-10]);
+ APP_DBG("Endpoint %02x %02x",cache_persistent_data.U8_data[len-7],cache_persistent_data.U8_data[len-8]);
+ APP_DBG("Direction %02x",cache_persistent_data.U8_data[len-6]);
+ APP_DBG("AttrID %02x %02x",cache_persistent_data.U8_data[len-4],cache_persistent_data.U8_data[len-5]);
+ APP_DBG("Len %02x %02x",cache_persistent_data.U8_data[len-2],cache_persistent_data.U8_data[len-3]);
+ APP_DBG("Value %02x",cache_persistent_data.U8_data[len-1]);
+ }
+
+ return status;
+}/* APP_ZIGBEE_ZbStartupPersist */
+
+/**
+ * @brief timer callback to wait end of restore cluster persistence form M0
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_PersistCompleted_callback(enum ZbStatusCodeT status,void *arg)
+{
+ if(status == ZB_WPAN_STATUS_SUCCESS)
+ {
+ APP_DBG("Persist complete callback entered with SUCCESS");
+ }
+ else
+ {
+ APP_DBG("Error in persist complete callback %x",status);
+ }
+ /* STEP3 - Activate back the persistent notofacation */
+
+ /* 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);
+}/* APP_ZIGBEE_PersistCompleted_callback */
+
+
+/**
+ * @brief Load persitent data
+ * @param None
+ * @retval true if sucess, false if fail
+ */
+static bool APP_ZIGBEE_persist_load(void)
+{
+#ifdef CFG_NVM
+ APP_DBG("Retrieving persistent data from FLASH");
+ return APP_ZIGBEE_NVM_Read();
+#else
+ /* 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;
+#endif /* CFG_NVM */
+} /* APP_ZIGBEE_persist_load */
+
+/**
+ * @brief Save persistent data
+ * @param None
+ * @retval true if success , false if fail
+ */
+static bool APP_ZIGBEE_persist_save(void)
+{
+ uint32_t len;
+
+ /* Clear the RAM cache before saving */
+ memset(cache_persistent_data.U8_data, 0x00, ST_PERSIST_MAX_ALLOC_SZ);
+
+ /* Call the satck API t get current persistent data */
+ 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;
+ }
+ 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;
+ }
+
+ /* 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 in cache RAM (num writes = %d) len=%d",
+ zigbee_app_info.persistNumWrites, cache_persistent_data.U32_data[0]);
+
+#ifdef CFG_NVM
+ if(!APP_ZIGBEE_NVM_Write())
+ {
+ return false;
+ }
+ APP_DBG("APP_ZIGBEE_persist_save: Persistent data FLASHED");
+#endif /* CFG_NVM */
+
+ return true;
+} /* APP_ZIGBEE_persist_save */
+
+/**
+ * @brief Delete persistent data
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_persist_delete(void)
+{
+ uint16_t c_int = 0;
+ bool deviceConnected = false;
+ bool connectionUpdateSuccess = false;
+ bool connectionUpdateNeeded = false;
+
+ /* Clear RAM cache */
+ memset(cache_persistent_data.U8_data, 0x00, ST_PERSIST_MAX_ALLOC_SZ);
+ APP_DBG("Persistent Data RAM cache cleared");
+#ifdef CFG_NVM
+ /* Check if there is at least 25ms connection interval window for a FLASH erase */
+ c_int = APP_BLE_GetConnectionInterval(&deviceConnected);
+ if(deviceConnected){
+ if( ((c_int * 10) / 8) < 25 ){
+ connectionUpdateNeeded = true;
+ APP_DBG("Connection interval of %dms too short for an erase.", ((c_int * 10) / 8));
+ APP_DBG("Need a temporary BLE connection interval update.");
+
+ /* Update BLE connection interval to 25ms */
+ connectionUpdateSuccess = APP_BLE_ConnectionUpdate(25*8/10);
+ if(!connectionUpdateSuccess){
+ APP_DBG("Cannot update connection interval");
+ return;
+ }
+ }
+ }
+
+ APP_ZIGBEE_NVM_Erase();
+ APP_DBG("FLASH ERASED");
+
+ if(connectionUpdateNeeded){
+ /* Restore the previous BLE connection interval */
+ APP_DBG("Restore previous connection interval");
+ connectionUpdateSuccess = APP_BLE_ConnectionUpdate(c_int);
+ if(!connectionUpdateSuccess){
+ APP_DBG("Cannot update connection interval");
+ }
+ }
+#endif /* CFG_NVM */
+} /* APP_ZIGBEE_persist_delete */
+
+
+#ifdef CFG_NVM
+/**
+ * @brief Init the NVM
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_NVM_Init(void)
+{
+ int eeprom_init_status;
+
+ APP_DBG("Flash starting address = %x",HW_FLASH_ADDRESS + CFG_NVM_BASE_ADDRESS);
+ eeprom_init_status = EE_Init( 0 , HW_FLASH_ADDRESS + CFG_NVM_BASE_ADDRESS );
+
+ if(eeprom_init_status != EE_OK)
+ {
+ /* format NVM since init failed */
+ eeprom_init_status= EE_Init( 1, HW_FLASH_ADDRESS + CFG_NVM_BASE_ADDRESS );
+ }
+ APP_DBG("EE_init status = %d",eeprom_init_status);
+
+} /* APP_ZIGBEE_NVM_Init */
+
+/**
+*@brief Read the persistent data from NVM
+* @param None
+* @retval true if success , false if failed
+*/
+static bool APP_ZIGBEE_NVM_Read(void)
+{
+ uint16_t num_words = 0;
+ bool status = true;
+ int ee_status = 0;
+ HAL_FLASH_Unlock();
+ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_PGSERR | FLASH_FLAG_WRPERR | FLASH_FLAG_OPTVERR);
+
+ /* Read the data length from cache */
+ ee_status = EE_Read(0, ZIGBEE_DB_START_ADDR, &cache_persistent_data.U32_data[0]);
+ if (ee_status != EE_OK)
+ {
+ APP_DBG("Read -> persistent data lenght not found ERASE to be done - Read Stopped");
+ status = false;
+ }
+ /* Check length is not too big nor zero */
+ else 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 length : %d", cache_persistent_data.U32_data[0]);
+ status = false;
+ }
+ /* Length is within range */
+ else
+ {
+ /* Adjust the length to be U32 aligned */
+ num_words = (uint16_t) (cache_persistent_data.U32_data[0]/4) ;
+ if (cache_persistent_data.U32_data[0] % 4 != 0)
+ {
+ num_words++;
+ }
+
+ /* copy the read data from Flash to cache including length */
+ for (uint16_t local_length = 1; local_length <= num_words; local_length++)
+ {
+ /* read data from first data in U32 unit */
+ ee_status = EE_Read(0, local_length + ZIGBEE_DB_START_ADDR, &cache_persistent_data.U32_data[local_length] );
+ if (ee_status != EE_OK)
+ {
+ APP_DBG("Read not found leaving");
+ status = false;
+ break;
+ }
+ }
+ }
+
+ HAL_FLASH_Lock();
+ if(status)
+ {
+ APP_DBG("READ PERSITENT DATA LEN = %d",cache_persistent_data.U32_data[0]);
+ }
+ return status;
+} /* APP_ZIGBEE_NVM_Read */
+
+/**
+ * @brief Write the persistent data in NVM
+ * @param None
+ * @retval None
+ */
+static bool APP_ZIGBEE_NVM_Write(void)
+{
+ int ee_status = 0;
+
+ uint16_t num_words;
+ uint16_t local_current_size;
+
+
+ num_words = 1U; /* 1 words for the length */
+ num_words+= (uint16_t) (cache_persistent_data.U32_data[0]/4);
+
+
+ /* Adjust the length to be U32 aligned */
+ if (cache_persistent_data.U32_data[0] % 4 != 0)
+ {
+ num_words++;
+ }
+
+ //save data in flash
+ for (local_current_size = 0; local_current_size < num_words; local_current_size++)
+ {
+ ee_status = EE_Write(0, (uint16_t)local_current_size + ZIGBEE_DB_START_ADDR, cache_persistent_data.U32_data[local_current_size]);
+ if (ee_status != EE_OK)
+ {
+ if(ee_status == EE_CLEAN_NEEDED) /* Shall not be there if CFG_EE_AUTO_CLEAN = 1*/
+ {
+ APP_DBG("CLEAN NEEDED, CLEANING");
+ EE_Clean(0,0);
+ }
+ else
+ {
+ /* Failed to write , an Erase shall be done */
+ APP_DBG("APP_ZIGBEE_NVM_Write failed @ %d status %d", local_current_size,ee_status);
+ break;
+ }
+ }
+ }
+
+
+ if(ee_status != EE_OK)
+ {
+ APP_DBG("WRITE STOPPED, need a FLASH ERASE");
+ return false;
+ }
+
+ APP_DBG("WRITTEN PERSISTENT DATA LEN = %d",cache_persistent_data.U32_data[0]);
+ return true;
+
+} /* APP_ZIGBEE_NVM_Write */
+
+/**
+ * @brief Erase the NVM
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_NVM_Erase(void)
+{
+ EE_Init(1, HW_FLASH_ADDRESS + CFG_NVM_BASE_ADDRESS); /* Erase Flash */
+} /* APP_ZIGBEE_NVM_Erase */
+
+#endif /* CFG_NVM */
+
+
+/**
+ * @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);
+
+ ZbStackType = p_wireless_info->StackType; /* Memorize ZB stack type */
+ switch (p_wireless_info->StackType) {
+ case INFO_STACK_TYPE_BLE_ZIGBEE_FFD_STATIC:
+ APP_DBG("FW Type : STACK_TYPE_BLE_ZIGBEE_FFD_STATIC");
+ break;
+ case INFO_STACK_TYPE_BLE_ZIGBEE_FFD_DYNAMIC:
+ APP_DBG("FW Type : STACK_TYPE_BLE_ZIGBEE_FFD_DYNAMIC");
+ 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 */
+
+static void APP_ZIGBEE_SW1_Process()
+{
+ struct ZbApsAddrT dst;
+
+ memset(&dst, 0, sizeof(dst));
+ dst.mode = ZB_APSDE_ADDRMODE_GROUP;
+ dst.endpoint = SW1_ENDPOINT;
+ dst.nwkAddr = SW1_GROUP_ADDR;
+
+ APP_DBG("==> SENDING TOGGLE TO GROUP 0x0001");
+ if (ZbZclOnOffClientToggleReq(zigbee_app_info.onoff_client_1, &dst, NULL, NULL) != ZCL_STATUS_SUCCESS) {
+ APP_DBG("Error, ZbZclOnOffClientToggleReq failed (SW1_ENDPOINT)");
+ }
+}
+
+/**
+ * @brief SW2 button pushed Clean NVM
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_SW2_Process()
+{
+ APP_DBG("SW2 PUSHED : Clearing NVM");
+// HW_TS_Create(CFG_TIM_WAIT_BEOFRE_NVM_CLEAR, &TS_ID1, hw_ts_SingleShot, APP_ZIGBEE_persist_delete);
+// HW_TS_Start(TS_ID1, 1000);
+ APP_ZIGBEE_persist_delete();
+}
+
+/*************************************************************
+ *
+ * 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;
+ }
+}
+
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+
+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;
+}
+
+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 */
+
+void APP_ZIGBEE_WaitUntilNext_802154_Evt_cb(void){
+ /** Set the EVENT_DYN_MODE_WAIT_NEXT_802154_EVT event.
+ * Pending FLASH operation is going to be performed.
+ */
+ UTIL_SEQ_SetEvt(EVENT_DYN_MODE_WAIT_NEXT_802154_EVT);
+}
+
+WaitedSemStatus_t DYN_CONCURRENT_MODE_WaitUntilNext_802154_Evt(uint32_t relative_time){
+ APP_DBG("Next BLE event in %dus. Waiting next 802.15.4 event.", relative_time);
+
+ /* Activate the notification for the next 802.15.4 event */
+ SHCI_C2_CONCURRENT_EnableNext_802154_EvtNotification();
+
+ /* Wait on EVENT_DYN_MODE_WAIT_NEXT_802154_EVT event */
+ UTIL_SEQ_WaitEvt(EVENT_DYN_MODE_WAIT_NEXT_802154_EVT);
+
+ return WAITED_SEM_FREE;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/App/app_zigbee.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/App/app_zigbee.h
new file mode 100644
index 000000000..480f89c80
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/App/app_zigbee.h
@@ -0,0 +1,69 @@
+/* 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"
+#include "zigbee.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_Init_Step1(void);
+void APP_ZIGBEE_Init_Step2(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);
+void APP_ZIGBEE_Stop(void);
+enum ZbStatusCodeT APP_ZIGBEE_ZbStartupPersist(struct ZigBeeT *zb);
+bool APP_ZIGBEE_persist_save(void);
+void APP_ZIGBEE_WaitUntilNext_802154_Evt_cb(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/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/App/ble_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/App/ble_conf.h
new file mode 100644
index 000000000..538713f85
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/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) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/App/ble_dbg_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/App/ble_dbg_conf.h
new file mode 100644
index 000000000..1f9b21135
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/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) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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 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_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/App/p2p_server_app.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/App/p2p_server_app.c
new file mode 100644
index 000000000..01edff240
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/App/p2p_server_app.c
@@ -0,0 +1,397 @@
+/* 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 "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_RED);
+ //APP_DBG_MSG("-- P2P APPLICATION SERVER : LED1 ON\n");
+ APP_DBG_MSG("+");
+ P2P_Server_App_Context.LedControl.Led1=0x01; /* LED1 ON */
+ }
+ if(pNotification->DataTransfered.pPayload[1] == 0x00)
+ {
+ BSP_LED_Off(LED_RED);
+ //APP_DBG_MSG("-- P2P APPLICATION SERVER : LED1 OFF\n");
+ APP_DBG_MSG("-");
+ 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_RED);
+ //APP_DBG_MSG("-- P2P APPLICATION SERVER 1 : LED1 ON\n");
+ //APP_DBG_MSG("+");
+ P2P_Server_App_Context.LedControl.Led1=0x01; /* LED1 ON */
+ }
+ if(pNotification->DataTransfered.pPayload[1] == 0x00)
+ {
+ BSP_LED_Off(LED_RED);
+ //APP_DBG_MSG("-- P2P APPLICATION SERVER 1 : LED1 OFF\n");
+ P2P_Server_App_Context.LedControl.Led1=0x00; /* LED1 OFF */
+ }
+ /* Switch to Thread */
+ 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(" \n\r");
+ /* Set "Switch Protocol" Task */
+ UTIL_SEQ_SetTask(1<<CFG_Task_Switch_Protocol,CFG_SCH_PRIO_0);
+ }
+ }
+#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_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/App/p2p_server_app.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/App/p2p_server_app.h
new file mode 100644
index 000000000..11e27d8a2
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/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) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/Target/hw_ipcc.c
new file mode 100644
index 000000000..e7049681d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/STM32_WPAN/Target/hw_ipcc.c
@@ -0,0 +1,675 @@
+/**
+ ******************************************************************************
+ * 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 LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_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 LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_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 )
+{
+ /**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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 */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_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_Zigbee/BLE_Zigbee_Dyn_NVM/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/readme.txt
new file mode 100644
index 000000000..5e091ebc3
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM/readme.txt
@@ -0,0 +1,161 @@
+/**
+ @page BLE_Zigbee_Dyn_NVM example
+
+ @verbatim
+ ******************************************************************************
+ * @file BLE_Zigbee/BLE_Zigbee_Dyn_NVM/readme.txt
+ * @author MCD Application Team
+ * @brief Example of application using BLE and Zigbee protocols in Static
+ * Concurrent mode.
+ ******************************************************************************
+ *
+ * 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
+
+How to use BLE application and Zigbee application in dynamic concurent mode with Zigbee persistent data feature.
+
+The idea is to present a demo with a Zigbee Network (at least 2 Nucleo Boards, Zb coordinator
+running Zigbee_OnOff_Server_Coord application[1] and router running Ble_Zigbee_Dynamic application[2]),
+and a BLE connection between 1 Nucleo board running Ble_Zigbee_Dynamic application [2] with either a
+smartphone running "ST BLE Sensor" Application (available on App Store and Google Play), or another
+Nucleo board running a BLE_p2pClient application[3].
+The STM32WB55xx-Nucleo board running Ble_Zigbee_Dynamic application is capable of switching
+dynamically and transparently from BLE network to Zigbee network and vice-versa.
+
+The demo architecture is summarized in the following figure:
+
+ ______________ ______________ ______________
+ / \ / \ / \
+ | | | | | |
+ | | BLE Toggle | Dynamic mode | ZB Toggle | |
+ | BLE App |<===========>| BLE/ZB App |<===========>| ZB App |
+ | | | | | |
+ | | | | | |
+ \______________/ \______________/ \______________/
+ [3] [2] [1]
+
+With the Zigbee NVM feature, the dynamic mode board[2] tries to start from persistence.
+This leads to two choices:
+ - Persistent Data read from NVM are valid -> the router takes back is role in the network.
+ - No Persistent data found or wrong data,a fresh start is performed, the Zigbee network is automatically created
+ and BLUE LED (LED1) is ON on all devices.
+
+Zigbee Persistence Data are updated in NVM.
+
+If the user power cycle the board[2], Persistent Data are read back and the stack configuration is restored.
+The device start from persistence and GREEN LED LED2 is on.
+
+Push Button SW2 is used to delete Zigbee NVM (fresh start will be done on next start up).
+
+
+@par Keywords
+
+Zigbee, BLE
+
+@par Directory contents
+
+
+
+@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 ?
+
+This application requests having the STM32WB5x_BLE_Zigbee_dynamic_fw.bin binary flashed on the M0 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.
+
+
+Minimum requirements for the demo:
+- 1 STM32WB55xx-Nucleo board in BLE Zigbee Dynamic Concurrent mode [2]
+- 1 STM32WB55xx-Nucleo board or more for creating Zigbee Network [1]
+ (see example Zigbee_OnOff_Server_Coord and Zigbee_OnOff_Client_Router for more details on how to use it)
+- 1 STM32WB55xx-Nucleo board running a BLE_p2pClient application[3]
+-- OR
+- 1 Smartphone (Android/IOS) with "ST BLE Sensor" Phone Application (available on App Store and Google Play)
+ 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
+
+In order to make the program work, you must do the following:
+ - Connect 1 STM32WB55xx-Nucleo boards to your PC
+ - Open your preferred toolchain
+ - Rebuild all files and load your image into target memory
+ - Run the example
+
+ if you want to get the traces in real time, you can connects an HyperTerminal
+ via an UART RS232 cable using the following connections :
+ RXD : CN10(Pin35)
+ TXD : CN10(Pin37)
+
+**** START DEMO ****
+By default, after a reset, the ZB/BLE board [2] will start with both BLE and Zigbee modes activated.
+
+The BLE example implements Point-to-Point communication using BLE component.
+1- The ZB/BLE device (P2P Server) starts BLE advertising and simultaneously starts to join the Zigbee Network.
+2- The node will then attach the existing Zigbee network (Zb coordinator running Zigbee_OnOff_Server_Coord application [1]).
+The blue led turns ON when the Zigbee join is successful.
+3- The BLE connection will be started as follows, depending if your BLE device is a smartphone or a 3rd Nucleo board:
+3.1 If using a smartphone, then the ST BLE Sensor App (smart Phone Application) scans and can connect to the P2P Server
+by selecting = "P2PZBSRV1" entry.
+-- Once connected, the application starts to search the P2P Services & Characteristics.
+-- Led Button service, Led Characteristic and Button Characteristic are discovered at this stage (this service is ST specific).
+-- Pressing the LED button on the App will turn On or Off the BLUE Led on the ZB/BLE device [2]
+3.2 If using a 3rd Nucleo board (running a BLE_p2pClient application [3]), you can start scanning by pressing the SW1 button
+-- the BLUE LED will light up on [3]
+-- After scanning complete, the 3rd Nucleo board [3] connects to the P2P server on BLE/ZB [2] dynamic node, and sends a toggle every 50ms.
+-- As a result the BLUE LED starts toggling on the BLE/ZB device [2], every 50 ms
+4- When the BLE connection is detected by the BLE/ZB device [2], it sends continuously a ZB ON_OFF toggle on the ZB coordinator [1]
+-- The RED Led toogles on the coordinator [1] (at an approx rate of 70 ms)
+
+ ______________ ______________ ______________
+ / \ / \ / \
+ | | | | | |
+ | | BLE Toggle | Dynamic mode | ZB Toggle | |
+ | BLE App |<===========>| BLE/ZB App |<===========>| ZB App |
+ | | | | | |
+ | | | | | |
+ \______________/ \______________/ \______________/
+ [3] [2] [1]
+
+This Demo illustates the simultaneous BLE and ZB connections, with the BLUE Led toggling on ZB/BLE device [2], reflecting BLE activity, and the RED Led toggling on the ZB coordinator[1], reflecting ZB activity.
+
+On BLE Disconnection, The STM32WB55xx-Nucleo board [3] will restart advertising.
+
+
+ * <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
+ */
+ \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/app_common.h
new file mode 100644
index 000000000..0d38b869d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/app_common.h
@@ -0,0 +1,124 @@
+/**
+ ******************************************************************************
+ * @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"
+#include "stm_logging.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 *
+ * -------------------------------- */
+
+#ifndef MAX
+#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+
+#ifndef MIN
+#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
+
+#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_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/app_conf.h
new file mode 100644
index 000000000..bc36342c8
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/app_conf.h
@@ -0,0 +1,640 @@
+/**
+ ******************************************************************************
+ * 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
+ ******************************************************************************/
+
+/**< 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 CFG_LP_CONN_ADV_INTERVAL_MIN (0x12c0*2) /**< 3s */
+//#define CFG_LP_CONN_ADV_INTERVAL_MAX (0x1900*2) /**< 4s */
+
+/**
+ * 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
+
+
+/**
+* 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 CFG_LED_SUPPORTED 1
+#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
+
+
+#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 0 /* 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
+
+/******************************************************************************
+ * 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
+ ******************************************************************************/
+#define CFG_DEBUG_TRACE_UART hw_uart1
+#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 1
+
+#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
+ *****************************************************************************/
+
+/**
+
+ * 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
+
+#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
+
+/******************************************************************************
+ * 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
+{
+ /* BLE */
+ CFG_TASK_ADV_CANCEL_ID,
+ CFG_TASK_SW1_BUTTON_PUSHED_ID,
+ CFG_TASK_HCI_ASYNCH_EVT_ID,
+ CFG_TASK_APP_BLE_START,
+ CFG_TASK_APP_ADV_START,
+
+ /* Zigbee */
+ CFG_TASK_NOTIFY_FROM_M0_TO_M4,
+ CFG_TASK_REQUEST_FROM_M0_TO_M4,
+ CFG_TASK_ZIGBEE_NETWORK_FORM,
+ CFG_TASK_BUTTON_SW1,
+ CFG_TASK_BUTTON_SW2,
+ CFG_TASK_BUTTON_SW3,
+ CFG_TASK_TOGGLE_ON_OFF,
+ CFG_TASK_DBG_NWK_STATUS,
+
+ 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_SCH_PRIO_1,
+ CFG_PRIO_NBR,
+} CFG_SCH_Prio_Id_t;
+
+#define TASK_COAP_MSG_BUTTON (1U << CFG_TASK_COAP_MSG_BUTTON)
+#define TASK_MSG_FROM_M0_TO_M4 (1U << CFG_TASK_MSG_FROM_M0_TO_M4)
+/**
+ * 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,
+ /* Zigbee */
+ CFG_EVT_ACK_FROM_M0_EVT,
+ CFG_EVT_SYNCHRO_BYPASS_IDLE,
+ CFG_EVT_ZIGBEE_STOP,
+ CFG_EVT_ON_OFF_RSP,
+ CFG_EVT_ZIGBEE_STARTUP_ENDED,
+} CFG_IdleEvt_Id_t;
+
+#define EVENT_ON_OFF_RSP (1U << CFG_EVT_ON_OFF_RSP)
+#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
+
+/* 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
+ ******************************************************************************/
+#undef CFG_LED_SUPPORTED
+#undef CFG_BUTTON_SUPPORTED
+#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 */
+
+/******************************************************************************
+ * 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
+
+
+typedef enum
+{
+ BUTTON_1 = 0x1,
+} button_type_t;
+
+#endif /* APP_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/app_entry.h
new file mode 100644
index 000000000..1e7fcbf1f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/app_entry.h
@@ -0,0 +1,53 @@
+
+/**
+ ******************************************************************************
+ * @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
+
+#include "stm32wbxx_hal.h"
+#include "stm32_seq.h"
+#include "tl.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Includes ------------------------------------------------------------------*/
+ /* Exported types ------------------------------------------------------------*/
+ /* Exported constants --------------------------------------------------------*/
+ /* External variables --------------------------------------------------------*/
+ /* Exported macros -----------------------------------------------------------*/
+ /* Exported functions ------------------------------------------------------- */
+ void APPE_Init( void );
+ void APP_ENTRY_RegisterCmdBuffer(TL_CmdPacket_t* p_buffer);
+ void APP_ENTRY_ProcessMsgM0ToM4(void);
+ void APP_ENTRY_Init_CFG_CLI_UART(void);
+ void APP_ENTRY_TL_THREAD_INIT(void);
+ void UTIL_SEQ_EvtIdle( UTIL_SEQ_bm_t task_id_bm, UTIL_SEQ_bm_t evt_waited_bm );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __APP_ENTRY_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/hw_conf.h
new file mode 100644
index 000000000..b76dd2494
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/hw_conf.h
@@ -0,0 +1,221 @@
+/**
+ ******************************************************************************
+ * @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 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 */
+#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.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/hw_if.h
new file mode 100644
index 000000000..271a222a9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_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/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/main.h
new file mode 100644
index 000000000..bbe71a4da
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/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_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/stm32_lpm_if.h
new file mode 100644
index 000000000..d8e67947f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_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/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/stm32wbxx_hal_conf.h
new file mode 100644
index 000000000..f37437884
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/stm32wbxx_hal_conf.h
@@ -0,0 +1,349 @@
+/**
+ ******************************************************************************
+ * @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_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/stm32wbxx_it.h
new file mode 100644
index 000000000..46179c211
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/stm32wbxx_it.h
@@ -0,0 +1,62 @@
+/**
+ ******************************************************************************
+ * @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 IPCC_C1_RX_IRQHandler(void);
+void IPCC_C1_TX_IRQHandler(void);
+void EXTI4_IRQHandler(void);
+void EXTI0_IRQHandler(void);
+void EXTI1_IRQHandler(void);
+void USART1_IRQHandler(void);
+void DMA2_Channel4_IRQHandler(void);
+void CFG_HW_USART1_DMA_TX_IRQHandler( void );
+void RTC_WKUP_IRQHandler(void);
+void LPUART1_IRQHandler(void);
+void DMA1_Channel4_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_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/stm_logging.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/stm_logging.h
new file mode 100644
index 000000000..8a6af65d6
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/stm_logging.h
@@ -0,0 +1,66 @@
+/**
+ ******************************************************************************
+ * @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.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Inc/utilities_conf.h
new file mode 100644
index 000000000..4dde3509a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_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/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/app_entry.c
new file mode 100644
index 000000000..afd6ffc97
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/app_entry.c
@@ -0,0 +1,504 @@
+/**
+ ******************************************************************************
+ * @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_zigbee.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 "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 */
+
+/* Private defines -----------------------------------------------------------*/
+/* POOL_SIZE = 2(TL_PacketHeader_t) + 258 (3(TL_EVT_HDR_SIZE) + 255(Payload size)) */
+#define POOL_SIZE (CFG_TLBLE_EVT_QUEUE_LENGTH*4*DIVC(( sizeof(TL_PacketHeader_t) + TL_BLE_EVENT_FRAME_SIZE ), 4))
+#define T_1S_NB_TICKS (1*1000*1000/CFG_TS_TICK_VAL) /**< 1s */
+#define T_1MS_NB_TICKS (1*1000/CFG_TS_TICK_VAL) /**< 1s */
+#define T_50MS (50*T_1MS_NB_TICKS)
+#define T_100MS (100*T_1MS_NB_TICKS)
+#define T_200MS (200*T_1MS_NB_TICKS)
+#define T_2S (2*T_1S_NB_TICKS)
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+/* Private variables ---------------------------------------------------------*/
+
+extern RTC_HandleTypeDef hrtc; /**< RTC handler declaration */
+extern uint8_t ZbStackType; /* ZB stack type, static or dynamic */
+
+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;
+
+/* Global variables ----------------------------------------------------------*/
+
+/* 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();
+
+ APP_DBG("ConcurrentMode = %d", ConcurrentMode);
+
+ /**
+ * 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();
+
+ 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 BLE or Zigbee Stack
+ * This system event is received with APPE_UserEvtRx()
+ */
+
+ 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
+ /* Disable debugger EXTI lines */
+ LL_EXTI_DisableIT_32_63(LL_EXTI_LINE_48);
+ LL_C2_EXTI_DisableIT_32_63(LL_EXTI_LINE_48);
+
+ 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 )
+{
+ // Before going to stop or standby modes, do the settings so that system clock and IP80215.4 clock
+ // start on HSI automatically
+ LL_RCC_HSI_EnableAutoFromStop();
+
+ /**
+ * 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( );
+ /* Initialize the CPU2 reset value before starting CPU2 with C2BOOT */
+ LL_C2_PWR_SetPowerMode(LL_PWR_MODE_SHUTDOWN);
+
+ /* 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
+ */
+ 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 == FUS_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_DBG("==> Start_BLE"); /* Start BLE first */
+ APP_BLE_Init();
+
+ APP_DBG("==> Start Zigbee stack & Networking");
+ APP_ZIGBEE_Init();
+
+ switch (ZbStackType) { /* Check ZB stack type */
+ case INFO_STACK_TYPE_ZIGBEE_FFD: /* Start ZB only */
+ case INFO_STACK_TYPE_ZIGBEE_RFD: /* Start ZB only */
+ case INFO_STACK_TYPE_BLE_ZIGBEE_FFD_STATIC: /* Start ZB only */
+ case INFO_STACK_TYPE_BLE_ZIGBEE_RFD_STATIC: /* Start ZB only */
+ break;
+ case INFO_STACK_TYPE_BLE_ZIGBEE_FFD_DYNAMIC: /* Start ZB/BLE Dynamic mode */
+ case INFO_STACK_TYPE_BLE_ZIGBEE_RFD_DYNAMIC: /* Start ZB/BLE Dynamic mode */
+ APP_DBG("==> Start_BLE Advertising");
+ UTIL_SEQ_SetTask(1U << CFG_TASK_APP_BLE_START, CFG_SCH_PRIO_1);
+ break;
+ default:
+ /* No Zigbee device supported ! */
+ APP_DBG("FW Type : No ZB STACK type detected");
+ break;
+ }
+
+#if ( CFG_LPM_SUPPORTED == 1)
+ /* ZB stack is initialized, low power mode will be enabled later (zb_interface.c) */
+ UTIL_LPM_SetStopMode(1U << CFG_LPM_APP, UTIL_LPM_DISABLE);
+#endif
+
+ 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_ID, CFG_SCH_PRIO_0);
+ return;
+}
+
+void shci_cmd_resp_release(uint32_t flag)
+{
+ UNUSED(flag);
+ UTIL_SEQ_SetEvt(1U << CFG_IDLEEVT_HCI_CMD_EVT_RSP_ID);
+ return;
+}
+
+void shci_cmd_resp_wait(uint32_t timeout)
+{
+ UNUSED(timeout);
+ UTIL_SEQ_WaitEvt(1U << CFG_IDLEEVT_HCI_CMD_EVT_RSP_ID);
+ 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 Initialization 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 */
+/**
+ * @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:
+ if (1) {
+ APP_DBG("BUTTON 1 PUSHED ! : ZIGBEE MESSAGE SENDING");
+ UTIL_SEQ_SetTask(1U << CFG_TASK_BUTTON_SW1, CFG_SCH_PRIO_1);
+ } else {
+ APP_BLE_Key_Button1_Action();
+ }
+ break;
+
+ case BUTTON_SW2_PIN:
+ APP_DBG("BUTTON 2 PUSHED ! : Request Connection Update");
+ UTIL_SEQ_SetTask(1U << CFG_TASK_BUTTON_SW2, CFG_SCH_PRIO_1);
+ break;
+
+ case BUTTON_SW3_PIN:
+ APP_DBG("BUTTON 3 PUSHED ! : Request Connection Update");
+ UTIL_SEQ_SetTask(1U << CFG_TASK_BUTTON_SW3, CFG_SCH_PRIO_1);
+
+ /* Start BLE App + Advertising */
+// APP_DBG("==> Start_BLE Advertising");
+// UTIL_SEQ_SetTask(1U << CFG_TASK_APP_BLE_START, CFG_SCH_PRIO_1);
+
+ 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_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/hw_timerserver.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/hw_timerserver.c
new file mode 100644
index 000000000..c842ba55e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_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/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/hw_uart.c
new file mode 100644
index 000000000..7d28f9582
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/hw_uart.c
@@ -0,0 +1,465 @@
+/**
+ ******************************************************************************
+ * @file hw_uart.c
+ * @author MCD Application Team
+ * @brief hardware access
+ ******************************************************************************
+ * @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 "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{ \
+ /* Enable GPIO clock */ \
+ CFG_HW_##__USART_BASE__##_TX_PORT_CLK_ENABLE(); \
+ \
+ /* Enable USART clock */ \
+ __HAL_RCC_##__USART_BASE__##_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); \
+ \
+ 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); \
+ \
+ 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); \
+ \
+ 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)
+{
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+
+ 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.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/main.c
new file mode 100644
index 000000000..540e84c08
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/main.c
@@ -0,0 +1,321 @@
+/**
+ ******************************************************************************
+ * @file : main.c
+ * @brief : Main program body
+ *
+ @verbatim
+ ==============================================================================
+ ##### IMPORTANT NOTE #####
+ ==============================================================================
+
+ This application requests having the stm32wb5x_BLE_Thread_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"
+
+/* 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 );
+
+/* Functions Definition ------------------------------------------------------*/
+
+/**
+ * @brief Main program
+ * @param None
+ * @retval None
+ */
+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 Init_Exti( void )
+{
+ /**< Disable all wakeup interrupt on CPU1 except LPUART(25), IPCC(36), HSEM(38) */
+ LL_EXTI_DisableIT_0_31( (~0) & (~(LL_EXTI_LINE_25)) );
+// 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; /**< 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
+ */
+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
+
+ /**
+ * 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;
+}
+
+/*************************************************************
+ *
+ * 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_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/stm32_lpm_if.c
new file mode 100644
index 000000000..01d478092
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/stm32_lpm_if.c
@@ -0,0 +1,295 @@
+/* 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) 2020 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
+ */
+ Switch_On_HSI( );
+ }
+ }
+ else
+ {
+ /**
+ * The switch on HSI before entering Stop Mode is required
+ */
+ 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_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/stm32wbxx_it.c
new file mode 100644
index 000000000..c29aafc7b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/stm32wbxx_it.c
@@ -0,0 +1,185 @@
+/**
+ ******************************************************************************
+ * @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 "stm32wbxx_it.h"
+#include "app_common.h"
+
+/* CONCURRENT MODE BLE/THREAD */
+/* External variables -----------------------------------------------------------*/
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+/* 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)
+{
+ /* 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();
+}
+
+ 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 External line
+ * interrupt request.
+ * @param None
+ * @retval None
+ */
+void PUSH_BUTTON_SW1_EXTI_IRQHandler(void)
+{
+ HAL_GPIO_EXTI_IRQHandler(BUTTON_SW1_PIN);
+}
+
+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);
+}
+
+#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
+
+
+/******************************************************************************/
+/* STM32L0xx Peripherals Interrupt Handlers */
+/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */
+/* available peripheral interrupt handler's name please refer to the startup */
+/* file (startup_stm32l0xx.s). */
+/******************************************************************************/
+/**
+ * @brief This function handles RTC Auto wake-up interrupt request.
+ * @param None
+ * @retval None
+ */
+void RTC_WKUP_IRQHandler(void)
+{
+ HW_TS_RTC_Wakeup_Handler();
+}
+
+
+
+
+
+
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/stm_logging.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/stm_logging.c
new file mode 100644
index 000000000..485e84742
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/stm_logging.c
@@ -0,0 +1,213 @@
+
+/**
+ ******************************************************************************
+ * @file stm_logging.c
+ * @author MCD Application Team
+ * @brief 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 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/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/Core/Src/system_stm32wbxx.c
new file mode 100644
index 000000000..e3025c7f9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/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_Zigbee/BLE_Zigbee_Dyn_SED/EWARM/ble_zigbee_SED_Dyn.ewd b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/EWARM/ble_zigbee_SED_Dyn.ewd
new file mode 100644
index 000000000..d3a8fb127
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/EWARM/ble_zigbee_SED_Dyn.ewd
@@ -0,0 +1,1419 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>ble_zigbee_SED_Dyn</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>$PROJ_DIR$\enableCPU2.mac</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>0</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>1</state>
+ </option>
+ <option>
+ <name>OCProductVersion</name>
+ <state>7.60.2.11347</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></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>1</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>1</state>
+ </option>
+ <option>
+ <name>OCMulticorePort</name>
+ <state>53461</state>
+ </option>
+ <option>
+ <name>OCMulticoreWorkspace</name>
+ <state>C:\work\THREAD\GIT_THREAD\stm32wb_M0_Firmware\Projects\Multi\Application\EWARM\stm32wbxx_ble_thread_host\ble_thread_host.eww</state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveProject</name>
+ <state>ble_thread_host</state>
+ </option>
+ <option>
+ <name>OCMulticoreSlaveConfiguration</name>
+ <state>Production</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>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></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>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>4</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>1</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>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></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>2</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>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>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>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>CCXds100CatchSFERR</name>
+ <state>0</state>
+ </option>
+ <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>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_Zigbee/BLE_Zigbee_Dyn_SED/EWARM/ble_zigbee_SED_Dyn.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/EWARM/ble_zigbee_SED_Dyn.ewp
new file mode 100644
index 000000000..bfe292df9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/EWARM/ble_zigbee_SED_Dyn.ewp
@@ -0,0 +1,1313 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>ble_zigbee_SED_Dyn</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>1</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>STM32WB55xx</state>
+ <state>USE_HAL_DRIVER</state>
+ <state>USE_STM32WBXX_NUCLEO</state>
+ <state>STATIC_MODE</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>1</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>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>1</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/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$\..\..\..\..\..\..\Middlewares/ST/STM32_WPAN/zigbee/stack/include/extras</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares/ST/STM32_WPAN/zigbee/platform</state>
+ <state>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN</state>
+ <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$\..\..\..\..\..\..\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</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\ble</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\thread\openthread\stack\include</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>1</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>ble_zigbee_SED_Dyn.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>ble_zigbee_SED_Dyn.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>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_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_ble.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\app_zigbee.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>
+ </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_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_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>
+ </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\p2p_stm.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>
+ <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>platform</name>
+ </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/BLE_Zigbee/BLE_Zigbee_Dyn_SED/EWARM/ble_zigbee_SED_Dyn.eww b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/EWARM/ble_zigbee_SED_Dyn.eww
new file mode 100644
index 000000000..52a443719
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/EWARM/ble_zigbee_SED_Dyn.eww
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workspace>
+ <project>
+ <path>$WS_DIR$\ble_zigbee_SED_Dyn.ewp</path>
+ </project>
+ <batchBuild />
+</workspace>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/EWARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..79b0e7edd
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/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/BLE_Zigbee/BLE_Zigbee_Dyn_SED/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/EWARM/stm32wb55xx_flash_cm4.icf
new file mode 100644
index 000000000..81eded0c7
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/EWARM/stm32wb55xx_flash_cm4.icf
@@ -0,0 +1,41 @@
+/*###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__ = 0x20025FFF;
+
+/*-Sizes-*/
+define symbol __ICFEDIT_size_cstack__ = 0x1000;
+define symbol __ICFEDIT_size_heap__ = 102400; /* Heap increased for Zigbee */
+/**** 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_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/app_ble.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/app_ble.c
new file mode 100644
index 000000000..6994d1b50
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/app_ble.c
@@ -0,0 +1,1266 @@
+/* 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 "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"
+
+/* 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;
+
+ /**
+ * connection interval of the current active connection
+ */
+ uint16_t connectionInterval;
+
+ /**
+ * 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 (90*1000*1000/CFG_TS_TICK_VAL) /**< 90s */
+
+#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];
+static uint16_t c_int_init, c_int;
+static uint8_t first_update = 0;
+
+extern uint32_t disc_cnt;
+
+/**
+* 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;
+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 5
+float tab_conn_interval[SIZE_TAB_CONN_INT] = {15, 50, 90, 125, 250} ; /* 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','Z','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 */,
+ CFG_FEATURE_THREAD_SWITCH /* 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', 'Z', 'B', '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', 'Z', 'B', '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', 'Z', 'B', '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', 'Z', 'B', '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', 'Z', 'B', '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
+
+/* 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 );
+static void APP_BLE_SW2_Process(void);
+static void APP_BLE_SW3_Process(void);
+#if(L2CAP_REQUEST_NEW_CONN_PARAM != 0)
+static void BLE_SVC_L2CAP_Conn_Update(uint16_t Connection_Handle);
+static void BLE_SVC_L2CAP_Conn_Update_val(uint16_t Connection_Handle, uint16_t Connection_Interval);
+#endif
+
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APP_BLE_Init( void )
+{
+/* USER CODE BEGIN APP_BLE_Init */
+
+ 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);
+
+ /* Task associated with BLE Start App */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_APP_BLE_START, UTIL_SEQ_RFU, APP_BLE_Init_App);
+
+ /* Task associated with BLE Start ADV */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_APP_ADV_START, UTIL_SEQ_RFU, APP_BLE_Start_ADV);
+
+ /* Task associated with push button SW1 */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_BUTTON_SW2, UTIL_SEQ_RFU, APP_BLE_SW2_Process);
+
+ /* Task associated with push button SW1 */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_BUTTON_SW3, UTIL_SEQ_RFU, APP_BLE_SW3_Process);
+
+ /**
+ * 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;
+/* USER CODE END APP_BLE_Init */
+ return;
+}
+
+void APP_BLE_Init_App( void )
+{
+ /**
+ * From here, all initialization are BLE application specific
+ */
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_ADV_CANCEL_ID, UTIL_SEQ_RFU, Adv_Cancel);
+ /**
+ * 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);
+ Adv_Request(APP_BLE_LP_ADV);
+
+/* USER CODE END APP_BLE_Init_App */
+ return;
+}
+
+void APP_BLE_Start_ADV( void )
+{
+ /**
+ * 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 END APP_BLE_Init_App */
+ 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;
+
+ 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");
+ disc_cnt++;
+ }
+ /* 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 */
+ hci_le_connection_update_complete_event_rp0 *connection_update_complete = (hci_le_connection_update_complete_event_rp0 *) meta_evt->data;
+ BleApplicationContext.BleApplicationContext_legacy.connectionInterval =
+ connection_update_complete->Conn_Interval;
+ APP_DBG_MSG("CONN_UPDATE_COMPLETE [Conn_Interval=%d ms], latency=%d \n\r",
+ (connection_update_complete->Conn_Interval * 10) / 8, connection_update_complete->Conn_Latency);
+ /* USER CODE END EVT_LE_CONN_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;
+ }
+
+ UTIL_SEQ_SetTask(1 << CFG_TASK_ADV_CANCEL_ID, CFG_SCH_PRIO_0);
+
+ BleApplicationContext.BleApplicationContext_legacy.connectionHandle =
+ connection_complete_event->Connection_Handle;
+
+ APP_DBG_MSG("CONN_COMPLETE [Conn_Interval=%d ms], latency=%d \n\r",
+ (connection_complete_event->Conn_Interval * 10) / 8, connection_complete_event->Conn_Latency);
+
+ BleApplicationContext.BleApplicationContext_legacy.connectionInterval =
+ connection_complete_event->Conn_Interval;
+ /*
+* 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 */
+
+ /* 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 0x0004:
+ /* 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;
+}
+
+/* USER CODE BEGIN FD*/
+static void APP_BLE_SW2_Process(void)
+{
+ APP_BLE_Key_Button2_Action();
+}
+
+static void APP_BLE_SW3_Process(void)
+{
+ APP_BLE_Key_Button3_Action();
+}
+
+void APP_BLE_Key_Button1_Action(void)
+{
+ P2PS_APP_SW1_Button_Action();
+}
+
+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)
+ {
+ c_int = BleApplicationContext.BleApplicationContext_legacy.connectionInterval;
+ if (!first_update) {
+ c_int_init = c_int; /* Memorize initial connection interval */
+ first_update = 1;
+ }
+ APP_DBG_MSG("\n### UPDATE CONNECTION INTERVAL - CI read = %d ms\n", (c_int * 10) / 8);
+ if (c_int > c_int_init + 7) { /* Come back to initial value to prevent connection interval drifting */
+ c_int = c_int_init;
+ }
+ else
+ c_int++;
+
+ BLE_SVC_L2CAP_Conn_Update_val(BleApplicationContext.BleApplicationContext_legacy.connectionHandle, c_int);
+ APP_DBG_MSG("### CONNECTION INTERVAL requested %d ms\n", (c_int * 10) / 8);
+ }
+ return;
+#endif
+}
+
+void APP_BLE_Key_Button3_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);
+ APP_DBG_MSG("### CONNECTION INTERVAL requested %d ms\n", (CONN_P(tab_conn_interval[index_con_int]) * 10) / 8);
+ }
+ return;
+#endif
+}
+
+void APP_BLE_Stop(void)
+{
+ /* BLE STOP Procedure */
+ aci_hal_stack_reset();
+
+ APP_DBG("INSERT SOME WAIT");
+ HAL_Delay(100);
+
+ /* Stop Advertising Timer */
+ HW_TS_Stop(BleApplicationContext.Advertising_mgr_timer_Id);
+ HW_TS_Delete(BleApplicationContext.Advertising_mgr_timer_Id);
+}
+/* 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 = "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();
+ }
+}
+
+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_FAST_ADV)
+ //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");
+ Adv_Request(APP_BLE_LP_ADV);
+ }
+ 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(CI=%d), Successful \r\n\r", (CONN_P(tab_conn_interval[index_con_int]) * 10) /8);
+ }
+ else
+ {
+ APP_DBG_MSG("BLE_SVC_L2CAP_Conn_Update(CI=%d), Failed \r\n\r", (CONN_P(tab_conn_interval[index_con_int]) * 10) /8);
+ }
+ }
+/* USER CODE BEGIN BLE_SVC_L2CAP_Conn_Update_2 */
+
+/* USER CODE END BLE_SVC_L2CAP_Conn_Update_2 */
+ return;
+}
+
+void BLE_SVC_L2CAP_Conn_Update_val(uint16_t Connection_Handle, uint16_t Connection_Interval)
+{
+/* USER CODE BEGIN BLE_SVC_L2CAP_Conn_Update_1 */
+
+/* USER CODE END BLE_SVC_L2CAP_Conn_Update_1 */
+ if(mutex == 1) {
+ mutex = 0;
+ uint16_t interval_min = Connection_Interval;
+ uint16_t interval_max = Connection_Interval;
+ 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(CI=%d), Successful \r\n\r", (Connection_Interval * 10) /8);
+ }
+ else
+ {
+ APP_DBG_MSG("BLE_SVC_L2CAP_Conn_Update(CI=%d), Failed \r\n\r", (Connection_Interval * 10) /8);
+ }
+ }
+/* USER CODE BEGIN BLE_SVC_L2CAP_Conn_Update_2 */
+
+/* USER CODE END BLE_SVC_L2CAP_Conn_Update_2 */
+ 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 */
+
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/app_ble.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/app_ble.h
new file mode 100644
index 000000000..d0729f77d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/app_ble.h
@@ -0,0 +1,90 @@
+/* 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 );
+ void APP_BLE_Init_App( void );
+ void APP_BLE_Start_ADV( 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);
+void APP_BLE_Stop(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_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/app_zigbee.c
new file mode 100644
index 000000000..b726b6a4b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/app_zigbee.c
@@ -0,0 +1,986 @@
+/**
+ ******************************************************************************
+ * File Name : App/app_zigbee.c
+ * Description : Zigbee Application.
+ ******************************************************************************
+ * @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 "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 "app_ble.h"
+#include "stm32_lpm.h"
+
+#include <assert.h>
+#include "zcl/zcl.h"
+#include "zcl/zcl.onoff.h"
+#include "zcl/zcl.identify.h"
+
+/* Private defines -----------------------------------------------------------*/
+#define APP_ZIGBEE_STARTUP_FAIL_DELAY 500U
+#define SW1_ENDPOINT 17U
+#define SW1_GROUP_ADDR 0x0001
+#define CHANNEL 13U
+#define CHANNELMASK_12TO14 0x00007000U /* Channels 12-14 */
+#define SED_SLEEP_TIME_30S 1
+
+#define COLOR_DEFAULT "\x1b[0m"
+#define COL_CYAN "\x1b[0;96m"
+#define COL_MAGENTA "\x1b[0;95m"
+#define COL_RED "\x1b[0;91m"
+#define COL_NORM "\x1b[0m"
+
+#define DELAY_5_MS (0.005*1000*1000/CFG_TS_TICK_VAL) /**< 5ms */
+#define DELAY_20_MS (0.02*1000*1000/CFG_TS_TICK_VAL) /**< 20ms */
+#define DELAY_40_MS (0.04*1000*1000/CFG_TS_TICK_VAL) /**< 40ms */
+#define DELAY_50_MS (0.05*1000*1000/CFG_TS_TICK_VAL) /**< 50ms */
+#define DELAY_100_MS (100*1000/CFG_TS_TICK_VAL) /**< 100 ms */
+#define DELAY_300_MS (300000/CFG_TS_TICK_VAL) /**< 500 ms */
+#define DELAY_500_MS (0.5*1000*1000/CFG_TS_TICK_VAL) /**< 500 ms */
+#define DELAY_1_S (1000*1000/CFG_TS_TICK_VAL) /**< 1 s */
+
+#undef STRESS_TEST /* undef or comment for public version */
+#ifdef STRESS_TEST
+#define TOGGLE_INTERVAL DELAY_20_MS /* 20 ms interval between 2 toggles */
+#else
+#define TOGGLE_INTERVAL DELAY_1_S /* 1 sec interval between 2 toggles */
+#endif
+#define DBG_NWK_STATUS_INTERVAL (DELAY_1_S * 15) /* 15 sec interval to display stats */
+
+
+#define OUTPUT_LINE_MAX_LEN 256
+
+/******************************************************************************
+ * 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
+
+/* 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_OnOff_Toggle(void);
+static void APP_ZIGBEE_Process_OnOff_Toggle();
+static void APP_ZIGBEE_NwkForm(void);
+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 Wait_Getting_Ack_From_M0(void);
+static void Receive_Ack_From_M0(void);
+static void Receive_Notification_From_M0(void);
+
+
+#ifdef WITH_PERSISTANT
+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);
+#endif // WITH_PERSISTANT
+
+static uint32_t APP_ZIGBEE_GetStartNb(void);
+static void APP_ZIGBEE_IncrementStartNb(void);
+static void toggle_cb(struct ZbZclCommandRspT *rsp, void *arg);
+
+/* 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;
+ uint32_t persistNumWrites;
+
+ struct ZbZclClusterT *onoff_client_1;
+};
+static struct zigbee_app_info zigbee_app_info;
+
+static uint32_t join_start_time;
+static double join_time_duration;
+
+#ifdef STRESS_TEST
+static uint32_t time_start;
+#endif
+
+/* Public variables -----------------------------------------------*/
+uint8_t ZbStackType; /* ZB stack type, static or dynamic, FFD or RFD */
+uint32_t toggle_cnt = 0;
+uint32_t toggle_fail = 0;
+uint32_t disc_cnt = 0;
+uint8_t Timer_ToggleOnOff_Id;
+
+/* Keep track of number of Zigbee start */
+static uint8_t zigbee_start_nb = 0U;
+static bool zigbee_logging_done = FALSE;
+
+/* Functions Definition ------------------------------------------------------*/
+/* external definition */
+enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+
+void APP_ZIGBEE_Init(void)
+{
+ SHCI_CmdStatus_t ZigbeeInitStatus;
+
+ /* Do not allow stop mode before ZB is initialized */
+ UTIL_LPM_SetStopMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE);
+
+ APP_DBG("APP_ZIGBEE_Init");
+ APP_DBG("STARTING ON CHANNEL = %d", CHANNEL);
+
+ /* 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 push button SW1 */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_BUTTON_SW1, UTIL_SEQ_RFU, APP_ZIGBEE_SW1_Process);
+
+ /* Task associated with Toggle On/Off */
+ UTIL_SEQ_RegTask(1U << CFG_TASK_TOGGLE_ON_OFF, UTIL_SEQ_RFU, APP_ZIGBEE_OnOff_Toggle);
+
+ /* Init the Zigbee on the CPU2 side */
+ ZigbeeInitStatus = SHCI_C2_ZIGBEE_Init();
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(ZigbeeInitStatus);
+
+ /**
+ * Create timer for Toggle On/Off process
+ */
+ HW_TS_Create(CFG_TIM_PROC_ID_ISR, &(Timer_ToggleOnOff_Id), hw_ts_Repeated, APP_ZIGBEE_Process_OnOff_Toggle);
+ /**
+ * Create timer for Network Status process
+ */
+ /* Initialize Zigbee stack layers and launch network formation */
+ APP_ZIGBEE_StackLayersInit();
+
+ APP_ZIGBEE_IncrementStartNb();
+
+} /* APP_ZIGBEE_Init */
+
+
+void APP_ZIGBEE_Stop(void)
+{
+ APP_DBG("APP_ZIGBEE_Stop");
+
+ BSP_LED_Off(LED_RED);
+ BSP_LED_Off(LED_GREEN);
+ BSP_LED_Off(LED_BLUE);
+
+ /* Save Persistent data */
+ APP_DBG("Save persistent data");
+#ifdef WITH_PERSISTANT
+ APP_ZIGBEE_persist_save();
+#endif //WITH_PERSISTANT
+
+ /* Zigbee STOP Procedure */
+ /* Free memory allocated by Zigbee stack */
+ 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;
+}
+
+/**
+ * @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;
+
+ join_start_time = HAL_GetTick();
+ UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, CFG_SCH_PRIO_0);
+}
+
+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_ONOFF_SWITCH;
+
+ /* Endpoint: SW1_ENDPOINT */
+ req.endpoint = SW1_ENDPOINT;
+ ZbZclAddEndpoint(zigbee_app_info.zb, &req, &conf);
+ assert(conf.status == ZB_STATUS_SUCCESS);
+
+ /* OnOff 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);
+
+} /* config_endpoints */
+
+/**
+ * @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;
+
+ if (zigbee_logging_done == FALSE)
+ {
+ /* 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);
+ zigbee_logging_done = TRUE;
+ }
+
+ /* Attempt to join a zigbee network */
+ ZbStartupConfigGetProDefaults(&config);
+
+ zigbee_app_info.startupControl = ZbStartTypeJoin;
+ config.startupControl = zigbee_app_info.startupControl;
+
+ /* 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*/
+ //config.channelList.list[0].channelMask = CHANNELMASK_12TO14; /* Channels 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 = SED_SLEEP_TIME_30S /* 30sec sleep time unit */;
+
+ APP_DBG("Network config : APP_STARTUP_SED");
+
+ APP_DBG("*** zigbee_start_nb value = %d ***", APP_ZIGBEE_GetStartNb());
+#ifdef WITH_PERSISTANT
+ if(APP_ZIGBEE_GetStartNb() < 2U)
+#endif
+ {
+ /* 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)\n", status);
+ zigbee_app_info.join_status = status;
+
+ if (status == ZB_STATUS_SUCCESS) {
+ join_time_duration = (double)(HAL_GetTick() - join_start_time)/1000;
+ APP_DBG("%s==> JOIN SUCCESS, Duration = (%.2f seconds)%s\n", COL_MAGENTA, join_time_duration, COL_NORM);
+ zigbee_app_info.join_delay = 0U;
+ zigbee_app_info.init_after_join = true;
+ 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;
+ }
+ }
+#ifdef WITH_PERSISTANT
+ 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!");
+ }
+ }
+#endif //WITH_PERSISTANT
+ }
+
+ /* 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 /* JOIN successful */
+ {
+ zigbee_app_info.init_after_join = false;
+
+ /* Do it only first time */
+ if(APP_ZIGBEE_GetStartNb() == 1U)
+ {
+ /* Assign ourselves to the group addresses */
+ APP_ZIGBEE_ConfigGroupAddr();
+
+ /* 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));
+
+ APP_DBG("==> Start_ZB Task Toggle");
+ /* Next toggle after TOGGLE_INTERVAL */
+ HW_TS_Start(Timer_ToggleOnOff_Id, (uint32_t)TOGGLE_INTERVAL);
+
+ }
+ }
+}
+
+/**
+ * @brief Set group addressing mode
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_ConfigGroupAddr(void)
+{
+ ZbApsmeAddGroupReqT req;
+ ZbApsmeAddGroupConfT conf;
+
+ memset(&req, 0, sizeof(req));
+ req.endpt = SW1_ENDPOINT;
+ req.groupAddr = SW1_GROUP_ADDR;
+ ZbApsmeAddGroupReq(zigbee_app_info.zb, &req, &conf);
+
+} /* APP_ZIGBEE_ConfigGroupAddr */
+
+/*************************************************************
+ * 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 */
+
+
+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
+ * @retval None
+ */
+#ifdef WITH_PERSISTANT
+enum ZbStatusCodeT APP_ZIGBEE_ZbStartupPersist(struct ZigBeeT *zb)
+{
+ 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;
+
+}
+
+/**
+ * @brief Load persitent data
+ * @param bufLen : pointer on buffer length
+ * @retval None
+ */
+static const void * APP_ZIGBEE_persist_load(unsigned int *bufLen)
+{
+ 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;
+}
+
+/**
+ * @brief Delete first word of persistent data (size = 0 meaning no data)
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_persist_delete(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");
+ }
+}
+
+/**
+ * @brief Free buffer
+ * @param buf : pointer on buffer to free
+ * @retval None
+ */
+static void APP_ZIGBEE_persist_buf_free(const void *buf)
+{
+ free((void *)buf);
+}
+
+/**
+ * @brief Save persistent data in FLASH (Or Flash Emulation in RAM)
+ * @param None
+ * @retval None
+ */
+bool APP_ZIGBEE_persist_save(void)
+{
+ 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);
+ return false;
+ }
+
+ buf = malloc(ST_PERSIST_MAX_ALLOC_SZ);
+ if (buf == NULL) {
+ APP_DBG("APP_ZIGBEE_persist_save: memory exhausted");
+ return false;
+ }
+
+ len = ZbPersistGet(zigbee_app_info.zb, buf, len);
+
+ /* 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);
+ 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);
+ return false;
+ }
+
+ free(buf);
+
+ zigbee_app_info.persistNumWrites++;
+ APP_DBG("APP_ZIGBEE_persist_save: Persistence written (num writes = %d)", zigbee_app_info.persistNumWrites);
+ return true;
+}
+#endif //WITH_PERSISTANT
+
+
+
+/**
+ * @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);
+
+ ZbStackType = p_wireless_info->StackType; /* Memorize ZB stack type */
+ switch (p_wireless_info->StackType) {
+ case INFO_STACK_TYPE_BLE_ZIGBEE_FFD_STATIC:
+ APP_DBG("FW Type : STACK_TYPE_BLE_ZIGBEE_FFD_STATIC");
+ break;
+ case INFO_STACK_TYPE_BLE_ZIGBEE_FFD_DYNAMIC:
+ APP_DBG("FW Type : STACK_TYPE_BLE_ZIGBEE_FFD_DYNAMIC");
+ break;
+ case INFO_STACK_TYPE_BLE_ZIGBEE_RFD_STATIC:
+ APP_DBG("FW Type : STACK_TYPE_BLE_ZIGBEE_RFD_STATIC");
+ break;
+ case INFO_STACK_TYPE_BLE_ZIGBEE_RFD_DYNAMIC:
+ APP_DBG("FW Type : STACK_TYPE_BLE_ZIGBEE_RFD_DYNAMIC");
+ break;
+ 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 */
+
+static void APP_ZIGBEE_SW1_Process(void)
+{
+ struct ZbApsAddrT dst;
+
+ memset(&dst, 0, sizeof(dst));
+ dst.mode = ZB_APSDE_ADDRMODE_GROUP;
+ dst.endpoint = SW1_ENDPOINT;
+ dst.nwkAddr = SW1_GROUP_ADDR;
+
+ APP_DBG("==> SENDING TOGGLE TO GROUP 0x0001");
+ if (ZbZclOnOffClientToggleReq(zigbee_app_info.onoff_client_1, &dst, NULL, NULL) != ZCL_STATUS_SUCCESS) {
+ APP_DBG("Error, ZbZclOnOffClientToggleReq failed (SW1_ENDPOINT)");
+ }
+}
+
+static void APP_ZIGBEE_Process_OnOff_Toggle(void)
+{
+ UTIL_SEQ_SetTask(1U << CFG_TASK_TOGGLE_ON_OFF, CFG_SCH_PRIO_1);
+}
+
+static void APP_ZIGBEE_OnOff_Toggle(void)
+{
+ struct ZbApsAddrT dst;
+
+ memset(&dst, 0, sizeof(dst));
+ dst.mode = ZB_APSDE_ADDRMODE_SHORT;
+ dst.endpoint = SW1_ENDPOINT;
+ dst.nwkAddr = 0x0;
+#ifdef STRESS_TEST
+ uint32_t time;
+
+ if (toggle_cnt == 0) {
+ time_start = HAL_GetTick();
+ }
+#endif
+
+ if (ZbZclOnOffClientToggleReq(zigbee_app_info.onoff_client_1, &dst, toggle_cb, NULL) != ZCL_STATUS_SUCCESS)
+ {
+ APP_DBG("Error, ZbZclOnOffClientToggleReq failed (SW1_ENDPOINT)");
+ }
+#ifdef STRESS_TEST
+ printf("T");
+ toggle_cnt++;
+ if ((toggle_cnt % 10) == 0) printf("\n");
+ UTIL_SEQ_WaitEvt(EVENT_ON_OFF_RSP);
+ if ((toggle_cnt % 200) == 0) {
+ time = HAL_GetTick() - time_start;
+ APP_DBG_FULL(LOG_LEVEL_INFO, APPLI_LOG_REGION_GENERAL, "\n==> Nb TOGGLE ON/OFF sent: %d (%d Fail - %.2f%%) - %d BLE Disc - Toggle freq = %.2f ms %s",
+ toggle_cnt, toggle_fail, (float)(toggle_fail * 100)/(float)toggle_cnt, disc_cnt, (float)time/(float)toggle_cnt, COLOR_DEFAULT);
+ }
+#else
+ toggle_cnt++;
+ UTIL_SEQ_WaitEvt(EVENT_ON_OFF_RSP);
+ APP_DBG_FULL(LOG_LEVEL_INFO, APPLI_LOG_REGION_GENERAL, "==> Nb TOGGLE ON/OFF sent: %d (%d Fail - %.2f%%) - %d BLE Disc %s",
+ toggle_cnt, toggle_fail, (float)(toggle_fail * 100)/(float)toggle_cnt, disc_cnt, COLOR_DEFAULT);
+#endif /* STRESS_TEST */
+ /* Enabling Stop mode */
+#if (CFG_FULL_LOW_POWER == 1)
+ UTIL_LPM_SetStopMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
+#endif /* CFG_FULL_LOW_POWER */
+}
+
+
+static void toggle_cb(struct ZbZclCommandRspT *rsp, void *arg)
+{
+ if(rsp->status != ZCL_STATUS_SUCCESS)
+ {
+#ifndef STRESS_TEST
+ APP_DBG("TOGGLE RSP FAIL status %d",rsp->status);
+#else
+ printf("-");
+#endif
+ toggle_fail++;
+ }
+ else
+ {
+#ifndef STRESS_TEST
+ APP_DBG("TOGGLE RSP SUCCESS from %#08llx",rsp->src.extAddr);
+#else
+ printf("+");
+#endif
+ }
+ UTIL_SEQ_SetEvt(EVENT_ON_OFF_RSP);
+}
+
+/*************************************************************
+ *
+ * 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/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/app_zigbee.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/app_zigbee.h
new file mode 100644
index 000000000..88ad973f2
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/app_zigbee.h
@@ -0,0 +1,66 @@
+/* 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"
+#include "zigbee.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);
+void APP_ZIGBEE_Stop(void);
+enum ZbStatusCodeT APP_ZIGBEE_ZbStartupPersist(struct ZigBeeT *zb);
+bool APP_ZIGBEE_persist_save(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/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/ble_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/ble_conf.h
new file mode 100644
index 000000000..538713f85
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/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) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/ble_dbg_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/ble_dbg_conf.h
new file mode 100644
index 000000000..1f9b21135
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/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) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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 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_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/p2p_server_app.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/p2p_server_app.c
new file mode 100644
index 000000000..bde504398
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/p2p_server_app.c
@@ -0,0 +1,397 @@
+/* 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 "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_RED);
+ //APP_DBG_MSG("-- P2P APPLICATION SERVER : LED1 ON\n");
+ APP_DBG_MSG("+");
+ P2P_Server_App_Context.LedControl.Led1=0x01; /* LED1 ON */
+ }
+ if(pNotification->DataTransfered.pPayload[1] == 0x00)
+ {
+ BSP_LED_Off(LED_RED);
+ //APP_DBG_MSG("-- P2P APPLICATION SERVER : LED1 OFF\n");
+ APP_DBG_MSG("-");
+ 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_RED);
+ //APP_DBG_MSG("-- P2P APPLICATION SERVER 1 : LED1 ON\n");
+ //APP_DBG_MSG("+");
+ P2P_Server_App_Context.LedControl.Led1=0x01; /* LED1 ON */
+ }
+ if(pNotification->DataTransfered.pPayload[1] == 0x00)
+ {
+ BSP_LED_Off(LED_RED);
+ //APP_DBG_MSG("-- P2P APPLICATION SERVER 1 : LED1 OFF\n");
+ P2P_Server_App_Context.LedControl.Led1=0x00; /* LED1 OFF */
+ }
+ /* Switch to Thread */
+ if(pNotification->DataTransfered.pPayload[1] == 0x02)
+ {
+ BSP_LED_Off(LED_BLUE);
+ APP_DBG("SYSTEM: SWITCH TO Zigbee");
+ 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);
+ }
+ }
+#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_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/p2p_server_app.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/p2p_server_app.h
new file mode 100644
index 000000000..11e27d8a2
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/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) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/tl_dbg_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/tl_dbg_conf.h
new file mode 100644
index 000000000..68db3653d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/App/tl_dbg_conf.h
@@ -0,0 +1,84 @@
+/**
+ ******************************************************************************
+ * File Name : tl_dbg_conf.h
+ * Description : Debug configuration file for stm32wpan transport layer 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
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __TL_DBG_CONF_H
+#define __TL_DBG_CONF_H
+
+/* USER CODE BEGIN Tl_Conf */
+
+/* Includes ------------------------------------------------------------------*/
+#include "dbg_trace.h"
+
+/**
+ * Enable or Disable traces
+ */
+#define TL_SHCI_CMD_DBG_EN 0 /* Reports System commands sent to CPU2 and the command response */
+#define TL_SHCI_EVT_DBG_EN 0 /* Reports System Asynchronous Events received from CPU2 */
+#define TL_HCI_CMD_DBG_EN 0 /* Reports BLE command sent to CPU2 and the command response */
+#define TL_HCI_EVT_DBG_EN 0 /* Reports BLE Asynchronous Events received from CPU2 */
+
+
+/**
+ * Macro definition
+ */
+
+/**
+ * System Transport Layer
+ */
+#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
+
+/**
+ * BLE Transport Layer
+ */
+#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
+
+/* USER CODE END Tl_Conf */
+
+#endif /*__TL_DBG_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/STM32_WPAN/Target/hw_ipcc.c
new file mode 100644
index 000000000..451ae9311
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/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_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 )
+{
+ /**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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_Zigbee/BLE_Zigbee_Dyn_SED/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/readme.txt
new file mode 100644
index 000000000..afa89bf71
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED/readme.txt
@@ -0,0 +1,149 @@
+/**
+ @page BLE_Zigbee_Dynamic example
+
+ @verbatim
+ ******************************************************************************
+ * @file BLE_Zigbee/BLE_Zigbee_Dynamic/readme.txt
+ * @author MCD Application Team
+ * @brief Example of application using BLE and Zigbee protocols in Static
+ * Concurrent mode.
+ ******************************************************************************
+ *
+ * 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
+
+How to use BLE application and Zigbee application in dynamic concurrent mode.
+
+The idea is to present a demo with a Zigbee Network (at least 2 Nucleo Boards, Zb coordinator
+running Zigbee_OnOff_Server_Coord application[1] and Zb SED running Ble_Zigbee_Dynamic application[2]),
+and a BLE connection between 1 Nucleo board running Ble_Zigbee_Dynamic application [2] with either a
+smartphone running "ST BLE Sensor" Application (available on App Store and Google Play), or another
+Nucleo board running a BLE_p2pClient application[3].
+The STM32WB55xx-Nucleo board running Ble_Zigbee_Dynamic application is capable of switching
+dynamically and transparently from BLE network to Zigbee network and vice-versa.
+Please note that no LEDs or buttons are active on the SED device as it is configured in Low power mode (LPM).
+
+The demo architecture is summarized in the following figure:
+
+ ______________ ______________ ______________
+ / \ / \ / \
+ | | | | | |
+ | SW1 => BLE Toggle | Dynamic mode | ZB Toggle | |
+ | BLE App |===========> | BLE/ZB App |============>| ZB App |
+ | | | | | |
+ | | | (ZB SED) | | (ZB coord.) |
+ \______________/ \______________/ \______________/
+ [3] [2] [1]
+
+ @par Keywords
+
+Zigbee, BLE
+
+@par Directory contents
+
+
+@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 ?
+
+This application requests having the STM32WB5x_BLE_Zigbee_dynamic_fw.bin binary flashed on the M0 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 load the proper
+Wireless Coprocessor binary.
+
+
+Minimum requirements for the demo:
+- 1 STM32WB55xx-Nucleo board in BLE Zigbee Dynamic Concurrent mode [2]
+- 1 STM32WB55xx-Nucleo board or more for creating Zigbee Network [1]
+ (see example Zigbee_OnOff_Server_Coord and Zigbee_OnOff_Client_Router for more details on how to use it)
+- 1 STM32WB55xx-Nucleo board running a BLE_p2pClient application[3]
+-- OR
+- 1 Smartphone (Android/IOS) with "ST BLE Sensor" Phone Application (available on App Store and Google Play)
+ 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
+
+In order to make the program work, you must do the following:
+ - Connect 1 STM32WB55xx-Nucleo boards to your PC
+ - Open your preferred toolchain
+ - Rebuild all files and load your image into target memory
+ - Run the example
+
+ if you want to get the traces in real time, you can connects an HyperTerminal
+ via an UART RS232 cable using the following connections :
+ RXD : CN10(Pin35)
+ TXD : CN10(Pin37)
+
+**** START DEMO ****
+By default, after a reset, the ZB/BLE board [2] will start with both BLE and Zigbee modes activated.
+
+The BLE example implements Point-to-Point communication using BLE component.
+1- The ZB/BLE device (P2P Server) starts BLE advertising and simultaneously starts to join the Zigbee Network.
+2- The node will then attach the existing Zigbee network (Zb coordinator running Zigbee_OnOff_Server_Coord application [1]).
+3- When the Zigbee connection is establised, the Zigbee SED will send every second a ZB ON_OFF toggle to the ZB coordinator [1]
+-- The RED Led toggles on the coordinator [1].
+4- The BLE connection will be started as follows, depending if your BLE device is a smartphone or a 3rd Nucleo board:
+4.1 If using a smartphone, then the ST BLE Sensor App (smart Phone Application) scans and can connect to the P2P Server
+by selecting = "P2PZBSRV1" entry.
+-- Once connected, the application starts to search the P2P Services & Characteristics.
+-- Led Button service, Led Characteristic and Button Characteristic are discovered at this stage (this service is ST specific).
+4.2 If using a 3rd Nucleo board (running a BLE_p2pClient application [3]), you can start scanning by pressing the SW1 button
+-- the BLUE LED will light up on [3]
+-- After scanning complete, the 3rd Nucleo board [3] connects to the P2P server on BLE/ZB [2] dynamic node, and sends a BLE toggle when pressing SW1.
+
+Please note that no LEDs or buttons are active on the SED device as it is configured in Low power mode (LPM).
+
+ ______________ ______________ ______________
+ / \ / \ / \
+ | | | | | |
+ | SW1 => BLE Toggle | Dynamic mode | ZB Toggle | |
+ | | | BLE/ZB App | (every sec)| |
+ | | | | | |
+ | | | | | |
+ | BLE App |===========> | |============>| ZB App |
+ | | | | | |
+ | | | (ZB SED) | | (ZB coord.) |
+ \______________/ \______________/ \______________/
+ [3] [2] [1]
+
+This Demo illustrates the simultaneous BLE and ZB connections, with the RED Led toggling on the ZB coordinator[1], reflecting ZB activity, while BLE activity can be shown on the BLE App.
+
+On BLE Disconnection, the STM32WB55xx-Nucleo board [3] will restart advertising.
+
+
+ * <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
+ */
+ \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/Core/Inc/app_common.h
index ad5ea9c1d..0d38b869d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/Core/Inc/app_common.h
@@ -69,9 +69,13 @@ extern "C"
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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 3e27820d1..7f5b48992 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
@@ -306,7 +306,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/STM32_WPAN/App/app_ble.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/STM32_WPAN/App/app_ble.c
index b403b8657..4fdd25ba5 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/STM32_WPAN/App/app_ble.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/STM32_WPAN/App/app_ble.c
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
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 32cbfd05c..9b5d7d787 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
@@ -192,7 +192,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
zigbee_app_info.startupControl = ZbStartTypeJoin;
@@ -593,6 +593,9 @@ static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
case INFO_STACK_TYPE_BLE_ZIGBEE_FFD_STATIC:
APP_DBG("FW Type : STACK_TYPE_BLE_ZIGBEE_FFD_STATIC");
break;
+ case INFO_STACK_TYPE_BLE_ZIGBEE_RFD_STATIC:
+ APP_DBG("FW Type : STACK_TYPE_BLE_ZIGBEE_RFD_STATIC");
+ break;
default:
/* No Zigbee device supported ! */
APP_ZIGBEE_Error((uint32_t)ERR_ZIGBEE_CHECK_WIRELESS, (uint32_t)ERR_INTERFACE_FATAL);
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/STM32_WPAN/App/app_zigbee.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/STM32_WPAN/App/app_zigbee.h
index 88ad973f2..98dde7f17 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/STM32_WPAN/App/app_zigbee.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/STM32_WPAN/App/app_zigbee.h
@@ -54,8 +54,6 @@ void APP_ZIGBEE_ProcessRequestM0ToM4(void);
void APP_ZIGBEE_TL_INIT(void);
void Pre_ZigbeeCmdProcessing(void);
void APP_ZIGBEE_Stop(void);
-enum ZbStatusCodeT APP_ZIGBEE_ZbStartupPersist(struct ZigBeeT *zb);
-bool APP_ZIGBEE_persist_save(void);
#ifdef __cplusplus
} /* extern "C" */
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 7b3a35bb0..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
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "dbg_trace.h"
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/STM32_WPAN/Target/hw_ipcc.c
index 751080c16..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -387,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -417,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/readme.txt
index aaa5d7734..8dd1fbe69 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/readme.txt
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE_Zigbee/BLE_Zigbee_Static/readme.txt
@@ -9,7 +9,7 @@
* Concurrent mode.
******************************************************************************
*
- * Copyright (c) 2019 STMicroelectronics. All rights reserved.
+ * 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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/app_common.h
new file mode 100644
index 000000000..5bb0f82f1
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/app_common.h
@@ -0,0 +1,124 @@
+/* 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 "main.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 *
+ * -------------------------------- */
+
+#ifndef MAX
+#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+
+#ifndef MIN
+#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
+
+#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
+
+#define CRITICAL_BEGIN( ) M_BEGIN BACKUP_PRIMASK(); DISABLE_IRQ()
+
+#define CRITICAL_END( ) RESTORE_PRIMASK(); 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/LLD_BLE/LLD_BLE_Chat/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/app_conf.h
new file mode 100644
index 000000000..870ac81ad
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/app_conf.h
@@ -0,0 +1,348 @@
+/* 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 M0 traces/log messages
+ * This parameter defines the number of asynchronous events that can be stored in the M0 test FW before
+ * being reported to the M4 which will re-build traces/log messages before to send them to UART.
+ * This parameter is combined with the CFG_TL_MOST_EVENT_PAYLOAD_SIZE to calculate the queue size needed by M0 for traces.
+ */
+#define CFG_TL_EVT_QUEUE_LENGTH 20
+/**
+ * TL_EVENT_FRAME_SIZE is the size of the packets transfered between M0 and M4 through IPCC.
+ * Note 1 : thoose packets are first put in a trace queue (see DBG_TRACE_MSG_QUEUE_SIZE) before beeing sent to UART
+ * Note 2 : Queue size must be higher than a M0 trace buffer max size (see LOG_BUFFER_SIZE_MAX in M0 FW)
+ */
+#define CFG_TL_MOST_EVENT_PAYLOAD_SIZE 255
+
+#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 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 1
+#else
+#define CFG_LED_SUPPORTED 1
+#define CFG_BUTTON_SUPPORTED 0
+#endif /* CFG_FULL_LOW_POWER */
+
+#ifdef STM32WB35xx
+#define PUSH_BUTTON_SW1_EXTI_IRQHandler EXTI0_IRQHandler
+#define PUSH_BUTTON_SW2_EXTI_IRQHandler EXTI4_IRQHandler
+#define PUSH_BUTTON_SW3_EXTI_IRQHandler EXTI9_5_IRQHandler
+#else
+#define PUSH_BUTTON_SW1_EXTI_IRQHandler EXTI4_IRQHandler
+#define PUSH_BUTTON_SW2_EXTI_IRQHandler EXTI0_IRQHandler
+#define PUSH_BUTTON_SW3_EXTI_IRQHandler EXTI1_IRQHandler
+#endif
+/* 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_CMD_FROM_M0_TO_M4,
+ CFG_TASK_SEND_CLI_TO_M0,
+ CFG_TASK_SEND_TO_M0,
+ CFG_TASK_HAL_BLE_INIT,
+/* USER CODE BEGIN IdleTask */
+ CFG_TASK_HAL_BLE_ENCRYPT,
+ CFG_TASK_HAL_BLE_SENDPACKET,
+ CFG_TASK_HAL_BLE_LISTENPACKET,
+ CFG_TASK_HAL_BLE_STARTTONE,
+ CFG_TASK_HAL_BLE_STOPTONE,
+/* USER CODE END IdleTask */
+ CFG_TASK_SYSTEM_HCI_ASYNCH_EVT,
+ CFG_TASK_PROCESS_UART_RX_BUFFER,
+ CFG_TASK_PROCESS_UART_RX_IT,
+ CFG_TASK_PROCESS_UART_TX_IT,
+ CFG_TASK_NBR /**< Shall be last in the list */
+} CFG_IdleTask_Id_t;
+
+/**
+ * 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_RECEIVE_RSPACKEVT,
+ CFG_EVT_RECEIVE_ENDPACKEVT,
+} 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_LLDTESTS,
+ CFG_LPM_APP_LLD_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/LLD_BLE/LLD_BLE_Chat/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/app_entry.h
new file mode 100644
index 000000000..77ead2384
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/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/LLD_BLE/LLD_BLE_Chat/Core/Inc/gpio_lld.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/gpio_lld.h
new file mode 100644
index 000000000..71678202a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/gpio_lld.h
@@ -0,0 +1,91 @@
+/*
+ * gpio_lld.h
+ *
+ */
+
+#ifndef GPIO_LLD_H_
+#define GPIO_LLD_H_
+
+#if defined (USE_SIMU) || defined (USE_FPGA)
+/* Be carefull with GPIO used on SIMU plateform */
+// GPIOA port is used for CRC management on MASTER only
+// GPIOC ad GPIOD ports are used to send messages between the 2 DORYs
+#define GPIO_TX_PIN GPIO_PIN_8
+#define GPIO_TX_PORT GPIOB
+
+#define GPIO_1_PIN GPIO_PIN_9
+#define GPIO_1_PORT GPIOB
+#else /* on Nucleo boards */
+/* Use GPIO PB.8 to monitor TX time during valid on Boards */
+#define GPIO_TX_PIN GPIO_PIN_8
+#define GPIO_TX_PORT GPIOB
+
+#define GPIO_HARD_FAULT_PIN GPIO_PIN_4
+#define GPIO_HARD_FAULT_PORT GPIOA
+
+#define GPIO_MCO_PIN GPIO_PIN_15
+#define GPIO_MCO_PORT GPIOA
+
+#ifdef STM32WB35xx
+#define GPIO_1_PIN GPIO_PIN_3
+#define GPIO_1_PORT GPIOB
+
+#define GPIO_2_PIN GPIO_PIN_4
+#define GPIO_2_PORT GPIOB
+#else
+#define GPIO_1_PIN GPIO_PIN_2
+#define GPIO_1_PORT GPIOC
+
+#define GPIO_2_PIN GPIO_PIN_3
+#define GPIO_2_PORT GPIOC
+#endif
+#endif
+
+// External PA TX/RX pin is fixed by the chip
+#define GPIO_EXT_PA_TX_PIN GPIO_PIN_0
+#define GPIO_EXT_PA_TX_PORT GPIOB
+// External PA enable pin is chosen by user
+#define GPIO_EXT_PA_EN_PIN GPIO_PIN_9
+#define GPIO_EXT_PA_EN_PORT GPIOB
+
+void gpio_lld_phy_init( void );
+void gpio_lld_phy_gpioTx_up(void);
+void gpio_lld_phy_gpioTx_down(void);
+void gpio_lld_phy_gpioHardFault_up(void);
+void gpio_lld_phy_gpioHardFault_down(void);
+void gpio_lld_phy_gpio1_up(void);
+void gpio_lld_phy_gpio1_down(void);
+void gpio_lld_phy_gpio2_up(void);
+void gpio_lld_phy_gpio2_down(void);
+void gpio_lld_phy_deInit(void);
+
+void gpio_lld_mco_init(uint32_t mcoSource, uint32_t mcoDiv);
+void gpio_lld_mco_deInit(void);
+
+void gpio_lld_extPa_init(void);
+void gpio_lld_extPa_deInit(void);
+
+#ifdef USE_SIMU
+void gpio_lld_SimuMaster_init(void);
+void gpio_lld_SimuSlave_init(void);
+#endif
+
+void gpio_lld_lpuart_init(void);
+void gpio_lld_lpuart_deInit(void);
+
+void gpio_lld_usart_init(void);
+void gpio_lld_usart_deInit(void);
+
+#if !defined (USE_SIMU) && !defined(USE_FPGA)
+void gpio_lld_pa2_init(uint8_t mode);
+void gpio_lld_pa2_deInit(void);
+
+void gpio_lld_dtb_init(uint8_t dtbMode);
+void gpio_lld_dtb_deInit(void);
+#endif
+
+void gpio_lld_led1_toggle(void);
+void gpio_lld_led2_toggle(void);
+void gpio_lld_led3_toggle(void);
+
+#endif /* GPIO_LLD_H_ */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/hw_conf.h
new file mode 100644
index 000000000..24e76f61c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/hw_conf.h
@@ -0,0 +1,90 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : hw_conf.h
+ * Description : Hardware configuration file for 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 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 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
+
+/******************************************************************************
+ * External PA
+ *****************************************************************************/
+
+#define CFG_HW_EXTPA_ENABLED 1
+
+#endif /*HW_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/hw_if.h
new file mode 100644
index 000000000..8851f00a4
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/hw_if.h
@@ -0,0 +1,115 @@
+/* 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
+#ifdef STM32WB35xx
+#include "nucleo_wb35ce.h"
+#else
+#include "stm32wbxx_nucleo.h"
+#endif
+#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;
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern UART_HandleTypeDef hlpuart1;
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern UART_HandleTypeDef huart1;
+extern DMA_HandleTypeDef hdma_usart1_tx;
+#endif
+
+//void HW_UART_Init(hw_uart_id_t hw_uart_id);
+hw_status_t HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+hw_status_t 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));
+#if 0
+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);
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+void MX_LPUART1_UART_Init(void);
+void MX_LPUART1_UART_DeInit(void);
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+void MX_USART1_UART_Init(void);
+void MX_USART1_UART_DeInit(void);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*HW_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/main.h
new file mode 100644
index 000000000..0c024028b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/main.h
@@ -0,0 +1,107 @@
+/* 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 ------------------------------------------------------------------*/
+
+/* 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);
+void SystemClock_Config_HSE(uint32_t usePLL);
+void SystemClock_Config_MSI(uint32_t usePLL);
+
+/* USER CODE BEGIN EFP */
+
+/* USER CODE END EFP */
+
+/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN Private defines */
+
+
+/*
+ In this example TIM2 input clock (TIM2CLK) is set to APB1 clock (PCLK1),
+ since APB1 prescaler is equal to 1.
+ TIM2CLK = PCLK1
+ PCLK1 = HCLK
+ => TIM2CLK = HCLK = SystemCoreClock
+ To get TIM2 counter clock at 10 KHz, the Prescaler is computed as following:
+ Prescaler = (TIM2CLK / TIM2 counter clock) - 1
+ Prescaler = (SystemCoreClock /10 KHz) - 1
+
+ Note:
+ SystemCoreClock variable holds HCLK frequency and is defined in system_stm32wbxx.c file.
+ Each time the core clock (HCLK) changes, user had to update SystemCoreClock
+ variable value. Otherwise, any configuration based on this variable will be incorrect.
+ This variable is updated in three ways:
+ 1) by calling CMSIS function SystemCoreClockUpdate()
+ 2) by calling HAL API function HAL_RCC_GetSysClockFreq()
+ 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
+ ----------------------------------------------------------------------- */
+
+/* Compute the prescaler value to have TIMx counter clock equal to 10000 Hz */
+
+#define PRESCALER_VALUE (uint32_t)(((SystemCoreClock) / (1000000)) - 1)
+
+ /* Initialize TIMx peripheral as follows:
+ + Period = 10000 - 1
+ + Prescaler = (SystemCoreClock/10000) - 1
+ + ClockDivision = 0
+ + Counter direction = Up
+ */
+
+#define PERIOD_VALUE (1000000 - 1);
+
+
+/* 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/LLD_BLE/LLD_BLE_Chat/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/stm32_lpm_if.h
new file mode 100644
index 000000000..dac7e2cbb
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/stm32_lpm_if.h
@@ -0,0 +1,79 @@
+/**
+ ******************************************************************************
+ * @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
+ *
+ ******************************************************************************
+ */
+
+/* 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/LLD_BLE/LLD_BLE_Chat/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/stm32wbxx_hal_conf.h
new file mode 100644
index 000000000..365809937
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/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_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_EXTI_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_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 (32000000UL) /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (HSE_STARTUP_TIMEOUT)
+ #define HSE_STARTUP_TIMEOUT (100UL) /*!< 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 (4000000UL) /*!< 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 (16000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+ * @brief Internal Low Speed oscillator (LSI1) value.
+ */
+#if !defined (LSI1_VALUE)
+ #define LSI1_VALUE (32000UL) /*!< 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 (32000UL) /*!< 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 (32768UL) /*!< 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 (48000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI48_VALUE */
+
+#if !defined (LSE_STARTUP_TIMEOUT)
+ #define LSE_STARTUP_TIMEOUT (5000UL) /*!< 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 (48000UL) /*!< 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 (3300UL) /*!< Value of VDD in mv */
+#define TICK_INT_PRIORITY ((1UL<<__NVIC_PRIO_BITS) - 1UL) /*!< 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((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/LLD_BLE/LLD_BLE_Chat/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/stm32wbxx_it.h
new file mode 100644
index 000000000..1fa67b9b2
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/stm32wbxx_it.h
@@ -0,0 +1,88 @@
+/* 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);
+#ifdef STM32WB35xx
+void DMA1_Channel4_IRQHandler(void);
+void DMA2_Channel4_IRQHandler(void);
+#else
+void DMA1_Channel1_IRQHandler(void);
+void DMA1_Channel2_IRQHandler(void);
+#endif
+void USART1_IRQHandler(void);
+void LPUART1_IRQHandler(void);
+/* USER CODE BEGIN EFP */
+#if 0
+void RTC_WKUP_IRQHandler(void);
+#endif
+void IPCC_C1_TX_IRQHandler(void);
+void IPCC_C1_RX_IRQHandler(void);
+#if 1 // Not needed for LLD tests : remove to use less power
+void PUSH_BUTTON_SW1_EXTI_IRQHandler(void);
+void PUSH_BUTTON_SW2_EXTI_IRQHandler(void);
+void PUSH_BUTTON_SW3_EXTI_IRQHandler(void);
+void TIM2_IRQHandler(void);
+#endif
+/* 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/LLD_BLE/LLD_BLE_Chat/Core/Inc/stm_logging.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/stm_logging.h
new file mode 100644
index 000000000..39e9fbd2e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/stm_logging.h
@@ -0,0 +1,63 @@
+/**
+ ******************************************************************************
+ * 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/LLD_BLE/LLD_BLE_Chat/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Inc/utilities_conf.h
new file mode 100644
index 000000000..4dde3509a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/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/LLD_BLE/LLD_BLE_Chat/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/app_entry.c
new file mode 100644
index 000000000..dae385caf
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/app_entry.c
@@ -0,0 +1,476 @@
+/* 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 "app_entry.h"
+#include "app_lld_ble.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 -----------------------------------------------------------*/
+/* 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 -----------------------------------------------*/
+#if(CFG_DEBUG_TRACE != 0)
+size_t DbgTraceWrite(int handle, const unsigned char * buf, size_t bufSize);
+#endif
+
+/* 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);
+
+/* USER CODE BEGIN PFP */
+static void Led_Init( void );
+static void Button_Init( void );
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APPE_Init( void )
+{
+ /**< Configure the system Power Mode */
+ SystemPower_Config();
+
+/* USER CODE BEGIN APPE_Init_1 */
+ /* initialize debugger module if supported and debug trace if activated */
+ Init_Debug();
+
+ Led_Init();
+ Button_Init();
+
+/* USER CODE END APPE_Init_1 */
+ /* Initialize all transport layers and start CPU2 which will send back a ready event to CPU1 */
+ appe_Tl_Init();
+
+ /**
+ * From now, the application is waiting for the ready event ( sub event : SHCI_SUB_EVT_CODE_READY / payload : WIRELESS_FW_RUNNING)
+ * received on the system channel before starting the LLD test appli using system message SHCI_OPCODE_C2_LLD_TESTS_INIT
+ * 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 EXTI lines */
+ LL_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+ LL_C2_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+
+#else
+ /* Disable debugger EXTI lines */
+ LL_EXTI_DisableIT_32_63(LL_EXTI_LINE_48);
+ LL_C2_EXTI_DisableIT_32_63(LL_EXTI_LINE_48);
+
+ /**
+ * Do not keep debugger enabled while in any low power mode
+ */
+ HAL_DBGMCU_DisableDBGSleepMode();
+ HAL_DBGMCU_DisableDBGStopMode();
+ HAL_DBGMCU_DisableDBGStandbyMode();
+#endif /* (CFG_DEBUGGER_SUPPORTED == 1) */
+
+#if(CFG_DEBUG_TRACE != 0)
+ DbgTraceInit();
+#endif
+
+ /* Send a first trace to debug trace port to see that M4 is alive */
+ APP_DBG("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
+#ifdef STM32WB35xx
+ APP_DBG("traces init done on Little DORY M4");
+#else
+ APP_DBG("traces init done on DORY M4");
+#endif
+ APP_DBG("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
+
+ 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 )
+{
+ // Disable internal wake-up which is active by default and is for RTC wake-up
+ LL_PWR_DisableInternWU();
+
+ // Before going to stop or standby modes, do the settings so that system clock and IP80215.4 clock
+ // start on HSI automatically
+ LL_RCC_HSI_EnableAutoFromStop();
+
+ /**
+ * 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( );
+
+ /* 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);
+
+ 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 );
+
+ /* Enable transport layer and start CPU2 */
+ 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 == FUS_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:
+ if (p_sys_event->payload[0] == WIRELESS_FW_RUNNING)
+ 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_LLD_TESTS : LLD_FATAL_ERROR \n");
+ break;
+
+ case ERR_THREAD_UNKNOWN_CMD:
+ APP_DBG("** ERR_LLD_TESTS : UNKNOWN_CMD \n");
+ break;
+
+ default:
+ APP_DBG("** ERR_LLD_TESTS : ErroCode=%d \n",ErrorCode);
+ break;
+ }
+ return;
+}
+
+static void APPE_SysEvtReadyProcessing( void )
+{
+ /* Traces channel initialization */
+ TL_TRACES_Init( );
+
+ /* LLD tests application specific init */
+ APP_LLD_BLE_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;
+}
+
+/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
+static void Led_Init( void )
+{
+#if (CFG_LED_SUPPORTED == 1U)
+ /**
+ * Leds Initialization
+ */
+#if (CFG_HW_LPUART1_ENABLED != 1) || ! defined (STM32WB35xx)
+ // On Little DORY, LED_BLUE share the GPIO PB5 with LPUART
+ BSP_LED_Init(LED_BLUE);
+ //BSP_LED_On(LED_BLUE);
+#endif
+
+//#if (CFG_HW_EXTPA_ENABLED != 1)
+ BSP_LED_Init(LED_GREEN);
+ //BSP_LED_On(LED_GREEN);
+//#endif
+
+ BSP_LED_Init(LED_RED);
+ //BSP_LED_On(LED_RED);
+#endif
+
+ return;
+}
+
+static void Button_Init( void )
+{
+ /**
+ * 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);
+
+ return;
+}
+
+/* USER CODE END FD_LOCAL_FUNCTIONS */
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void UTIL_SEQ_Idle( void )
+{
+ /* Note that WFI (i.e. SLEEP mode) is required for SF timer tests but STOP or OFF mode will be managed by low-power test itself */
+#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)
+ {
+ default :
+ /* default case : schedule all tasks */
+ 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 )
+{
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_Init();
+#endif
+
+ 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 */
+void HAL_GPIO_EXTI_Callback( uint16_t GPIO_Pin )
+{
+ switch (GPIO_Pin)
+ {
+ case BUTTON_SW1_PIN:
+ Appli_GPIO_EXTI_Callback(BUTTON_SW1_PIN);
+ break;
+
+ case BUTTON_SW2_PIN:
+ Appli_GPIO_EXTI_Callback(BUTTON_SW2_PIN);
+ break;
+
+ case BUTTON_SW3_PIN:
+ Appli_GPIO_EXTI_Callback(BUTTON_SW3_PIN);
+ break;
+
+ default:
+ break;
+
+ }
+ return;
+}
+
+void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
+{
+ Appli_TIM_IC_CaptureCallback();
+}
+
+void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
+{
+ Appli_TIM_PeriodElapsedCallback();
+}
+
+
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/app_lld_ble_iar_asm.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/app_lld_ble_iar_asm.s
new file mode 100644
index 000000000..987eb201e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/app_lld_ble_iar_asm.s
@@ -0,0 +1,86 @@
+;/**
+; ******************************************************************************
+; * @file app_lld_tests_iar_asm.s
+; * @brief Common functionnalities for RF LLD tests that must be writen
+; * in assembler for IAR compilator
+; ******************************************************************************
+; * @attention
+; *
+; * <h2><center>&copy; COPYRIGHT 2018 STMicroelectronics</center></h2>
+; *
+; ******************************************************************************
+; */
+;
+;/**
+; * @brief Active polling for a given delay
+; * @param microsec the delay in us unit
+; *
+; * Caution:
+; * - This function has been implemented for system clock set to 16MHz. It must
+; * be rewiewed (twice more NOP) for 32Mhz config.
+; * - This function can be interrupted if used in interruptible part of code.
+; * - Be carefull with the use of critical section that can interrupt the reel
+; * time during input microsec value.
+; * - If 0 is given as input
+; */
+ PUBLIC us_delay_16m
+ SECTION .text:CODE:NOROOT(3)
+us_delay_16m
+loop_16m:
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ SUBS R0, R0, #1
+ BHI loop_16m
+ BX LR
+
+ PUBLIC us_delay_32m
+ SECTION .text:CODE:NOROOT(3)
+us_delay_32m
+loop_32m:
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ SUBS R0, R0, #1
+ BHI loop_32m
+ BX LR
+
+ END
+
+;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/gpio_lld.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/gpio_lld.c
new file mode 100644
index 000000000..ba3565389
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/gpio_lld.c
@@ -0,0 +1,613 @@
+/**
+ ******************************************************************************
+ * @file gpio_lld.c
+ * @author MCD Application Team
+ * @version $VERSION$
+ * @date $DATE$
+ * @brief This file contains the init of all the GPIOs used by LLD tests.
+ * It is to be used on both M0 and M4.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; COPYRIGHT(c) 2015 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 ------------------------------------------------------------------*/
+// Be carrefull with the .h included as this file must be compilable on both M0 and M4 environments
+#include "app_conf.h"
+#include "gpio_lld.h"
+
+/* Initialize GPIOs fused by PHY valid CLI */
+void gpio_lld_phy_init(void) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+ /* Enable clock(s) for GPIOs */
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+#ifdef STM32WB35xx
+#else
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+#endif
+#ifdef USE_SIMU
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOD_CLK_ENABLE();
+#endif
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+#ifdef STM32WB35xx
+#else
+ __HAL_RCC_C2GPIOC_CLK_ENABLE();
+#endif
+#ifdef USE_SIMU
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+ __HAL_RCC_C2GPIOC_CLK_ENABLE();
+ __HAL_RCC_C2GPIOD_CLK_ENABLE();
+#endif
+#endif
+
+#if defined (USE_SIMU)
+ // Initialize GPIO used to detect if current DORY is master or slave
+ // 4 GPIOs are needed while only one is enougth but this must be kept as it is
+ // because this is also used by tests which are not managed by MDG-RF
+ GPIO_InitStruct.Pin = (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH ;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ // Initialize GPIOs used to have both DORYs communicating over
+ // 13 bits of the port C and D which are cross connected in SIMU test bench
+ GPIO_InitStruct.Pin = (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH ;
+ HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13);
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH ;
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
+#endif
+
+ // configure the GPIO to be set to '1' during frame TX
+ GPIO_InitStruct.Pin = (GPIO_TX_PIN);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIO_TX_PORT, &GPIO_InitStruct);
+ gpio_lld_phy_gpioTx_down();
+
+ // configure the GPIO to be set to '1' during HardFault'
+ GPIO_InitStruct.Pin = (GPIO_HARD_FAULT_PIN);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIO_HARD_FAULT_PORT, &GPIO_InitStruct);
+ gpio_lld_phy_gpioHardFault_down();
+
+ // configure 2 GPIOs that can be used for debug purposes
+ GPIO_InitStruct.Pin = (GPIO_1_PIN);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIO_1_PORT, &GPIO_InitStruct);
+ gpio_lld_phy_gpio1_down();
+#if !defined (USE_SIMU) && !defined (USE_FPGA)
+ GPIO_InitStruct.Pin = (GPIO_2_PIN);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIO_2_PORT, &GPIO_InitStruct);
+ gpio_lld_phy_gpio2_down();
+#endif
+}
+
+/* Set PHY GPIO_TX to '1' */
+void gpio_lld_phy_gpioTx_up(void) {
+ HAL_GPIO_WritePin(GPIO_TX_PORT, GPIO_TX_PIN, GPIO_PIN_SET);
+}
+
+/* Set PHY GPIO_TX to '0' */
+void gpio_lld_phy_gpioTx_down(void) {
+ HAL_GPIO_WritePin(GPIO_TX_PORT, GPIO_TX_PIN, GPIO_PIN_RESET);
+}
+
+/* Set PHY GPIO_HARD_FAULT to '1' */
+void gpio_lld_phy_gpioHardFault_up(void) {
+ HAL_GPIO_WritePin(GPIO_HARD_FAULT_PORT, GPIO_HARD_FAULT_PIN, GPIO_PIN_SET);
+}
+
+/* Set PHY GPIO_HARD_FAULT to '0' */
+void gpio_lld_phy_gpioHardFault_down(void) {
+ HAL_GPIO_WritePin(GPIO_HARD_FAULT_PORT, GPIO_HARD_FAULT_PIN, GPIO_PIN_RESET);
+}
+
+/* Set PHY GPIO_1 to '1' */
+void gpio_lld_phy_gpio1_up(void) {
+ HAL_GPIO_WritePin(GPIO_1_PORT, GPIO_1_PIN, GPIO_PIN_SET);
+}
+
+/* Set PHY GPIO_1 to '0' */
+void gpio_lld_phy_gpio1_down(void) {
+ HAL_GPIO_WritePin(GPIO_1_PORT, GPIO_1_PIN, GPIO_PIN_RESET);
+}
+
+/* Set PHY GPIO_2 to '1' */
+void gpio_lld_phy_gpio2_up(void) {
+ HAL_GPIO_WritePin(GPIO_2_PORT, GPIO_2_PIN, GPIO_PIN_SET);
+}
+
+/* Set PHY GPIO_2 to '0' */
+void gpio_lld_phy_gpio2_down(void) {
+ HAL_GPIO_WritePin(GPIO_2_PORT, GPIO_2_PIN, GPIO_PIN_RESET);
+}
+
+/* De-initialize GPIOs fused by PHY valid CLI */
+void gpio_lld_phy_deInit(void) {
+ HAL_GPIO_DeInit(GPIO_TX_PORT, GPIO_TX_PIN);
+ HAL_GPIO_DeInit(GPIO_HARD_FAULT_PORT, GPIO_HARD_FAULT_PIN);
+ HAL_GPIO_DeInit(GPIO_1_PORT, GPIO_1_PIN);
+ HAL_GPIO_DeInit(GPIO_2_PORT, GPIO_2_PIN);
+}
+
+/* Initialize GPIOs for MCO use */
+void gpio_lld_mco_init(uint32_t mcoSource, uint32_t mcoDiv) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+ //HAL_RCC_MCOConfig(RCC_MCO3, mcoSource, mcoDiv);
+ LL_RCC_ConfigMCO(mcoSource, mcoDiv);
+
+ /* Enable clock(s) for GPIOs */
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+#endif
+
+ // configure the GPIO PA15 in AF6 to be used as MCO
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF6_MCO;
+ GPIO_InitStruct.Pin = GPIO_MCO_PIN;
+ HAL_GPIO_Init(GPIO_MCO_PORT, &GPIO_InitStruct);
+}
+
+/* De-initialize GPIOs for external PA use */
+void gpio_lld_mco_deInit(void) {
+ HAL_GPIO_DeInit(GPIO_MCO_PORT, GPIO_MCO_PIN);
+ //HAL_RCC_MCOConfig(RCC_MCO3, RCC_MCO1SOURCE_NOCLOCK, RCC_MCODIV_1);
+ LL_RCC_ConfigMCO(RCC_MCO1SOURCE_NOCLOCK, RCC_MCODIV_1);
+}
+
+/* Initialize GPIOs for external PA use */
+void gpio_lld_extPa_init(void) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+ /* Enable clock(s) for GPIOs */
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+#endif
+
+ // configure the GPIO PB0 in AF6 to be used as RF_TX_MOD_EXT_PA
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF6_RF_DTB0;
+ GPIO_InitStruct.Pin = GPIO_EXT_PA_TX_PIN;
+ HAL_GPIO_Init(GPIO_EXT_PA_TX_PORT, &GPIO_InitStruct);
+
+ // configure the GPIO which will be managed by M0 stack to enable Ext PA
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Pin = GPIO_EXT_PA_EN_PIN;
+ HAL_GPIO_Init(GPIO_EXT_PA_EN_PORT, &GPIO_InitStruct);
+}
+
+/* De-initialize GPIOs for external PA use */
+void gpio_lld_extPa_deInit(void) {
+ HAL_GPIO_DeInit(GPIO_EXT_PA_TX_PORT, GPIO_EXT_PA_TX_PIN);
+ HAL_GPIO_DeInit(GPIO_EXT_PA_EN_PORT, GPIO_EXT_PA_EN_PIN);
+}
+
+#ifdef USE_SIMU
+/* Initialize GPIOs for master DORY of the SIMU */
+void gpio_lld_SimuMaster_init(void) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+ /* Enable clock(s) for GPIOs */
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+#endif
+
+ // In DORY master only : initialize GPIO port A pin 0, 1 and, 2 to send CRC result to simulator
+ GPIO_InitStruct.Pin = (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ // In DORY master only : initialize GPIO port B pin 8 and pin 9 to be used for debug purposes
+ GPIO_InitStruct.Pin = (GPIO_TX_PIN);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH ;
+ HAL_GPIO_Init(GPIO_TX_PORT, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = (GPIO_1_PIN);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH ;
+ HAL_GPIO_Init(GPIO_1_PORT, &GPIO_InitStruct);
+}
+
+/* Initialize GPIOs for slave DORY of the SIMU */
+void gpio_lld_SimuSlave_init(void) {
+// No GPIO to initialize in DORY slave
+}
+#endif
+
+/* Initialize GPIOs used by USART */
+void gpio_lld_usart_init(void) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+ /* Enable clock(s) for GPIOs used by USART */
+#if USE_NEW_SET_OF_GPIO_FOR_USART
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+#endif
+#else
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+#endif
+#endif
+
+ /* USART1 GPIO Configuration
+ USART1_TX : PB6
+ USART1_RX : PB7
+ */
+#if USE_NEW_SET_OF_GPIO_FOR_USART
+ GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+#else
+ 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_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+#endif
+}
+
+/* De-initialize GPIOs used by USART */
+void gpio_lld_usart_deInit(void) {
+ /* USART1 GPIO Configuration
+ USART1_TX : PB6
+ USART1_RX : PB7
+ */
+#if USE_NEW_SET_OF_GPIO_FOR_USART
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9);
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_10);
+#else
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6);
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7);
+#endif
+
+ /* Do not disable clocks as they could be used by others GPIOs and it seems to not need power in STOP mode */
+}
+
+/* Initialize GPIOs used by LPUART */
+void gpio_lld_lpuart_init(void) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+#ifdef STM32WB35xx
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+#endif
+#else
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOC_CLK_ENABLE();
+#endif
+#endif
+
+ /* LPUART1 GPIO Configuration
+ LPUART1_TX : PB5 on Little DORY or PC1 on DORY
+ LPUART1_RX : PA3 on Little DORY or PC0 on DORY
+ */
+#ifdef STM32WB35xx
+ GPIO_InitStruct.Pin = 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_5;
+ 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(GPIOB, &GPIO_InitStruct);
+#else
+ GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
+ 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(GPIOC, &GPIO_InitStruct);
+#endif
+}
+
+/* De-initialize GPIOs used by LPUART */
+void gpio_lld_lpuart_deInit(void) {
+ /* LPUART1 GPIO Configuration
+ LPUART1_TX : PB5 on Little DORY PC1 on DORY
+ LPUART1_RX : PA3 on Little DORY PC0 on DORY
+ */
+#ifdef STM32WB35xx
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_3);
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_5);
+#else
+ HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0 | GPIO_PIN_1);
+#endif
+ /* Do not disable clocks as they could be used by others GPIOs and it seems to not need power in STOP mode */
+}
+
+#if !defined (USE_SIMU) && !defined(USE_FPGA)
+/* Initialize GPIO PA2 (for debug use only) */
+void gpio_lld_pa2_init(uint8_t mode) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+ /* Enable clock(s) for GPIOs */
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+#endif
+
+ if (mode == 0) {
+ GPIO_InitStruct.Pin = GPIO_PIN_2;
+ 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);
+ }
+ if (mode == 1) {
+ GPIO_InitStruct.Pin = GPIO_PIN_2;
+ 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);
+ }
+ if (mode == 2) {
+ GPIO_InitStruct.Pin = GPIO_PIN_2;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF6_RF_DTB7;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+ }
+ if (mode == 3) {
+ GPIO_InitStruct.Pin = GPIO_PIN_2;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+ }
+ if (mode == 4) {
+ GPIO_InitStruct.Pin = GPIO_PIN_2;
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+ }
+ if (mode == 5) {
+ GPIO_InitStruct.Pin = GPIO_PIN_2;
+ GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+ }
+}
+
+/* De-initialize GPIO PA2 (for debug use only) */
+void gpio_lld_pa2_deInit(void) {
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2);
+}
+
+/*
+ * Initialize GPIOs needed by DTB mode chosen (for debug use only).
+ * Only DTB0 and DTB7 configurations are coded until now.
+ * Do not forget to program the RF SPI register addr 0x30 () with the DTB cfg and DTB enable.
+ */
+void gpio_lld_dtb_init(uint8_t dtbMode) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+ uint32_t usePA = 0, pinPA = 0;
+ uint32_t usePB = 0, pinPB = 0;
+ uint32_t usePC = 0, pinPC = 0;
+
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+
+ if (dtbMode == 0) {
+ GPIO_InitStruct.Alternate = GPIO_AF6_RF_DTB0;
+
+ usePA = 1;
+ pinPA = (GPIO_PIN_0 | GPIO_PIN_1| GPIO_PIN_2| GPIO_PIN_3| GPIO_PIN_4 |
+ GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9);
+
+ usePC = 1;
+ pinPC = (GPIO_PIN_14 | GPIO_PIN_15);
+ }
+
+ if (dtbMode == 7) {
+ GPIO_InitStruct.Alternate = GPIO_AF6_RF_DTB7;
+
+ usePA = 1;
+#ifdef STM32WB35xx
+ pinPA = (GPIO_PIN_8 | GPIO_PIN_9| GPIO_PIN_10| GPIO_PIN_11| GPIO_PIN_13| GPIO_PIN_14);
+#else
+ pinPA = (GPIO_PIN_8 | GPIO_PIN_9| GPIO_PIN_10| GPIO_PIN_11);
+#endif
+
+ usePB = 1;
+#ifdef STM32WB35xx
+ //pinPB = (GPIO_PIN_2 | GPIO_PIN_7 | GPIO_PIN_8| GPIO_PIN_10| GPIO_PIN_11);
+ // PB 7 is in conflict with USART
+ pinPB = (GPIO_PIN_2 | GPIO_PIN_8);
+#else
+ //pinPB = (GPIO_PIN_2 | GPIO_PIN_7 | GPIO_PIN_8| GPIO_PIN_10| GPIO_PIN_11);
+ // PB 7 is in conflict with USART
+ pinPB = (GPIO_PIN_2 | GPIO_PIN_8| GPIO_PIN_10| GPIO_PIN_11);
+#endif
+ }
+
+ if (usePA == 1) {
+#ifdef CORE_CM4
+ // Enable GPIO PA clock for M4 use
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+#else
+ // Enable GPIO PA clock for M0 use
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+#endif
+
+ GPIO_InitStruct.Pin = pinPA;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+ }
+
+ if (usePB == 1) {
+#ifdef CORE_CM4
+ // Enable GPIO PB clock for M4 use
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+#else
+ // Enable GPIO PB clock for M0 use
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+#endif
+
+ GPIO_InitStruct.Pin = pinPB;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+ }
+
+ if (usePC == 1) {
+#ifdef CORE_CM4
+ // Enable GPIO PC clock for M4 use
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+#else
+ // Enable GPIO PC clock for M0 use
+ __HAL_RCC_C2GPIOC_CLK_ENABLE();
+#endif
+
+ GPIO_InitStruct.Pin = pinPC;
+ HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+ }
+}
+
+void gpio_lld_dtb_deInit(void) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+#ifdef CORE_CM4
+ // Enable GPIO PB clock for M4 use
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+#else
+ // Enable GPIO PB clock for M0 use
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+#endif
+
+ // configure the GPIO to be set to '1' during frame TX
+ GPIO_InitStruct.Pin = (GPIO_PIN_8);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH ;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
+}
+#endif /* ! USE_SIMU and ! USE_FPGA */
+
+// Do not initialize LED GPIOs as they are already initialized by BSP if possible (depending on board and possible GPIOs conflicts).
+// So just offer the toggle possibility for debug purposes
+/* Toggle LED1 */
+void gpio_lld_led1_toggle(void) {
+ HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
+}
+
+/* Toggle LED2 */
+void gpio_lld_led2_toggle(void) {
+ HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
+}
+
+/* Toggle LED3 */
+void gpio_lld_led3_toggle(void) {
+ HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/hw_uart.c
new file mode 100644
index 000000000..8ea61633f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/hw_uart.c
@@ -0,0 +1,484 @@
+/**
+ ******************************************************************************
+ * 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"
+
+/* Macros --------------------------------------------------------------------*/
+#define HW_UART_RX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##RxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ hal_status = 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_status = 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)
+UART_HandleTypeDef huart1;
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+DMA_HandleTypeDef hdma_usart1_tx;
+#endif
+void (*HW_huart1RxCb)(void);
+void (*HW_huart1TxCb)(void);
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+UART_HandleTypeDef hlpuart1;
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+DMA_HandleTypeDef hdma_lpuart1_tx;
+#endif
+void (*HW_hlpuart1RxCb)(void);
+void (*HW_hlpuart1TxCb)(void);
+#endif
+
+/* Functions Definition ------------------------------------------------------*/
+#if (CFG_HW_LPUART1_ENABLED == 1)
+/**
+ * @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.OverSampling = UART_OVERSAMPLING_16;
+ 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();
+ }
+}
+
+void MX_LPUART1_UART_DeInit(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.OverSampling = UART_OVERSAMPLING_16;
+ 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_DeInit(&hlpuart1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+}
+#endif
+
+#if (CFG_HW_USART1_ENABLED == 1)
+/**
+ * @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_16;
+ huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ huart1.FifoMode = UART_FIFOMODE_DISABLE;
+ 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();
+ }
+}
+
+void MX_USART1_UART_DeInit(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_16;
+ huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ huart1.FifoMode = UART_FIFOMODE_DISABLE;
+ if (HAL_UART_DeInit(&huart1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+}
+#endif
+
+hw_status_t HW_UART_Receive_IT(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_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;
+ }
+
+ 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_IT(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_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;
+ }
+
+ 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(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;
+}
+
+#if 0
+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;
+}
+#endif
+
+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/LLD_BLE/LLD_BLE_Chat/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/main.c
new file mode 100644
index 000000000..1f61b6690
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/main.c
@@ -0,0 +1,605 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file main.c
+ * @author MCD Application Team
+ * @brief RF LLD tests application
+ *
+ @verbatim
+ ==============================================================================
+ ##### IMPORTANT NOTE #####
+ ==============================================================================
+
+ This application requests having a M0 LLD tests 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 "app_common.h"
+#include "app_entry.h"
+#include "main.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 ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+TIM_HandleTypeDef htim2;
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+static void MX_DMA_Init(void);
+static void MX_TIM2_Init(void);
+
+/* USER CODE BEGIN PFP */
+static void SystemClock_Config(void);
+static 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 on HSE without using PLL and the periph clock needed by this application */
+ SystemClock_Config();
+
+ /* USER CODE BEGIN SysInit */
+ PeriphClock_Config();
+ Init_Exti();
+
+ /* USER CODE END SysInit */
+
+ /* Initialize all configured peripherals */
+ MX_DMA_Init();
+ MX_TIM2_Init();
+ /* USER CODE BEGIN 2 */
+ if (HAL_TIM_Base_Start(&htim2) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* 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 END WHILE */
+ }
+ /* USER CODE BEGIN 3 */
+
+ /* USER CODE END 3 */
+}
+
+/**
+ * @brief System Clock Configuration : API to be called to use HSE (with or without PLL use) as 32Mhz system clock.
+ SystemClock_Config_HSE() must be called once just after boot (to go from default MSI to HSE).
+ Then application user can call both SystemClock_Config_HSE() and SystemClock_Config_MSI() at any time.
+ * @retval None
+ */
+void SystemClock_Config_HSE(uint32_t usePLL)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+
+ /* First, just set MSI ON (with the 32Mhz range) in case it was OFF, without any update on PLL */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
+ RCC_OscInitStruct.MSIState = RCC_MSI_ON;
+ RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_10;
+ RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+ /* Select MSI as system clock in order to be able to update HSE and PLL configuration */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+
+ /* Configure HSE and PLL if needed*/
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
+ if (usePLL == 1)
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+ else
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_OFF;
+ RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV2;
+ RCC_OscInitStruct.PLL.PLLN = 8;
+ RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
+ RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV4;
+ RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV4;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ /* Configure the system clock source and the dividers according to the fact that system clock source is 32Mhz */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4 | RCC_CLOCKTYPE_HCLK2 | RCC_CLOCKTYPE_HCLK |
+ RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
+ if (usePLL == 1)
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+ else
+ 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();
+ }
+
+ // Note that function UTILS_SetFlashLatency() could be used to set the correct Flash latency
+ // (with 32Mhz, 2WS are needed if the range is changed to 1V instead of 1.2V)
+
+ /* Disable MSI Oscillator as the MSI is no more needed by the application */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
+ RCC_OscInitStruct.MSIState = RCC_MSI_OFF;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; /* No update on PLL */
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+}
+
+/**
+ * @brief System Clock Configuration : API to be called to use MSI (with or without PLL use) as 32Mhz system clock.
+ SystemClock_Config_HSE() must be called once just after boot (to go from default MSI to HSE).
+ Then application user can call both SystemClock_Config_HSE() and SystemClock_Config_MSI() at any time.
+ * @retval None
+ */
+void SystemClock_Config_MSI(uint32_t usePLL)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+
+ /* First, just set HSE ON (with the 32Mhz range) in case it was OFF, without any update on PLL */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+ /* Select HSE as system clock in order to be able to update MSI and PLL configuration */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+
+ /* Configure MSI and PLL if needed*/
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
+ RCC_OscInitStruct.MSIState = RCC_MSI_ON;
+ RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_10;
+ RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
+ if (usePLL == 1)
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+ else
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_OFF;
+ RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV2;
+ RCC_OscInitStruct.PLL.PLLN = 8;
+ RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
+ RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV4;
+ RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV4;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+
+ /* Configure the system clock source and the dividers according to the fact that system clock source is 32Mhz */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4 | RCC_CLOCKTYPE_HCLK2 | RCC_CLOCKTYPE_HCLK |
+ RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
+ if (usePLL == 1)
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+ else
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
+ 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();
+ }
+
+/* HSE cannot be stopped while using RF */
+#if 0
+ /* Disable HSE Oscillator as the HSE is no more needed by the application */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_OFF;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; /* No update on PLL */
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+#endif
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief System Clock Configuration : must be called during application start-up
+ * @retval None
+ */
+static void SystemClock_Config(void)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {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);
+
+ /* Assuming that MSI is enabled by default after boot, lets go to HSE without using PLL */
+ SystemClock_Config_HSE(0);
+
+ /* Configure Others clock */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSI48 |
+ RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI2;
+ RCC_OscInitStruct.LSEState = RCC_LSE_ON;
+ RCC_OscInitStruct.HSIState = RCC_HSI_OFF;
+ RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.LSIState = RCC_LSI_OFF;
+ RCC_OscInitStruct.LSI2CalibrationValue = 0;
+ RCC_OscInitStruct.HSI48State = RCC_HSI48_OFF;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+}
+
+/**
+ * Enable DMA controller clock
+ */
+static void MX_DMA_Init(void)
+{
+ /* DMA controller clock enable */
+ __HAL_RCC_DMAMUX1_CLK_ENABLE();
+ __HAL_RCC_DMA1_CLK_ENABLE();
+#ifdef STM32WB35xx
+ __HAL_RCC_DMA2_CLK_ENABLE();
+#endif
+
+ /* DMA interrupt init */
+#ifdef STM32WB35xx
+ /* DMA1_Channel4_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);
+ /* DMA2_Channel4_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA2_Channel4_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA2_Channel4_IRQn);
+#else
+ /* 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);
+#endif
+}
+
+static void PeriphClock_Config(void)
+{
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+
+#if USE_SMPS_ENABLED_BY_DEFAULT
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS | RCC_PERIPHCLK_RFWAKEUP | RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_LPUART1;
+ PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
+ PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
+ PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
+ PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE;
+ PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE1;
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ /* Initialize SMPS here like in BLE applis */
+ LL_PWR_SMPS_SetStartupCurrent(LL_PWR_SMPS_STARTUP_CURRENT_80MA);
+ LL_PWR_SMPS_SetOutputVoltageLevel(LL_PWR_SMPS_OUTPUT_VOLTAGE_1V40);
+ LL_PWR_SMPS_Enable();
+#else
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RFWAKEUP | RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_LPUART1;
+ PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
+ PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
+ PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+#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;
+}
+
+
+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 LPUART(25), IPCC(36), HSEM(38) */
+ LL_EXTI_DisableIT_0_31( (~0) & (~(LL_EXTI_LINE_25)) );
+ LL_EXTI_DisableIT_32_63( (~0) & (~(LL_EXTI_LINE_36 | LL_EXTI_LINE_38)) );
+
+ return;
+}
+
+/**
+ * @brief TIM2 Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_TIM2_Init(void)
+{
+
+ /* USER CODE BEGIN TIM2_Init 0 */
+
+ /* USER CODE END TIM2_Init 0 */
+
+ TIM_ClockConfigTypeDef sClockSourceConfig = {0};
+ TIM_MasterConfigTypeDef sMasterConfig = {0};
+
+ /* USER CODE BEGIN TIM2_Init 1 */
+
+ /* USER CODE END TIM2_Init 1 */
+ htim2.Instance = TIM2;
+ htim2.Init.Prescaler = PRESCALER_VALUE;
+ htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
+ htim2.Init.Period = PERIOD_VALUE;
+ htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
+ htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
+ if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
+ if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
+ sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
+ if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN TIM2_Init 2 */
+
+ /* USER CODE END TIM2_Init 2 */
+
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+/**
+ * @brief Declare here empty functions to over-write the default one as it declared as WEAK in HAL.
+ * This is the way to avoid systick use which is initialized by default in HAL_Init() and suspended or resumed in LPM.
+ *
+ * @param None
+ */
+HAL_StatusTypeDef HAL_InitTick( uint32_t TickPriority )
+{
+ return (HAL_OK);
+}
+
+void HAL_SuspendTick(void)
+{
+}
+
+void HAL_ResumeTick(void)
+{
+}
+
+/**
+ * @brief This function is executed in case of error occurrence.
+ * @retval None
+ */
+void Error_Handler(void)
+{
+ BSP_LED_On(LED_BLUE);
+ /* USER CODE BEGIN Error_Handler */
+ /* User can add his own implementation to report the HAL error return state */
+ /* USER CODE END Error_Handler */
+}
+
+#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 assert_failed */
+ /* 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 assert_failed */
+}
+#endif /* USE_FULL_ASSERT */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/stm32_lpm_if.c
new file mode 100644
index 000000000..d73fbdbfc
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/stm32_lpm_if.c
@@ -0,0 +1,288 @@
+ /*******************************************************************************
+ * @file stm32_lpm_if.c
+ * @author MCD Application Team
+ * @brief 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
+ *
+ ******************************************************************************
+ */
+
+/* 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 -----------------------------------------------*/
+/* USER CODE BEGIN Private_Function_Prototypes */
+static void Switch_On_HSI( void );
+
+/* 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 */
+
+/**
+ * @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
+ * @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 ) );
+// CCO : Taken from MAC project already validated in low-power
+// if(LL_RCC_GetSysClkSource( ) == LL_RCC_SYS_CLKSOURCE_STATUS_HSI)
+ if(LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSE)
+ {
+ 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 */
+}
+
+/* USER CODE BEGIN Private_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 END Private_Functions */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/stm32wbxx_hal_msp.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/stm32wbxx_hal_msp.c
new file mode 100644
index 000000000..e3d6cdb29
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/stm32wbxx_hal_msp.c
@@ -0,0 +1,289 @@
+/**
+ ******************************************************************************
+ * @file stm32wbxx_hal_msp.c
+ * @author MCD Application Team
+ * @brief This file contains the HAL System and Peripheral (UARTs) MSP initialization
+ * and de-initialization functions.
+ ******************************************************************************
+ * @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 "stm32wbxx_hal.h"
+#include "app_common.h"
+#include "gpio_lld.h"
+
+/** @addtogroup STM32WBxx_HAL_Driver
+ * @{
+ */
+
+/** @defgroup HAL_MSP HAL MSP
+ * @brief HAL MSP module.
+ * @{
+ */
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+/** @defgroup HAL_MSP_Private_Functions HAL MSP Private Functions
+ * @{
+ */
+
+/**
+ * @brief Initializes the Global MSP.
+ * @note This function is called from HAL_Init() function to perform system
+ * level initialization (GPIOs, clock, DMA, interrupt).
+ * @retval None
+ */
+void HAL_MspInit(void)
+{
+
+}
+
+/**
+ * @brief DeInitializes the Global MSP.
+ * @note This functiona is called from HAL_DeInit() function to perform system
+ * level de-initialization (GPIOs, clock, DMA, interrupt).
+ * @retval None
+ */
+void HAL_MspDeInit(void)
+{
+
+}
+
+/**
+ * @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)
+{
+ HAL_DMA_MuxSyncConfigTypeDef pSyncConfig;
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ if(huart->Instance == LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspInit 0 */
+
+ /* USER CODE END LPUART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_LPUART1_CLK_ENABLE();
+
+ /* GPIOs configuration */
+ gpio_lld_lpuart_init();
+
+ /* LPUART1 DMA Init */
+ /* LPUART1_TX Init */
+#ifdef STM32WB35xx
+ hdma_lpuart1_tx.Instance = DMA1_Channel4;
+#else
+ hdma_lpuart1_tx.Instance = DMA1_Channel1;
+#endif
+ 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 */
+ }
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+ if(huart->Instance == USART1)
+ {
+ /* USER CODE BEGIN USART1_MspInit 0 */
+
+ /* USER CODE END USART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_USART1_CLK_ENABLE();
+
+ /* GPIOs configuration */
+ gpio_lld_usart_init();
+
+ /* USART1 DMA Init */
+ /* USART1_TX Init */
+#ifdef STM32WB35xx
+ hdma_usart1_tx.Instance = DMA2_Channel4;
+#else
+ hdma_usart1_tx.Instance = DMA1_Channel2;
+#endif
+ 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 */
+ }
+#endif
+}
+
+/**
+ * @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 (CFG_HW_LPUART1_ENABLED == 1)
+ if(huart->Instance == LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspDeInit 0 */
+
+ /* USER CODE END LPUART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_LPUART1_CLK_DISABLE();
+
+ /* De-init GPIOs */
+ gpio_lld_lpuart_deInit();
+
+ /* 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 */
+ }
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+ if(huart->Instance == USART1)
+ {
+ /* USER CODE BEGIN USART1_MspDeInit 0 */
+
+ /* USER CODE END USART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_USART1_CLK_DISABLE();
+
+ /* De-init GPIOs */
+ gpio_lld_usart_deInit();
+
+ /* 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 */
+ }
+#endif
+}
+
+/**
+ * @}
+ */
+/**
+* @brief TIM_Base MSP Initialization
+* This function configures the hardware resources used in this example
+* @param htim_base: TIM_Base handle pointer
+* @retval None
+*/
+void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
+{
+ if(htim_base->Instance==TIM2)
+ {
+ /* USER CODE BEGIN TIM2_MspInit 0 */
+
+ /* USER CODE END TIM2_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_TIM2_CLK_ENABLE();
+ /* TIM2 interrupt Init */
+ HAL_NVIC_SetPriority(TIM2_IRQn, 3, 0);
+ HAL_NVIC_EnableIRQ(TIM2_IRQn);
+ /* USER CODE BEGIN TIM2_MspInit 1 */
+
+ /* USER CODE END TIM2_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief TIM_Base MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param htim_base: TIM_Base handle pointer
+* @retval None
+*/
+void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base)
+{
+ if(htim_base->Instance==TIM2)
+ {
+ /* USER CODE BEGIN TIM2_MspDeInit 0 */
+
+ /* USER CODE END TIM2_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_TIM2_CLK_DISABLE();
+
+ /* TIM2 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(TIM2_IRQn);
+ /* USER CODE BEGIN TIM2_MspDeInit 1 */
+
+ /* USER CODE END TIM2_MspDeInit 1 */
+ }
+
+}
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/stm32wbxx_it.c
new file mode 100644
index 000000000..74159c52a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/stm32wbxx_it.c
@@ -0,0 +1,377 @@
+/* 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 "app_common.h"
+#include "stm32wbxx_it.h"
+#include "gpio_lld.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 --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+extern TIM_HandleTypeDef htim2;
+
+/* 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 */
+ gpio_lld_phy_gpioHardFault_up();
+
+ /* 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 */
+#if 0 /* no systick used */
+ HAL_IncTick();
+#endif
+ /* 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). */
+/******************************************************************************/
+
+#ifdef STM32WB35xx
+/**
+ * @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 */
+#if (CFG_HW_LPUART1_ENABLED == 1)
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ HAL_DMA_IRQHandler(&hdma_lpuart1_tx);
+#endif
+#endif
+ /* USER CODE BEGIN DMA1_Channel4_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel4_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 */
+#if (CFG_HW_USART1_ENABLED == 1)
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ HAL_DMA_IRQHandler(&hdma_usart1_tx);
+#endif
+#endif
+ /* USER CODE BEGIN DMA2_Channel4_IRQn 1 */
+
+ /* USER CODE END DMA2_Channel4_IRQn 1 */
+}
+
+#else
+/**
+ * @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 */
+#if (CFG_HW_LPUART1_ENABLED == 1)
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ HAL_DMA_IRQHandler(&hdma_lpuart1_tx);
+#endif
+#endif
+ /* 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 */
+#if (CFG_HW_USART1_ENABLED == 1)
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ HAL_DMA_IRQHandler(&hdma_usart1_tx);
+#endif
+#endif
+ /* USER CODE BEGIN DMA1_Channel2_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel2_IRQn 1 */
+}
+#endif
+
+/**
+ * @brief This function handles USART1 global interrupt.
+ */
+void USART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN USART1_IRQn 0 */
+
+ /* USER CODE END USART1_IRQn 0 */
+#if (CFG_HW_USART1_ENABLED == 1)
+ HAL_UART_IRQHandler(&huart1);
+#endif
+ /* 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 */
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ HAL_UART_IRQHandler(&hlpuart1);
+#endif
+ /* USER CODE BEGIN LPUART1_IRQn 1 */
+
+ /* USER CODE END LPUART1_IRQn 1 */
+}
+
+/* USER CODE BEGIN 1 */
+#if 1 /* Not needed for LLD tests : removed to use less power */
+/**
+ * @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 TIM2_IRQHandler(void)
+{
+ HAL_TIM_IRQHandler(&htim2);
+}
+#endif
+
+
+#if 0 /* Not needed for LLD tests : removed to use less power */
+void RTC_WKUP_IRQHandler(void)
+{
+ HW_TS_RTC_Wakeup_Handler();
+}
+#endif /* Not needed for LLD tests : removed to use less power */
+
+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/LLD_BLE/LLD_BLE_Chat/Core/Src/stm_logging.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/stm_logging.c
new file mode 100644
index 000000000..8c76e703c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/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/LLD_BLE/LLD_BLE_Chat/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/system_stm32wbxx.c
new file mode 100644
index 000000000..2e42904ec
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/Core/Src/system_stm32wbxx.c
@@ -0,0 +1,357 @@
+/**
+ ******************************************************************************
+ * @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 */
+
+#if defined(STM32WB55xx) || defined(STM32WB35xx)
+ 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}};
+#endif
+
+/**
+ * @}
+ */
+
+/** @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;
+
+#if defined(STM32WB55xx)
+ /* Reset PLLSAI1CFGR register */
+ RCC->PLLSAI1CFGR = 0x22041000U;
+#endif
+
+ /* 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/LLD_BLE/LLD_BLE_Chat/EWARM/LLD_BLE_Chat.ewd b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/EWARM/LLD_BLE_Chat.ewd
new file mode 100644
index 000000000..d05bbd13b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/EWARM/LLD_BLE_Chat.ewd
@@ -0,0 +1,1419 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>LLD_BLE</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>1</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>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.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>1</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>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></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>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></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>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></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>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></state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNoSelect</name>
+ <state>1</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>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/LLD_BLE/LLD_BLE_Chat/EWARM/LLD_BLE_Chat.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/EWARM/LLD_BLE_Chat.ewp
new file mode 100644
index 000000000..18c28da63
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/EWARM/LLD_BLE_Chat.ewp
@@ -0,0 +1,1214 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>LLD_BLE</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>LLD_BLE/Exe</state>
+ </option>
+ <option>
+ <name>ObjPath</name>
+ <state>LLD_BLE/Obj</state>
+ </option>
+ <option>
+ <name>ListPath</name>
+ <state>LLD_BLE/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>CORE_CM4</state>
+ <state>USE_HAL_DRIVER</state>
+ <state>STM32WB55xx</state>
+ <state>USE_STM32WBXX_NUCLEO</state>
+ <state>LLD_BLE_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$/../STM32_WPAN/Target</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>
+ <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>
+ </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>LLD_BLE_Chat.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>LLD_BLE_Chat.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\app_lld_ble_iar_asm.s</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\gpio_lld.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_lld_ble.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\lld_ble.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>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.Nucleo\stm32wbxx_nucleo.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_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\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\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\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/LLD_BLE/LLD_BLE_Chat/EWARM/LLD_BLE_Chat.eww b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/EWARM/LLD_BLE_Chat.eww
new file mode 100644
index 000000000..444125301
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/EWARM/LLD_BLE_Chat.eww
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workspace>
+ <project>
+ <path>$WS_DIR$\LLD_BLE_Chat.ewp</path>
+ </project>
+ <batchBuild />
+</workspace>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/EWARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..1f886ff59
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/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/LLD_BLE/LLD_BLE_Chat/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/EWARM/stm32wb55xx_flash_cm4.icf
new file mode 100644
index 000000000..383e53fef
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/EWARM/stm32wb55xx_flash_cm4.icf
@@ -0,0 +1,41 @@
+/*###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/LLD_BLE/LLD_BLE_Chat/STM32_WPAN/App/app_lld_ble.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/STM32_WPAN/App/app_lld_ble.c
new file mode 100644
index 000000000..d0096520b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/STM32_WPAN/App/app_lld_ble.c
@@ -0,0 +1,1757 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_lld_ble.c
+ * Description : CHAT LLD 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 "app_common.h"
+#include "utilities_common.h"
+#include "app_entry.h"
+#include "dbg_trace.h"
+#include "lld_ble.h"
+#include "app_lld_ble.h"
+#include "tl.h"
+#include "shci.h"
+#include "stm_logging.h"
+#include "stm32_lpm.h"
+#include "stm32_seq.h"
+#include "gpio_lld.h"
+
+/* Private includes -----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+typedef enum
+{
+ CMD_FROM_M0_STOP0_ON = 0,
+ CMD_FROM_M0_STOP1_ON = 1,
+ CMD_FROM_M0_STOP2_ON = 2,
+ CMD_FROM_M0_STOP_OFF = 3,
+ CMD_FROM_M0_GO_IN_WFI = 4,
+ CMD_FROM_M0_GO_DIRECTLY_IN_WFI = 5,
+ CMD_FROM_M0_USE_MSI = 6,
+ CMD_FROM_M0_USE_MSI_PLL = 7,
+ CMD_FROM_M0_USE_HSE = 8,
+ CMD_FROM_M0_USE_HSE_PLL = 9,
+ CMD_FROM_M0_EXT_PA_EN = 10,
+ CMD_FROM_M0_EXT_PA_DIS = 11,
+ CMD_FROM_M0_RADIO_STOP = 12,
+ CMD_FROM_M0_RADIO_END = 13,
+ CMD_FROM_M0_RADIO_RXACK = 14,
+ CMD_FROM_M0_RADIO_RXOK = 15,
+ CMD_FROM_M0_RADIO_RXACKEND = 16,
+ CMD_FROM_M0_RADIO_RXOKEND = 17,
+} cmdFromM0_t;
+
+enum
+{
+ CHAR_CTRLC = 3,
+ CHAR_ESC = 27,
+ CHAR_DEL = 127
+};
+
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private defines -----------------------------------------------------------*/
+#define RX_BUFFER_SIZE 258
+#define CMD_HISTORY_LENGTH 10
+#define CLI_BUFFER_SIZE 30
+#define TX_BUFFER_SIZE 268
+#define CMD_BUFFER_SIZE 8
+
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macros ------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private function prototypes -----------------------------------------------*/
+static void CheckWirelessFirmwareInfo(void);
+static void LldBleTraceError(const char * pMess, uint32_t ErrCode);
+
+static void SendM0CmdAckToM0(void);
+static void SendCmdToM0(void);
+static void SendRspAckToM0(void);
+
+static void uartRxCpltCallback(void);
+static void uartRxItProcess(void);
+static void uartRxBufferProcessMode(uint8_t uartRxCmdEnable);
+static void uartRxBufferProcess(void);
+static void uartClearChars(int nbChar);
+
+static void uartTxBufferAdd(const char * str);
+static void uartTxItProcess(void);
+static void uartTxCpltCallback(void);
+
+static void m0RadioProcess(void);
+static void m0CmdProcess(void);
+static void m0CmdStopRequired(uint32_t stopRequired);
+static void m4ConfigBeforeStop(void);
+static void m4ConfigAfterStop(void);
+
+static void Appli_ProcessMode(void);
+static void Appli_RegTask(void);
+static void Appli_Init(void);
+static void Appli_uartRxBufferPrint(void);
+
+void Appli_m0RadioProcess_RadioStop(void);
+void Appli_m0RadioProcess_RadioEnd(void);
+void Appli_m0RadioProcess_RxAck(void);
+void Appli_m0RadioProcess_RxOk(void);
+void Appli_m0RadioProcess_RxAckEnd(void);
+void Appli_m0RadioProcess_RxOkEnd(void);
+
+void Appli_m0CmdProcess_RadioStop(void);
+void Appli_m0CmdProcess_RadioEnd(void);
+void Appli_m0CmdProcess_RxAck(void);
+void Appli_m0CmdProcess_RxOk(void);
+void Appli_m0CmdProcess_RxAckEnd(void);
+void Appli_m0CmdProcess_RxOkEnd(void);
+
+/* USER CODE BEGIN PFP */
+void CHAT_BLE_Init(void);
+void CHAT_Encrypt(void);
+void CHAT_UnEncrypt(void);
+void CHAT_ToggleEncrypt(void);
+void CHAT_ListenPacket(void);
+void CHAT_SendPacket(void);
+void CHAT_StopRadio(void);
+void CHAT_StartTone(void);
+void CHAT_StopTone(void);
+/* USER CODE END PFP */
+
+/* debug function prototypes */
+uint32_t Debug_Start_timer(void);
+uint32_t Debug_Stop_timer(void);
+
+/* Private variables -----------------------------------------------*/
+static cmdFromM0_t m0Cmd = CMD_FROM_M0_STOP_OFF;
+
+static uint8_t txBusy;
+static uint8_t rxCmdAllowed = 0;
+static uint8_t txBuffer_Tab[TX_BUFFER_SIZE];
+static uint32_t txBuffer_wrPtr;
+static uint32_t txBuffer_rdPtr;
+static uint8_t *pTxBuff_currentWr;
+static uint8_t rxBuffer_Tab[RX_BUFFER_SIZE];
+static uint32_t rxBuffer_wrPtr;
+static uint32_t rxBuffer_rdPtr;
+static uint8_t currentCommand[CMD_BUFFER_SIZE];
+static uint32_t currentCommandPos;
+static uint8_t commandHistory[CMD_HISTORY_LENGTH][RX_BUFFER_SIZE];
+static int commandHistoryIdx;
+static int commandHistoryIdxSav;
+static uint32_t txtCommandPos;
+static uint8_t txtCommand[TX_BUFFER_SIZE];
+static char cliPrompt[CLI_BUFFER_SIZE] = "Unknown M0 appli > ";
+static uint8_t uartRxCmd = 0;
+static uint32_t delayBeforeSleepOnM4 = 100000;
+static uint8_t uartLastChar;
+static uint8_t uartPayload[RX_BUFFER_SIZE];
+
+/* used with lld_ble */
+extern uint8_t *txBuffer_Ptr;
+uint8_t *rxBuffer_Ptr[8];
+uint32_t *rxStatus_Ptr[8];
+uint32_t *rxTimeStamp_Ptr[8];
+int *rxRSSI_Ptr[8];
+
+PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static TL_LLD_BLE_Config_t LldBleConfigBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t LldBleM0CmdPacket;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t LldBleCmdRspPacket;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t currentCommand[CMD_BUFFER_SIZE];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) param_hal_BLE_t bleparam_hal_BLE_Packet;
+
+/* debug */
+#define LLD_BLE_DEBUG
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint32_t debug_timer[4];
+uint32_t start_timer;
+uint32_t stop_timer;
+extern TIM_HandleTypeDef htim2;
+
+/* USER CODE BEGIN PV */
+/* Parameters */
+uint8_t init_done =0;
+static char chatPrompt[258] = "Unknown Text received > ";
+uint32_t chatID = 0xB55A54AA ; //0x8E89BED6
+uint8_t chatChannel = 12;
+uint32_t chatWakeup = 1876;
+uint32_t chatReceive = 29876;
+uint32_t chatReceiveAck = 576;
+
+/* data buffer Tab to send TX */
+uint8_t chattxBufferTab[258] ={0x80,0x08,0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73};
+uint8_t* chattxBuffer = chattxBufferTab;
+
+/* data buffer ACK Tab to send TX ACK after RX */
+uint8_t chatAcktxBufferTab[258] ={0x60,0x0A,0x4a,0x75,0x6c,0x69,0x65,0x6e,0x2b,0x4d,0x61,0x72};
+uint8_t* chatAcktxBuffer = chatAcktxBufferTab;
+
+/* data buffer Tab to receive RX (Not empty)*/
+uint8_t chatrxBufferTab[258]={0x0A,0x0C,0xAB,0xBA,0x67,0x76,0x55,0x55,0x4E,0xE4,0x9B,0xB9,0xAB,0xBA};
+uint8_t* chatrxBuffer = chatrxBufferTab;
+
+/* data buffer ACK Tab to receive RX ACK after TX */
+uint8_t chatAckrxBufferTab[258]={0x0A,0x0C,0x3E,0xE3,0x28,0x82,0x64,0x46,0xC1,0x1C,0x78,0x87,0xDC,0xCD};
+uint8_t* chatAckrxBuffer= chatAckrxBufferTab;
+
+/* Routines */
+/* dataRoutine enum for LL and HAL dataRoutine() */
+dataCase_t dataRoutineDone_hal_BLE = dataCase_Custom0;
+dataCase_t dataRoutineTx_hal_BLE = dataCase_Custom1;
+dataCase_t dataRoutineRx_hal_BLE = dataCase_Custom2;
+dataCase_t dataRoutineStop_hal_BLE = dataCase_Custom3;
+
+/* dataRoutine enum for LL dataRoutine() */
+dataCase_t dataRoutine_LL_TxAck = dataCase_Custom4;
+dataCase_t dataRoutine_LL_RxAck = dataCase_Custom5;
+dataCase_t dataRoutine_Action = dataCase_Custom6;
+
+/* dataRoutine enum for HAL dataRoutine() */
+dataCase_t dataRoutine_HAL_Tx = dataCase_Custom4;
+dataCase_t dataRoutine_HAL_TxAck = dataCase_Custom5;
+dataCase_t dataRoutine_HAL_Rx = dataCase_Custom6;
+dataCase_t dataRoutine_HAL_RxAck = dataCase_Custom7;
+
+/* Routines options */
+uint32_t chatPacketNumberTx = 5; // NB of Successif PACKET using HAL Send
+uint32_t chatPacketNumberRx = 10; // NB of Successif PACKET using HAL Receive
+uint8_t chatPacketStopRx = 1; // Stop after RX
+
+/* Encryption */
+uint8_t chatcount_tx[5] = {0x00,0x00,0xAF,0x00,0x08};
+uint8_t chatcount_rcv[5] = {0x00,0x00,0xAF,0x00,0x08};
+uint8_t chatenc_key[16] = {0xBF,0x01,0xFB,0x9D,0x4E,0xF3,0xBC,0x36,0xD8,0x74,0xF5,0x39,0x41,0x38,0x68,0x56};
+uint8_t chatenc_iv[8] = {0x00,0x00,0xAF,0x00,0x08,0x00,0x00,0x00};
+uint8_t chatEncrypt = 0;
+
+/* Hot config */
+uint32_t LLD_BLE_hot_ana_config_table[BLE_HOT_ANA_CONFIG_TABLE_LENGTH/4];
+
+/* Variable used with m0RadioProcess/m0CmdProcess */
+static uint8_t radioPacketNb=0;
+static uint8_t radioLength=0;
+/* USER CODE END PV */
+
+/* Functions Definition ------------------------------------------------------*/
+void APP_LLD_BLE_Init( void )
+{
+ uint32_t devId = HAL_GetDEVID();
+ uint32_t revId = HAL_GetREVID();
+ uint8_t param[8];
+ char traceBuff[50];
+
+ SHCI_CmdStatus_t LldTestsInitStatus;
+
+ /* Check the compatibility with the Coprocessor Wireless Firmware loaded */
+ CheckWirelessFirmwareInfo();
+
+ /**
+ * Do not allow standby in the application
+ */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP_LLD_BLE, UTIL_LPM_DISABLE);
+
+ /* No need to activate the System low power mode as it is managed by the low-power test itself */
+ UTIL_LPM_SetStopMode(1 << CFG_LPM_APP_LLD_BLE, UTIL_LPM_DISABLE );
+
+ /* Init config buffer and call TL_LLD_BLE_Init */
+ APP_LLD_BLE_Init_TL();
+
+ /* Create a task to send CLI commands to M0 via IPCC */
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_SEND_TO_M0, UTIL_SEQ_RFU, SendCmdToM0);
+
+ /* Create a task to process data received from UART and create CLI commands */
+ Appli_ProcessMode();
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_PROCESS_UART_RX_BUFFER, UTIL_SEQ_RFU, uartRxBufferProcess);
+
+ /* Create tasks to process interrupt from/to UART to avoid locking UART during IT processing */
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_PROCESS_UART_RX_IT, UTIL_SEQ_RFU, uartRxItProcess);
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_PROCESS_UART_TX_IT, UTIL_SEQ_RFU, uartTxItProcess);
+
+ /* Create a task to manage commands from M0 */
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_CMD_FROM_M0_TO_M4, UTIL_SEQ_RFU, m0CmdProcess);
+
+ /* Create Task for Appli */
+ Appli_RegTask();
+
+ /* Configure UART for receiving CLI command from PC and sending CLI response or notifications to PC */
+ txBusy = 0;
+ rxCmdAllowed = 0;
+ txBuffer_Tab[TX_BUFFER_SIZE-1] = 0;
+ txBuffer_wrPtr = 0;
+ txBuffer_rdPtr = 0;
+ rxBuffer_wrPtr = 0;
+ rxBuffer_rdPtr = 0;
+ currentCommandPos = 0;
+ commandHistoryIdx = 0;
+ commandHistoryIdxSav = 0;
+ APP_LLD_BLE_Init_UART_CLI();
+
+ /* Send LLD tests CLI start information to CLI UART */
+ uartTxBufferAdd("\r\n\n================================\r\n");
+#ifdef STM32WB35xx
+ sprintf(traceBuff, "= Little DORY");
+#else
+ sprintf(traceBuff, "= DORY");
+#endif
+ sprintf(traceBuff, "%s RF LLD BLE \r\n", traceBuff );
+ uartTxBufferAdd(traceBuff);
+ uartTxBufferAdd("================================\r\n");
+#if (CFG_FULL_LOW_POWER == 1U)
+ uartTxBufferAdd("Low-power mode is activated\r\n");
+#endif
+#if (CFG_DEBUGGER_SUPPORTED == 0U)
+ uartTxBufferAdd("Debugger de-activated\r\n");
+#endif
+#if (( CFG_DEBUG_TRACE_FULL == 0 ) && ( CFG_DEBUG_TRACE_LIGHT == 0 ))
+ uartTxBufferAdd("Trace is de-activated\r\n");
+#endif
+
+#if 0
+ APP_DBG("EXTI status");
+ sprintf(traceBuff, " IMR1 0x%08X IMR2 0x%08X", EXTI->IMR1, EXTI->IMR2);
+ APP_DBG(traceBuff);
+ sprintf(traceBuff, " EMR1 0x%08X EMR2 0x%08X", EXTI->EMR1, EXTI->EMR2);
+ APP_DBG(traceBuff);
+ sprintf(traceBuff, "C2IMR1 0x%08X C2IMR2 0x%08X", EXTI->C2IMR1, EXTI->C2IMR2);
+ APP_DBG(traceBuff);
+ sprintf(traceBuff, "C2EMR1 0x%08X C2EMR2 0x%08X", EXTI->C2EMR1, EXTI->C2EMR2);
+ APP_DBG(traceBuff);
+#endif
+
+#if 0
+ // Read the RCC_CR register
+ APP_DBG( "RCC_CR (0x%08X) = 0x%08X", (uint32_t)&(RCC->CR), RCC->CR);
+ // RCC CFGR register
+ APP_DBG( "RCC_CFGR (0x%08X) = 0x%08X", (uint32_t)&(RCC->CFGR), RCC->CFGR);
+ // PLL_CFG register
+ APP_DBG( "RCC_PLLCFGR (0x%08X) = 0x%08X", (uint32_t)&(RCC->PLLCFGR), RCC->PLLCFGR);
+#endif
+
+ /* Indicate end of M4 initialization */
+ APP_DBG("Test appli initialized on M4, wait for M0 initialization");
+
+ /* Send CLI start cmd to M0 (with device and revision ID as parameters */
+ memcpy(&param[0], &devId, 4 );
+ memcpy(&param[4], &revId, 4 );
+ LldTestsInitStatus = SHCI_C2_LLD_BLE_Init(8, param);
+ if(LldTestsInitStatus != SHCI_Success)
+ APP_DBG((char *)"!! ERROR during M0 init !!");
+
+ /* M0 init done, send first command to have M0 code info and thus, a first prompt will be printed automatically */
+ /* Do not accept new command from UART until this one is managed */
+ rxCmdAllowed = 0;
+ currentCommandPos = 5;
+ currentCommand[0] = HAL_BLE_UNUSED_CMDCODE ;/* HAL_BLE_INIT_CMDCODE cmdcode */
+ currentCommand[1] = 'i';
+ currentCommand[2] = 'n';
+ currentCommand[3] = 'f';
+ currentCommand[4] = 'o';
+ currentCommand[5] = 0;
+ /* Set corresponding task to send this command to M0 */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_SEND_TO_M0, CFG_SCH_PRIO_0);
+
+ /* Activate UART RX buffer processing task to allow USER command comming from UART */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_PROCESS_UART_RX_BUFFER, CFG_SCH_PRIO_0);
+
+ Appli_Init();
+
+}
+
+/**
+ * @brief Trace the error or the warning reported.
+ * @param ErrId :
+ * @param ErrCode
+ * @retval None
+ */
+void APP_LLD_BLE_Error(uint32_t ErrId, uint32_t ErrCode)
+{
+ switch(ErrId)
+ {
+ case ERR_LLD_BLE_SET_STATE_CB :
+ LldBleTraceError("ERROR : ERR_LLD_BLE_SET_STATE_CB ",ErrCode);
+ break;
+
+ case ERR_LLD_BLE_ERASE_PERSISTENT_INFO :
+ LldBleTraceError("ERROR : ERR_LLDT_BLE_ERASE_PERSISTENT_INFO ",ErrCode);
+ break;
+
+ case ERR_LLD_BLE_CHECK_WIRELESS :
+ LldBleTraceError("ERROR : ERR_LLD_BLE_CHECK_WIRELESS ",ErrCode);
+ break;
+
+ default :
+ LldBleTraceError("ERROR Unknown ", 0);
+ break;
+ }
+}
+
+
+/*************************************************************
+ *
+ * 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 (OpenThread or other module if any)
+ * @retval None
+ */
+static void LldBleTraceError(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 Check if the Coprocessor Wireless Firmware loaded supports Thread
+ * and display associated informations
+ * @param None
+ * @retval None
+ */
+static void CheckWirelessFirmwareInfo(void)
+{
+ WirelessFwInfo_t wireless_info_instance;
+ WirelessFwInfo_t* p_wireless_info = &wireless_info_instance;
+ char m0FwType[50] = "M0 FW Type : Unknown !! ";
+
+ if (SHCI_GetWirelessFwInfo(p_wireless_info) != SHCI_Success)
+ {
+ APP_LLD_BLE_Error((uint32_t)ERR_LLD_BLE_CHECK_WIRELESS, 0);
+ }
+ else
+ {
+ APP_DBG("**********************************************************");
+ APP_DBG("Loaded M0 TEST FW info :");
+ switch(p_wireless_info->StackType)
+ {
+ case INFO_STACK_TYPE_802154_LLD_TESTS :
+ sprintf(m0FwType, " M0 FW Type : 802.15.4 and radio LLDs tests");
+ sprintf(cliPrompt, "802.15.4 TESTS > ");
+ break;
+
+ case INFO_STACK_TYPE_802154_PHY_VALID :
+ sprintf(m0FwType, " M0 FW Type : 802.15.4 and radio PHY validation");
+ sprintf(cliPrompt, "802.15.4 valid cli > ");
+ break;
+
+ case INFO_STACK_TYPE_BLE_PHY_VALID :
+ sprintf(m0FwType, " M0 FW Type : BLE and radio PHY validation");
+ sprintf(cliPrompt, "BLE valid cli > ");
+ break;
+
+ default :
+ /* FW not supported */
+ APP_LLD_BLE_Error((uint32_t)ERR_LLD_BLE_CHECK_WIRELESS, 0);
+ break;
+ }
+ APP_DBG(m0FwType);
+
+ /* Print version */
+ APP_DBG(" M0 FW VERSION = v%d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
+
+ APP_DBG("**********************************************************");
+ }
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Perform initialization of CLI UART interface.
+ * @param None
+ * @retval None
+ */
+void APP_LLD_BLE_Init_UART_CLI(void)
+{
+#if (CFG_HW_USART1_ENABLED == 1)
+ MX_USART1_UART_Init();
+
+ /* Put the UART device in reception mode and wait for interrupt */
+ if (HW_UART_Receive_IT(CFG_CLI_UART, &rxBuffer_Tab[rxBuffer_wrPtr], 1, uartRxCpltCallback) != hw_uart_ok)
+ APP_DBG((char *)"!! HAL_UART_Receive_IT error on M4 in APP_LLD_BLE_Init_UART_CLI !!");
+#endif
+}
+
+/**
+ * @brief Perform de-initialization of CLI UART interface.
+ * @param None
+ * @retval None
+ */
+void APP_LLD_BLE_DeInit_UART_CLI(void)
+{
+#if (CFG_HW_USART1_ENABLED == 1)
+ MX_USART1_UART_DeInit();
+#endif
+}
+
+static void uartRxCpltCallback(void)
+{
+ /* This callback is called :
+ - during RX isr (huart->RxISR)
+ - after bytes copy in buffer specified in last call to HW_UART_Receive_IT()
+ - when number of bytes specified in last call to HW_UART_Receive_IT() is acheived */
+
+ /* Prepare buffer to receive next character */
+ if ( rxCmdAllowed ) {
+ /* Increment read pointer index and manage buffer rollover */
+ rxBuffer_wrPtr++;
+ if(rxBuffer_wrPtr >= RX_BUFFER_SIZE)
+ rxBuffer_wrPtr = 0;
+ }
+
+ /* Re-put UART device in reception mode (not during IT to avoid locking the device while perhaps in transmit phase) */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_PROCESS_UART_RX_IT, CFG_SCH_PRIO_0);
+}
+
+static void uartRxItProcess(void)
+{
+ /* Put the UART device in reception mode and wait for interrupt */
+ if (HW_UART_Receive_IT(CFG_CLI_UART, &rxBuffer_Tab[rxBuffer_wrPtr], 1, uartRxCpltCallback) != hw_uart_ok)
+ APP_DBG((char *)"!! HAL_UART_Receive_IT error on M4 in uartRxItProcess !!");
+}
+
+static void uartClearChars(int nbChar)
+{
+ char clearCmd[2];
+
+ clearCmd[0] = CHAR_DEL;
+ clearCmd[1] = 0;
+ for (int i = 0; i < nbChar; i++) {
+ uartTxBufferAdd(clearCmd);
+ }
+}
+
+static void uartRxBufferProcessMode(uint8_t uartRxCmdEnable) /* 1 for Cmd ; 0 for Print */
+{
+ uartRxCmd=uartRxCmdEnable;
+}
+
+static void uartRxBufferProcess( void )
+{
+ char last_char[2];
+ static int8_t escape = -1;
+ static uint8_t escape_seq[3] = {0};
+
+ /* Ensure that last_char buffer contains a string with the char and a \0 (usefull to send echo or CHAR_DEL to UART) */
+ last_char[1] = 0;
+
+ if(uartRxCmd) {
+ /* Interpret and Command the character reception from UART */
+ while (rxBuffer_rdPtr != rxBuffer_wrPtr ) {
+ last_char[0] = rxBuffer_Tab[rxBuffer_rdPtr];
+ if( escape >= 0 ) {
+ escape_seq[escape++] = last_char[0];
+ if ( escape == 2 ) {
+ if ( strcmp((char*)escape_seq, "[A") == 0 ) { // UP
+ uartClearChars(currentCommandPos);
+ commandHistoryIdx = (commandHistoryIdx > 0) ? (commandHistoryIdx - 1) : (CMD_HISTORY_LENGTH - 1);
+ strcpy((char*)currentCommand,(char*)commandHistory[commandHistoryIdx]);
+ currentCommandPos = strlen((char*)currentCommand);
+ uartTxBufferAdd((char*)currentCommand);
+ }
+ if ( strcmp((char*)escape_seq, "[B") == 0 ) { // DOWN
+ uartClearChars(currentCommandPos);
+ commandHistoryIdx = (commandHistoryIdx < (CMD_HISTORY_LENGTH - 1)) ? (commandHistoryIdx + 1) : 0;
+ strcpy((char*)currentCommand,(char*)commandHistory[commandHistoryIdx]);
+ currentCommandPos = strlen((char*)currentCommand);
+ uartTxBufferAdd((char*)currentCommand);
+ }
+ escape = -1;
+ }
+ }
+ else if ( last_char[0] == CHAR_DEL ) {
+ if ( currentCommandPos > 0 ) {
+ currentCommandPos--;
+ uartTxBufferAdd(last_char);
+ }
+ }
+ else if ( last_char[0] == CHAR_ESC ) {
+ escape = 0;
+ }
+ else if ( last_char[0] == CHAR_CTRLC ) {
+ /* Just send a new prompt to wait for a new command */
+ currentCommandPos = 0;
+ uartTxBufferAdd("\r\n");
+ uartTxBufferAdd(cliPrompt);
+ }
+ else if ( ( last_char[0] == '\r' ) || ( last_char[0] == '\n' )) {
+ if (currentCommandPos == 0) {
+ /* User just typed 'enter' without any command, so, just send a new prompt to wait for a new command */
+ uartTxBufferAdd("\r\n");
+ uartTxBufferAdd(cliPrompt);
+ } else {
+ /* Do not accept new command from UART until this one is managed */
+ rxCmdAllowed = 0;
+
+ /* Put a end of line in UART TX buffer to have the echo sent */
+ uartTxBufferAdd("\r\n");
+
+ /* Copy the current command in history buffer before to send it to M0 */
+ memcpy(commandHistory[commandHistoryIdxSav],currentCommand,currentCommandPos);
+ /* add a \0 to avoid reseting end of command history buffer */
+ commandHistory[commandHistoryIdxSav][currentCommandPos] = 0;
+ commandHistoryIdxSav = (commandHistoryIdxSav+1) % CMD_HISTORY_LENGTH;
+ commandHistoryIdx = commandHistoryIdxSav;
+
+ /* UART task scheduling to send it to M0 */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_SEND_TO_M0, CFG_SCH_PRIO_0);
+ }
+ }
+ else {
+ /* Put the char in UART TX buffer to have the echo sent */
+ uartTxBufferAdd(last_char);
+ /* Put the char in the current command buffer */
+ currentCommand[currentCommandPos++] = last_char[0];
+ }
+
+ /* Increment read pointer index and manage buffer rollover */
+ rxBuffer_rdPtr++;
+ if(rxBuffer_rdPtr >= RX_BUFFER_SIZE)
+ rxBuffer_rdPtr = 0;
+ }
+ } else {
+ /* Interpret and Print the character reception from UART */
+ while (rxBuffer_rdPtr != rxBuffer_wrPtr ) {
+ last_char[0] = rxBuffer_Tab[rxBuffer_rdPtr];
+ if( escape >= 0 ) {
+ escape_seq[escape++] = last_char[0];
+ if ( escape == 2 ) {
+ if ( strcmp((char*)escape_seq, "[A") == 0 ) { // UP
+ uartClearChars(txtCommandPos);
+ commandHistoryIdx = (commandHistoryIdx > 0) ? (commandHistoryIdx - 1) : (CMD_HISTORY_LENGTH - 1);
+ strcpy((char*)txtCommand,(char*)commandHistory[commandHistoryIdx]);
+ txtCommandPos = strlen((char*)txtCommand);
+ uartTxBufferAdd((char*)txtCommand);
+ }
+ if ( strcmp((char*)escape_seq, "[B") == 0 ) { // DOWN
+ uartClearChars(txtCommandPos);
+ commandHistoryIdx = (commandHistoryIdx < (CMD_HISTORY_LENGTH - 1)) ? (commandHistoryIdx + 1) : 0;
+ strcpy((char*)txtCommand,(char*)commandHistory[commandHistoryIdx]);
+ txtCommandPos = strlen((char*)txtCommand);
+ uartTxBufferAdd((char*)txtCommand);
+ }
+ escape = -1;
+ }
+ }
+ else if ( last_char[0] == CHAR_DEL ) {
+ if ( txtCommandPos > 0 ) {
+ txtCommandPos--;
+ uartTxBufferAdd(last_char);
+ }
+ }
+ else if ( last_char[0] == CHAR_ESC ) {
+ escape = 0;
+ }
+ else if ( last_char[0] == CHAR_CTRLC ) {
+ /* Just send a new prompt to wait for a new command */
+ txtCommandPos = 0;
+ uartTxBufferAdd("\r\n");
+ uartTxBufferAdd(cliPrompt);
+ }
+ else if ( ( last_char[0] == '\r' ) || ( last_char[0] == '\n' )) {
+ if (txtCommandPos == 0) {
+ /* User just typed 'enter' without any command, so, just send a new prompt to wait for a new command */
+ uartTxBufferAdd("\r\n");
+ uartTxBufferAdd(cliPrompt);
+ uartLastChar=0;
+
+ } else {
+ /* Do not accept new command from UART until this one is managed */
+ rxCmdAllowed = 0;
+
+ /* Put a end of line in UART TX buffer to have the echo sent */
+ uartTxBufferAdd("\r\n");
+
+ /* Copy the current command in history buffer before to send it to M0 */
+ memcpy(commandHistory[commandHistoryIdxSav],txtCommand,txtCommandPos);
+ /* add a \0 to avoid reseting end of command history buffer */
+ commandHistory[commandHistoryIdxSav][txtCommandPos] = 0;
+ commandHistoryIdxSav = (commandHistoryIdxSav+1) % CMD_HISTORY_LENGTH;
+ commandHistoryIdx = commandHistoryIdxSav;
+
+ /* UART task scheduling to send it to M0 */
+ /* Send Packet with UART Char as Payload */
+ uartPayload[0]= 0xAA; // Appli Header
+ uartPayload[1]= txtCommandPos; // Appli Length
+ memcpy(&uartPayload[2],txtCommand,txtCommandPos);
+ txtCommandPos=0;
+ Appli_uartRxBufferPrint();
+ uartLastChar=1;
+
+ }
+ }
+ else {
+ /* Put the char in UART TX buffer to have the echo sent */
+ uartTxBufferAdd(last_char);
+ /* Put the char in the current command buffer */
+ txtCommand[txtCommandPos++] = last_char[0];
+ }
+
+ /* Increment read pointer index and manage buffer rollover */
+ rxBuffer_rdPtr++;
+ if(rxBuffer_rdPtr >= RX_BUFFER_SIZE)
+ rxBuffer_rdPtr = 0;
+ }
+ }
+
+ /* Re-activate UART RX buffer processing task */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_PROCESS_UART_RX_BUFFER, CFG_SCH_PRIO_0);
+}
+
+uint32_t txBufferFullCount;
+static void uartTxBufferAdd(const char * str)
+{
+ uint16_t bytesToWrite = strlen(str);
+ uint32_t txBufferFull = 0;
+
+ if (bytesToWrite) {
+ CRITICAL_BEGIN();
+ {
+ uint16_t remainingBytesToWrite = bytesToWrite;
+ uint32_t currentWrPtr = txBuffer_wrPtr;
+ uint8_t * currentWrAddr = &txBuffer_Tab[txBuffer_wrPtr];
+
+ while ((remainingBytesToWrite > 0) && (txBufferFull == 0)) {
+ if ((txBuffer_rdPtr == (currentWrPtr + 1)) || ((txBuffer_rdPtr == 0) && (currentWrPtr == (TX_BUFFER_SIZE - 1)))) {
+ /* If there is not enougth place (i.e. write pointer is just behind read pointer in the circular buffer),
+ buffer is full, so do not consider new string */
+ /* !! No trace here as it is under CRITICAL section */
+ txBufferFull = 1;
+ } else {
+ *currentWrAddr = str[bytesToWrite - remainingBytesToWrite];
+ remainingBytesToWrite--;
+
+ /* Increment write pointer index and manage buffer rollover */
+ currentWrPtr++;
+ if(currentWrPtr >= TX_BUFFER_SIZE)
+ currentWrPtr = 0;
+ currentWrAddr = &txBuffer_Tab[currentWrPtr];
+ }
+ }
+
+ if (txBufferFull == 0) {
+ txBuffer_wrPtr = currentWrPtr;
+ }
+ }
+ CRITICAL_END();
+
+ if (txBufferFull == 0) {
+ if (txBusy == 0) {
+ txBusy = 1;
+ uartTxCpltCallback();
+ }
+ } else {
+ txBufferFullCount++;
+ APP_DBG((char *)"!! TX buffer full : %u", txBufferFullCount);
+ }
+ }
+}
+
+static void uartTxCpltCallback(void)
+{
+ /* Prepare buffer to receive next character */
+ if ( txBuffer_rdPtr != txBuffer_wrPtr ) {
+ /* Re-put UART device in reception mode (not during IT to avoid locking the device while perhaps in transmit phase) */
+ pTxBuff_currentWr = &txBuffer_Tab[txBuffer_rdPtr];
+ UTIL_SEQ_SetTask(1U << CFG_TASK_PROCESS_UART_TX_IT, CFG_SCH_PRIO_0);
+
+ /* Increment write pointer index and manage buffer rollover */
+ txBuffer_rdPtr++;
+ if(txBuffer_rdPtr >= TX_BUFFER_SIZE)
+ txBuffer_rdPtr = 0;
+ } else {
+ txBusy = 0;
+ }
+}
+
+static void uartTxItProcess(void)
+{
+ /* Put the UART device in transmission mode and wait for interrupts :
+ - 1 to write the data in TDR register
+ - 1 when char is sent
+ - 1 to indicate end of transmit if several chars are to be transmitted */
+ if (HW_UART_Transmit_IT(CFG_CLI_UART, pTxBuff_currentWr, 1, uartTxCpltCallback) != hw_uart_ok)
+ APP_DBG((char *)"!! HAL_UART_Transmit_IT error on M4 in uart TX callback !!");
+}
+
+/**
+ * @brief Process sends CLI command to M0.
+ * @param None
+ * @retval None
+ */
+static void SendCmdToM0(void)
+{
+ memset(LldBleCmdRspPacket.cmdserial.cmd.payload, 0x0U, 255U);
+ *(uint32_t *)LldBleCmdRspPacket.cmdserial.cmd.payload = (uint32_t)currentCommand;
+ *(uint32_t *)&LldBleCmdRspPacket.cmdserial.cmd.payload[4] = currentCommandPos;
+ LldBleCmdRspPacket.cmdserial.cmd.plen = 8;
+ LldBleCmdRspPacket.cmdserial.cmd.cmdcode = 0x0;
+
+ TL_LLD_BLE_SendCmd();
+}
+
+/**
+ * @brief Perform initialization of TL for LLD tests.
+ * @param None
+ * @retval None
+ */
+void APP_LLD_BLE_Init_TL(void)
+{
+ LldBleConfigBuffer.p_LldBleCmdRspBuffer = (uint8_t*)&LldBleCmdRspPacket;
+ LldBleConfigBuffer.p_LldBleM0CmdBuffer = (uint8_t*)&LldBleM0CmdPacket;
+
+ TL_LLD_BLE_Init( &LldBleConfigBuffer );
+}
+
+static void m0RadioProcess(void)
+{
+ switch (m0Cmd) {
+ case CMD_FROM_M0_RADIO_STOP :
+ Appli_m0RadioProcess_RadioStop();
+ break;
+
+ case CMD_FROM_M0_RADIO_END :
+ Appli_m0RadioProcess_RadioEnd();
+ break;
+
+ case CMD_FROM_M0_RADIO_RXACK :
+ Appli_m0RadioProcess_RxAck();
+ break;
+
+ case CMD_FROM_M0_RADIO_RXOK :
+ Appli_m0RadioProcess_RxOk();
+ break;
+
+ case CMD_FROM_M0_RADIO_RXACKEND :
+ Appli_m0RadioProcess_RxAckEnd();
+ break;
+
+ case CMD_FROM_M0_RADIO_RXOKEND :
+ Appli_m0RadioProcess_RxOkEnd();
+ break;
+
+ default:
+ break;
+ }
+}
+
+static void m0CmdProcess(void)
+{
+ switch (m0Cmd) {
+
+ case CMD_FROM_M0_RADIO_STOP :
+ Appli_m0CmdProcess_RadioStop();
+ break;
+
+ case CMD_FROM_M0_RADIO_END :
+ Appli_m0CmdProcess_RadioEnd();
+ break;
+
+ case CMD_FROM_M0_RADIO_RXACK :
+ Appli_m0CmdProcess_RxAck();
+ break;
+
+ case CMD_FROM_M0_RADIO_RXOK :
+ Appli_m0CmdProcess_RxOk();
+ break;
+
+ case CMD_FROM_M0_RADIO_RXACKEND :
+ Appli_m0CmdProcess_RxAckEnd();
+ break;
+
+ case CMD_FROM_M0_RADIO_RXOKEND :
+ Appli_m0CmdProcess_RxOkEnd();
+ break;
+
+ case CMD_FROM_M0_STOP0_ON :
+ m0CmdStopRequired(0);
+ break;
+
+ case CMD_FROM_M0_STOP1_ON :
+ m0CmdStopRequired(1);
+ break;
+
+ case CMD_FROM_M0_STOP2_ON :
+ m0CmdStopRequired(2);
+ break;
+
+ case CMD_FROM_M0_STOP_OFF :
+ // Nothing done here as the goal of this command is just to have an IPCC interrupt
+ // that will make the M4 going out of STOP or WFI
+ break;
+
+ case CMD_FROM_M0_GO_IN_WFI :
+ m0CmdStopRequired(3);
+ break;
+
+ case CMD_FROM_M0_GO_DIRECTLY_IN_WFI :
+ m0CmdStopRequired(4);
+ break;
+
+ case CMD_FROM_M0_USE_MSI :
+ SystemClock_Config_MSI(0);
+ break;
+
+ case CMD_FROM_M0_USE_MSI_PLL :
+ SystemClock_Config_MSI(1);
+ break;
+
+ case CMD_FROM_M0_USE_HSE :
+ SystemClock_Config_HSE(0);
+ break;
+
+ case CMD_FROM_M0_USE_HSE_PLL :
+ SystemClock_Config_HSE(1);
+ break;
+
+#if (CFG_HW_EXTPA_ENABLED == 1)
+ case CMD_FROM_M0_EXT_PA_EN :
+ gpio_lld_extPa_init();
+ // Indicate to M0 which GPIO must be managed
+ SHCI_C2_ExtpaConfig((uint32_t)GPIO_EXT_PA_EN_PORT, GPIO_EXT_PA_EN_PIN, EXT_PA_ENABLED_HIGH, EXT_PA_ENABLED);
+ break;
+
+ case CMD_FROM_M0_EXT_PA_DIS :
+ gpio_lld_extPa_deInit();
+ SHCI_C2_ExtpaConfig((uint32_t)GPIO_EXT_PA_EN_PORT, GPIO_EXT_PA_EN_PIN, EXT_PA_ENABLED_HIGH, EXT_PA_DISABLED);
+ break;
+#endif
+
+ default:
+ break;
+ }
+}
+
+static void m4ConfigBeforeStop(void)
+{
+ // Clear C1 Stop flag if any remaining
+ LL_PWR_ClearFlag_C1STOP_C1STB();
+}
+
+static void m4ConfigAfterStop(void)
+{
+ // Clear C1 Stop flag
+ LL_PWR_ClearFlag_C1STOP_C1STB();
+}
+
+static void m0CmdStopRequired(uint32_t stopRequired)
+{
+ switch (stopRequired) {
+ case 0:
+ // flush IPC and trace before sleeping. Let time to M0 to set RF in sleep and to be in STOP if needed
+ us_delay(delayBeforeSleepOnM4);
+
+ // Stop UART and its GPIOs to reduce power consumption
+ APP_LLD_BLE_DeInit_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_DeInit();
+#endif
+
+ // trial for no IT (ex RF) at low speed
+ CRITICAL_BEGIN();
+
+ // Prepare system to be stopped
+ m4ConfigBeforeStop();
+
+ // Enter selected STOP mode
+ HAL_PWREx_EnterSTOP0Mode(PWR_STOPENTRY_WFI);
+
+ // Restart system
+ m4ConfigAfterStop();
+
+ // Restart UART before to go out of critical area to not have to send trace from M0 before to restart it
+ APP_LLD_BLE_Init_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_Init();
+#endif
+
+ // trial for no IT (ex RF) at low speed
+ CRITICAL_END();
+
+ APP_DBG("M4 back from STOP0");
+ break;
+
+ case 1:
+ // flush IPC and trace before sleeping. Let time to M0 to set RF in sleep and to be in STOP if needed
+ us_delay(delayBeforeSleepOnM4);
+
+ // Stop UART and its GPIOs to reduce power consumption
+ APP_LLD_BLE_DeInit_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_DeInit();
+#endif
+
+ // trial for no IT (ex RF) at low speed
+ CRITICAL_BEGIN();
+
+ // Prepare system to be stopped
+ m4ConfigBeforeStop();
+
+ // Enter selected STOP mode
+ HAL_PWREx_EnterSTOP1Mode(PWR_STOPENTRY_WFI);
+
+ // Restart system
+ m4ConfigAfterStop();
+
+ // Restart UART before to go out of critical area to not have to send trace from M0 before to restart it
+ APP_LLD_BLE_Init_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_Init();
+#endif
+
+ // trial for no IT (ex RF) at low speed
+ CRITICAL_END();
+
+ APP_DBG("M4 back from STOP1");
+ break;
+
+ case 2:
+ // flush IPC and trace before sleeping. Let time to M0 to set RF in sleep and to be in STOP if needed
+ us_delay(delayBeforeSleepOnM4);
+
+ // Stop UART and its GPIOs to reduce power consumption
+ APP_LLD_BLE_DeInit_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_DeInit();
+#endif
+
+ // trial for no IT (ex RF) at low speed
+ CRITICAL_BEGIN();
+
+ // Prepare system to be stopped
+ m4ConfigBeforeStop();
+
+ // Enter selected STOP mode
+ HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
+
+ // Restart system
+ m4ConfigAfterStop();
+
+ // Restart UART before to go out of critical area to not have to send trace from M0 before to restart it
+ APP_LLD_BLE_Init_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_Init();
+#endif
+
+ // trial for no IT (ex RF) at low speed
+ CRITICAL_END();
+
+ APP_DBG("M4 back from STOP2");
+ break;
+
+ case 3:
+ // flush IPC and trace before sleeping. Let time to M0 to set RF in sleep and to be in STOP if needed
+ us_delay(delayBeforeSleepOnM4);
+
+ // Stop UART and its GPIOs to reduce power consumption
+ APP_LLD_BLE_DeInit_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_DeInit();
+#endif
+
+ // trial for no IT (ex RF) at low speed
+ CRITICAL_BEGIN();
+
+ __WFI();
+ // Restart UART before to go out of critical area to not have to send trace from M0 before to restart it
+ APP_LLD_BLE_Init_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_Init();
+#endif
+
+ // trial for no IT (ex RF) at low speed
+ CRITICAL_END();
+
+ APP_DBG("M4 back from WFI");
+ break;
+
+ case 4:
+ // Put M4 in WFI without delay :
+ // - In some cases, it is recomanded to limit the M4 activity to avoid Flash access which can slow down the M0 which share it with M4
+ // - But, be carrefull as WFI can be blocking as there is no more interrupts
+ // - As example, if not used, SF timer test is failed.
+ __WFI();
+ APP_DBG("M4 back from WFI (without delay)");
+ break;
+
+ default:
+ break;
+ }
+}
+
+/**
+ * @brief Send Ack to M0 CLI Response channel.
+ * @param None
+ * @retval None
+ */
+static void SendRspAckToM0(void)
+{
+ /* Notify M0 that CLI notification has been taken into account */
+ TL_LLD_BLE_SendRspAck();
+}
+
+/**
+ * @brief This function is called when notification on CLI TL Channel from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_CmdPacket_t
+ * @return None
+ */
+void TL_LLD_BLE_ReceiveRsp( TL_CmdPacket_t * Notbuffer )
+{
+
+ uint8_t l_size = Notbuffer->cmdserial.cmd.plen;
+ char * sourceBuf = (char *)Notbuffer->cmdserial.cmd.payload;
+
+ if (l_size > 0)
+ {
+ if (strncmp(sourceBuf, "Resp_End", 9) == 0)
+ {
+ /* This is an answer to indicate that the CLI command has been completed */
+ UTIL_SEQ_SetEvt(1U << CFG_EVT_RECEIVE_RSPACKEVT);
+
+ /* Write a promp to UART and allow to receive a new command */
+ //sprintf(cliPrompt, "LLD BLE > ");
+ //uartTxBufferAdd("\r\n");
+ //uartTxBufferAdd(cliPrompt);
+
+ currentCommandPos = 0;
+ rxCmdAllowed = 1;
+ }
+ else
+ {
+ /* This is just a trace from M0, write to CLI UART buffer */
+ uartTxBufferAdd(sourceBuf);
+ }
+ }
+ else
+ {
+ APP_DBG((char *)"!! Empty M0 CLI response received by M4 !!");
+ }
+ SendRspAckToM0();
+}
+
+/**
+ * @brief Send Ack to M0 CLI Response channel.
+ * @param None
+ * @retval None
+ */
+static void SendM0CmdAckToM0(void)
+{
+ /* Notify M0 that CLI notification has been taken into account */
+ TL_LLD_BLE_SendM0CmdAck();
+}
+
+/**
+ * @brief This function is called when notification on CLI TL Channel from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_CmdPacket_t
+ * @return None
+ */
+void TL_LLD_BLE_ReceiveM0Cmd( TL_CmdPacket_t * cmdBuffer )
+{
+ //TL_CmdPacket_t* l_CliBuffer = (TL_CmdPacket_t*)Notbuffer;
+ uint8_t bufferSize = cmdBuffer->cmdserial.cmd.plen;
+ char * bufferAddr = (char *)cmdBuffer->cmdserial.cmd.payload;
+ //uint32_t length = *(uint32_t *)&l_CliBuffer->cmdserial.cmd.payload[4];
+
+ if (bufferSize > 0)
+ {
+ if (strncmp(bufferAddr, "Radio_Stop", 10) == 0)
+ {
+ m0Cmd = CMD_FROM_M0_RADIO_STOP;
+
+ /* Action under IT */
+ m0RadioProcess();
+
+ /* Action under Sequencer */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+
+ }
+ else if (strncmp(bufferAddr, "Radio_End", 9) == 0)
+ {
+ m0Cmd = CMD_FROM_M0_RADIO_END;
+
+ /* Action under IT */
+ m0RadioProcess();
+
+ /* Action under Sequencer */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+
+ }
+ else if (strncmp(bufferAddr, "Radio_RxAckEnd", 14) == 0)
+ {
+ m0Cmd = CMD_FROM_M0_RADIO_RXACKEND;
+
+ /* Action under IT */
+ m0RadioProcess();
+
+ /* Action under Sequencer */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+
+ }
+ else if (strncmp(bufferAddr, "Radio_RxOkEnd", 13) == 0)
+ {
+ m0Cmd = CMD_FROM_M0_RADIO_RXOKEND;
+
+ /* Action under IT */
+ m0RadioProcess();
+
+ /* Action under Sequencer */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+
+ }
+ else if (strncmp(bufferAddr, "Radio_RxAck", 11) == 0)
+ {
+ m0Cmd = CMD_FROM_M0_RADIO_RXACK;
+
+ /* Action under IT */
+ m0RadioProcess();
+
+ /* Action under Sequencer */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+
+ }
+ else if (strncmp(bufferAddr, "Radio_RxOk", 10) == 0)
+ {
+ m0Cmd = CMD_FROM_M0_RADIO_RXOK;
+
+ /* Action under IT */
+ m0RadioProcess();
+
+ /* Action under Sequencer */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+
+ }
+ else if (strncmp(bufferAddr, "stop0_on", 8) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_STOP0_ON;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "stop1_on", 8) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_STOP1_ON;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "stop2_on", 8) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_STOP2_ON;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "stop_off", 8) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_STOP_OFF;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "go_in_wfi", 9) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_GO_IN_WFI;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "go_directly_in_wfi", 18) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_GO_DIRECTLY_IN_WFI;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "use_msi_no_pll", 14) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_USE_MSI;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "use_msi_pll", 11) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_USE_MSI_PLL;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "use_hse_no_pll", 14) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_USE_HSE;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "use_hse_pll", 11) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_USE_HSE_PLL;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "ext_pa_enable", 13) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_EXT_PA_EN;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "ext_pa_disable", 14) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_EXT_PA_DIS;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else
+ {
+ APP_DBG((char *)"!! Unknown M0 command received by M4 !!");
+ }
+ }
+ else
+ {
+ APP_DBG((char *)"!! Empty M0 command received by M4 !!");
+ }
+ SendM0CmdAckToM0();
+}
+
+/**
+ * @brief This function is called to Send Command to M0, Every lld_ble API call this function
+ *
+ * @param currentCmd : a value of the lld_ble API
+ * @param currentPt : a pointer to param_hal_BLE_t
+ * @return M0 return value
+ */
+uint8_t APP_LLD_BLE_SendCmdM0(uint8_t currentCmd , uint32_t* currentPt)
+{
+ /* M0 init done, send first command to have M0 code info and thus, a first prompt will be printed automatically */
+ /* Do not accept new command from UART until this one is managed */
+ rxCmdAllowed = 0;
+ currentCommandPos = 5;
+ currentCommand[0] = currentCmd ;
+ currentCommand[1] = (uint8_t)((((uint32_t)(currentPt)) >> 0) & 0xFF);
+ currentCommand[2] = (uint8_t)((((uint32_t)(currentPt)) >> 8) & 0xFF);
+ currentCommand[3] = (uint8_t)((((uint32_t)(currentPt)) >> 16) & 0xFF);
+ currentCommand[4] = (uint8_t)((((uint32_t)(currentPt)) >> 24) & 0xFF);
+
+ currentCommand[5] = 0;
+
+ /* Set corresponding task to send this command to M0 */
+ //UTIL_SEQ_SetTask(1U << CFG_TASK_SEND_TO_M0, CFG_SCH_PRIO_0);
+ UTIL_SEQ_ClrEvt(1U << CFG_EVT_RECEIVE_RSPACKEVT);
+ SendCmdToM0();
+
+ UTIL_SEQ_WaitEvt(1U << CFG_EVT_RECEIVE_RSPACKEVT);
+
+ /* Activate UART RX buffer processing task to allow USER command comming from UART */
+ //UTIL_SEQ_SetTask(1U << CFG_TASK_PROCESS_UART_RX_BUFFER, CFG_SCH_PRIO_0);
+ return(((param_hal_BLE_t*)(currentPt))->return_value);
+
+}
+
+/**
+ * @brief As the default systick is not used, declare here, at least, an empty function to
+ * over-write the default one as it declared as WEAK in HAL.
+ */
+void HAL_Delay(__IO uint32_t Delay)
+{
+ us_delay(Delay*1000);
+ return;
+}
+
+/* USER CODE BEGIN FD */
+/* Appli common functions */
+void Appli_ProcessMode(void)
+{
+ uartRxBufferProcessMode(0); /* print mode */
+}
+
+void Appli_RegTask(void)
+{
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_HAL_BLE_INIT , UTIL_SEQ_RFU, CHAT_BLE_Init);
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_HAL_BLE_ENCRYPT , UTIL_SEQ_RFU, CHAT_ToggleEncrypt);
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_HAL_BLE_SENDPACKET , UTIL_SEQ_RFU, CHAT_SendPacket);
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_HAL_BLE_LISTENPACKET , UTIL_SEQ_RFU, CHAT_ListenPacket);
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_HAL_BLE_STARTTONE , UTIL_SEQ_RFU, CHAT_StartTone);
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_HAL_BLE_STOPTONE , UTIL_SEQ_RFU, CHAT_StopTone);
+}
+
+void Appli_Init(void)
+{
+ sprintf(cliPrompt, "LLD BLE > ");
+ uartTxBufferAdd("\r\n");
+ uartTxBufferAdd(cliPrompt);
+
+ // Init CHAT Appli
+ UTIL_SEQ_SetTask(1U << CFG_TASK_HAL_BLE_INIT, CFG_SCH_PRIO_0);
+}
+
+void Appli_uartRxBufferPrint(void)
+{
+ sprintf(cliPrompt, "LLD BLE > ");
+ uartTxBufferAdd(cliPrompt);
+}
+
+/* Appli radio functions */
+void Appli_m0RadioProcess_RadioStop(void)
+{
+ /* copy status from M0 BLE Radio */
+ radioPacketNb=bleparam_hal_BLE_Packet.txrxBuffer.rxBuffer[257];
+ *rxStatus_Ptr[radioPacketNb]=bleparam_hal_BLE_Packet.status; // status
+ UTIL_SEQ_SetEvt(1U << CFG_EVT_RECEIVE_ENDPACKEVT);
+}
+
+void Appli_m0RadioProcess_RadioEnd(void)
+{
+ /* copy status from M0 BLE Radio */
+ radioPacketNb=bleparam_hal_BLE_Packet.txrxBuffer.rxBuffer[257];
+ *rxStatus_Ptr[radioPacketNb]=bleparam_hal_BLE_Packet.status; // status
+ UTIL_SEQ_SetEvt(1U << CFG_EVT_RECEIVE_ENDPACKEVT);
+}
+
+void Appli_m0RadioProcess_RxAck(void)
+{
+ /* copy status from M0 BLE Radio */
+ radioPacketNb=bleparam_hal_BLE_Packet.txrxBuffer.rxBuffer[257];
+ *rxStatus_Ptr[radioPacketNb]=bleparam_hal_BLE_Packet.status; // status
+ UTIL_SEQ_SetEvt(1U << CFG_EVT_RECEIVE_ENDPACKEVT);
+}
+
+void Appli_m0RadioProcess_RxOk(void)
+{
+ /* copy status from M0 BLE Radio */
+ radioPacketNb=bleparam_hal_BLE_Packet.txrxBuffer.rxBuffer[257];
+ *rxStatus_Ptr[radioPacketNb]=bleparam_hal_BLE_Packet.status; // status
+ *rxTimeStamp_Ptr[radioPacketNb]=bleparam_hal_BLE_Packet.timestamp_receive; // timestamp_receive
+ *rxRSSI_Ptr[radioPacketNb]=bleparam_hal_BLE_Packet.rssi; // rssi
+ /* copy payload from M0 BLE Radio */
+ memcpy(rxBuffer_Ptr[radioPacketNb],(bleparam_hal_BLE_Packet.txrxBuffer.rxBuffer),258);
+ UTIL_SEQ_SetEvt(1U << CFG_EVT_RECEIVE_ENDPACKEVT);
+}
+
+void Appli_m0RadioProcess_RxAckEnd(void)
+{
+ /* copy status from M0 BLE Radio */
+ radioPacketNb=bleparam_hal_BLE_Packet.txrxBuffer.rxBuffer[257];
+ *rxStatus_Ptr[radioPacketNb]=bleparam_hal_BLE_Packet.status; // status
+ UTIL_SEQ_SetEvt(1U << CFG_EVT_RECEIVE_ENDPACKEVT);
+}
+
+void Appli_m0RadioProcess_RxOkEnd(void)
+{
+ /* copy status from M0 BLE Radio */
+ radioPacketNb=bleparam_hal_BLE_Packet.txrxBuffer.rxBuffer[257];
+ *rxStatus_Ptr[radioPacketNb]=bleparam_hal_BLE_Packet.status; // status
+ /* copy payload from M0 BLE Radio */
+ memcpy(rxBuffer_Ptr[radioPacketNb],(bleparam_hal_BLE_Packet.txrxBuffer.rxBuffer),258);
+ UTIL_SEQ_SetEvt(1U << CFG_EVT_RECEIVE_ENDPACKEVT);
+}
+
+void Appli_m0CmdProcess_RadioStop(void)
+{
+}
+
+void Appli_m0CmdProcess_RadioEnd(void)
+{
+ if (uartLastChar)
+ {
+ UTIL_SEQ_SetTask(1U << CFG_TASK_HAL_BLE_SENDPACKET, CFG_SCH_PRIO_0); // Chat
+ uartLastChar=0;
+ } else {
+ UTIL_SEQ_SetTask(1U << CFG_TASK_HAL_BLE_LISTENPACKET, CFG_SCH_PRIO_0); // Chat
+ }
+}
+
+void Appli_m0CmdProcess_RxAck(void)
+{
+ if (uartLastChar)
+ {
+ UTIL_SEQ_SetTask(1U << CFG_TASK_HAL_BLE_SENDPACKET, CFG_SCH_PRIO_0); // Chat
+ uartLastChar=0;
+ } else {
+ UTIL_SEQ_SetTask(1U << CFG_TASK_HAL_BLE_LISTENPACKET, CFG_SCH_PRIO_0); // Chat
+ }
+}
+
+void Appli_m0CmdProcess_RxOk(void)
+{
+ sprintf(chatPrompt, "");
+ if (chatEncrypt!=0) {
+ radioLength=rxBuffer_Ptr[radioPacketNb][1]-4; // Chat Length - 4 for Encrypt
+ } else {
+ radioLength=rxBuffer_Ptr[radioPacketNb][1]; // Chat Length
+ }
+
+ for (uint8_t i=0 ; i < radioLength ; i++)
+ {
+ sprintf(chatPrompt, "%s%c",chatPrompt, rxBuffer_Ptr[radioPacketNb][i+2]); // Record ID from Stack_Packet
+ }
+ uartTxBufferAdd(chatPrompt);
+ uartTxBufferAdd("\r\n");
+ sprintf(cliPrompt, "LLD BLE > ");
+ uartTxBufferAdd(cliPrompt);
+
+ if (uartLastChar)
+ {
+ UTIL_SEQ_SetTask(1U << CFG_TASK_HAL_BLE_SENDPACKET, CFG_SCH_PRIO_0); // Chat
+ uartLastChar=0;
+ } else {
+ UTIL_SEQ_SetTask(1U << CFG_TASK_HAL_BLE_LISTENPACKET, CFG_SCH_PRIO_0); // Chat
+ }
+}
+
+void Appli_m0CmdProcess_RxAckEnd(void)
+{
+ if (uartLastChar)
+ {
+ UTIL_SEQ_SetTask(1U << CFG_TASK_HAL_BLE_SENDPACKET, CFG_SCH_PRIO_0); // Chat
+ uartLastChar=0;
+ } else {
+ UTIL_SEQ_SetTask(1U << CFG_TASK_HAL_BLE_LISTENPACKET, CFG_SCH_PRIO_0); // Chat
+ }
+}
+
+void Appli_m0CmdProcess_RxOkEnd(void)
+{
+ sprintf(chatPrompt, "");
+ if (chatEncrypt!=0) {
+ radioLength=rxBuffer_Ptr[radioPacketNb][1]-4; // Chat Length - 4 for Encrypt
+ } else {
+ radioLength=rxBuffer_Ptr[radioPacketNb][1]; // Chat Length
+ }
+
+ for (uint8_t i=0 ; i < radioLength ; i++)
+ {
+ sprintf(chatPrompt, "%s%c",chatPrompt, rxBuffer_Ptr[radioPacketNb][i+2]); // Record ID from Stack_Packet
+ }
+ uartTxBufferAdd(chatPrompt);
+ uartTxBufferAdd("\r\n");
+ sprintf(cliPrompt, "LLD BLE > ");
+ uartTxBufferAdd(cliPrompt);
+
+ if (uartLastChar)
+ {
+ UTIL_SEQ_SetTask(1U << CFG_TASK_HAL_BLE_SENDPACKET, CFG_SCH_PRIO_0); // Chat
+ uartLastChar=0;
+ } else {
+ UTIL_SEQ_SetTask(1U << CFG_TASK_HAL_BLE_LISTENPACKET, CFG_SCH_PRIO_0); // Chat
+ }
+}
+
+/* Appli custom functions */
+void CHAT_BLE_Init(void)
+{
+ #ifdef LLD_BLE_DEBUG
+ bleparam_hal_BLE_Packet.InfoTime=(uint32_t)debug_timer;
+ #endif
+
+ HAL_BLE_Init();
+ HAL_BLE_SetNetworkID(chatID);
+
+ /* Encryption Parameters */
+ LLD_BLE_SetEncryptionAttributes(STATE_MACHINE_0, chatenc_iv, chatenc_key);
+ LLD_BLE_SetEncryptionCount(STATE_MACHINE_0, &chatcount_tx[0], &chatcount_rcv[0]);
+
+ BSP_LED_On(LED_BLUE);
+ BSP_LED_Off(LED_GREEN);
+ BSP_LED_Off(LED_RED);
+ UTIL_SEQ_SetTask(1U << CFG_TASK_HAL_BLE_LISTENPACKET , CFG_SCH_PRIO_0);
+}
+
+void CHAT_Encrypt(void)
+{
+ // enable Encrypt
+ chatEncrypt = 1;
+ LLD_BLE_SetEncryptFlags(STATE_MACHINE_0, ENABLE, ENABLE);
+ // end Encrypt
+
+ BSP_LED_Off(LED_BLUE);
+}
+
+void CHAT_UnEncrypt(void)
+{
+ // disable Encrypt
+ chatEncrypt = 0;
+ LLD_BLE_SetEncryptFlags(STATE_MACHINE_0, DISABLE, DISABLE);
+ // end Encrypt
+
+ BSP_LED_On(LED_BLUE);
+}
+
+void CHAT_ToggleEncrypt(void)
+
+{
+ LLD_BLE_StopActivity();
+ uint32_t iTimeTone = 0 ;
+ uint32_t TimeTone;
+ while((LLD_BLE_GetStatus(&TimeTone)) != 0)
+ {
+ iTimeTone++;
+ us_delay(100);
+ }
+ if (chatEncrypt!=0) {
+ CHAT_UnEncrypt();
+ } else {
+ CHAT_Encrypt();
+ }
+ UTIL_SEQ_SetTask(1U << CFG_TASK_HAL_BLE_LISTENPACKET , CFG_SCH_PRIO_0);
+
+}
+
+void CHAT_SendPacket(void)
+{
+ chattxBuffer[0]= 0x68; // Chat Header
+ if (chatEncrypt!=0) {
+ chattxBuffer[1]= uartPayload[1]+4; // Chat Length + 4 for Encrypt
+ } else {
+ chattxBuffer[1]= uartPayload[1]; // Chat Length
+ }
+ memcpy(&chattxBuffer[2],&uartPayload[2],uartPayload[1]);
+ APP_LLD_BLE_SetdataRoutineOption(chatPacketNumberTx,chatPacketStopRx);
+ #ifdef LLD_BLE_DEBUG
+ start_timer=Debug_Start_timer();
+ #endif
+ HAL_BLE_SendPacketWithAck(chatChannel, chatWakeup, chattxBuffer, chatAckrxBuffer, chatReceiveAck, dataRoutine_HAL_TxAck);
+ #ifdef LLD_BLE_DEBUG
+ stop_timer=Debug_Stop_timer();
+ #endif
+ UTIL_SEQ_ClrEvt(1U << CFG_EVT_RECEIVE_ENDPACKEVT);
+ BSP_LED_Off(LED_GREEN);
+ HAL_NVIC_EnableIRQ(BUTTON_SW1_EXTI_IRQn);
+}
+
+void CHAT_ListenPacket(void)
+{
+ APP_LLD_BLE_SetdataRoutineOption(chatPacketNumberRx,chatPacketStopRx);
+ HAL_BLE_ReceivePacketWithAck(chatChannel, chatWakeup, chatrxBuffer, chatAcktxBuffer, chatReceive, dataRoutine_HAL_RxAck);
+ UTIL_SEQ_ClrEvt(1U << CFG_EVT_RECEIVE_ENDPACKEVT);
+ BSP_LED_On(LED_GREEN);
+ BSP_LED_On(LED_RED);
+ HAL_NVIC_EnableIRQ(BUTTON_SW1_EXTI_IRQn);
+}
+
+void CHAT_StopRadio(void)
+{
+ LLD_BLE_StopActivity();
+ BSP_LED_Off(LED_GREEN);
+ uint32_t iTimeTone = 0 ;
+ uint32_t TimeTone;
+ while((LLD_BLE_GetStatus(&TimeTone)) != 0)
+ {
+ iTimeTone++;
+ us_delay(100);
+ }
+ BSP_LED_Off(LED_RED);
+}
+
+void CHAT_StartTone(void)
+{
+ CHAT_StopRadio();
+
+ LLD_BLE_StartTone(14, 30); /* 14 for BLE channel 12*/
+ BSP_LED_On(LED_GREEN);
+}
+
+void CHAT_StopTone(void)
+{
+ LLD_BLE_StopTone();
+ BSP_LED_Off(LED_GREEN);
+ BSP_LED_On(LED_RED);
+}
+
+/* USER CODE END FD */
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+void Appli_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
+{
+ switch (GPIO_Pin)
+ {
+ case BUTTON_SW1_PIN:
+ HAL_NVIC_DisableIRQ(BUTTON_SW1_EXTI_IRQn);
+ UTIL_SEQ_SetTask(1U << CFG_TASK_HAL_BLE_ENCRYPT, CFG_SCH_PRIO_0);
+ break;
+
+ case BUTTON_SW2_PIN:
+ HAL_NVIC_DisableIRQ(BUTTON_SW2_EXTI_IRQn);
+ UTIL_SEQ_SetTask(1U << CFG_TASK_HAL_BLE_STARTTONE, CFG_SCH_PRIO_0);
+ break;
+
+ case BUTTON_SW3_PIN:
+ HAL_NVIC_DisableIRQ(BUTTON_SW3_EXTI_IRQn);
+ UTIL_SEQ_SetTask(1U << CFG_TASK_HAL_BLE_STOPTONE, CFG_SCH_PRIO_0);
+ break;
+
+ default:
+ break;
+
+ }
+ return;
+}
+void Appli_TIM_IC_CaptureCallback(void)
+{
+}
+
+void Appli_TIM_PeriodElapsedCallback(void)
+{
+}
+/* USER CODE END FD_WRAP_FUNCTIONS */
+
+/* debug */
+uint32_t Debug_Start_timer(void)
+{
+ debug_timer[0]=__HAL_TIM_GET_COUNTER(&htim2);
+ if(!debug_timer[2])
+ {
+ return 0;
+ } else
+ {
+ return(debug_timer[0]-debug_timer[2]);
+ }
+}
+uint32_t Debug_Stop_timer(void)
+{
+ debug_timer[1]=__HAL_TIM_GET_COUNTER(&htim2);
+ return(debug_timer[1]-debug_timer[0]);
+}
+
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/STM32_WPAN/App/app_lld_ble.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/STM32_WPAN/App/app_lld_ble.h
new file mode 100644
index 000000000..4e8974cb8
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/STM32_WPAN/App/app_lld_ble.h
@@ -0,0 +1,89 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_lld_ble.h
+ * Description : Header for LLD 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_LLD_BLE_H
+#define APP_LLD_BLE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+
+/* Exported types ------------------------------------------------------------*/
+
+/* 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_LLD_BLE_SET_STATE_CB,
+ ERR_LLD_BLE_ERASE_PERSISTENT_INFO,
+ ERR_LLD_BLE_CHECK_WIRELESS
+ } ErrAppLldBleIdEnum_t;
+
+/* Exported constants --------------------------------------------------------*/
+
+/* External variables --------------------------------------------------------*/
+
+/* Exported macros ------------------------------------------------------------*/
+
+/* Exported functions ------------------------------------------------------- */
+void APP_LLD_BLE_Init( void );
+void APP_LLD_BLE_Error(uint32_t ErrId, uint32_t ErrCode);
+void APP_LLD_BLE_ProcessMsgM0ToM4(void);
+void APP_LLD_BLE_Init_UART_CLI(void);
+void APP_LLD_BLE_DeInit_UART_CLI(void);
+void APP_LLD_BLE_Init_TL(void);
+/**
+ * @brief Active polling for a given delay
+ * @param microsec the delay in us unit
+ **/
+void us_delay_16m(uint32_t microsec);
+void us_delay_32m(uint32_t microsec);
+#ifdef USE_SYS_CLOCK_DIV_2
+#define us_delay us_delay_16m
+#else
+#define us_delay us_delay_32m
+#endif
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+/* only for M4 */
+uint8_t APP_LLD_BLE_SendCmdM0(uint8_t currentCmd , uint32_t* currentPt);
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+void Appli_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
+void Appli_TIM_IC_CaptureCallback(void);
+void Appli_TIM_PeriodElapsedCallback(void);
+/* USER CODE END FD_WRAP_FUNCTIONS */
+
+#endif /* APP_LLD_BLE_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/STM32_WPAN/App/lld_ble.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/STM32_WPAN/App/lld_ble.c
new file mode 100644
index 000000000..277391024
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/STM32_WPAN/App/lld_ble.c
@@ -0,0 +1,443 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : lld_ble.c
+ * Description : LLD 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 "app_common.h"
+#include "utilities_common.h"
+#include "app_entry.h"
+#include "dbg_trace.h"
+#include "lld_ble.h"
+#include "app_lld_ble.h"
+#include "tl.h"
+#include "shci.h"
+#include "stm_logging.h"
+#include "stm32_lpm.h"
+#include "stm32_seq.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 function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Private variables -----------------------------------------------*/
+/* USER CODE BEGIN PV */
+uint8_t *txBuffer_Ptr;
+extern uint8_t *rxBuffer_Ptr[8];
+extern uint32_t *rxStatus_Ptr[8];
+extern uint32_t *rxTimeStamp_Ptr[8];
+extern int *rxRSSI_Ptr[8];
+/* for HAL */
+uint32_t hal_status;
+uint32_t hal_timestamp_receive;
+int hal_rssi;
+
+extern param_hal_BLE_t bleparam_hal_BLE_Packet;
+
+uint32_t* param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+static uint32_t global_PacketNumber = 1; // NB of Successif PACKET Send or Receive
+static uint8_t global_PacketStopRx = 1; // Stop after RX
+/* USER CODE END PV */
+
+/* --------------------------- dataRoutine LEVEL -------------------------------*/
+void APP_LLD_BLE_SetdataRoutineOption(uint32_t PacketNumber, uint8_t PacketStop )
+{
+ global_PacketNumber = PacketNumber; // NB of Successif PACKET using LL Send or Receive
+ global_PacketStopRx = PacketStop; // Stop after RX
+}
+
+/* ------------------------------- HAL LEVEL -----------------------------------*/
+uint8_t HAL_BLE_Init(void)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ return(APP_LLD_BLE_SendCmdM0(HAL_BLE_INIT_CMDCODE,param_hal_BLE_IPCC));
+
+}
+
+//static uint32_t networkID = 0x71764129;
+uint8_t HAL_BLE_SetNetworkID(uint32_t ID)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ /* use param_hal_BLE_IPCC for Network ID */
+ bleparam_hal_BLE_Packet.InfoTime = ID ;// channel becomes network ID
+
+ return(APP_LLD_BLE_SendCmdM0(HAL_BLE_SETNETWORKID_CMDCODE,param_hal_BLE_IPCC));
+
+}
+
+uint8_t HAL_BLE_SendPacket(uint8_t channel, uint32_t wakeup_time, uint8_t* txBuffer, dataCase_t dataCaseTx)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+ rxStatus_Ptr[0]=&hal_status;
+ rxTimeStamp_Ptr[0]=&hal_timestamp_receive;
+ rxRSSI_Ptr[0]=&hal_rssi;
+
+
+ txBuffer_Ptr=txBuffer;
+ bleparam_hal_BLE_Packet.InfoTime = global_PacketNumber ; // used benefit of InfoTime to send parameter to M0
+
+ bleparam_hal_BLE_Packet.channel_tx = channel ;
+ bleparam_hal_BLE_Packet.WakeupTime = wakeup_time ;
+ bleparam_hal_BLE_Packet.setCase.dataCase = dataCaseTx;
+ memcpy((bleparam_hal_BLE_Packet.txrxBuffer.txBuffer),txBuffer_Ptr,txBuffer[1]+2); // to be replaced with \0 ended unit8_t
+
+ return(APP_LLD_BLE_SendCmdM0(HAL_BLE_SENDPACKET_CMDCODE,param_hal_BLE_IPCC));
+}
+
+uint8_t HAL_BLE_SendPacketWithAck(uint8_t channel, uint32_t wakeup_time, uint8_t* txBuffer, uint8_t* rxBuffer, uint32_t receive_timeout, dataCase_t dataCaseTx )
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+ rxStatus_Ptr[0]=&hal_status;
+ rxTimeStamp_Ptr[0]=&hal_timestamp_receive;
+ rxRSSI_Ptr[0]=&hal_rssi;
+
+ txBuffer_Ptr=txBuffer;
+ rxBuffer_Ptr[0]=rxBuffer;
+ bleparam_hal_BLE_Packet.InfoTime = global_PacketNumber ; // used benefit of InfoTime to send parameter to M0
+ bleparam_hal_BLE_Packet.StateMachineNo= global_PacketStopRx ; // used benefit of StateMachineNo to send parameter to M0
+
+ bleparam_hal_BLE_Packet.channel_tx = channel ;
+ bleparam_hal_BLE_Packet.WakeupTime = wakeup_time ;
+ bleparam_hal_BLE_Packet.ReceiveWindowLength = receive_timeout ;
+ bleparam_hal_BLE_Packet.setCase.dataCase = dataCaseTx;
+ memcpy((bleparam_hal_BLE_Packet.txrxBuffer.txBuffer),txBuffer_Ptr,txBuffer[1]+2); // to be replaced with \0 ended unit8_t
+
+ return(APP_LLD_BLE_SendCmdM0(HAL_BLE_SENDPACKETWITHACK_CMDCODE,param_hal_BLE_IPCC));
+}
+
+uint8_t HAL_BLE_ReceivePacket(uint8_t channel, uint32_t wakeup_time, uint8_t* rxBuffer, uint32_t receive_timeout, dataCase_t dataCaseRx)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+ rxStatus_Ptr[0]=&hal_status;
+ rxTimeStamp_Ptr[0]=&hal_timestamp_receive;
+ rxRSSI_Ptr[0]=&hal_rssi;
+
+ rxBuffer_Ptr[0]=rxBuffer;
+ bleparam_hal_BLE_Packet.InfoTime = global_PacketNumber ; // used benefit of InfoTime to send parameter to M0
+ bleparam_hal_BLE_Packet.StateMachineNo= global_PacketStopRx ; // used benefit of StateMachineNo to send parameter to M0
+
+
+ bleparam_hal_BLE_Packet.channel_rx = channel ;
+ bleparam_hal_BLE_Packet.WakeupTime = wakeup_time;
+ bleparam_hal_BLE_Packet.ReceiveWindowLength = receive_timeout ;
+ bleparam_hal_BLE_Packet.setCase.dataCase = dataCaseRx;
+
+ return(APP_LLD_BLE_SendCmdM0(HAL_BLE_RECEIVEPACKET_CMDCODE,param_hal_BLE_IPCC));
+}
+
+uint8_t HAL_BLE_ReceivePacketWithAck(uint8_t channel, uint32_t wakeup_time, uint8_t* rxBuffer, uint8_t* txBuffer, uint32_t receive_timeout, dataCase_t dataCaseRx )
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+ rxStatus_Ptr[0]=&hal_status;
+ rxTimeStamp_Ptr[0]=&hal_timestamp_receive;
+ rxRSSI_Ptr[0]=&hal_rssi;
+
+ txBuffer_Ptr=txBuffer;
+ rxBuffer_Ptr[0]=rxBuffer;
+ bleparam_hal_BLE_Packet.InfoTime = global_PacketNumber ; // used benefit of InfoTime to send parameter to M0
+ bleparam_hal_BLE_Packet.StateMachineNo= global_PacketStopRx ; // used benefit of StateMachineNo to send parameter to M0
+
+ bleparam_hal_BLE_Packet.channel_rx = channel ;
+ bleparam_hal_BLE_Packet.WakeupTime = wakeup_time;
+ bleparam_hal_BLE_Packet.ReceiveWindowLength = receive_timeout ;
+ bleparam_hal_BLE_Packet.setCase.dataCase = dataCaseRx;
+ memcpy((bleparam_hal_BLE_Packet.txrxBuffer.txBuffer),txBuffer_Ptr,txBuffer[1]+2); // to be replaced with \0 ended unit8_t
+
+ return(APP_LLD_BLE_SendCmdM0(HAL_BLE_RECEIVEPACKETWITHACK_CMDCODE,param_hal_BLE_IPCC));
+}
+
+/* ------------------------------- LL LEVEL -----------------------------------*/
+
+uint8_t LLD_BLE_GetStatus(uint32_t *time) /* return value */
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ /* use param_hal_BLE_IPCC for Network ID */
+ bleparam_hal_BLE_Packet.InfoTime= NULL;
+
+ uint8_t return_value;
+ return_value=(APP_LLD_BLE_SendCmdM0(LLD_BLE_GETSTATUS_CMDCODE,param_hal_BLE_IPCC)); /* return_value used */
+
+ *time = (bleparam_hal_BLE_Packet.InfoTime); /* pointer as result */
+ return(return_value); /* return_value send */
+
+}
+
+uint8_t LLD_BLE_StopActivity(void)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ return(APP_LLD_BLE_SendCmdM0(LLD_BLE_STOPACTIVITY_CMDCODE,param_hal_BLE_IPCC)); /* return_value send */
+}
+
+void LLD_BLE_SetEncryptionCount(uint8_t StateMachineNo, uint8_t *count_tx, uint8_t *count_rcv)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ /* use param_hal_BLE_IPCC for Network ID */
+ bleparam_hal_BLE_Packet.StateMachineNo=StateMachineNo;
+
+ for(uint8_t i = 0; i < 5; i++) {
+ bleparam_hal_BLE_Packet.txrxBuffer.txBuffer[i]=count_tx[i];
+ bleparam_hal_BLE_Packet.txrxBuffer.txBuffer[i+5]=count_rcv[i];
+ }
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETENCRYPTIONCOUNT_CMDCODE,param_hal_BLE_IPCC); /* return_value send */
+
+ return;
+}
+
+void LLD_BLE_SetEncryptionAttributes(uint8_t StateMachineNo, uint8_t *enc_iv, uint8_t *enc_key)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ /* use param_hal_BLE_IPCC for Network ID */
+ bleparam_hal_BLE_Packet.StateMachineNo=StateMachineNo;
+
+ for(uint8_t i = 0; i < 8; i++) {
+ bleparam_hal_BLE_Packet.txrxBuffer.txBuffer[i]=enc_iv[i];
+ bleparam_hal_BLE_Packet.txrxBuffer.txBuffer[i+8]=enc_key[i];
+ bleparam_hal_BLE_Packet.txrxBuffer.txBuffer[i+16]=enc_key[i+8];
+ }
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETENCRYPTIONATTRIBUTES_CMDCODE,param_hal_BLE_IPCC); /* return_value send */
+
+ return;
+}
+
+void LLD_BLE_SetEncryptFlags(uint8_t StateMachineNo, FunctionalState EncryptFlagTx, FunctionalState EncryptFlagRcv)
+{
+ /* Check the parameters */
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ /* use param_hal_BLE_IPCC for Network ID */
+ bleparam_hal_BLE_Packet.StateMachineNo=StateMachineNo;
+ bleparam_hal_BLE_Packet.channel_tx=(uint8_t)EncryptFlagTx;
+ bleparam_hal_BLE_Packet.channel_rx=(uint8_t)EncryptFlagRcv;
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETENCRYPTFLAGS_CMDCODE,param_hal_BLE_IPCC); /* return_value send */
+
+ return;
+}
+
+void LLD_BLE_EncryptPlainData(uint8_t *Key, uint8_t *plainData, uint8_t *cypherData)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ /* use param_hal_BLE_IPCC for Network ID */
+ memcpy((bleparam_hal_BLE_Packet.txrxBuffer.txBuffer),Key,128); // to be replaced with \0 ended unit8_t
+ memcpy((bleparam_hal_BLE_Packet.txrxBuffer.txBuffer+128),plainData,128); // to be replaced with \0 ended unit8_t
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_ENCRYPTPLAINDATA_CMDCODE,param_hal_BLE_IPCC); /* return_value used */
+
+ memcpy(cypherData,(bleparam_hal_BLE_Packet.txrxBuffer.rxBuffer),128); // to be replaced with \0 ended unit8_t
+
+ return;
+}
+
+void LLD_BLE_StartTone(uint8_t RF_channel, uint8_t powerLevel)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ /* use param_hal_BLE_IPCC for Network ID */
+ bleparam_hal_BLE_Packet.channel_tx= RF_channel;
+ bleparam_hal_BLE_Packet.StateMachineNo= powerLevel;
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_STARTTONE_CMDCODE,param_hal_BLE_IPCC); /* return_value send */
+
+ return;
+}
+
+/* without return */
+void LLD_BLE_SetChannelMap(uint8_t StateMachineNo, uint8_t *chan_remap) /* no return */
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ /* use param_hal_BLE_IPCC for Network ID */
+ bleparam_hal_BLE_Packet.StateMachineNo=StateMachineNo;
+
+ for(uint8_t i = 0; i < 5; i++) {
+ bleparam_hal_BLE_Packet.txrxBuffer.txBuffer[i]=chan_remap[i];
+ }
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETCHANNELMAP_CMDCODE,param_hal_BLE_IPCC); /* return_value used */
+
+ return;
+}
+
+void LLD_BLE_SetChannel(uint8_t StateMachineNo, uint8_t channel, uint8_t channel_increment)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ /* use param_hal_BLE_IPCC for Network ID */
+ bleparam_hal_BLE_Packet.StateMachineNo=StateMachineNo;
+ bleparam_hal_BLE_Packet.channel_tx= channel;
+ bleparam_hal_BLE_Packet.channel_rx= channel_increment;
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETCHANNEL_CMDCODE,param_hal_BLE_IPCC); /* return_value used */
+
+ return;
+}
+
+void LLD_BLE_SetTxAttributes(uint8_t StateMachineNo, uint32_t NetworkID, uint32_t crc_init, uint32_t sca)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ bleparam_hal_BLE_Packet.StateMachineNo=StateMachineNo;
+ bleparam_hal_BLE_Packet.InfoTime = NetworkID ;// channel becomes network ID
+ bleparam_hal_BLE_Packet.WakeupTime = crc_init;
+ bleparam_hal_BLE_Packet.ReceiveWindowLength = sca; // not used
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETTXATTRIBUTES_CMDCODE,param_hal_BLE_IPCC); /* return_value used */
+
+ return;
+}
+
+void LLD_BLE_SetBackToBackTime(uint32_t back_to_back_time)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ bleparam_hal_BLE_Packet.WakeupTime = back_to_back_time;// channel becomes network ID
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETBACKTOBACKTIME_CMDCODE,param_hal_BLE_IPCC); /* return */
+
+ return;
+}
+
+void LLD_BLE_SetTxPower(uint8_t powerLevel)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ bleparam_hal_BLE_Packet.StateMachineNo = powerLevel;// channel becomes network ID
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETTXPOWER_CMDCODE,param_hal_BLE_IPCC); /* return_value used */
+
+ return;
+}
+
+void LLD_BLE_SetTx_Rx_Phy(uint8_t StateMachineNo, uint8_t tx_phy, uint8_t rx_phy)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ bleparam_hal_BLE_Packet.StateMachineNo = StateMachineNo;// channel becomes network ID
+ bleparam_hal_BLE_Packet.channel_tx = tx_phy;// channel becomes network ID
+ bleparam_hal_BLE_Packet.channel_rx = rx_phy;// channel becomes network ID
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETTX_RX_PHY_CMDCODE,param_hal_BLE_IPCC); /* return_value used */
+
+ return;
+}
+
+void LLD_BLE_StopTone(void)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_STOPTONE_CMDCODE,param_hal_BLE_IPCC); /* return_value used */
+
+ return;
+}
+
+void LLD_BLE_SetReservedArea(ActionPacket *p)
+{
+
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ bleparam_hal_BLE_Packet.StateMachineNo=p->StateMachineNo;
+ bleparam_hal_BLE_Packet.channel_tx=p->next_true;
+ bleparam_hal_BLE_Packet.channel_rx=p->next_false;
+ bleparam_hal_BLE_Packet.WakeupTime=p->WakeupTime;
+ bleparam_hal_BLE_Packet.ReceiveWindowLength=p->ReceiveWindowLength;
+
+ bleparam_hal_BLE_Packet.actionPacketNb=(p->actionPacketNb);
+ bleparam_hal_BLE_Packet.ActionTag=(p->ActionTag);
+
+ rxStatus_Ptr[p->actionPacketNb]=&(p->status);
+ rxTimeStamp_Ptr[p->actionPacketNb]=&(p->timestamp_receive);
+ rxRSSI_Ptr[p->actionPacketNb]=&(p->rssi);
+
+ bleparam_hal_BLE_Packet.setCase.condCase=(condCase_t)p->condRoutine;
+ bleparam_hal_BLE_Packet.setCase.dataCase=(dataCase_t)p->dataRoutine;
+
+ if(bleparam_hal_BLE_Packet.ActionTag & TXRX) {
+
+ txBuffer_Ptr=p->data;
+ memcpy((bleparam_hal_BLE_Packet.txrxBuffer.txBuffer),txBuffer_Ptr,258); // to be replaced with \0 ended unit8_t
+
+ } else {
+ rxBuffer_Ptr[p->actionPacketNb]=p->data;
+ }
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETRESERVEDAREA_CMDCODE,param_hal_BLE_IPCC); /* return_value used */
+
+ return;
+
+}
+
+uint8_t LLD_BLE_MakeActionPacketPending(ActionPacket *p)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ bleparam_hal_BLE_Packet.actionPacketNb=(p->actionPacketNb);
+ bleparam_hal_BLE_Packet.InfoTime = global_PacketNumber ; // used benefit of time to send parameter to M0
+ bleparam_hal_BLE_Packet.StateMachineNo = global_PacketStopRx ;
+
+
+ return(APP_LLD_BLE_SendCmdM0(LLD_BLE_MAKEACTIONPACKETPENDING_CMDCODE,param_hal_BLE_IPCC)); /* return_value used */
+}
+
+void LLD_BLE_Init(uint16_t hs_startup_time, uint8_t low_speed_osc, uint32_t* hot_table, FunctionalState whitening)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ bleparam_hal_BLE_Packet.WakeupTime=(uint32_t)(hs_startup_time);
+ bleparam_hal_BLE_Packet.ActionTag=low_speed_osc;
+ bleparam_hal_BLE_Packet.actionPacketNb=(uint8_t)whitening;
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_INIT_CMDCODE,param_hal_BLE_IPCC); /* return_value used */
+
+ memcpy((uint8_t*)hot_table,(bleparam_hal_BLE_Packet.txrxBuffer.txBuffer),BLE_HOT_ANA_CONFIG_TABLE_LENGTH); // to be replaced with \0 ended unit8_t
+
+ return;
+
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/STM32_WPAN/App/lld_ble.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/STM32_WPAN/App/lld_ble.h
new file mode 100644
index 000000000..eabc03fe9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/STM32_WPAN/App/lld_ble.h
@@ -0,0 +1,229 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_lld_ble.h
+ * Description : Header for LLD 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 LLD_BLE_H
+#define LLD_BLE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+
+/* Exported types ------------------------------------------------------------*/
+
+/* Exported constants --------------------------------------------------------*/
+
+/* External variables --------------------------------------------------------*/
+
+/* Exported macros ------------------------------------------------------------*/
+
+/* Exported functions ------------------------------------------------------- */
+
+/* ---------------------------------------------------------------------------*/
+/* ------------------------------- LLD BLE -----------------------------------*/
+/* ---------------------------------------------------------------------------*/
+#define IRQ_RCV_OK (1UL<<31) /* The packet is received, and the CRC is valid. */
+#define BIT_TX_MODE (1UL<<18) /* The packet has been sent successfully. */
+
+#define HS_STARTUP_TIME (uint16_t)(0x001A) /* High Speed start up time 64 us */
+#define BLE_HOT_ANA_CONFIG_TABLE_LENGTH 60 /* LLD TESTING */
+
+#define RX_PHY_1MBPS 0x00
+#define RX_PHY_2MBPS 0x10
+#define TX_PHY_1MBPS 0x00
+#define TX_PHY_2MBPS 0x01
+#define BACK2BACK_TIME 50
+
+#define PLL_TRIG 0x01
+#define TXRX 0x02
+#define TIMER_WAKEUP 0x04
+#define NS_EN 0x08
+#define INC_CHAN 0x10
+#define RELATIVE 0x20
+#define TIMESTAMP_POSITION 0x80
+
+typedef enum {
+ STATE_MACHINE_0 = 0,
+ STATE_MACHINE_1,
+ STATE_MACHINE_2,
+ STATE_MACHINE_3,
+ STATE_MACHINE_4,
+ STATE_MACHINE_5,
+ STATE_MACHINE_6,
+ STATE_MACHINE_7,
+} StateMachine_t;
+
+/* condRoutine enum for condRoutine() */
+typedef enum
+ {
+ condCase_Done = 0,
+ condCase_Tx,
+ condCase_Rx,
+ condCase_Stop,
+ } condCase_t;
+
+/* dataRoutine enum for dataRoutine() */
+typedef enum
+ {
+ dataCase_Custom0 = 0,
+ dataCase_Custom1,
+ dataCase_Custom2,
+ dataCase_Custom3,
+ dataCase_Custom4,
+ dataCase_Custom5,
+ dataCase_Custom6,
+ dataCase_Custom7,
+ } dataCase_t;
+
+/* dataRoutine and condRoutine struct */
+typedef struct {
+ condCase_t condCase ; /* __I */
+ dataCase_t dataCase ; /* __I */
+} setCase_t;
+
+/* Structure for Buffer */
+typedef struct {
+ uint8_t txBuffer[260]; /* __I */ /*txBuffer + Encrypt*/
+ uint8_t rxBuffer[260]; /* __O */ /*rxBuffer + radioPacketNb=rxBuffer[257] */
+} buffer_hal_BLE_t;
+
+/* Parameter HAL LLD BLE Data Structure */
+typedef struct {
+ uint32_t WakeupTime; /* __I status_32[0]*/ /*WakeupTime + back2back + crc_init + hs_startup_time*/
+ uint32_t ReceiveWindowLength; /* __I status_32[1]*/ /*ReceiveWindowLength*/
+ uint32_t InfoTime; /* __I status_32[2]*/ /*InfoTime + NetworkID + global_PacketNumber */
+ uint32_t status; /* __O status_32[3]*/ /*status*/
+ uint32_t timestamp_receive; /* __O status_32[4]*/ /*timestamp_receive*/
+ uint32_t rssi; /* __O status_32[5]*/ /*rssi*/
+ uint8_t return_value; /* __IO */ /*return value*/
+ uint8_t channel_tx; /* __I status_8[0]*/ /*tx + flagTx + channel + tx_phy + next_true + RF_channel */
+ uint8_t channel_rx; /* __I status_8[1]*/ /*rx + flagRcv + increment + rx_phy + next_false */
+ uint8_t StateMachineNo; /* __I status_8[2]*/ /*StateMachineNo + powerLevel + global_PacketStopRx*/
+ uint8_t ActionTag; /* __I status_8[3]*/ /*ActionTag + low_speed_osc*/
+ uint8_t actionPacketNb; /* __I status_8[4]*/ /*actionPacketNb + whitening*/
+ setCase_t setCase; /* __I status_8[5] status_8[6]*/ /*condRoutine , dataRoutine*/
+ buffer_hal_BLE_t txrxBuffer; /*data*/
+} param_hal_BLE_t;
+
+typedef struct {
+ uint8_t StateMachineNo ; /* This parameter indicates the state machine number for this action. From 0 to 7. */
+ uint8_t ActionTag; /* The configuration of the current action.
+ * Action Tag: PLL_TRIG, TXRX, TIMER_WAKEUP, INC_CHAN, TIMESTAMP_POSITION, RELATIVE */
+ uint32_t WakeupTime; /* Contains the wakeup time in microsecond if it is relative.
+ * It should not be more than 24 bits if it is absolute.
+ * It only applies if TIMER_WAKEUP flag is set in ActionTag. */
+ uint32_t ReceiveWindowLength; /* Sets RX window size in microsecond. Applicable only for RX actions. */
+ uint8_t *data; /* Pointer to the array with the data to send (header, length and data field), for TX.
+ * Pointer to the array where the data received are copied, for RX.
+ * In case of RX, the array must have the max size MAX_PACKET_LENGTH. */
+ uint32_t status; /* The Status Register with the information on the action. */
+ uint32_t timestamp_receive; /* This field contains the timestamp when a packet is received.
+ * Intended to be used in the dataRoutine() callback routine. RX only. */
+ int32_t rssi; /* The rssi of the packet was received with. RX only. */
+ uint8_t next_true; /* Pointer to next ActionPacket if condRoutine() returns TRUE */
+ uint8_t next_false; /* Pointer to next ActionPacket if condRoutine() returns FALSE */
+ uint8_t condRoutine; /* User callback that decide the next ActionPacket to use.
+ * It is time critical. Routine must end within 45 us. */
+ uint8_t dataRoutine; /* User callback for managing data. */
+ uint8_t actionPacketNb; /* User callback for managing data. */
+} ActionPacket;
+
+typedef enum
+ {
+ APACKET_0 = 0,
+ APACKET_1,
+ APACKET_2,
+ APACKET_3,
+ APACKET_4,
+ APACKET_5,
+ APACKET_6,
+ APACKET_7,
+ APACKET_NULL=0xFF, // to be place at the end
+} ActionPacket_Nb;
+
+/* Enum for Cmd Code */
+typedef enum
+ {
+ /* hal_BLE.c part */
+ HAL_BLE_UNUSED_CMDCODE = 0,
+ HAL_BLE_INIT_CMDCODE ,
+ HAL_BLE_SETNETWORKID_CMDCODE,
+ HAL_BLE_SENDPACKET_CMDCODE,
+ HAL_BLE_SENDPACKETWITHACK_CMDCODE,
+ HAL_BLE_RECEIVEPACKET_CMDCODE,
+ HAL_BLE_RECEIVEPACKETWITHACK_CMDCODE,
+ /* ipBLE_lld.c part */
+ LLD_BLE_GETSTATUS_CMDCODE,
+ LLD_BLE_SETCHANNELMAP_CMDCODE,
+ LLD_BLE_SETCHANNEL_CMDCODE,
+ LLD_BLE_SETTXATTRIBUTES_CMDCODE,
+ LLD_BLE_SETBACKTOBACKTIME_CMDCODE,
+ LLD_BLE_SETTXPOWER_CMDCODE,
+ LLD_BLE_SETTX_RX_PHY_CMDCODE,
+ LLD_BLE_STOPACTIVITY_CMDCODE,
+ LLD_BLE_SETENCRYPTIONCOUNT_CMDCODE,
+ LLD_BLE_SETENCRYPTIONATTRIBUTES_CMDCODE,
+ LLD_BLE_SETENCRYPTFLAGS_CMDCODE,
+ LLD_BLE_ENCRYPTPLAINDATA_CMDCODE,
+ LLD_BLE_STARTTONE_CMDCODE,
+ LLD_BLE_STOPTONE_CMDCODE,
+ LLD_BLE_SETRESERVEDAREA_CMDCODE,
+ LLD_BLE_MAKEACTIONPACKETPENDING_CMDCODE,
+ LLD_BLE_INIT_CMDCODE,
+} hal_BLE_Code_t;
+
+uint8_t HAL_BLE_Init(void);
+uint8_t HAL_BLE_SetNetworkID(uint32_t ID);
+uint8_t HAL_BLE_SendPacket(uint8_t channel, uint32_t wakeup_time, uint8_t* txBuffer, dataCase_t dataCaseTx);
+uint8_t HAL_BLE_SendPacketWithAck(uint8_t channel, uint32_t wakeup_time, uint8_t* txBuffer, uint8_t* rxBuffer, uint32_t receive_timeout, dataCase_t dataCaseTxAck );
+uint8_t HAL_BLE_ReceivePacket(uint8_t channel, uint32_t wakeup_time, uint8_t* rxBuffer, uint32_t receive_timeout, dataCase_t dataCaseTx );
+uint8_t HAL_BLE_ReceivePacketWithAck(uint8_t channel, uint32_t wakeup_time, uint8_t* rxBuffer, uint8_t* txBuffer, uint32_t receive_timeout, dataCase_t dataCaseTxAck );
+
+uint8_t LLD_BLE_GetStatus(uint32_t *time);
+void LLD_BLE_SetChannelMap(uint8_t StateMachineNo,uint8_t *chan_remap);
+void LLD_BLE_SetChannel(uint8_t StateMachineNo, uint8_t channel,uint8_t channel_increment);
+void LLD_BLE_SetTxAttributes(uint8_t StateMachineNo, uint32_t NetworkID, uint32_t crc_init, uint32_t sca);
+void LLD_BLE_SetBackToBackTime(uint32_t back_to_back_time);
+void LLD_BLE_SetTxPower(uint8_t powerLevel);
+void LLD_BLE_SetTx_Rx_Phy(uint8_t StateMachineNo, uint8_t tx_phy, uint8_t rx_phy);
+uint8_t LLD_BLE_StopActivity(void);
+void LLD_BLE_SetEncryptionCount(uint8_t StateMachineNo, uint8_t *count_tx, uint8_t *count_rcv);
+void LLD_BLE_SetEncryptionAttributes(uint8_t StateMachineNo, uint8_t *enc_iv, uint8_t *enc_key);
+void LLD_BLE_SetEncryptFlags(uint8_t StateMachineNo, FunctionalState EncryptFlagTx, FunctionalState EncryptFlagRcv);
+void LLD_BLE_EncryptPlainData(uint8_t *Key, uint8_t *plainData, uint8_t *cypherData);
+void LLD_BLE_StartTone(uint8_t RF_channel, uint8_t powerLevel);
+void LLD_BLE_StopTone(void);
+
+//void LLD_BLE_CrystalCheck(void);
+void LLD_BLE_SetReservedArea(ActionPacket *p);
+uint8_t LLD_BLE_MakeActionPacketPending(ActionPacket *p);
+void LLD_BLE_Init(uint16_t hs_startup_time, uint8_t low_speed_osc, uint32_t* hot_table, FunctionalState whitening);
+//void LLD_BLE_IRQHandler(void);
+
+
+/* only for M4 */
+void APP_LLD_BLE_SetdataRoutineOption(uint32_t PacketNumber, uint8_t PacketStop );
+
+#endif /* LLD_BLE_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/STM32_WPAN/Target/hw_ipcc.c
new file mode 100644
index 000000000..e7049681d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/STM32_WPAN/Target/hw_ipcc.c
@@ -0,0 +1,675 @@
+/**
+ ******************************************************************************
+ * 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 LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_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 LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_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 )
+{
+ /**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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 */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_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/LLD_BLE/LLD_BLE_Chat/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/readme.txt
index 7f0f90db4..10aaa082f 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/readme.txt
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Chat/readme.txt
@@ -20,14 +20,62 @@
@par Example Description
-This example is to communicate Over The Air (OTA) using LLD_BLE between 2 boards in BLE Radio format not BLE Stack protocol.
+How to create a "Chat" talk between 2 STM32WB55xx boards using terminals.
+
+@note The objectives are to communicate using LLD_BLE between 2 boards,
+ in BLE Radio format not BLE Stack protocol.
+ LLD_BLE_Chat uses 2 terminal and through uart by typing Text on terminal.
+ It sends the text into the payload and this payload is received on other board
+ and text into the payload is displayed on terminal using uart.
+
+@note LLD_BLE is a 2-level stack implemented just over the Hardware and Radio layer.
+ Lowest Layer also called Low Level or LL
+ It is just over the Hardware and Radio Layer.
+ It contains all the API to Set/Configure/Initialize all the parameters for Sending/receiving BLE Radio format packet data
+ Over LL layer there is HAL level
+ It contains a reduced number of API to Send/Receive BLE Radio format packet with predefined parameters
+ It works by calling a set of LL API
+ It make simple and fast to Send/receive Packet
+ But It does allow the user to change all the Radio parameters
+
+@note LL is for user that want to customize the Radio and BLE parameters, it is more complex to implement
+ HAL is for user that want to Send/Receive in a very simple way less complex, without configuring LL
+ lld_ble module contains LLD API HAL and LL API
+ app_lld_ble module contains Transport Layer Command call from CPU1 to CPU2 + Buffer management + IT Radio management from CPU2
@par Keywords
-LLD_BLE, HAL send and receive Packet
+LLD_BLE, Connectivity, BLE, LLD, IPCC, HAL, Dual core, send and receive Packet
@par Directory contents
-
+
+ - LLD_BLE/LLD_BLE_Chat/STM32_WPAN/App/app_lld_ble.h Header for app_lld_ble.c module
+ - LLD_BLE/LLD_BLE_Chat/STM32_WPAN/App/lld_ble.h Header for lld_ble.c module
+ - LLD_BLE/LLD_BLE_Chat/STM32_WPAN/App/app_lld_ble.c contains TL management and Buffer for LLD BLE Application
+ - LLD_BLE/LLD_BLE_Chat/STM32_WPAN/App/lld_ble.c contains LL and HAL API
+ - LLD_BLE/LLD_BLE_Chat/STM32_WPAN/Target/hw_ipcc.c IPCC Driver
+ - LLD_BLE/LLD_BLE_Chat/Core/Inc/app_common.h Header for all modules with common definition
+ - LLD_BLE/LLD_BLE_Chat/Core/Inc/app_conf.h Parameters configuration file of the application
+ - LLD_BLE/LLD_BLE_Chat/Core/Inc/app_entry.h Parameters configuration file of the application
+ - LLD_BLE/LLD_BLE_Chat/Core/Inc/gpio_lld.h Parameters for gpio configuration file of the application
+ - LLD_BLE/LLD_BLE_Chat/Core/Inc/hw_conf.h Configuration file of the HW
+ - LLD_BLE/LLD_BLE_Chat/Core/Inc/hw_if.h Configuration file of the HW
+ - LLD_BLE/LLD_BLE_Chat/Core/Inc/main.h Header for main.c module
+ - LLD_BLE/LLD_BLE_Chat/Core/Inc/stm_logging.h Header for stm_logging.c module
+ - LLD_BLE/LLD_BLE_Chat/Core/Inc/stm32_lpm_if.h Header for stm32_lpm_if.c module
+ - LLD_BLE/LLD_BLE_Chat/Core/Inc/stm32wbxx_hal_conf.h HAL configuration file
+ - LLD_BLE/LLD_BLE_Chat/Core/Inc/stm32wbxx_it.h Interrupt handlers header file
+ - LLD_BLE/LLD_BLE_Chat/Core/Inc/utilities_conf.h Configuration file of the utilities
+ - LLD_BLE/LLD_BLE_Chat/Core/Src/app_entry.c Initialization of the application
+ - LLD_BLE/LLD_BLE_Chat/Core/Src/gpio_lld.c GPIO for for application
+ - LLD_BLE/LLD_BLE_Chat/Core/Src/hw_uart.c UART Driver
+ - LLD_BLE/LLD_BLE_Chat/Core/Src/main.c Main program
+ - LLD_BLE/LLD_BLE_Chat/Core/Src/stm_logging.c Logging for application
+ - LLD_BLE/LLD_BLE_Chat/Core/Src/stm32_lpm_if.c Low Power Manager Interface
+ - LLD_BLE/LLD_BLE_Chat/Core/Src/stm32wbxx_it.c Interrupt handlers
+ - LLD_BLE/LLD_BLE_Chat/Core/Src/system_stm32wbxx.c stm32wbxx system source file
+ - LLD_BLE/LLD_BLE_Chat/Core/Src/stm32wbxx_hal_msp.c HAL MPS for application
+
@par Hardware and Software environment
- This application uses two STM32WB55xx devices.
@@ -62,60 +110,70 @@ In order to make the program work, you must do the following:
and load your image into the other target memory
+ load stm32wb5x_BLE_LLD_fw.bin
- Run the application
-
- If you want to control this application, you can directly press buttons
- In this order and described into main.c:
-
- /////////////// OBJECTIVES //////////////////////////
- The objectif is to communicate Over The Air (OTA) using LLD_BLE between 2 boards, in BLE Radio format not BLE Stack protocol.
-
- LLD_BLE is a 2-level stack implemented just over the Hardware and Radio layer.
- Lowest Layer also called Low Level or LL
- It is just over the Hardware and Radio Layer.
- It contains all the API to Set/Configure/Initialize all the parameters for Sending/receiving BLE Radio format packet data OTA
- Over LL layer there is HAL level
- It contains a reduced number of API to Send/Receive BLE Radio format packet with predefined parameters
- It works by calling a set of LL API
- It make simple and fast to Send/receive Packet
- But It does allow the user to change all the Radio parameters
-
- LL is for user that want to customize the Radio and BLE parameters, it is more complex to implement
- HAL is for user that want to Send/Receive in a very simple way less complex, without configuring LL
-
- lld_ble contains LLD API HAL and LL API
- app_lld_ble contains Transport Layer Command call from CPU1 to CPU2 + Buffer management + IT Radio management from CPU2
- /////////////// APPLICATION //////////////////////////
- After power On or Reset (ALL the LED are ON)
+LLD_BLE_Chat used only HAL API for Send/Receive not LL
+
+In this order and described into main.c:
+
+After power On or Reset (ALL the LED are ON), Init is done
+
+ 1) Open 2 terminal 1 per Board (reset if you want Info on Terminal and first "LLD BLE >" )
+ Start to CHAT....
+
+ When Power or Reset, Init is automatically run with:
+ CHAT_BLE_Init
+ - HAL_BLE_Init(); // Init the Radio in BLE mode
+ - HAL_BLE_SetNetworkID(chatID); // Set the network ID
+ + encrypt setting without enabling yet
+ - LLD_BLE_SetEncryptionAttributes(STATE_MACHINE_0, chatenc_iv, chatenc_key); // Set the init Vector and the Key for Encrypt
+ - LLD_BLE_SetEncryptionCount(STATE_MACHINE_0, &chatcount_tx[0], &chatcount_rcv[0]); // Set the account TX and RX
+
+ After CHAT_BLE_Init, Listen is done using Sequencer:
+ CHAT_ListenPacket
+ - APP_LLD_BLE_SetdataRoutineOption(chatPacketNumberRx,chatPacketStopRx); // Set dataRoutine option : NB of listen packet + Stop if a RX packet is OK
+ - HAL_BLE_ReceivePacketWithAck(chatChannel, chatWakeup, chatrxBuffer, chatAcktxBuffer, chatReceive, dataRoutine_HAL_RxAck); // HAL API for Receiving and Send Ack
+
+ if no packet Receive, and if a packet has to be send: CHAT_ListenPacket is recursively called
+ else
+ if packet Receive, it prints the Results on Terminal using uart.
+ or
+ if a packet has to be send, it calls CHAT_SendPacket
+
+ A packet has to be send when Text to chat has been write and return into the Terminal uar. In this case CHAT_SendPacket is called instead of CHAT_ListenPacket
+ CHAT_SendPacket
+ - APP_LLD_BLE_SetdataRoutineOption(chatPacketNumberTx,chatPacketStopRx); // Set dataRoutine option : NB of send packet + Stop if a RX ACK packet is OK
+ - HAL_BLE_SendPacketWithAck(chatChannel, chatWakeup, chattxBuffer, chatAckrxBuffer, chatReceiveAck, dataRoutine_HAL_TxAck); // HAL API for Send and wait Ack
+
+ 2) Press SW1 to alternatively Encrypt/UnEncrypt the Chat
- 1)Open 2 terminal 1 per Board (reset if you want Info on Terminal and first "LLD BLE >" )
- Start to CHAT....
+ LLD_BLE_StopActivity is done before Alterning Encrypt/UnEncrypt
+
+ CHAT_Encrypt
+ - LLD_BLE_SetEncryptFlags(STATE_MACHINE_0, ENABLE, ENABLE);
+ or
+ CHAT_UnEncrypt
+ - LLD_BLE_SetEncryptFlags(STATE_MACHINE_0, DISABLE, DISABLE);
- 2) Press SW1 Encrypt/UnEncrypt the chat
Encrypt when BLUE LED is off
Non-Encrypt (UnEncrypt) BLUE LED is on (default)
- This also call the StopRadio API
+
+ 3) Press SW2 to Start the Tone
- Serial Port Setup TERMINAL
- Baud Rate:115200 / Data:8 bits / Parity:none / Stop:1bit / Flow Control:none
-
- A set of parameters common to HAL API are proposed
+ LLD_BLE_StartTone is launched only one time (SW2 inactive after)
+ It can be stopped by resetting board
+ or by using LLD_BLE_StopTone
+ Chat will not work after StartTone: reset board must be performed after StartTone
+
+ 3) Press SW3 to Stop the Tone
- channel / WakeupTime / ReceiveWindowTime are predefined as chatChannel / chatWakeup / chatReceive
+ LLD_BLE_StopTone is launched only one time (SW3 inactive after)
+ Chat will not work after StopTone: reset board must be performed after StopTone
- networkID=chatID for HAL
+Serial Port Setup TERMINAL
+Baud Rate:115200 / Data:8 bits / Parity:none / Stop:1bit / Flow Control:none
- TxBuffer is also predefined, chattxBufferTab maximum size is 258
- 1 for Header (set by user)
- 1 for Payload Length (set by user / or sw) should be aligned with the payload Length
- 255 max for Payload if Non-Encrypt
- 251 max if Encrypt (4 bytes are added by hardware)
-
- TxBuffer for ACK answer is set as chatAcktxBufferTab
-
- dataRoutine for HAL API Send is chatdataCaseTx=dataRoutine_HAL_TxAck
- dataRoutine for HAL API Receive is chatdataCaseRx=dataRoutine_HAL_RxAck
-
+255 max for Payload if Non-Encrypt
+251 max if Encrypt (4 bytes are added by hardware)
* <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
*/ \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/app_common.h
new file mode 100644
index 000000000..5bb0f82f1
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/app_common.h
@@ -0,0 +1,124 @@
+/* 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 "main.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 *
+ * -------------------------------- */
+
+#ifndef MAX
+#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+
+#ifndef MIN
+#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
+
+#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
+
+#define CRITICAL_BEGIN( ) M_BEGIN BACKUP_PRIMASK(); DISABLE_IRQ()
+
+#define CRITICAL_END( ) RESTORE_PRIMASK(); 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/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/app_conf.h
new file mode 100644
index 000000000..5e8356876
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/app_conf.h
@@ -0,0 +1,345 @@
+/* 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 M0 traces/log messages
+ * This parameter defines the number of asynchronous events that can be stored in the M0 test FW before
+ * being reported to the M4 which will re-build traces/log messages before to send them to UART.
+ * This parameter is combined with the CFG_TL_MOST_EVENT_PAYLOAD_SIZE to calculate the queue size needed by M0 for traces.
+ */
+#define CFG_TL_EVT_QUEUE_LENGTH 20
+/**
+ * TL_EVENT_FRAME_SIZE is the size of the packets transfered between M0 and M4 through IPCC.
+ * Note 1 : thoose packets are first put in a trace queue (see DBG_TRACE_MSG_QUEUE_SIZE) before beeing sent to UART
+ * Note 2 : Queue size must be higher than a M0 trace buffer max size (see LOG_BUFFER_SIZE_MAX in M0 FW)
+ */
+#define CFG_TL_MOST_EVENT_PAYLOAD_SIZE 255
+
+#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 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 1
+#else
+#define CFG_LED_SUPPORTED 1
+#define CFG_BUTTON_SUPPORTED 0
+#endif /* CFG_FULL_LOW_POWER */
+
+#ifdef STM32WB35xx
+#define PUSH_BUTTON_SW1_EXTI_IRQHandler EXTI0_IRQHandler
+#define PUSH_BUTTON_SW2_EXTI_IRQHandler EXTI4_IRQHandler
+#define PUSH_BUTTON_SW3_EXTI_IRQHandler EXTI9_5_IRQHandler
+#else
+#define PUSH_BUTTON_SW1_EXTI_IRQHandler EXTI4_IRQHandler
+#define PUSH_BUTTON_SW2_EXTI_IRQHandler EXTI0_IRQHandler
+#define PUSH_BUTTON_SW3_EXTI_IRQHandler EXTI1_IRQHandler
+#endif
+/* 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_CMD_FROM_M0_TO_M4,
+ CFG_TASK_SEND_CLI_TO_M0,
+ CFG_TASK_SEND_TO_M0,
+ CFG_TASK_HAL_BLE_INIT,
+/* USER CODE BEGIN IdleTask */
+ CFG_TASK_HAL_BLE_SENDPACKET,
+ CFG_TASK_HAL_BLE_RECEIVEPACKET,
+/* USER CODE END IdleTask */
+ CFG_TASK_SYSTEM_HCI_ASYNCH_EVT,
+ CFG_TASK_PROCESS_UART_RX_BUFFER,
+ CFG_TASK_PROCESS_UART_RX_IT,
+ CFG_TASK_PROCESS_UART_TX_IT,
+ CFG_TASK_NBR /**< Shall be last in the list */
+} CFG_IdleTask_Id_t;
+
+/**
+ * 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_RECEIVE_RSPACKEVT,
+ CFG_EVT_RECEIVE_ENDPACKEVT,
+} 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_LLDTESTS,
+ CFG_LPM_APP_LLD_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/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/app_entry.h
new file mode 100644
index 000000000..77ead2384
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/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/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/gpio_lld.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/gpio_lld.h
new file mode 100644
index 000000000..71678202a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/gpio_lld.h
@@ -0,0 +1,91 @@
+/*
+ * gpio_lld.h
+ *
+ */
+
+#ifndef GPIO_LLD_H_
+#define GPIO_LLD_H_
+
+#if defined (USE_SIMU) || defined (USE_FPGA)
+/* Be carefull with GPIO used on SIMU plateform */
+// GPIOA port is used for CRC management on MASTER only
+// GPIOC ad GPIOD ports are used to send messages between the 2 DORYs
+#define GPIO_TX_PIN GPIO_PIN_8
+#define GPIO_TX_PORT GPIOB
+
+#define GPIO_1_PIN GPIO_PIN_9
+#define GPIO_1_PORT GPIOB
+#else /* on Nucleo boards */
+/* Use GPIO PB.8 to monitor TX time during valid on Boards */
+#define GPIO_TX_PIN GPIO_PIN_8
+#define GPIO_TX_PORT GPIOB
+
+#define GPIO_HARD_FAULT_PIN GPIO_PIN_4
+#define GPIO_HARD_FAULT_PORT GPIOA
+
+#define GPIO_MCO_PIN GPIO_PIN_15
+#define GPIO_MCO_PORT GPIOA
+
+#ifdef STM32WB35xx
+#define GPIO_1_PIN GPIO_PIN_3
+#define GPIO_1_PORT GPIOB
+
+#define GPIO_2_PIN GPIO_PIN_4
+#define GPIO_2_PORT GPIOB
+#else
+#define GPIO_1_PIN GPIO_PIN_2
+#define GPIO_1_PORT GPIOC
+
+#define GPIO_2_PIN GPIO_PIN_3
+#define GPIO_2_PORT GPIOC
+#endif
+#endif
+
+// External PA TX/RX pin is fixed by the chip
+#define GPIO_EXT_PA_TX_PIN GPIO_PIN_0
+#define GPIO_EXT_PA_TX_PORT GPIOB
+// External PA enable pin is chosen by user
+#define GPIO_EXT_PA_EN_PIN GPIO_PIN_9
+#define GPIO_EXT_PA_EN_PORT GPIOB
+
+void gpio_lld_phy_init( void );
+void gpio_lld_phy_gpioTx_up(void);
+void gpio_lld_phy_gpioTx_down(void);
+void gpio_lld_phy_gpioHardFault_up(void);
+void gpio_lld_phy_gpioHardFault_down(void);
+void gpio_lld_phy_gpio1_up(void);
+void gpio_lld_phy_gpio1_down(void);
+void gpio_lld_phy_gpio2_up(void);
+void gpio_lld_phy_gpio2_down(void);
+void gpio_lld_phy_deInit(void);
+
+void gpio_lld_mco_init(uint32_t mcoSource, uint32_t mcoDiv);
+void gpio_lld_mco_deInit(void);
+
+void gpio_lld_extPa_init(void);
+void gpio_lld_extPa_deInit(void);
+
+#ifdef USE_SIMU
+void gpio_lld_SimuMaster_init(void);
+void gpio_lld_SimuSlave_init(void);
+#endif
+
+void gpio_lld_lpuart_init(void);
+void gpio_lld_lpuart_deInit(void);
+
+void gpio_lld_usart_init(void);
+void gpio_lld_usart_deInit(void);
+
+#if !defined (USE_SIMU) && !defined(USE_FPGA)
+void gpio_lld_pa2_init(uint8_t mode);
+void gpio_lld_pa2_deInit(void);
+
+void gpio_lld_dtb_init(uint8_t dtbMode);
+void gpio_lld_dtb_deInit(void);
+#endif
+
+void gpio_lld_led1_toggle(void);
+void gpio_lld_led2_toggle(void);
+void gpio_lld_led3_toggle(void);
+
+#endif /* GPIO_LLD_H_ */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/hw_conf.h
new file mode 100644
index 000000000..24e76f61c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/hw_conf.h
@@ -0,0 +1,90 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : hw_conf.h
+ * Description : Hardware configuration file for 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 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 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
+
+/******************************************************************************
+ * External PA
+ *****************************************************************************/
+
+#define CFG_HW_EXTPA_ENABLED 1
+
+#endif /*HW_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/hw_if.h
new file mode 100644
index 000000000..8851f00a4
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/hw_if.h
@@ -0,0 +1,115 @@
+/* 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
+#ifdef STM32WB35xx
+#include "nucleo_wb35ce.h"
+#else
+#include "stm32wbxx_nucleo.h"
+#endif
+#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;
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern UART_HandleTypeDef hlpuart1;
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern UART_HandleTypeDef huart1;
+extern DMA_HandleTypeDef hdma_usart1_tx;
+#endif
+
+//void HW_UART_Init(hw_uart_id_t hw_uart_id);
+hw_status_t HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+hw_status_t 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));
+#if 0
+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);
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+void MX_LPUART1_UART_Init(void);
+void MX_LPUART1_UART_DeInit(void);
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+void MX_USART1_UART_Init(void);
+void MX_USART1_UART_DeInit(void);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*HW_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/main.h
new file mode 100644
index 000000000..0c024028b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/main.h
@@ -0,0 +1,107 @@
+/* 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 ------------------------------------------------------------------*/
+
+/* 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);
+void SystemClock_Config_HSE(uint32_t usePLL);
+void SystemClock_Config_MSI(uint32_t usePLL);
+
+/* USER CODE BEGIN EFP */
+
+/* USER CODE END EFP */
+
+/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN Private defines */
+
+
+/*
+ In this example TIM2 input clock (TIM2CLK) is set to APB1 clock (PCLK1),
+ since APB1 prescaler is equal to 1.
+ TIM2CLK = PCLK1
+ PCLK1 = HCLK
+ => TIM2CLK = HCLK = SystemCoreClock
+ To get TIM2 counter clock at 10 KHz, the Prescaler is computed as following:
+ Prescaler = (TIM2CLK / TIM2 counter clock) - 1
+ Prescaler = (SystemCoreClock /10 KHz) - 1
+
+ Note:
+ SystemCoreClock variable holds HCLK frequency and is defined in system_stm32wbxx.c file.
+ Each time the core clock (HCLK) changes, user had to update SystemCoreClock
+ variable value. Otherwise, any configuration based on this variable will be incorrect.
+ This variable is updated in three ways:
+ 1) by calling CMSIS function SystemCoreClockUpdate()
+ 2) by calling HAL API function HAL_RCC_GetSysClockFreq()
+ 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
+ ----------------------------------------------------------------------- */
+
+/* Compute the prescaler value to have TIMx counter clock equal to 10000 Hz */
+
+#define PRESCALER_VALUE (uint32_t)(((SystemCoreClock) / (1000000)) - 1)
+
+ /* Initialize TIMx peripheral as follows:
+ + Period = 10000 - 1
+ + Prescaler = (SystemCoreClock/10000) - 1
+ + ClockDivision = 0
+ + Counter direction = Up
+ */
+
+#define PERIOD_VALUE (1000000 - 1);
+
+
+/* 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/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/stm32_lpm_if.h
new file mode 100644
index 000000000..dac7e2cbb
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/stm32_lpm_if.h
@@ -0,0 +1,79 @@
+/**
+ ******************************************************************************
+ * @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
+ *
+ ******************************************************************************
+ */
+
+/* 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/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/stm32wbxx_hal_conf.h
new file mode 100644
index 000000000..365809937
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/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_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_EXTI_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_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 (32000000UL) /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (HSE_STARTUP_TIMEOUT)
+ #define HSE_STARTUP_TIMEOUT (100UL) /*!< 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 (4000000UL) /*!< 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 (16000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+ * @brief Internal Low Speed oscillator (LSI1) value.
+ */
+#if !defined (LSI1_VALUE)
+ #define LSI1_VALUE (32000UL) /*!< 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 (32000UL) /*!< 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 (32768UL) /*!< 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 (48000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI48_VALUE */
+
+#if !defined (LSE_STARTUP_TIMEOUT)
+ #define LSE_STARTUP_TIMEOUT (5000UL) /*!< 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 (48000UL) /*!< 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 (3300UL) /*!< Value of VDD in mv */
+#define TICK_INT_PRIORITY ((1UL<<__NVIC_PRIO_BITS) - 1UL) /*!< 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((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/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/stm32wbxx_it.h
new file mode 100644
index 000000000..1fa67b9b2
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/stm32wbxx_it.h
@@ -0,0 +1,88 @@
+/* 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);
+#ifdef STM32WB35xx
+void DMA1_Channel4_IRQHandler(void);
+void DMA2_Channel4_IRQHandler(void);
+#else
+void DMA1_Channel1_IRQHandler(void);
+void DMA1_Channel2_IRQHandler(void);
+#endif
+void USART1_IRQHandler(void);
+void LPUART1_IRQHandler(void);
+/* USER CODE BEGIN EFP */
+#if 0
+void RTC_WKUP_IRQHandler(void);
+#endif
+void IPCC_C1_TX_IRQHandler(void);
+void IPCC_C1_RX_IRQHandler(void);
+#if 1 // Not needed for LLD tests : remove to use less power
+void PUSH_BUTTON_SW1_EXTI_IRQHandler(void);
+void PUSH_BUTTON_SW2_EXTI_IRQHandler(void);
+void PUSH_BUTTON_SW3_EXTI_IRQHandler(void);
+void TIM2_IRQHandler(void);
+#endif
+/* 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/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/stm_logging.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/stm_logging.h
new file mode 100644
index 000000000..39e9fbd2e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/stm_logging.h
@@ -0,0 +1,63 @@
+/**
+ ******************************************************************************
+ * 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/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/utilities_conf.h
new file mode 100644
index 000000000..4dde3509a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/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/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/app_entry.c
new file mode 100644
index 000000000..dae385caf
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/app_entry.c
@@ -0,0 +1,476 @@
+/* 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 "app_entry.h"
+#include "app_lld_ble.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 -----------------------------------------------------------*/
+/* 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 -----------------------------------------------*/
+#if(CFG_DEBUG_TRACE != 0)
+size_t DbgTraceWrite(int handle, const unsigned char * buf, size_t bufSize);
+#endif
+
+/* 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);
+
+/* USER CODE BEGIN PFP */
+static void Led_Init( void );
+static void Button_Init( void );
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APPE_Init( void )
+{
+ /**< Configure the system Power Mode */
+ SystemPower_Config();
+
+/* USER CODE BEGIN APPE_Init_1 */
+ /* initialize debugger module if supported and debug trace if activated */
+ Init_Debug();
+
+ Led_Init();
+ Button_Init();
+
+/* USER CODE END APPE_Init_1 */
+ /* Initialize all transport layers and start CPU2 which will send back a ready event to CPU1 */
+ appe_Tl_Init();
+
+ /**
+ * From now, the application is waiting for the ready event ( sub event : SHCI_SUB_EVT_CODE_READY / payload : WIRELESS_FW_RUNNING)
+ * received on the system channel before starting the LLD test appli using system message SHCI_OPCODE_C2_LLD_TESTS_INIT
+ * 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 EXTI lines */
+ LL_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+ LL_C2_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+
+#else
+ /* Disable debugger EXTI lines */
+ LL_EXTI_DisableIT_32_63(LL_EXTI_LINE_48);
+ LL_C2_EXTI_DisableIT_32_63(LL_EXTI_LINE_48);
+
+ /**
+ * Do not keep debugger enabled while in any low power mode
+ */
+ HAL_DBGMCU_DisableDBGSleepMode();
+ HAL_DBGMCU_DisableDBGStopMode();
+ HAL_DBGMCU_DisableDBGStandbyMode();
+#endif /* (CFG_DEBUGGER_SUPPORTED == 1) */
+
+#if(CFG_DEBUG_TRACE != 0)
+ DbgTraceInit();
+#endif
+
+ /* Send a first trace to debug trace port to see that M4 is alive */
+ APP_DBG("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
+#ifdef STM32WB35xx
+ APP_DBG("traces init done on Little DORY M4");
+#else
+ APP_DBG("traces init done on DORY M4");
+#endif
+ APP_DBG("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
+
+ 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 )
+{
+ // Disable internal wake-up which is active by default and is for RTC wake-up
+ LL_PWR_DisableInternWU();
+
+ // Before going to stop or standby modes, do the settings so that system clock and IP80215.4 clock
+ // start on HSI automatically
+ LL_RCC_HSI_EnableAutoFromStop();
+
+ /**
+ * 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( );
+
+ /* 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);
+
+ 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 );
+
+ /* Enable transport layer and start CPU2 */
+ 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 == FUS_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:
+ if (p_sys_event->payload[0] == WIRELESS_FW_RUNNING)
+ 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_LLD_TESTS : LLD_FATAL_ERROR \n");
+ break;
+
+ case ERR_THREAD_UNKNOWN_CMD:
+ APP_DBG("** ERR_LLD_TESTS : UNKNOWN_CMD \n");
+ break;
+
+ default:
+ APP_DBG("** ERR_LLD_TESTS : ErroCode=%d \n",ErrorCode);
+ break;
+ }
+ return;
+}
+
+static void APPE_SysEvtReadyProcessing( void )
+{
+ /* Traces channel initialization */
+ TL_TRACES_Init( );
+
+ /* LLD tests application specific init */
+ APP_LLD_BLE_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;
+}
+
+/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
+static void Led_Init( void )
+{
+#if (CFG_LED_SUPPORTED == 1U)
+ /**
+ * Leds Initialization
+ */
+#if (CFG_HW_LPUART1_ENABLED != 1) || ! defined (STM32WB35xx)
+ // On Little DORY, LED_BLUE share the GPIO PB5 with LPUART
+ BSP_LED_Init(LED_BLUE);
+ //BSP_LED_On(LED_BLUE);
+#endif
+
+//#if (CFG_HW_EXTPA_ENABLED != 1)
+ BSP_LED_Init(LED_GREEN);
+ //BSP_LED_On(LED_GREEN);
+//#endif
+
+ BSP_LED_Init(LED_RED);
+ //BSP_LED_On(LED_RED);
+#endif
+
+ return;
+}
+
+static void Button_Init( void )
+{
+ /**
+ * 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);
+
+ return;
+}
+
+/* USER CODE END FD_LOCAL_FUNCTIONS */
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void UTIL_SEQ_Idle( void )
+{
+ /* Note that WFI (i.e. SLEEP mode) is required for SF timer tests but STOP or OFF mode will be managed by low-power test itself */
+#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)
+ {
+ default :
+ /* default case : schedule all tasks */
+ 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 )
+{
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_Init();
+#endif
+
+ 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 */
+void HAL_GPIO_EXTI_Callback( uint16_t GPIO_Pin )
+{
+ switch (GPIO_Pin)
+ {
+ case BUTTON_SW1_PIN:
+ Appli_GPIO_EXTI_Callback(BUTTON_SW1_PIN);
+ break;
+
+ case BUTTON_SW2_PIN:
+ Appli_GPIO_EXTI_Callback(BUTTON_SW2_PIN);
+ break;
+
+ case BUTTON_SW3_PIN:
+ Appli_GPIO_EXTI_Callback(BUTTON_SW3_PIN);
+ break;
+
+ default:
+ break;
+
+ }
+ return;
+}
+
+void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
+{
+ Appli_TIM_IC_CaptureCallback();
+}
+
+void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
+{
+ Appli_TIM_PeriodElapsedCallback();
+}
+
+
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/app_lld_ble_iar_asm.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/app_lld_ble_iar_asm.s
new file mode 100644
index 000000000..987eb201e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/app_lld_ble_iar_asm.s
@@ -0,0 +1,86 @@
+;/**
+; ******************************************************************************
+; * @file app_lld_tests_iar_asm.s
+; * @brief Common functionnalities for RF LLD tests that must be writen
+; * in assembler for IAR compilator
+; ******************************************************************************
+; * @attention
+; *
+; * <h2><center>&copy; COPYRIGHT 2018 STMicroelectronics</center></h2>
+; *
+; ******************************************************************************
+; */
+;
+;/**
+; * @brief Active polling for a given delay
+; * @param microsec the delay in us unit
+; *
+; * Caution:
+; * - This function has been implemented for system clock set to 16MHz. It must
+; * be rewiewed (twice more NOP) for 32Mhz config.
+; * - This function can be interrupted if used in interruptible part of code.
+; * - Be carefull with the use of critical section that can interrupt the reel
+; * time during input microsec value.
+; * - If 0 is given as input
+; */
+ PUBLIC us_delay_16m
+ SECTION .text:CODE:NOROOT(3)
+us_delay_16m
+loop_16m:
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ SUBS R0, R0, #1
+ BHI loop_16m
+ BX LR
+
+ PUBLIC us_delay_32m
+ SECTION .text:CODE:NOROOT(3)
+us_delay_32m
+loop_32m:
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ SUBS R0, R0, #1
+ BHI loop_32m
+ BX LR
+
+ END
+
+;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/gpio_lld.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/gpio_lld.c
new file mode 100644
index 000000000..ba3565389
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/gpio_lld.c
@@ -0,0 +1,613 @@
+/**
+ ******************************************************************************
+ * @file gpio_lld.c
+ * @author MCD Application Team
+ * @version $VERSION$
+ * @date $DATE$
+ * @brief This file contains the init of all the GPIOs used by LLD tests.
+ * It is to be used on both M0 and M4.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; COPYRIGHT(c) 2015 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 ------------------------------------------------------------------*/
+// Be carrefull with the .h included as this file must be compilable on both M0 and M4 environments
+#include "app_conf.h"
+#include "gpio_lld.h"
+
+/* Initialize GPIOs fused by PHY valid CLI */
+void gpio_lld_phy_init(void) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+ /* Enable clock(s) for GPIOs */
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+#ifdef STM32WB35xx
+#else
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+#endif
+#ifdef USE_SIMU
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOD_CLK_ENABLE();
+#endif
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+#ifdef STM32WB35xx
+#else
+ __HAL_RCC_C2GPIOC_CLK_ENABLE();
+#endif
+#ifdef USE_SIMU
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+ __HAL_RCC_C2GPIOC_CLK_ENABLE();
+ __HAL_RCC_C2GPIOD_CLK_ENABLE();
+#endif
+#endif
+
+#if defined (USE_SIMU)
+ // Initialize GPIO used to detect if current DORY is master or slave
+ // 4 GPIOs are needed while only one is enougth but this must be kept as it is
+ // because this is also used by tests which are not managed by MDG-RF
+ GPIO_InitStruct.Pin = (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH ;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ // Initialize GPIOs used to have both DORYs communicating over
+ // 13 bits of the port C and D which are cross connected in SIMU test bench
+ GPIO_InitStruct.Pin = (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH ;
+ HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13);
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH ;
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
+#endif
+
+ // configure the GPIO to be set to '1' during frame TX
+ GPIO_InitStruct.Pin = (GPIO_TX_PIN);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIO_TX_PORT, &GPIO_InitStruct);
+ gpio_lld_phy_gpioTx_down();
+
+ // configure the GPIO to be set to '1' during HardFault'
+ GPIO_InitStruct.Pin = (GPIO_HARD_FAULT_PIN);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIO_HARD_FAULT_PORT, &GPIO_InitStruct);
+ gpio_lld_phy_gpioHardFault_down();
+
+ // configure 2 GPIOs that can be used for debug purposes
+ GPIO_InitStruct.Pin = (GPIO_1_PIN);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIO_1_PORT, &GPIO_InitStruct);
+ gpio_lld_phy_gpio1_down();
+#if !defined (USE_SIMU) && !defined (USE_FPGA)
+ GPIO_InitStruct.Pin = (GPIO_2_PIN);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIO_2_PORT, &GPIO_InitStruct);
+ gpio_lld_phy_gpio2_down();
+#endif
+}
+
+/* Set PHY GPIO_TX to '1' */
+void gpio_lld_phy_gpioTx_up(void) {
+ HAL_GPIO_WritePin(GPIO_TX_PORT, GPIO_TX_PIN, GPIO_PIN_SET);
+}
+
+/* Set PHY GPIO_TX to '0' */
+void gpio_lld_phy_gpioTx_down(void) {
+ HAL_GPIO_WritePin(GPIO_TX_PORT, GPIO_TX_PIN, GPIO_PIN_RESET);
+}
+
+/* Set PHY GPIO_HARD_FAULT to '1' */
+void gpio_lld_phy_gpioHardFault_up(void) {
+ HAL_GPIO_WritePin(GPIO_HARD_FAULT_PORT, GPIO_HARD_FAULT_PIN, GPIO_PIN_SET);
+}
+
+/* Set PHY GPIO_HARD_FAULT to '0' */
+void gpio_lld_phy_gpioHardFault_down(void) {
+ HAL_GPIO_WritePin(GPIO_HARD_FAULT_PORT, GPIO_HARD_FAULT_PIN, GPIO_PIN_RESET);
+}
+
+/* Set PHY GPIO_1 to '1' */
+void gpio_lld_phy_gpio1_up(void) {
+ HAL_GPIO_WritePin(GPIO_1_PORT, GPIO_1_PIN, GPIO_PIN_SET);
+}
+
+/* Set PHY GPIO_1 to '0' */
+void gpio_lld_phy_gpio1_down(void) {
+ HAL_GPIO_WritePin(GPIO_1_PORT, GPIO_1_PIN, GPIO_PIN_RESET);
+}
+
+/* Set PHY GPIO_2 to '1' */
+void gpio_lld_phy_gpio2_up(void) {
+ HAL_GPIO_WritePin(GPIO_2_PORT, GPIO_2_PIN, GPIO_PIN_SET);
+}
+
+/* Set PHY GPIO_2 to '0' */
+void gpio_lld_phy_gpio2_down(void) {
+ HAL_GPIO_WritePin(GPIO_2_PORT, GPIO_2_PIN, GPIO_PIN_RESET);
+}
+
+/* De-initialize GPIOs fused by PHY valid CLI */
+void gpio_lld_phy_deInit(void) {
+ HAL_GPIO_DeInit(GPIO_TX_PORT, GPIO_TX_PIN);
+ HAL_GPIO_DeInit(GPIO_HARD_FAULT_PORT, GPIO_HARD_FAULT_PIN);
+ HAL_GPIO_DeInit(GPIO_1_PORT, GPIO_1_PIN);
+ HAL_GPIO_DeInit(GPIO_2_PORT, GPIO_2_PIN);
+}
+
+/* Initialize GPIOs for MCO use */
+void gpio_lld_mco_init(uint32_t mcoSource, uint32_t mcoDiv) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+ //HAL_RCC_MCOConfig(RCC_MCO3, mcoSource, mcoDiv);
+ LL_RCC_ConfigMCO(mcoSource, mcoDiv);
+
+ /* Enable clock(s) for GPIOs */
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+#endif
+
+ // configure the GPIO PA15 in AF6 to be used as MCO
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF6_MCO;
+ GPIO_InitStruct.Pin = GPIO_MCO_PIN;
+ HAL_GPIO_Init(GPIO_MCO_PORT, &GPIO_InitStruct);
+}
+
+/* De-initialize GPIOs for external PA use */
+void gpio_lld_mco_deInit(void) {
+ HAL_GPIO_DeInit(GPIO_MCO_PORT, GPIO_MCO_PIN);
+ //HAL_RCC_MCOConfig(RCC_MCO3, RCC_MCO1SOURCE_NOCLOCK, RCC_MCODIV_1);
+ LL_RCC_ConfigMCO(RCC_MCO1SOURCE_NOCLOCK, RCC_MCODIV_1);
+}
+
+/* Initialize GPIOs for external PA use */
+void gpio_lld_extPa_init(void) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+ /* Enable clock(s) for GPIOs */
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+#endif
+
+ // configure the GPIO PB0 in AF6 to be used as RF_TX_MOD_EXT_PA
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF6_RF_DTB0;
+ GPIO_InitStruct.Pin = GPIO_EXT_PA_TX_PIN;
+ HAL_GPIO_Init(GPIO_EXT_PA_TX_PORT, &GPIO_InitStruct);
+
+ // configure the GPIO which will be managed by M0 stack to enable Ext PA
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Pin = GPIO_EXT_PA_EN_PIN;
+ HAL_GPIO_Init(GPIO_EXT_PA_EN_PORT, &GPIO_InitStruct);
+}
+
+/* De-initialize GPIOs for external PA use */
+void gpio_lld_extPa_deInit(void) {
+ HAL_GPIO_DeInit(GPIO_EXT_PA_TX_PORT, GPIO_EXT_PA_TX_PIN);
+ HAL_GPIO_DeInit(GPIO_EXT_PA_EN_PORT, GPIO_EXT_PA_EN_PIN);
+}
+
+#ifdef USE_SIMU
+/* Initialize GPIOs for master DORY of the SIMU */
+void gpio_lld_SimuMaster_init(void) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+ /* Enable clock(s) for GPIOs */
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+#endif
+
+ // In DORY master only : initialize GPIO port A pin 0, 1 and, 2 to send CRC result to simulator
+ GPIO_InitStruct.Pin = (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ // In DORY master only : initialize GPIO port B pin 8 and pin 9 to be used for debug purposes
+ GPIO_InitStruct.Pin = (GPIO_TX_PIN);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH ;
+ HAL_GPIO_Init(GPIO_TX_PORT, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = (GPIO_1_PIN);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH ;
+ HAL_GPIO_Init(GPIO_1_PORT, &GPIO_InitStruct);
+}
+
+/* Initialize GPIOs for slave DORY of the SIMU */
+void gpio_lld_SimuSlave_init(void) {
+// No GPIO to initialize in DORY slave
+}
+#endif
+
+/* Initialize GPIOs used by USART */
+void gpio_lld_usart_init(void) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+ /* Enable clock(s) for GPIOs used by USART */
+#if USE_NEW_SET_OF_GPIO_FOR_USART
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+#endif
+#else
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+#endif
+#endif
+
+ /* USART1 GPIO Configuration
+ USART1_TX : PB6
+ USART1_RX : PB7
+ */
+#if USE_NEW_SET_OF_GPIO_FOR_USART
+ GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+#else
+ 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_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+#endif
+}
+
+/* De-initialize GPIOs used by USART */
+void gpio_lld_usart_deInit(void) {
+ /* USART1 GPIO Configuration
+ USART1_TX : PB6
+ USART1_RX : PB7
+ */
+#if USE_NEW_SET_OF_GPIO_FOR_USART
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9);
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_10);
+#else
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6);
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7);
+#endif
+
+ /* Do not disable clocks as they could be used by others GPIOs and it seems to not need power in STOP mode */
+}
+
+/* Initialize GPIOs used by LPUART */
+void gpio_lld_lpuart_init(void) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+#ifdef STM32WB35xx
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+#endif
+#else
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOC_CLK_ENABLE();
+#endif
+#endif
+
+ /* LPUART1 GPIO Configuration
+ LPUART1_TX : PB5 on Little DORY or PC1 on DORY
+ LPUART1_RX : PA3 on Little DORY or PC0 on DORY
+ */
+#ifdef STM32WB35xx
+ GPIO_InitStruct.Pin = 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_5;
+ 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(GPIOB, &GPIO_InitStruct);
+#else
+ GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
+ 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(GPIOC, &GPIO_InitStruct);
+#endif
+}
+
+/* De-initialize GPIOs used by LPUART */
+void gpio_lld_lpuart_deInit(void) {
+ /* LPUART1 GPIO Configuration
+ LPUART1_TX : PB5 on Little DORY PC1 on DORY
+ LPUART1_RX : PA3 on Little DORY PC0 on DORY
+ */
+#ifdef STM32WB35xx
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_3);
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_5);
+#else
+ HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0 | GPIO_PIN_1);
+#endif
+ /* Do not disable clocks as they could be used by others GPIOs and it seems to not need power in STOP mode */
+}
+
+#if !defined (USE_SIMU) && !defined(USE_FPGA)
+/* Initialize GPIO PA2 (for debug use only) */
+void gpio_lld_pa2_init(uint8_t mode) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+ /* Enable clock(s) for GPIOs */
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+#endif
+
+ if (mode == 0) {
+ GPIO_InitStruct.Pin = GPIO_PIN_2;
+ 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);
+ }
+ if (mode == 1) {
+ GPIO_InitStruct.Pin = GPIO_PIN_2;
+ 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);
+ }
+ if (mode == 2) {
+ GPIO_InitStruct.Pin = GPIO_PIN_2;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF6_RF_DTB7;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+ }
+ if (mode == 3) {
+ GPIO_InitStruct.Pin = GPIO_PIN_2;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+ }
+ if (mode == 4) {
+ GPIO_InitStruct.Pin = GPIO_PIN_2;
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+ }
+ if (mode == 5) {
+ GPIO_InitStruct.Pin = GPIO_PIN_2;
+ GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+ }
+}
+
+/* De-initialize GPIO PA2 (for debug use only) */
+void gpio_lld_pa2_deInit(void) {
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2);
+}
+
+/*
+ * Initialize GPIOs needed by DTB mode chosen (for debug use only).
+ * Only DTB0 and DTB7 configurations are coded until now.
+ * Do not forget to program the RF SPI register addr 0x30 () with the DTB cfg and DTB enable.
+ */
+void gpio_lld_dtb_init(uint8_t dtbMode) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+ uint32_t usePA = 0, pinPA = 0;
+ uint32_t usePB = 0, pinPB = 0;
+ uint32_t usePC = 0, pinPC = 0;
+
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+
+ if (dtbMode == 0) {
+ GPIO_InitStruct.Alternate = GPIO_AF6_RF_DTB0;
+
+ usePA = 1;
+ pinPA = (GPIO_PIN_0 | GPIO_PIN_1| GPIO_PIN_2| GPIO_PIN_3| GPIO_PIN_4 |
+ GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9);
+
+ usePC = 1;
+ pinPC = (GPIO_PIN_14 | GPIO_PIN_15);
+ }
+
+ if (dtbMode == 7) {
+ GPIO_InitStruct.Alternate = GPIO_AF6_RF_DTB7;
+
+ usePA = 1;
+#ifdef STM32WB35xx
+ pinPA = (GPIO_PIN_8 | GPIO_PIN_9| GPIO_PIN_10| GPIO_PIN_11| GPIO_PIN_13| GPIO_PIN_14);
+#else
+ pinPA = (GPIO_PIN_8 | GPIO_PIN_9| GPIO_PIN_10| GPIO_PIN_11);
+#endif
+
+ usePB = 1;
+#ifdef STM32WB35xx
+ //pinPB = (GPIO_PIN_2 | GPIO_PIN_7 | GPIO_PIN_8| GPIO_PIN_10| GPIO_PIN_11);
+ // PB 7 is in conflict with USART
+ pinPB = (GPIO_PIN_2 | GPIO_PIN_8);
+#else
+ //pinPB = (GPIO_PIN_2 | GPIO_PIN_7 | GPIO_PIN_8| GPIO_PIN_10| GPIO_PIN_11);
+ // PB 7 is in conflict with USART
+ pinPB = (GPIO_PIN_2 | GPIO_PIN_8| GPIO_PIN_10| GPIO_PIN_11);
+#endif
+ }
+
+ if (usePA == 1) {
+#ifdef CORE_CM4
+ // Enable GPIO PA clock for M4 use
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+#else
+ // Enable GPIO PA clock for M0 use
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+#endif
+
+ GPIO_InitStruct.Pin = pinPA;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+ }
+
+ if (usePB == 1) {
+#ifdef CORE_CM4
+ // Enable GPIO PB clock for M4 use
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+#else
+ // Enable GPIO PB clock for M0 use
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+#endif
+
+ GPIO_InitStruct.Pin = pinPB;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+ }
+
+ if (usePC == 1) {
+#ifdef CORE_CM4
+ // Enable GPIO PC clock for M4 use
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+#else
+ // Enable GPIO PC clock for M0 use
+ __HAL_RCC_C2GPIOC_CLK_ENABLE();
+#endif
+
+ GPIO_InitStruct.Pin = pinPC;
+ HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+ }
+}
+
+void gpio_lld_dtb_deInit(void) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+#ifdef CORE_CM4
+ // Enable GPIO PB clock for M4 use
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+#else
+ // Enable GPIO PB clock for M0 use
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+#endif
+
+ // configure the GPIO to be set to '1' during frame TX
+ GPIO_InitStruct.Pin = (GPIO_PIN_8);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH ;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
+}
+#endif /* ! USE_SIMU and ! USE_FPGA */
+
+// Do not initialize LED GPIOs as they are already initialized by BSP if possible (depending on board and possible GPIOs conflicts).
+// So just offer the toggle possibility for debug purposes
+/* Toggle LED1 */
+void gpio_lld_led1_toggle(void) {
+ HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
+}
+
+/* Toggle LED2 */
+void gpio_lld_led2_toggle(void) {
+ HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
+}
+
+/* Toggle LED3 */
+void gpio_lld_led3_toggle(void) {
+ HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/hw_uart.c
new file mode 100644
index 000000000..8ea61633f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/hw_uart.c
@@ -0,0 +1,484 @@
+/**
+ ******************************************************************************
+ * 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"
+
+/* Macros --------------------------------------------------------------------*/
+#define HW_UART_RX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##RxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ hal_status = 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_status = 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)
+UART_HandleTypeDef huart1;
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+DMA_HandleTypeDef hdma_usart1_tx;
+#endif
+void (*HW_huart1RxCb)(void);
+void (*HW_huart1TxCb)(void);
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+UART_HandleTypeDef hlpuart1;
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+DMA_HandleTypeDef hdma_lpuart1_tx;
+#endif
+void (*HW_hlpuart1RxCb)(void);
+void (*HW_hlpuart1TxCb)(void);
+#endif
+
+/* Functions Definition ------------------------------------------------------*/
+#if (CFG_HW_LPUART1_ENABLED == 1)
+/**
+ * @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.OverSampling = UART_OVERSAMPLING_16;
+ 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();
+ }
+}
+
+void MX_LPUART1_UART_DeInit(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.OverSampling = UART_OVERSAMPLING_16;
+ 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_DeInit(&hlpuart1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+}
+#endif
+
+#if (CFG_HW_USART1_ENABLED == 1)
+/**
+ * @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_16;
+ huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ huart1.FifoMode = UART_FIFOMODE_DISABLE;
+ 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();
+ }
+}
+
+void MX_USART1_UART_DeInit(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_16;
+ huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ huart1.FifoMode = UART_FIFOMODE_DISABLE;
+ if (HAL_UART_DeInit(&huart1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+}
+#endif
+
+hw_status_t HW_UART_Receive_IT(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_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;
+ }
+
+ 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_IT(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_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;
+ }
+
+ 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(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;
+}
+
+#if 0
+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;
+}
+#endif
+
+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/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/main.c
new file mode 100644
index 000000000..1f61b6690
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/main.c
@@ -0,0 +1,605 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file main.c
+ * @author MCD Application Team
+ * @brief RF LLD tests application
+ *
+ @verbatim
+ ==============================================================================
+ ##### IMPORTANT NOTE #####
+ ==============================================================================
+
+ This application requests having a M0 LLD tests 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 "app_common.h"
+#include "app_entry.h"
+#include "main.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 ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+TIM_HandleTypeDef htim2;
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+static void MX_DMA_Init(void);
+static void MX_TIM2_Init(void);
+
+/* USER CODE BEGIN PFP */
+static void SystemClock_Config(void);
+static 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 on HSE without using PLL and the periph clock needed by this application */
+ SystemClock_Config();
+
+ /* USER CODE BEGIN SysInit */
+ PeriphClock_Config();
+ Init_Exti();
+
+ /* USER CODE END SysInit */
+
+ /* Initialize all configured peripherals */
+ MX_DMA_Init();
+ MX_TIM2_Init();
+ /* USER CODE BEGIN 2 */
+ if (HAL_TIM_Base_Start(&htim2) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* 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 END WHILE */
+ }
+ /* USER CODE BEGIN 3 */
+
+ /* USER CODE END 3 */
+}
+
+/**
+ * @brief System Clock Configuration : API to be called to use HSE (with or without PLL use) as 32Mhz system clock.
+ SystemClock_Config_HSE() must be called once just after boot (to go from default MSI to HSE).
+ Then application user can call both SystemClock_Config_HSE() and SystemClock_Config_MSI() at any time.
+ * @retval None
+ */
+void SystemClock_Config_HSE(uint32_t usePLL)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+
+ /* First, just set MSI ON (with the 32Mhz range) in case it was OFF, without any update on PLL */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
+ RCC_OscInitStruct.MSIState = RCC_MSI_ON;
+ RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_10;
+ RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+ /* Select MSI as system clock in order to be able to update HSE and PLL configuration */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+
+ /* Configure HSE and PLL if needed*/
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
+ if (usePLL == 1)
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+ else
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_OFF;
+ RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV2;
+ RCC_OscInitStruct.PLL.PLLN = 8;
+ RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
+ RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV4;
+ RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV4;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ /* Configure the system clock source and the dividers according to the fact that system clock source is 32Mhz */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4 | RCC_CLOCKTYPE_HCLK2 | RCC_CLOCKTYPE_HCLK |
+ RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
+ if (usePLL == 1)
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+ else
+ 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();
+ }
+
+ // Note that function UTILS_SetFlashLatency() could be used to set the correct Flash latency
+ // (with 32Mhz, 2WS are needed if the range is changed to 1V instead of 1.2V)
+
+ /* Disable MSI Oscillator as the MSI is no more needed by the application */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
+ RCC_OscInitStruct.MSIState = RCC_MSI_OFF;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; /* No update on PLL */
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+}
+
+/**
+ * @brief System Clock Configuration : API to be called to use MSI (with or without PLL use) as 32Mhz system clock.
+ SystemClock_Config_HSE() must be called once just after boot (to go from default MSI to HSE).
+ Then application user can call both SystemClock_Config_HSE() and SystemClock_Config_MSI() at any time.
+ * @retval None
+ */
+void SystemClock_Config_MSI(uint32_t usePLL)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+
+ /* First, just set HSE ON (with the 32Mhz range) in case it was OFF, without any update on PLL */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+ /* Select HSE as system clock in order to be able to update MSI and PLL configuration */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+
+ /* Configure MSI and PLL if needed*/
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
+ RCC_OscInitStruct.MSIState = RCC_MSI_ON;
+ RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_10;
+ RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
+ if (usePLL == 1)
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+ else
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_OFF;
+ RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV2;
+ RCC_OscInitStruct.PLL.PLLN = 8;
+ RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
+ RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV4;
+ RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV4;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+
+ /* Configure the system clock source and the dividers according to the fact that system clock source is 32Mhz */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4 | RCC_CLOCKTYPE_HCLK2 | RCC_CLOCKTYPE_HCLK |
+ RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
+ if (usePLL == 1)
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+ else
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
+ 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();
+ }
+
+/* HSE cannot be stopped while using RF */
+#if 0
+ /* Disable HSE Oscillator as the HSE is no more needed by the application */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_OFF;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; /* No update on PLL */
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+#endif
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief System Clock Configuration : must be called during application start-up
+ * @retval None
+ */
+static void SystemClock_Config(void)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {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);
+
+ /* Assuming that MSI is enabled by default after boot, lets go to HSE without using PLL */
+ SystemClock_Config_HSE(0);
+
+ /* Configure Others clock */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSI48 |
+ RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI2;
+ RCC_OscInitStruct.LSEState = RCC_LSE_ON;
+ RCC_OscInitStruct.HSIState = RCC_HSI_OFF;
+ RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.LSIState = RCC_LSI_OFF;
+ RCC_OscInitStruct.LSI2CalibrationValue = 0;
+ RCC_OscInitStruct.HSI48State = RCC_HSI48_OFF;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+}
+
+/**
+ * Enable DMA controller clock
+ */
+static void MX_DMA_Init(void)
+{
+ /* DMA controller clock enable */
+ __HAL_RCC_DMAMUX1_CLK_ENABLE();
+ __HAL_RCC_DMA1_CLK_ENABLE();
+#ifdef STM32WB35xx
+ __HAL_RCC_DMA2_CLK_ENABLE();
+#endif
+
+ /* DMA interrupt init */
+#ifdef STM32WB35xx
+ /* DMA1_Channel4_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);
+ /* DMA2_Channel4_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA2_Channel4_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA2_Channel4_IRQn);
+#else
+ /* 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);
+#endif
+}
+
+static void PeriphClock_Config(void)
+{
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+
+#if USE_SMPS_ENABLED_BY_DEFAULT
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS | RCC_PERIPHCLK_RFWAKEUP | RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_LPUART1;
+ PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
+ PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
+ PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
+ PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE;
+ PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE1;
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ /* Initialize SMPS here like in BLE applis */
+ LL_PWR_SMPS_SetStartupCurrent(LL_PWR_SMPS_STARTUP_CURRENT_80MA);
+ LL_PWR_SMPS_SetOutputVoltageLevel(LL_PWR_SMPS_OUTPUT_VOLTAGE_1V40);
+ LL_PWR_SMPS_Enable();
+#else
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RFWAKEUP | RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_LPUART1;
+ PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
+ PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
+ PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+#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;
+}
+
+
+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 LPUART(25), IPCC(36), HSEM(38) */
+ LL_EXTI_DisableIT_0_31( (~0) & (~(LL_EXTI_LINE_25)) );
+ LL_EXTI_DisableIT_32_63( (~0) & (~(LL_EXTI_LINE_36 | LL_EXTI_LINE_38)) );
+
+ return;
+}
+
+/**
+ * @brief TIM2 Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_TIM2_Init(void)
+{
+
+ /* USER CODE BEGIN TIM2_Init 0 */
+
+ /* USER CODE END TIM2_Init 0 */
+
+ TIM_ClockConfigTypeDef sClockSourceConfig = {0};
+ TIM_MasterConfigTypeDef sMasterConfig = {0};
+
+ /* USER CODE BEGIN TIM2_Init 1 */
+
+ /* USER CODE END TIM2_Init 1 */
+ htim2.Instance = TIM2;
+ htim2.Init.Prescaler = PRESCALER_VALUE;
+ htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
+ htim2.Init.Period = PERIOD_VALUE;
+ htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
+ htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
+ if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
+ if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
+ sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
+ if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN TIM2_Init 2 */
+
+ /* USER CODE END TIM2_Init 2 */
+
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+/**
+ * @brief Declare here empty functions to over-write the default one as it declared as WEAK in HAL.
+ * This is the way to avoid systick use which is initialized by default in HAL_Init() and suspended or resumed in LPM.
+ *
+ * @param None
+ */
+HAL_StatusTypeDef HAL_InitTick( uint32_t TickPriority )
+{
+ return (HAL_OK);
+}
+
+void HAL_SuspendTick(void)
+{
+}
+
+void HAL_ResumeTick(void)
+{
+}
+
+/**
+ * @brief This function is executed in case of error occurrence.
+ * @retval None
+ */
+void Error_Handler(void)
+{
+ BSP_LED_On(LED_BLUE);
+ /* USER CODE BEGIN Error_Handler */
+ /* User can add his own implementation to report the HAL error return state */
+ /* USER CODE END Error_Handler */
+}
+
+#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 assert_failed */
+ /* 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 assert_failed */
+}
+#endif /* USE_FULL_ASSERT */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/stm32_lpm_if.c
new file mode 100644
index 000000000..d73fbdbfc
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/stm32_lpm_if.c
@@ -0,0 +1,288 @@
+ /*******************************************************************************
+ * @file stm32_lpm_if.c
+ * @author MCD Application Team
+ * @brief 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
+ *
+ ******************************************************************************
+ */
+
+/* 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 -----------------------------------------------*/
+/* USER CODE BEGIN Private_Function_Prototypes */
+static void Switch_On_HSI( void );
+
+/* 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 */
+
+/**
+ * @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
+ * @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 ) );
+// CCO : Taken from MAC project already validated in low-power
+// if(LL_RCC_GetSysClkSource( ) == LL_RCC_SYS_CLKSOURCE_STATUS_HSI)
+ if(LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSE)
+ {
+ 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 */
+}
+
+/* USER CODE BEGIN Private_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 END Private_Functions */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/stm32wbxx_hal_msp.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/stm32wbxx_hal_msp.c
new file mode 100644
index 000000000..e3d6cdb29
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/stm32wbxx_hal_msp.c
@@ -0,0 +1,289 @@
+/**
+ ******************************************************************************
+ * @file stm32wbxx_hal_msp.c
+ * @author MCD Application Team
+ * @brief This file contains the HAL System and Peripheral (UARTs) MSP initialization
+ * and de-initialization functions.
+ ******************************************************************************
+ * @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 "stm32wbxx_hal.h"
+#include "app_common.h"
+#include "gpio_lld.h"
+
+/** @addtogroup STM32WBxx_HAL_Driver
+ * @{
+ */
+
+/** @defgroup HAL_MSP HAL MSP
+ * @brief HAL MSP module.
+ * @{
+ */
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+/** @defgroup HAL_MSP_Private_Functions HAL MSP Private Functions
+ * @{
+ */
+
+/**
+ * @brief Initializes the Global MSP.
+ * @note This function is called from HAL_Init() function to perform system
+ * level initialization (GPIOs, clock, DMA, interrupt).
+ * @retval None
+ */
+void HAL_MspInit(void)
+{
+
+}
+
+/**
+ * @brief DeInitializes the Global MSP.
+ * @note This functiona is called from HAL_DeInit() function to perform system
+ * level de-initialization (GPIOs, clock, DMA, interrupt).
+ * @retval None
+ */
+void HAL_MspDeInit(void)
+{
+
+}
+
+/**
+ * @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)
+{
+ HAL_DMA_MuxSyncConfigTypeDef pSyncConfig;
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ if(huart->Instance == LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspInit 0 */
+
+ /* USER CODE END LPUART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_LPUART1_CLK_ENABLE();
+
+ /* GPIOs configuration */
+ gpio_lld_lpuart_init();
+
+ /* LPUART1 DMA Init */
+ /* LPUART1_TX Init */
+#ifdef STM32WB35xx
+ hdma_lpuart1_tx.Instance = DMA1_Channel4;
+#else
+ hdma_lpuart1_tx.Instance = DMA1_Channel1;
+#endif
+ 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 */
+ }
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+ if(huart->Instance == USART1)
+ {
+ /* USER CODE BEGIN USART1_MspInit 0 */
+
+ /* USER CODE END USART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_USART1_CLK_ENABLE();
+
+ /* GPIOs configuration */
+ gpio_lld_usart_init();
+
+ /* USART1 DMA Init */
+ /* USART1_TX Init */
+#ifdef STM32WB35xx
+ hdma_usart1_tx.Instance = DMA2_Channel4;
+#else
+ hdma_usart1_tx.Instance = DMA1_Channel2;
+#endif
+ 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 */
+ }
+#endif
+}
+
+/**
+ * @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 (CFG_HW_LPUART1_ENABLED == 1)
+ if(huart->Instance == LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspDeInit 0 */
+
+ /* USER CODE END LPUART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_LPUART1_CLK_DISABLE();
+
+ /* De-init GPIOs */
+ gpio_lld_lpuart_deInit();
+
+ /* 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 */
+ }
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+ if(huart->Instance == USART1)
+ {
+ /* USER CODE BEGIN USART1_MspDeInit 0 */
+
+ /* USER CODE END USART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_USART1_CLK_DISABLE();
+
+ /* De-init GPIOs */
+ gpio_lld_usart_deInit();
+
+ /* 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 */
+ }
+#endif
+}
+
+/**
+ * @}
+ */
+/**
+* @brief TIM_Base MSP Initialization
+* This function configures the hardware resources used in this example
+* @param htim_base: TIM_Base handle pointer
+* @retval None
+*/
+void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
+{
+ if(htim_base->Instance==TIM2)
+ {
+ /* USER CODE BEGIN TIM2_MspInit 0 */
+
+ /* USER CODE END TIM2_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_TIM2_CLK_ENABLE();
+ /* TIM2 interrupt Init */
+ HAL_NVIC_SetPriority(TIM2_IRQn, 3, 0);
+ HAL_NVIC_EnableIRQ(TIM2_IRQn);
+ /* USER CODE BEGIN TIM2_MspInit 1 */
+
+ /* USER CODE END TIM2_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief TIM_Base MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param htim_base: TIM_Base handle pointer
+* @retval None
+*/
+void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base)
+{
+ if(htim_base->Instance==TIM2)
+ {
+ /* USER CODE BEGIN TIM2_MspDeInit 0 */
+
+ /* USER CODE END TIM2_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_TIM2_CLK_DISABLE();
+
+ /* TIM2 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(TIM2_IRQn);
+ /* USER CODE BEGIN TIM2_MspDeInit 1 */
+
+ /* USER CODE END TIM2_MspDeInit 1 */
+ }
+
+}
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/stm32wbxx_it.c
new file mode 100644
index 000000000..74159c52a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/stm32wbxx_it.c
@@ -0,0 +1,377 @@
+/* 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 "app_common.h"
+#include "stm32wbxx_it.h"
+#include "gpio_lld.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 --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+extern TIM_HandleTypeDef htim2;
+
+/* 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 */
+ gpio_lld_phy_gpioHardFault_up();
+
+ /* 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 */
+#if 0 /* no systick used */
+ HAL_IncTick();
+#endif
+ /* 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). */
+/******************************************************************************/
+
+#ifdef STM32WB35xx
+/**
+ * @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 */
+#if (CFG_HW_LPUART1_ENABLED == 1)
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ HAL_DMA_IRQHandler(&hdma_lpuart1_tx);
+#endif
+#endif
+ /* USER CODE BEGIN DMA1_Channel4_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel4_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 */
+#if (CFG_HW_USART1_ENABLED == 1)
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ HAL_DMA_IRQHandler(&hdma_usart1_tx);
+#endif
+#endif
+ /* USER CODE BEGIN DMA2_Channel4_IRQn 1 */
+
+ /* USER CODE END DMA2_Channel4_IRQn 1 */
+}
+
+#else
+/**
+ * @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 */
+#if (CFG_HW_LPUART1_ENABLED == 1)
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ HAL_DMA_IRQHandler(&hdma_lpuart1_tx);
+#endif
+#endif
+ /* 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 */
+#if (CFG_HW_USART1_ENABLED == 1)
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ HAL_DMA_IRQHandler(&hdma_usart1_tx);
+#endif
+#endif
+ /* USER CODE BEGIN DMA1_Channel2_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel2_IRQn 1 */
+}
+#endif
+
+/**
+ * @brief This function handles USART1 global interrupt.
+ */
+void USART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN USART1_IRQn 0 */
+
+ /* USER CODE END USART1_IRQn 0 */
+#if (CFG_HW_USART1_ENABLED == 1)
+ HAL_UART_IRQHandler(&huart1);
+#endif
+ /* 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 */
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ HAL_UART_IRQHandler(&hlpuart1);
+#endif
+ /* USER CODE BEGIN LPUART1_IRQn 1 */
+
+ /* USER CODE END LPUART1_IRQn 1 */
+}
+
+/* USER CODE BEGIN 1 */
+#if 1 /* Not needed for LLD tests : removed to use less power */
+/**
+ * @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 TIM2_IRQHandler(void)
+{
+ HAL_TIM_IRQHandler(&htim2);
+}
+#endif
+
+
+#if 0 /* Not needed for LLD tests : removed to use less power */
+void RTC_WKUP_IRQHandler(void)
+{
+ HW_TS_RTC_Wakeup_Handler();
+}
+#endif /* Not needed for LLD tests : removed to use less power */
+
+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/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/stm_logging.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/stm_logging.c
new file mode 100644
index 000000000..8c76e703c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/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/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/system_stm32wbxx.c
new file mode 100644
index 000000000..2e42904ec
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/Core/Src/system_stm32wbxx.c
@@ -0,0 +1,357 @@
+/**
+ ******************************************************************************
+ * @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 */
+
+#if defined(STM32WB55xx) || defined(STM32WB35xx)
+ 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}};
+#endif
+
+/**
+ * @}
+ */
+
+/** @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;
+
+#if defined(STM32WB55xx)
+ /* Reset PLLSAI1CFGR register */
+ RCC->PLLSAI1CFGR = 0x22041000U;
+#endif
+
+ /* 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/LLD_BLE/LLD_BLE_Pressbutton/EWARM/LLD_BLE_Pressbutton.ewd b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/EWARM/LLD_BLE_Pressbutton.ewd
new file mode 100644
index 000000000..7c451b3a7
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/EWARM/LLD_BLE_Pressbutton.ewd
@@ -0,0 +1,1419 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>LLD_BLE</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>1</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>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.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>1</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>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></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>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></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>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></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>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></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>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/LLD_BLE/LLD_BLE_Pressbutton/EWARM/LLD_BLE_Pressbutton.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/EWARM/LLD_BLE_Pressbutton.ewp
new file mode 100644
index 000000000..75706f6cc
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/EWARM/LLD_BLE_Pressbutton.ewp
@@ -0,0 +1,1214 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>LLD_BLE</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>LLD_BLE/Exe</state>
+ </option>
+ <option>
+ <name>ObjPath</name>
+ <state>LLD_BLE/Obj</state>
+ </option>
+ <option>
+ <name>ListPath</name>
+ <state>LLD_BLE/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>CORE_CM4</state>
+ <state>USE_HAL_DRIVER</state>
+ <state>STM32WB55xx</state>
+ <state>USE_STM32WBXX_NUCLEO</state>
+ <state>LLD_BLE_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$/../STM32_WPAN/Target</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>
+ <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>
+ </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>LLD_BLE_Pressbutton.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>LLD_BLE_Pressbutton.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\app_lld_ble_iar_asm.s</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\gpio_lld.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_lld_ble.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\lld_ble.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>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.Nucleo\stm32wbxx_nucleo.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_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\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\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\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/LLD_BLE/LLD_BLE_Pressbutton/EWARM/LLD_BLE_Pressbutton.eww b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/EWARM/LLD_BLE_Pressbutton.eww
new file mode 100644
index 000000000..b9af5d955
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/EWARM/LLD_BLE_Pressbutton.eww
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workspace>
+ <project>
+ <path>$WS_DIR$\LLD_BLE_Pressbutton.ewp</path>
+ </project>
+ <batchBuild />
+</workspace>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/EWARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..1f886ff59
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/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/LLD_BLE/LLD_BLE_Pressbutton/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/EWARM/stm32wb55xx_flash_cm4.icf
new file mode 100644
index 000000000..383e53fef
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/EWARM/stm32wb55xx_flash_cm4.icf
@@ -0,0 +1,41 @@
+/*###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/LLD_BLE/LLD_BLE_Pressbutton/STM32_WPAN/App/app_lld_ble.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/STM32_WPAN/App/app_lld_ble.c
new file mode 100644
index 000000000..217e2b726
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/STM32_WPAN/App/app_lld_ble.c
@@ -0,0 +1,1835 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_lld_ble.c
+ * Description : PRESSBUTTON LLD 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 "app_common.h"
+#include "utilities_common.h"
+#include "app_entry.h"
+#include "dbg_trace.h"
+#include "lld_ble.h"
+#include "app_lld_ble.h"
+#include "tl.h"
+#include "shci.h"
+#include "stm_logging.h"
+#include "stm32_lpm.h"
+#include "stm32_seq.h"
+#include "gpio_lld.h"
+
+/* Private includes -----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+typedef enum
+{
+ CMD_FROM_M0_STOP0_ON = 0,
+ CMD_FROM_M0_STOP1_ON = 1,
+ CMD_FROM_M0_STOP2_ON = 2,
+ CMD_FROM_M0_STOP_OFF = 3,
+ CMD_FROM_M0_GO_IN_WFI = 4,
+ CMD_FROM_M0_GO_DIRECTLY_IN_WFI = 5,
+ CMD_FROM_M0_USE_MSI = 6,
+ CMD_FROM_M0_USE_MSI_PLL = 7,
+ CMD_FROM_M0_USE_HSE = 8,
+ CMD_FROM_M0_USE_HSE_PLL = 9,
+ CMD_FROM_M0_EXT_PA_EN = 10,
+ CMD_FROM_M0_EXT_PA_DIS = 11,
+ CMD_FROM_M0_RADIO_STOP = 12,
+ CMD_FROM_M0_RADIO_END = 13,
+ CMD_FROM_M0_RADIO_RXACK = 14,
+ CMD_FROM_M0_RADIO_RXOK = 15,
+ CMD_FROM_M0_RADIO_RXACKEND = 16,
+ CMD_FROM_M0_RADIO_RXOKEND = 17,
+} cmdFromM0_t;
+
+enum
+{
+ CHAR_CTRLC = 3,
+ CHAR_ESC = 27,
+ CHAR_DEL = 127
+};
+
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private defines -----------------------------------------------------------*/
+#define RX_BUFFER_SIZE 258
+#define CMD_HISTORY_LENGTH 10
+#define CLI_BUFFER_SIZE 30
+#define TX_BUFFER_SIZE 268
+#define CMD_BUFFER_SIZE 8
+
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macros ------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private function prototypes -----------------------------------------------*/
+static void CheckWirelessFirmwareInfo(void);
+static void LldBleTraceError(const char * pMess, uint32_t ErrCode);
+
+static void SendM0CmdAckToM0(void);
+static void SendCmdToM0(void);
+static void SendRspAckToM0(void);
+
+static void uartRxCpltCallback(void);
+static void uartRxItProcess(void);
+static void uartRxBufferProcessMode(uint8_t uartRxCmdEnable);
+static void uartRxBufferProcess(void);
+static void uartClearChars(int nbChar);
+
+static void uartTxBufferAdd(const char * str);
+static void uartTxItProcess(void);
+static void uartTxCpltCallback(void);
+
+static void m0RadioProcess(void);
+static void m0CmdProcess(void);
+static void m0CmdStopRequired(uint32_t stopRequired);
+static void m4ConfigBeforeStop(void);
+static void m4ConfigAfterStop(void);
+
+static void Appli_ProcessMode(void);
+static void Appli_RegTask(void);
+static void Appli_Init(void);
+static void Appli_uartRxBufferPrint(void);
+
+void Appli_m0RadioProcess_RadioStop(void);
+void Appli_m0RadioProcess_RadioEnd(void);
+void Appli_m0RadioProcess_RxAck(void);
+void Appli_m0RadioProcess_RxOk(void);
+void Appli_m0RadioProcess_RxAckEnd(void);
+void Appli_m0RadioProcess_RxOkEnd(void);
+
+void Appli_m0CmdProcess_RadioStop(void);
+void Appli_m0CmdProcess_RadioEnd(void);
+void Appli_m0CmdProcess_RxAck(void);
+void Appli_m0CmdProcess_RxOk(void);
+void Appli_m0CmdProcess_RxAckEnd(void);
+void Appli_m0CmdProcess_RxOkEnd(void);
+
+/* USER CODE BEGIN PFP */
+void BUTTON_SW1_BLE_Init(void);
+void BUTTON_SW2_SendPacket(void);
+void BUTTON_SW3_ReceivePacket(void);
+/* USER CODE END PFP */
+
+/* debug function prototypes */
+uint32_t Debug_Start_timer(void);
+uint32_t Debug_Stop_timer(void);
+
+/* Private variables -----------------------------------------------*/
+static cmdFromM0_t m0Cmd = CMD_FROM_M0_STOP_OFF;
+
+static uint8_t txBusy;
+static uint8_t rxCmdAllowed = 0;
+static uint8_t txBuffer_Tab[TX_BUFFER_SIZE];
+static uint32_t txBuffer_wrPtr;
+static uint32_t txBuffer_rdPtr;
+static uint8_t *pTxBuff_currentWr;
+static uint8_t rxBuffer_Tab[RX_BUFFER_SIZE];
+static uint32_t rxBuffer_wrPtr;
+static uint32_t rxBuffer_rdPtr;
+static uint8_t currentCommand[CMD_BUFFER_SIZE];
+static uint32_t currentCommandPos;
+static uint8_t commandHistory[CMD_HISTORY_LENGTH][RX_BUFFER_SIZE];
+static int commandHistoryIdx;
+static int commandHistoryIdxSav;
+static uint32_t txtCommandPos;
+static uint8_t txtCommand[TX_BUFFER_SIZE];
+static char cliPrompt[CLI_BUFFER_SIZE] = "Unknown M0 appli > ";
+static uint8_t uartRxCmd = 0;
+static uint32_t delayBeforeSleepOnM4 = 100000;
+static uint8_t uartLastChar;
+static uint8_t uartPayload[RX_BUFFER_SIZE];
+
+/* used with lld_ble */
+extern uint8_t *txBuffer_Ptr;
+uint8_t *rxBuffer_Ptr[8];
+uint32_t *rxStatus_Ptr[8];
+uint32_t *rxTimeStamp_Ptr[8];
+int *rxRSSI_Ptr[8];
+
+PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static TL_LLD_BLE_Config_t LldBleConfigBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t LldBleM0CmdPacket;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t LldBleCmdRspPacket;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t currentCommand[CMD_BUFFER_SIZE];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) param_hal_BLE_t bleparam_hal_BLE_Packet;
+
+/* debug */
+#define LLD_BLE_DEBUG
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint32_t debug_timer[4];
+uint32_t start_timer;
+uint32_t stop_timer;
+extern TIM_HandleTypeDef htim2;
+
+/* USER CODE BEGIN PV */
+/* Parameters */
+uint8_t init_done =0;
+uint8_t use_hal = 0;
+//uint32_t pressID = 0xAA00ABCD; // valid ko
+//uint32_t pressID = 0x01555555; // valid ko
+uint32_t pressID = 0x5A964129;
+uint8_t pressChannel1 = 8;
+uint8_t pressChannel2 = 9;
+uint32_t pressWakeup = 9876;
+uint32_t pressReceive = 19876;
+uint32_t pressReceiveAck = 576;
+uint32_t presstime=1234;
+
+/* data buffer Tab to send TX */
+uint8_t presstxBufferTab[258] ={0x95,0xFF,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,
+0x8A,0xA8,0xBB,0xFF,0x8A,0xA8,0xA8,0xA8,
+};
+uint8_t* presstxBuffer = presstxBufferTab;
+
+
+/* data buffer ACK Tab to send TX ACK after RX */
+uint8_t pressAcktxBufferTab[258] ={0x60,0x0D,
+0x4a,0x75,0x6c,0x69,0x65,0x6e,0x2b,0x4d,0x61,0x72,0x69,0x6e,0x65,
+};
+uint8_t* pressAcktxBuffer = pressAcktxBufferTab;
+
+
+/* data buffer Tab to receive RX (Not empty)*/
+uint8_t pressrxBufferTab[258]={0x77,0x24,
+0xAB,0xBA,0x67,0x76,0x55,0x55,0x4E,0xE4,0x9B,0xB9,0xAB,0xBA,
+0x6a,0x6f,0x73,0x65,0x70,0x68,0x20,0x65,0x74,0x20,0x68,0x6f,
+0x73,0x61,0x6e,0x6e,0x61,0x20,0x6c,0x65,0x20,0x63,0x6f,0x7a,
+};
+uint8_t* pressrxBuffer = pressrxBufferTab;
+
+/* data buffer ACK Tab to receive RX ACK after TX */
+uint8_t pressAckrxBufferTab[258]={0x33,0x0C,
+0x3E,0xE3,0x28,0x82,0x64,0x46,0xC1,0x1C,0x78,0x87,0xDC,0xCD,
+};
+/* pointer of data buffer ACK Tab to receive RX ACK after TX */
+uint8_t* pressAckrxBuffer= pressAckrxBufferTab;
+
+/* Routines */
+/* dataRoutine enum for LL and HAL dataRoutine() */
+dataCase_t dataRoutineDone_hal_BLE = dataCase_Custom0;
+dataCase_t dataRoutineTx_hal_BLE = dataCase_Custom1;
+dataCase_t dataRoutineRx_hal_BLE = dataCase_Custom2;
+dataCase_t dataRoutineStop_hal_BLE = dataCase_Custom3;
+
+/* dataRoutine enum for LL dataRoutine() */
+dataCase_t dataRoutine_LL_TxAck = dataCase_Custom4;
+dataCase_t dataRoutine_LL_RxAck = dataCase_Custom5;
+dataCase_t dataRoutine_Action = dataCase_Custom6;
+
+/* dataRoutine enum for HAL dataRoutine() */
+dataCase_t dataRoutine_HAL_Tx = dataCase_Custom4;
+dataCase_t dataRoutine_HAL_TxAck = dataCase_Custom5;
+dataCase_t dataRoutine_HAL_Rx = dataCase_Custom6;
+dataCase_t dataRoutine_HAL_RxAck = dataCase_Custom7;
+
+/* Routines options */
+uint32_t pressPacketNumber = 500; // NB of Successif PACKET using LL Send or Receive
+uint32_t pressPacketNumberTx = 500; // NB of Successif PACKET using HAL Send
+uint32_t pressPacketNumberRx = 400; // NB of Successif PACKET using HAL Receive
+uint8_t pressPacketStopRx = 0; // Stop after RX
+
+ActionPacket pressPacket[8];
+Led_TypeDef LED_TXRX=LED_BLUE;
+
+/* Hot config */
+uint32_t LLD_BLE_hot_ana_config_table[BLE_HOT_ANA_CONFIG_TABLE_LENGTH/4];
+
+/* Variable used with m0RadioProcess/m0CmdProcess */
+static uint8_t Toggle_in_progress=0;
+static uint8_t radioPacketNb=0;
+static uint32_t number_of_TXRX=0;
+static uint32_t number_of_RXACK=0;
+/* USER CODE END PV */
+
+/* Functions Definition ------------------------------------------------------*/
+void APP_LLD_BLE_Init( void )
+{
+ uint32_t devId = HAL_GetDEVID();
+ uint32_t revId = HAL_GetREVID();
+ uint8_t param[8];
+ char traceBuff[50];
+
+ SHCI_CmdStatus_t LldTestsInitStatus;
+
+ /* Check the compatibility with the Coprocessor Wireless Firmware loaded */
+ CheckWirelessFirmwareInfo();
+
+ /**
+ * Do not allow standby in the application
+ */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP_LLD_BLE, UTIL_LPM_DISABLE);
+
+ /* No need to activate the System low power mode as it is managed by the low-power test itself */
+ UTIL_LPM_SetStopMode(1 << CFG_LPM_APP_LLD_BLE, UTIL_LPM_DISABLE );
+
+ /* Init config buffer and call TL_LLD_BLE_Init */
+ APP_LLD_BLE_Init_TL();
+
+ /* Create a task to send CLI commands to M0 via IPCC */
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_SEND_TO_M0, UTIL_SEQ_RFU, SendCmdToM0);
+
+ /* Create a task to process data received from UART and create CLI commands */
+ Appli_ProcessMode();
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_PROCESS_UART_RX_BUFFER, UTIL_SEQ_RFU, uartRxBufferProcess);
+
+ /* Create tasks to process interrupt from/to UART to avoid locking UART during IT processing */
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_PROCESS_UART_RX_IT, UTIL_SEQ_RFU, uartRxItProcess);
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_PROCESS_UART_TX_IT, UTIL_SEQ_RFU, uartTxItProcess);
+
+ /* Create a task to manage commands from M0 */
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_CMD_FROM_M0_TO_M4, UTIL_SEQ_RFU, m0CmdProcess);
+
+ /* Create Task for Appli */
+ Appli_RegTask();
+
+ /* Configure UART for receiving CLI command from PC and sending CLI response or notifications to PC */
+ txBusy = 0;
+ rxCmdAllowed = 0;
+ txBuffer_Tab[TX_BUFFER_SIZE-1] = 0;
+ txBuffer_wrPtr = 0;
+ txBuffer_rdPtr = 0;
+ rxBuffer_wrPtr = 0;
+ rxBuffer_rdPtr = 0;
+ currentCommandPos = 0;
+ commandHistoryIdx = 0;
+ commandHistoryIdxSav = 0;
+ APP_LLD_BLE_Init_UART_CLI();
+
+ /* Send LLD tests CLI start information to CLI UART */
+ uartTxBufferAdd("\r\n\n================================\r\n");
+#ifdef STM32WB35xx
+ sprintf(traceBuff, "= Little DORY");
+#else
+ sprintf(traceBuff, "= DORY");
+#endif
+ sprintf(traceBuff, "%s RF LLD BLE \r\n", traceBuff );
+ uartTxBufferAdd(traceBuff);
+ uartTxBufferAdd("================================\r\n");
+#if (CFG_FULL_LOW_POWER == 1U)
+ uartTxBufferAdd("Low-power mode is activated\r\n");
+#endif
+#if (CFG_DEBUGGER_SUPPORTED == 0U)
+ uartTxBufferAdd("Debugger de-activated\r\n");
+#endif
+#if (( CFG_DEBUG_TRACE_FULL == 0 ) && ( CFG_DEBUG_TRACE_LIGHT == 0 ))
+ uartTxBufferAdd("Trace is de-activated\r\n");
+#endif
+
+#if 0
+ APP_DBG("EXTI status");
+ sprintf(traceBuff, " IMR1 0x%08X IMR2 0x%08X", EXTI->IMR1, EXTI->IMR2);
+ APP_DBG(traceBuff);
+ sprintf(traceBuff, " EMR1 0x%08X EMR2 0x%08X", EXTI->EMR1, EXTI->EMR2);
+ APP_DBG(traceBuff);
+ sprintf(traceBuff, "C2IMR1 0x%08X C2IMR2 0x%08X", EXTI->C2IMR1, EXTI->C2IMR2);
+ APP_DBG(traceBuff);
+ sprintf(traceBuff, "C2EMR1 0x%08X C2EMR2 0x%08X", EXTI->C2EMR1, EXTI->C2EMR2);
+ APP_DBG(traceBuff);
+#endif
+
+#if 0
+ // Read the RCC_CR register
+ APP_DBG( "RCC_CR (0x%08X) = 0x%08X", (uint32_t)&(RCC->CR), RCC->CR);
+ // RCC CFGR register
+ APP_DBG( "RCC_CFGR (0x%08X) = 0x%08X", (uint32_t)&(RCC->CFGR), RCC->CFGR);
+ // PLL_CFG register
+ APP_DBG( "RCC_PLLCFGR (0x%08X) = 0x%08X", (uint32_t)&(RCC->PLLCFGR), RCC->PLLCFGR);
+#endif
+
+ /* Indicate end of M4 initialization */
+ APP_DBG("Test appli initialized on M4, wait for M0 initialization");
+
+ /* Send CLI start cmd to M0 (with device and revision ID as parameters */
+ memcpy(&param[0], &devId, 4 );
+ memcpy(&param[4], &revId, 4 );
+ LldTestsInitStatus = SHCI_C2_LLD_BLE_Init(8, param);
+ if(LldTestsInitStatus != SHCI_Success)
+ APP_DBG((char *)"!! ERROR during M0 init !!");
+
+ /* M0 init done, send first command to have M0 code info and thus, a first prompt will be printed automatically */
+ /* Do not accept new command from UART until this one is managed */
+ rxCmdAllowed = 0;
+ currentCommandPos = 5;
+ currentCommand[0] = HAL_BLE_UNUSED_CMDCODE ;/* HAL_BLE_INIT_CMDCODE cmdcode */
+ currentCommand[1] = 'i';
+ currentCommand[2] = 'n';
+ currentCommand[3] = 'f';
+ currentCommand[4] = 'o';
+ currentCommand[5] = 0;
+ /* Set corresponding task to send this command to M0 */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_SEND_TO_M0, CFG_SCH_PRIO_0);
+
+ /* Activate UART RX buffer processing task to allow USER command comming from UART */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_PROCESS_UART_RX_BUFFER, CFG_SCH_PRIO_0);
+
+ Appli_Init();
+
+}
+
+/**
+ * @brief Trace the error or the warning reported.
+ * @param ErrId :
+ * @param ErrCode
+ * @retval None
+ */
+void APP_LLD_BLE_Error(uint32_t ErrId, uint32_t ErrCode)
+{
+ switch(ErrId)
+ {
+ case ERR_LLD_BLE_SET_STATE_CB :
+ LldBleTraceError("ERROR : ERR_LLD_BLE_SET_STATE_CB ",ErrCode);
+ break;
+
+ case ERR_LLD_BLE_ERASE_PERSISTENT_INFO :
+ LldBleTraceError("ERROR : ERR_LLDT_BLE_ERASE_PERSISTENT_INFO ",ErrCode);
+ break;
+
+ case ERR_LLD_BLE_CHECK_WIRELESS :
+ LldBleTraceError("ERROR : ERR_LLD_BLE_CHECK_WIRELESS ",ErrCode);
+ break;
+
+ default :
+ LldBleTraceError("ERROR Unknown ", 0);
+ break;
+ }
+}
+
+
+/*************************************************************
+ *
+ * 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 (OpenThread or other module if any)
+ * @retval None
+ */
+static void LldBleTraceError(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 Check if the Coprocessor Wireless Firmware loaded supports Thread
+ * and display associated informations
+ * @param None
+ * @retval None
+ */
+static void CheckWirelessFirmwareInfo(void)
+{
+ WirelessFwInfo_t wireless_info_instance;
+ WirelessFwInfo_t* p_wireless_info = &wireless_info_instance;
+ char m0FwType[50] = "M0 FW Type : Unknown !! ";
+
+ if (SHCI_GetWirelessFwInfo(p_wireless_info) != SHCI_Success)
+ {
+ APP_LLD_BLE_Error((uint32_t)ERR_LLD_BLE_CHECK_WIRELESS, 0);
+ }
+ else
+ {
+ APP_DBG("**********************************************************");
+ APP_DBG("Loaded M0 TEST FW info :");
+ switch(p_wireless_info->StackType)
+ {
+ case INFO_STACK_TYPE_802154_LLD_TESTS :
+ sprintf(m0FwType, " M0 FW Type : 802.15.4 and radio LLDs tests");
+ sprintf(cliPrompt, "802.15.4 TESTS > ");
+ break;
+
+ case INFO_STACK_TYPE_802154_PHY_VALID :
+ sprintf(m0FwType, " M0 FW Type : 802.15.4 and radio PHY validation");
+ sprintf(cliPrompt, "802.15.4 valid cli > ");
+ break;
+
+ case INFO_STACK_TYPE_BLE_PHY_VALID :
+ sprintf(m0FwType, " M0 FW Type : BLE and radio PHY validation");
+ sprintf(cliPrompt, "BLE valid cli > ");
+ break;
+
+ default :
+ /* FW not supported */
+ APP_LLD_BLE_Error((uint32_t)ERR_LLD_BLE_CHECK_WIRELESS, 0);
+ break;
+ }
+ APP_DBG(m0FwType);
+
+ /* Print version */
+ APP_DBG(" M0 FW VERSION = v%d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
+
+ APP_DBG("**********************************************************");
+ }
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Perform initialization of CLI UART interface.
+ * @param None
+ * @retval None
+ */
+void APP_LLD_BLE_Init_UART_CLI(void)
+{
+#if (CFG_HW_USART1_ENABLED == 1)
+ MX_USART1_UART_Init();
+
+ /* Put the UART device in reception mode and wait for interrupt */
+ if (HW_UART_Receive_IT(CFG_CLI_UART, &rxBuffer_Tab[rxBuffer_wrPtr], 1, uartRxCpltCallback) != hw_uart_ok)
+ APP_DBG((char *)"!! HAL_UART_Receive_IT error on M4 in APP_LLD_BLE_Init_UART_CLI !!");
+#endif
+}
+
+/**
+ * @brief Perform de-initialization of CLI UART interface.
+ * @param None
+ * @retval None
+ */
+void APP_LLD_BLE_DeInit_UART_CLI(void)
+{
+#if (CFG_HW_USART1_ENABLED == 1)
+ MX_USART1_UART_DeInit();
+#endif
+}
+
+static void uartRxCpltCallback(void)
+{
+ /* This callback is called :
+ - during RX isr (huart->RxISR)
+ - after bytes copy in buffer specified in last call to HW_UART_Receive_IT()
+ - when number of bytes specified in last call to HW_UART_Receive_IT() is acheived */
+
+ /* Prepare buffer to receive next character */
+ if ( rxCmdAllowed ) {
+ /* Increment read pointer index and manage buffer rollover */
+ rxBuffer_wrPtr++;
+ if(rxBuffer_wrPtr >= RX_BUFFER_SIZE)
+ rxBuffer_wrPtr = 0;
+ }
+
+ /* Re-put UART device in reception mode (not during IT to avoid locking the device while perhaps in transmit phase) */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_PROCESS_UART_RX_IT, CFG_SCH_PRIO_0);
+}
+
+static void uartRxItProcess(void)
+{
+ /* Put the UART device in reception mode and wait for interrupt */
+ if (HW_UART_Receive_IT(CFG_CLI_UART, &rxBuffer_Tab[rxBuffer_wrPtr], 1, uartRxCpltCallback) != hw_uart_ok)
+ APP_DBG((char *)"!! HAL_UART_Receive_IT error on M4 in uartRxItProcess !!");
+}
+
+static void uartClearChars(int nbChar)
+{
+ char clearCmd[2];
+
+ clearCmd[0] = CHAR_DEL;
+ clearCmd[1] = 0;
+ for (int i = 0; i < nbChar; i++) {
+ uartTxBufferAdd(clearCmd);
+ }
+}
+
+static void uartRxBufferProcessMode(uint8_t uartRxCmdEnable) /* 1 for Cmd ; 0 for Print */
+{
+ uartRxCmd=uartRxCmdEnable;
+}
+
+static void uartRxBufferProcess( void )
+{
+ char last_char[2];
+ static int8_t escape = -1;
+ static uint8_t escape_seq[3] = {0};
+
+ /* Ensure that last_char buffer contains a string with the char and a \0 (usefull to send echo or CHAR_DEL to UART) */
+ last_char[1] = 0;
+
+ if(uartRxCmd) {
+ /* Interpret and Command the character reception from UART */
+ while (rxBuffer_rdPtr != rxBuffer_wrPtr ) {
+ last_char[0] = rxBuffer_Tab[rxBuffer_rdPtr];
+ if( escape >= 0 ) {
+ escape_seq[escape++] = last_char[0];
+ if ( escape == 2 ) {
+ if ( strcmp((char*)escape_seq, "[A") == 0 ) { // UP
+ uartClearChars(currentCommandPos);
+ commandHistoryIdx = (commandHistoryIdx > 0) ? (commandHistoryIdx - 1) : (CMD_HISTORY_LENGTH - 1);
+ strcpy((char*)currentCommand,(char*)commandHistory[commandHistoryIdx]);
+ currentCommandPos = strlen((char*)currentCommand);
+ uartTxBufferAdd((char*)currentCommand);
+ }
+ if ( strcmp((char*)escape_seq, "[B") == 0 ) { // DOWN
+ uartClearChars(currentCommandPos);
+ commandHistoryIdx = (commandHistoryIdx < (CMD_HISTORY_LENGTH - 1)) ? (commandHistoryIdx + 1) : 0;
+ strcpy((char*)currentCommand,(char*)commandHistory[commandHistoryIdx]);
+ currentCommandPos = strlen((char*)currentCommand);
+ uartTxBufferAdd((char*)currentCommand);
+ }
+ escape = -1;
+ }
+ }
+ else if ( last_char[0] == CHAR_DEL ) {
+ if ( currentCommandPos > 0 ) {
+ currentCommandPos--;
+ uartTxBufferAdd(last_char);
+ }
+ }
+ else if ( last_char[0] == CHAR_ESC ) {
+ escape = 0;
+ }
+ else if ( last_char[0] == CHAR_CTRLC ) {
+ /* Just send a new prompt to wait for a new command */
+ currentCommandPos = 0;
+ uartTxBufferAdd("\r\n");
+ uartTxBufferAdd(cliPrompt);
+ }
+ else if ( ( last_char[0] == '\r' ) || ( last_char[0] == '\n' )) {
+ if (currentCommandPos == 0) {
+ /* User just typed 'enter' without any command, so, just send a new prompt to wait for a new command */
+ uartTxBufferAdd("\r\n");
+ uartTxBufferAdd(cliPrompt);
+ } else {
+ /* Do not accept new command from UART until this one is managed */
+ rxCmdAllowed = 0;
+
+ /* Put a end of line in UART TX buffer to have the echo sent */
+ uartTxBufferAdd("\r\n");
+
+ /* Copy the current command in history buffer before to send it to M0 */
+ memcpy(commandHistory[commandHistoryIdxSav],currentCommand,currentCommandPos);
+ /* add a \0 to avoid reseting end of command history buffer */
+ commandHistory[commandHistoryIdxSav][currentCommandPos] = 0;
+ commandHistoryIdxSav = (commandHistoryIdxSav+1) % CMD_HISTORY_LENGTH;
+ commandHistoryIdx = commandHistoryIdxSav;
+
+ /* UART task scheduling to send it to M0 */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_SEND_TO_M0, CFG_SCH_PRIO_0);
+ }
+ }
+ else {
+ /* Put the char in UART TX buffer to have the echo sent */
+ uartTxBufferAdd(last_char);
+ /* Put the char in the current command buffer */
+ currentCommand[currentCommandPos++] = last_char[0];
+ }
+
+ /* Increment read pointer index and manage buffer rollover */
+ rxBuffer_rdPtr++;
+ if(rxBuffer_rdPtr >= RX_BUFFER_SIZE)
+ rxBuffer_rdPtr = 0;
+ }
+ } else {
+ /* Interpret and Print the character reception from UART */
+ while (rxBuffer_rdPtr != rxBuffer_wrPtr ) {
+ last_char[0] = rxBuffer_Tab[rxBuffer_rdPtr];
+ if( escape >= 0 ) {
+ escape_seq[escape++] = last_char[0];
+ if ( escape == 2 ) {
+ if ( strcmp((char*)escape_seq, "[A") == 0 ) { // UP
+ uartClearChars(txtCommandPos);
+ commandHistoryIdx = (commandHistoryIdx > 0) ? (commandHistoryIdx - 1) : (CMD_HISTORY_LENGTH - 1);
+ strcpy((char*)txtCommand,(char*)commandHistory[commandHistoryIdx]);
+ txtCommandPos = strlen((char*)txtCommand);
+ uartTxBufferAdd((char*)txtCommand);
+ }
+ if ( strcmp((char*)escape_seq, "[B") == 0 ) { // DOWN
+ uartClearChars(txtCommandPos);
+ commandHistoryIdx = (commandHistoryIdx < (CMD_HISTORY_LENGTH - 1)) ? (commandHistoryIdx + 1) : 0;
+ strcpy((char*)txtCommand,(char*)commandHistory[commandHistoryIdx]);
+ txtCommandPos = strlen((char*)txtCommand);
+ uartTxBufferAdd((char*)txtCommand);
+ }
+ escape = -1;
+ }
+ }
+ else if ( last_char[0] == CHAR_DEL ) {
+ if ( txtCommandPos > 0 ) {
+ txtCommandPos--;
+ uartTxBufferAdd(last_char);
+ }
+ }
+ else if ( last_char[0] == CHAR_ESC ) {
+ escape = 0;
+ }
+ else if ( last_char[0] == CHAR_CTRLC ) {
+ /* Just send a new prompt to wait for a new command */
+ txtCommandPos = 0;
+ uartTxBufferAdd("\r\n");
+ uartTxBufferAdd(cliPrompt);
+ }
+ else if ( ( last_char[0] == '\r' ) || ( last_char[0] == '\n' )) {
+ if (txtCommandPos == 0) {
+ /* User just typed 'enter' without any command, so, just send a new prompt to wait for a new command */
+ uartTxBufferAdd("\r\n");
+ uartTxBufferAdd(cliPrompt);
+ uartLastChar=0;
+
+ } else {
+ /* Do not accept new command from UART until this one is managed */
+ rxCmdAllowed = 0;
+
+ /* Put a end of line in UART TX buffer to have the echo sent */
+ uartTxBufferAdd("\r\n");
+
+ /* Copy the current command in history buffer before to send it to M0 */
+ memcpy(commandHistory[commandHistoryIdxSav],txtCommand,txtCommandPos);
+ /* add a \0 to avoid reseting end of command history buffer */
+ commandHistory[commandHistoryIdxSav][txtCommandPos] = 0;
+ commandHistoryIdxSav = (commandHistoryIdxSav+1) % CMD_HISTORY_LENGTH;
+ commandHistoryIdx = commandHistoryIdxSav;
+
+ /* UART task scheduling to send it to M0 */
+ /* Send Packet with UART Char as Payload */
+ uartPayload[0]= 0xAA; // Appli Header
+ uartPayload[1]= txtCommandPos; // Appli Length
+ memcpy(&uartPayload[2],txtCommand,txtCommandPos);
+ txtCommandPos=0;
+ Appli_uartRxBufferPrint();
+ uartLastChar=1;
+
+ }
+ }
+ else {
+ /* Put the char in UART TX buffer to have the echo sent */
+ uartTxBufferAdd(last_char);
+ /* Put the char in the current command buffer */
+ txtCommand[txtCommandPos++] = last_char[0];
+ }
+
+ /* Increment read pointer index and manage buffer rollover */
+ rxBuffer_rdPtr++;
+ if(rxBuffer_rdPtr >= RX_BUFFER_SIZE)
+ rxBuffer_rdPtr = 0;
+ }
+ }
+
+ /* Re-activate UART RX buffer processing task */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_PROCESS_UART_RX_BUFFER, CFG_SCH_PRIO_0);
+}
+
+uint32_t txBufferFullCount;
+static void uartTxBufferAdd(const char * str)
+{
+ uint16_t bytesToWrite = strlen(str);
+ uint32_t txBufferFull = 0;
+
+ if (bytesToWrite) {
+ CRITICAL_BEGIN();
+ {
+ uint16_t remainingBytesToWrite = bytesToWrite;
+ uint32_t currentWrPtr = txBuffer_wrPtr;
+ uint8_t * currentWrAddr = &txBuffer_Tab[txBuffer_wrPtr];
+
+ while ((remainingBytesToWrite > 0) && (txBufferFull == 0)) {
+ if ((txBuffer_rdPtr == (currentWrPtr + 1)) || ((txBuffer_rdPtr == 0) && (currentWrPtr == (TX_BUFFER_SIZE - 1)))) {
+ /* If there is not enougth place (i.e. write pointer is just behind read pointer in the circular buffer),
+ buffer is full, so do not consider new string */
+ /* !! No trace here as it is under CRITICAL section */
+ txBufferFull = 1;
+ } else {
+ *currentWrAddr = str[bytesToWrite - remainingBytesToWrite];
+ remainingBytesToWrite--;
+
+ /* Increment write pointer index and manage buffer rollover */
+ currentWrPtr++;
+ if(currentWrPtr >= TX_BUFFER_SIZE)
+ currentWrPtr = 0;
+ currentWrAddr = &txBuffer_Tab[currentWrPtr];
+ }
+ }
+
+ if (txBufferFull == 0) {
+ txBuffer_wrPtr = currentWrPtr;
+ }
+ }
+ CRITICAL_END();
+
+ if (txBufferFull == 0) {
+ if (txBusy == 0) {
+ txBusy = 1;
+ uartTxCpltCallback();
+ }
+ } else {
+ txBufferFullCount++;
+ APP_DBG((char *)"!! TX buffer full : %u", txBufferFullCount);
+ }
+ }
+}
+
+static void uartTxCpltCallback(void)
+{
+ /* Prepare buffer to receive next character */
+ if ( txBuffer_rdPtr != txBuffer_wrPtr ) {
+ /* Re-put UART device in reception mode (not during IT to avoid locking the device while perhaps in transmit phase) */
+ pTxBuff_currentWr = &txBuffer_Tab[txBuffer_rdPtr];
+ UTIL_SEQ_SetTask(1U << CFG_TASK_PROCESS_UART_TX_IT, CFG_SCH_PRIO_0);
+
+ /* Increment write pointer index and manage buffer rollover */
+ txBuffer_rdPtr++;
+ if(txBuffer_rdPtr >= TX_BUFFER_SIZE)
+ txBuffer_rdPtr = 0;
+ } else {
+ txBusy = 0;
+ }
+}
+
+static void uartTxItProcess(void)
+{
+ /* Put the UART device in transmission mode and wait for interrupts :
+ - 1 to write the data in TDR register
+ - 1 when char is sent
+ - 1 to indicate end of transmit if several chars are to be transmitted */
+ if (HW_UART_Transmit_IT(CFG_CLI_UART, pTxBuff_currentWr, 1, uartTxCpltCallback) != hw_uart_ok)
+ APP_DBG((char *)"!! HAL_UART_Transmit_IT error on M4 in uart TX callback !!");
+}
+
+/**
+ * @brief Process sends CLI command to M0.
+ * @param None
+ * @retval None
+ */
+static void SendCmdToM0(void)
+{
+ memset(LldBleCmdRspPacket.cmdserial.cmd.payload, 0x0U, 255U);
+ *(uint32_t *)LldBleCmdRspPacket.cmdserial.cmd.payload = (uint32_t)currentCommand;
+ *(uint32_t *)&LldBleCmdRspPacket.cmdserial.cmd.payload[4] = currentCommandPos;
+ LldBleCmdRspPacket.cmdserial.cmd.plen = 8;
+ LldBleCmdRspPacket.cmdserial.cmd.cmdcode = 0x0;
+
+ TL_LLD_BLE_SendCmd();
+}
+
+/**
+ * @brief Perform initialization of TL for LLD tests.
+ * @param None
+ * @retval None
+ */
+void APP_LLD_BLE_Init_TL(void)
+{
+ LldBleConfigBuffer.p_LldBleCmdRspBuffer = (uint8_t*)&LldBleCmdRspPacket;
+ LldBleConfigBuffer.p_LldBleM0CmdBuffer = (uint8_t*)&LldBleM0CmdPacket;
+
+ TL_LLD_BLE_Init( &LldBleConfigBuffer );
+}
+
+static void m0RadioProcess(void)
+{
+ switch (m0Cmd) {
+ case CMD_FROM_M0_RADIO_STOP :
+ Appli_m0RadioProcess_RadioStop();
+ break;
+
+ case CMD_FROM_M0_RADIO_END :
+ Appli_m0RadioProcess_RadioEnd();
+ break;
+
+ case CMD_FROM_M0_RADIO_RXACK :
+ Appli_m0RadioProcess_RxAck();
+ break;
+
+ case CMD_FROM_M0_RADIO_RXOK :
+ Appli_m0RadioProcess_RxOk();
+ break;
+
+ case CMD_FROM_M0_RADIO_RXACKEND :
+ Appli_m0RadioProcess_RxAckEnd();
+ break;
+
+ case CMD_FROM_M0_RADIO_RXOKEND :
+ Appli_m0RadioProcess_RxOkEnd();
+ break;
+
+ default:
+ break;
+ }
+}
+
+static void m0CmdProcess(void)
+{
+ switch (m0Cmd) {
+
+ case CMD_FROM_M0_RADIO_STOP :
+ Appli_m0CmdProcess_RadioStop();
+ break;
+
+ case CMD_FROM_M0_RADIO_END :
+ Appli_m0CmdProcess_RadioEnd();
+ break;
+
+ case CMD_FROM_M0_RADIO_RXACK :
+ Appli_m0CmdProcess_RxAck();
+ break;
+
+ case CMD_FROM_M0_RADIO_RXOK :
+ Appli_m0CmdProcess_RxOk();
+ break;
+
+ case CMD_FROM_M0_RADIO_RXACKEND :
+ Appli_m0CmdProcess_RxAckEnd();
+ break;
+
+ case CMD_FROM_M0_RADIO_RXOKEND :
+ Appli_m0CmdProcess_RxOkEnd();
+ break;
+
+ case CMD_FROM_M0_STOP0_ON :
+ m0CmdStopRequired(0);
+ break;
+
+ case CMD_FROM_M0_STOP1_ON :
+ m0CmdStopRequired(1);
+ break;
+
+ case CMD_FROM_M0_STOP2_ON :
+ m0CmdStopRequired(2);
+ break;
+
+ case CMD_FROM_M0_STOP_OFF :
+ // Nothing done here as the goal of this command is just to have an IPCC interrupt
+ // that will make the M4 going out of STOP or WFI
+ break;
+
+ case CMD_FROM_M0_GO_IN_WFI :
+ m0CmdStopRequired(3);
+ break;
+
+ case CMD_FROM_M0_GO_DIRECTLY_IN_WFI :
+ m0CmdStopRequired(4);
+ break;
+
+ case CMD_FROM_M0_USE_MSI :
+ SystemClock_Config_MSI(0);
+ break;
+
+ case CMD_FROM_M0_USE_MSI_PLL :
+ SystemClock_Config_MSI(1);
+ break;
+
+ case CMD_FROM_M0_USE_HSE :
+ SystemClock_Config_HSE(0);
+ break;
+
+ case CMD_FROM_M0_USE_HSE_PLL :
+ SystemClock_Config_HSE(1);
+ break;
+
+#if (CFG_HW_EXTPA_ENABLED == 1)
+ case CMD_FROM_M0_EXT_PA_EN :
+ gpio_lld_extPa_init();
+ // Indicate to M0 which GPIO must be managed
+ SHCI_C2_ExtpaConfig((uint32_t)GPIO_EXT_PA_EN_PORT, GPIO_EXT_PA_EN_PIN, EXT_PA_ENABLED_HIGH, EXT_PA_ENABLED);
+ break;
+
+ case CMD_FROM_M0_EXT_PA_DIS :
+ gpio_lld_extPa_deInit();
+ SHCI_C2_ExtpaConfig((uint32_t)GPIO_EXT_PA_EN_PORT, GPIO_EXT_PA_EN_PIN, EXT_PA_ENABLED_HIGH, EXT_PA_DISABLED);
+ break;
+#endif
+
+ default:
+ break;
+ }
+}
+
+static void m4ConfigBeforeStop(void)
+{
+ // Clear C1 Stop flag if any remaining
+ LL_PWR_ClearFlag_C1STOP_C1STB();
+}
+
+static void m4ConfigAfterStop(void)
+{
+ // Clear C1 Stop flag
+ LL_PWR_ClearFlag_C1STOP_C1STB();
+}
+
+static void m0CmdStopRequired(uint32_t stopRequired)
+{
+ switch (stopRequired) {
+ case 0:
+ // flush IPC and trace before sleeping. Let time to M0 to set RF in sleep and to be in STOP if needed
+ us_delay(delayBeforeSleepOnM4);
+
+ // Stop UART and its GPIOs to reduce power consumption
+ APP_LLD_BLE_DeInit_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_DeInit();
+#endif
+
+ // trial for no IT (ex RF) at low speed
+ CRITICAL_BEGIN();
+
+ // Prepare system to be stopped
+ m4ConfigBeforeStop();
+
+ // Enter selected STOP mode
+ HAL_PWREx_EnterSTOP0Mode(PWR_STOPENTRY_WFI);
+
+ // Restart system
+ m4ConfigAfterStop();
+
+ // Restart UART before to go out of critical area to not have to send trace from M0 before to restart it
+ APP_LLD_BLE_Init_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_Init();
+#endif
+
+ // trial for no IT (ex RF) at low speed
+ CRITICAL_END();
+
+ APP_DBG("M4 back from STOP0");
+ break;
+
+ case 1:
+ // flush IPC and trace before sleeping. Let time to M0 to set RF in sleep and to be in STOP if needed
+ us_delay(delayBeforeSleepOnM4);
+
+ // Stop UART and its GPIOs to reduce power consumption
+ APP_LLD_BLE_DeInit_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_DeInit();
+#endif
+
+ // trial for no IT (ex RF) at low speed
+ CRITICAL_BEGIN();
+
+ // Prepare system to be stopped
+ m4ConfigBeforeStop();
+
+ // Enter selected STOP mode
+ HAL_PWREx_EnterSTOP1Mode(PWR_STOPENTRY_WFI);
+
+ // Restart system
+ m4ConfigAfterStop();
+
+ // Restart UART before to go out of critical area to not have to send trace from M0 before to restart it
+ APP_LLD_BLE_Init_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_Init();
+#endif
+
+ // trial for no IT (ex RF) at low speed
+ CRITICAL_END();
+
+ APP_DBG("M4 back from STOP1");
+ break;
+
+ case 2:
+ // flush IPC and trace before sleeping. Let time to M0 to set RF in sleep and to be in STOP if needed
+ us_delay(delayBeforeSleepOnM4);
+
+ // Stop UART and its GPIOs to reduce power consumption
+ APP_LLD_BLE_DeInit_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_DeInit();
+#endif
+
+ // trial for no IT (ex RF) at low speed
+ CRITICAL_BEGIN();
+
+ // Prepare system to be stopped
+ m4ConfigBeforeStop();
+
+ // Enter selected STOP mode
+ HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
+
+ // Restart system
+ m4ConfigAfterStop();
+
+ // Restart UART before to go out of critical area to not have to send trace from M0 before to restart it
+ APP_LLD_BLE_Init_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_Init();
+#endif
+
+ // trial for no IT (ex RF) at low speed
+ CRITICAL_END();
+
+ APP_DBG("M4 back from STOP2");
+ break;
+
+ case 3:
+ // flush IPC and trace before sleeping. Let time to M0 to set RF in sleep and to be in STOP if needed
+ us_delay(delayBeforeSleepOnM4);
+
+ // Stop UART and its GPIOs to reduce power consumption
+ APP_LLD_BLE_DeInit_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_DeInit();
+#endif
+
+ // trial for no IT (ex RF) at low speed
+ CRITICAL_BEGIN();
+
+ __WFI();
+ // Restart UART before to go out of critical area to not have to send trace from M0 before to restart it
+ APP_LLD_BLE_Init_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_Init();
+#endif
+
+ // trial for no IT (ex RF) at low speed
+ CRITICAL_END();
+
+ APP_DBG("M4 back from WFI");
+ break;
+
+ case 4:
+ // Put M4 in WFI without delay :
+ // - In some cases, it is recomanded to limit the M4 activity to avoid Flash access which can slow down the M0 which share it with M4
+ // - But, be carrefull as WFI can be blocking as there is no more interrupts
+ // - As example, if not used, SF timer test is failed.
+ __WFI();
+ APP_DBG("M4 back from WFI (without delay)");
+ break;
+
+ default:
+ break;
+ }
+}
+
+/**
+ * @brief Send Ack to M0 CLI Response channel.
+ * @param None
+ * @retval None
+ */
+static void SendRspAckToM0(void)
+{
+ /* Notify M0 that CLI notification has been taken into account */
+ TL_LLD_BLE_SendRspAck();
+}
+
+/**
+ * @brief This function is called when notification on CLI TL Channel from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_CmdPacket_t
+ * @return None
+ */
+void TL_LLD_BLE_ReceiveRsp( TL_CmdPacket_t * Notbuffer )
+{
+
+ uint8_t l_size = Notbuffer->cmdserial.cmd.plen;
+ char * sourceBuf = (char *)Notbuffer->cmdserial.cmd.payload;
+
+ if (l_size > 0)
+ {
+ if (strncmp(sourceBuf, "Resp_End", 9) == 0)
+ {
+ /* This is an answer to indicate that the CLI command has been completed */
+ UTIL_SEQ_SetEvt(1U << CFG_EVT_RECEIVE_RSPACKEVT);
+
+ /* Write a promp to UART and allow to receive a new command */
+ //sprintf(cliPrompt, "LLD BLE > ");
+ //uartTxBufferAdd("\r\n");
+ //uartTxBufferAdd(cliPrompt);
+
+ currentCommandPos = 0;
+ rxCmdAllowed = 1;
+ }
+ else
+ {
+ /* This is just a trace from M0, write to CLI UART buffer */
+ uartTxBufferAdd(sourceBuf);
+ }
+ }
+ else
+ {
+ APP_DBG((char *)"!! Empty M0 CLI response received by M4 !!");
+ }
+ SendRspAckToM0();
+}
+
+/**
+ * @brief Send Ack to M0 CLI Response channel.
+ * @param None
+ * @retval None
+ */
+static void SendM0CmdAckToM0(void)
+{
+ /* Notify M0 that CLI notification has been taken into account */
+ TL_LLD_BLE_SendM0CmdAck();
+}
+
+/**
+ * @brief This function is called when notification on CLI TL Channel from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_CmdPacket_t
+ * @return None
+ */
+void TL_LLD_BLE_ReceiveM0Cmd( TL_CmdPacket_t * cmdBuffer )
+{
+ //TL_CmdPacket_t* l_CliBuffer = (TL_CmdPacket_t*)Notbuffer;
+ uint8_t bufferSize = cmdBuffer->cmdserial.cmd.plen;
+ char * bufferAddr = (char *)cmdBuffer->cmdserial.cmd.payload;
+ //uint32_t length = *(uint32_t *)&l_CliBuffer->cmdserial.cmd.payload[4];
+
+ if (bufferSize > 0)
+ {
+ if (strncmp(bufferAddr, "Radio_Stop", 10) == 0)
+ {
+ m0Cmd = CMD_FROM_M0_RADIO_STOP;
+
+ /* Action under IT */
+ m0RadioProcess();
+
+ /* Action under Sequencer */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+
+ }
+ else if (strncmp(bufferAddr, "Radio_End", 9) == 0)
+ {
+ m0Cmd = CMD_FROM_M0_RADIO_END;
+
+ /* Action under IT */
+ m0RadioProcess();
+
+ /* Action under Sequencer */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+
+ }
+ else if (strncmp(bufferAddr, "Radio_RxAckEnd", 14) == 0)
+ {
+ m0Cmd = CMD_FROM_M0_RADIO_RXACKEND;
+
+ /* Action under IT */
+ m0RadioProcess();
+
+ /* Action under Sequencer */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+
+ }
+ else if (strncmp(bufferAddr, "Radio_RxOkEnd", 13) == 0)
+ {
+ m0Cmd = CMD_FROM_M0_RADIO_RXOKEND;
+
+ /* Action under IT */
+ m0RadioProcess();
+
+ /* Action under Sequencer */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+
+ }
+ else if (strncmp(bufferAddr, "Radio_RxAck", 11) == 0)
+ {
+ m0Cmd = CMD_FROM_M0_RADIO_RXACK;
+
+ /* Action under IT */
+ m0RadioProcess();
+
+ /* Action under Sequencer */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+
+ }
+ else if (strncmp(bufferAddr, "Radio_RxOk", 10) == 0)
+ {
+ m0Cmd = CMD_FROM_M0_RADIO_RXOK;
+
+ /* Action under IT */
+ m0RadioProcess();
+
+ /* Action under Sequencer */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+
+ }
+ else if (strncmp(bufferAddr, "stop0_on", 8) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_STOP0_ON;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "stop1_on", 8) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_STOP1_ON;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "stop2_on", 8) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_STOP2_ON;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "stop_off", 8) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_STOP_OFF;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "go_in_wfi", 9) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_GO_IN_WFI;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "go_directly_in_wfi", 18) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_GO_DIRECTLY_IN_WFI;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "use_msi_no_pll", 14) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_USE_MSI;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "use_msi_pll", 11) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_USE_MSI_PLL;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "use_hse_no_pll", 14) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_USE_HSE;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "use_hse_pll", 11) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_USE_HSE_PLL;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "ext_pa_enable", 13) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_EXT_PA_EN;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "ext_pa_disable", 14) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_EXT_PA_DIS;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else
+ {
+ APP_DBG((char *)"!! Unknown M0 command received by M4 !!");
+ }
+ }
+ else
+ {
+ APP_DBG((char *)"!! Empty M0 command received by M4 !!");
+ }
+ SendM0CmdAckToM0();
+}
+
+/**
+ * @brief This function is called to Send Command to M0, Every lld_ble API call this function
+ *
+ * @param currentCmd : a value of the lld_ble API
+ * @param currentPt : a pointer to param_hal_BLE_t
+ * @return M0 return value
+ */
+uint8_t APP_LLD_BLE_SendCmdM0(uint8_t currentCmd , uint32_t* currentPt)
+{
+ /* M0 init done, send first command to have M0 code info and thus, a first prompt will be printed automatically */
+ /* Do not accept new command from UART until this one is managed */
+ rxCmdAllowed = 0;
+ currentCommandPos = 5;
+ currentCommand[0] = currentCmd ;
+ currentCommand[1] = (uint8_t)((((uint32_t)(currentPt)) >> 0) & 0xFF);
+ currentCommand[2] = (uint8_t)((((uint32_t)(currentPt)) >> 8) & 0xFF);
+ currentCommand[3] = (uint8_t)((((uint32_t)(currentPt)) >> 16) & 0xFF);
+ currentCommand[4] = (uint8_t)((((uint32_t)(currentPt)) >> 24) & 0xFF);
+
+ currentCommand[5] = 0;
+
+ /* Set corresponding task to send this command to M0 */
+ //UTIL_SEQ_SetTask(1U << CFG_TASK_SEND_TO_M0, CFG_SCH_PRIO_0);
+ UTIL_SEQ_ClrEvt(1U << CFG_EVT_RECEIVE_RSPACKEVT);
+ SendCmdToM0();
+
+ UTIL_SEQ_WaitEvt(1U << CFG_EVT_RECEIVE_RSPACKEVT);
+
+ /* Activate UART RX buffer processing task to allow USER command comming from UART */
+ //UTIL_SEQ_SetTask(1U << CFG_TASK_PROCESS_UART_RX_BUFFER, CFG_SCH_PRIO_0);
+ return(((param_hal_BLE_t*)(currentPt))->return_value);
+
+}
+
+/**
+ * @brief As the default systick is not used, declare here, at least, an empty function to
+ * over-write the default one as it declared as WEAK in HAL.
+ */
+void HAL_Delay(__IO uint32_t Delay)
+{
+ us_delay(Delay*1000);
+ return;
+}
+
+/* USER CODE BEGIN FD */
+/* Appli common functions */
+void Appli_ProcessMode(void)
+{
+ uartRxBufferProcessMode(1); /* cmd mode */
+}
+
+void Appli_RegTask(void)
+{
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_HAL_BLE_INIT , UTIL_SEQ_RFU, BUTTON_SW1_BLE_Init);
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_HAL_BLE_SENDPACKET , UTIL_SEQ_RFU, BUTTON_SW2_SendPacket);
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_HAL_BLE_RECEIVEPACKET , UTIL_SEQ_RFU, BUTTON_SW3_ReceivePacket);
+}
+
+void Appli_Init(void)
+{
+ HAL_TIM_Base_Start_IT(&htim2);
+ HAL_TIM_Base_Stop_IT(&htim2);
+}
+
+void Appli_uartRxBufferPrint(void)
+{
+ //No Appli Print
+}
+
+/* Appli radio functions */
+void Appli_m0RadioProcess_RadioStop(void)
+{
+ /* copy status from M0 BLE Radio */
+ radioPacketNb=bleparam_hal_BLE_Packet.txrxBuffer.rxBuffer[257];
+ *rxStatus_Ptr[radioPacketNb]=bleparam_hal_BLE_Packet.status; // status
+}
+
+void Appli_m0RadioProcess_RadioEnd(void)
+{
+ /* copy status from M0 BLE Radio */
+ radioPacketNb=bleparam_hal_BLE_Packet.txrxBuffer.rxBuffer[257];
+ *rxStatus_Ptr[radioPacketNb]=bleparam_hal_BLE_Packet.status; // status
+}
+
+void Appli_m0RadioProcess_RxAck(void)
+{
+ /* copy status from M0 BLE Radio */
+ radioPacketNb=bleparam_hal_BLE_Packet.txrxBuffer.rxBuffer[257];
+ *rxStatus_Ptr[radioPacketNb]=bleparam_hal_BLE_Packet.status; // status
+ /* copy payload from M0 BLE Radio */
+ memcpy(rxBuffer_Ptr[radioPacketNb],(bleparam_hal_BLE_Packet.txrxBuffer.rxBuffer),258);
+ number_of_RXACK++;
+}
+
+void Appli_m0RadioProcess_RxOk(void)
+{
+ /* copy status from M0 BLE Radio */
+ radioPacketNb=bleparam_hal_BLE_Packet.txrxBuffer.rxBuffer[257];
+ *rxStatus_Ptr[radioPacketNb]=bleparam_hal_BLE_Packet.status; // status
+ *rxTimeStamp_Ptr[radioPacketNb]=bleparam_hal_BLE_Packet.timestamp_receive; // timestamp_receive
+ *rxRSSI_Ptr[radioPacketNb]=bleparam_hal_BLE_Packet.rssi; // rssi
+ /* copy payload from M0 BLE Radio */
+ memcpy(rxBuffer_Ptr[radioPacketNb],(bleparam_hal_BLE_Packet.txrxBuffer.rxBuffer),258);
+ number_of_TXRX++;
+}
+
+void Appli_m0RadioProcess_RxAckEnd(void)
+{
+ /* copy status from M0 BLE Radio */
+ radioPacketNb=bleparam_hal_BLE_Packet.txrxBuffer.rxBuffer[257];
+ *rxStatus_Ptr[radioPacketNb]=bleparam_hal_BLE_Packet.status; // status
+ /* copy payload from M0 BLE Radio */
+ memcpy(rxBuffer_Ptr[radioPacketNb],(bleparam_hal_BLE_Packet.txrxBuffer.rxBuffer),258);
+ number_of_RXACK++;
+}
+
+void Appli_m0RadioProcess_RxOkEnd(void)
+{
+ /* copy status from M0 BLE Radio */
+ radioPacketNb=bleparam_hal_BLE_Packet.txrxBuffer.rxBuffer[257];
+ *rxStatus_Ptr[radioPacketNb]=bleparam_hal_BLE_Packet.status; // status
+ *rxTimeStamp_Ptr[radioPacketNb]=bleparam_hal_BLE_Packet.timestamp_receive; // timestamp_receive
+ *rxRSSI_Ptr[radioPacketNb]=bleparam_hal_BLE_Packet.rssi; // rssi
+ /* copy payload from M0 BLE Radio */
+ memcpy(rxBuffer_Ptr[radioPacketNb],(bleparam_hal_BLE_Packet.txrxBuffer.rxBuffer),258);
+ number_of_TXRX++;
+}
+
+void Appli_m0CmdProcess_RadioStop(void)
+{
+ sprintf(cliPrompt, "> Radio STOP : RXACK:%d RX:%d",number_of_RXACK ,number_of_TXRX);
+ uartTxBufferAdd("\r\n");
+ uartTxBufferAdd(cliPrompt);
+ number_of_RXACK=0;
+ number_of_TXRX=0;
+}
+
+void Appli_m0CmdProcess_RadioEnd(void)
+{
+ HAL_TIM_Base_Stop_IT(&htim2);
+ Toggle_in_progress=0;
+ BSP_LED_On(LED_RED);
+ BSP_LED_On(LED_GREEN);
+ sprintf(cliPrompt, "> Radio END: RXACK:%d RX:%d",number_of_RXACK ,number_of_TXRX);
+ uartTxBufferAdd("\r\n");
+ uartTxBufferAdd(cliPrompt);
+ number_of_RXACK=0;
+ number_of_TXRX=0;
+ if(uartLastChar) uartLastChar=0;
+}
+
+void Appli_m0CmdProcess_RxAck(void)
+{
+ if(Toggle_in_progress!=1){
+ Toggle_in_progress=1;
+ HAL_TIM_Base_Start_IT(&htim2);
+ }
+ sprintf(cliPrompt, "> Radio RXACK %d",number_of_RXACK);
+ uartTxBufferAdd("\r\n");
+ uartTxBufferAdd(cliPrompt);
+}
+
+void Appli_m0CmdProcess_RxOk(void)
+{
+ if(Toggle_in_progress!=1){
+ Toggle_in_progress=1;
+ HAL_TIM_Base_Start_IT(&htim2);
+ }
+ sprintf(cliPrompt, "> Radio RX %d",number_of_TXRX);
+ uartTxBufferAdd("\r\n");
+ uartTxBufferAdd(cliPrompt);
+}
+
+void Appli_m0CmdProcess_RxAckEnd(void)
+{
+ HAL_TIM_Base_Stop_IT(&htim2);
+ Toggle_in_progress=0;
+ BSP_LED_On(LED_RED);
+ BSP_LED_On(LED_GREEN);
+ sprintf(cliPrompt, "> Radio END: RXACK:%d",number_of_RXACK);
+ uartTxBufferAdd("\r\n");
+ uartTxBufferAdd(cliPrompt);
+ number_of_RXACK=0;
+}
+
+void Appli_m0CmdProcess_RxOkEnd(void)
+{
+ HAL_TIM_Base_Stop_IT(&htim2);
+ Toggle_in_progress=0;
+ BSP_LED_On(LED_RED);
+ BSP_LED_On(LED_GREEN);
+ sprintf(cliPrompt, "> Radio END: RX:%d",number_of_TXRX);
+ uartTxBufferAdd("\r\n");
+ uartTxBufferAdd(cliPrompt);
+ number_of_TXRX=0;
+}
+
+/* Appli custom functions */
+void BUTTON_SW1_BLE_Init(void)
+{
+ if (use_hal ==0) {
+ use_hal = 1 ;
+ init_done = 0 ;
+ BSP_LED_On(LED_BLUE);
+ BSP_LED_Off(LED_GREEN);
+ BSP_LED_Off(LED_RED);
+ } else {
+ use_hal = 0 ;
+ init_done = 0 ;
+ BSP_LED_Off(LED_BLUE); // default use LL
+ BSP_LED_Off(LED_GREEN);
+ BSP_LED_Off(LED_RED);
+ }
+}
+
+void BUTTON_SW2_SendPacket(void)
+{
+ LED_TXRX=LED_GREEN;
+
+ if (init_done ==0) {
+ init_done =1 ;
+ if (use_hal ==0) {
+ #ifdef LLD_BLE_DEBUG
+ bleparam_hal_BLE_Packet.InfoTime=(uint32_t)debug_timer;
+ #endif
+ LLD_BLE_Init(HS_STARTUP_TIME, 1, LLD_BLE_hot_ana_config_table, DISABLE);
+
+ LLD_BLE_GetStatus(&presstime);
+
+ uint8_t map[5]= {0xFF,0xFF,0xFF,0xFF,0xFF};
+ LLD_BLE_SetChannelMap(STATE_MACHINE_0, &map[0]);
+ LLD_BLE_SetChannel(STATE_MACHINE_0,pressChannel2,0);
+ LLD_BLE_SetTxAttributes(STATE_MACHINE_0, pressID, 0x555555,0);
+ LLD_BLE_SetTx_Rx_Phy(STATE_MACHINE_0, TX_PHY_2MBPS, RX_PHY_2MBPS);
+ LLD_BLE_SetBackToBackTime(BACK2BACK_TIME);
+
+ LLD_BLE_GetStatus(&presstime);
+
+ LLD_BLE_SetChannelMap(STATE_MACHINE_3, &map[0]);
+ LLD_BLE_SetChannel(STATE_MACHINE_3, pressChannel2, 0);
+ LLD_BLE_SetTxAttributes(STATE_MACHINE_3, ~pressID, 0x555555,0);
+ LLD_BLE_SetTx_Rx_Phy(STATE_MACHINE_3, TX_PHY_2MBPS, RX_PHY_2MBPS);
+ LLD_BLE_SetBackToBackTime(BACK2BACK_TIME);
+
+ presstxBufferTab[257]= 0xAA;
+ presstxBufferTab[256]= 0xBB;
+ presstxBufferTab[255]= 0xCC;
+
+ } else {
+ #ifdef LLD_BLE_DEBUG
+ bleparam_hal_BLE_Packet.InfoTime=(uint32_t)debug_timer;
+ #endif
+ HAL_BLE_Init();
+ HAL_BLE_SetNetworkID(pressID);
+ }
+ BSP_LED_On(LED_GREEN);
+ BSP_LED_On(LED_RED);
+ } else if(!use_hal) {
+ LLD_BLE_GetStatus(&presstime);
+
+
+ pressPacket[APACKET_0].StateMachineNo = STATE_MACHINE_0;
+ pressPacket[APACKET_0].ActionTag = TXRX | PLL_TRIG | TIMER_WAKEUP | RELATIVE ;
+ pressPacket[APACKET_0].WakeupTime = pressWakeup;
+ pressPacket[APACKET_0].ReceiveWindowLength = 0; /* does not affect for Tx */
+ pressPacket[APACKET_0].data = presstxBuffer;
+ pressPacket[APACKET_0].next_true = APACKET_1;
+ pressPacket[APACKET_0].next_false = APACKET_NULL;
+ pressPacket[APACKET_0].condRoutine = condCase_Done;
+ pressPacket[APACKET_0].dataRoutine = dataRoutine_LL_TxAck;
+ pressPacket[APACKET_0].actionPacketNb = APACKET_0;
+ LLD_BLE_SetReservedArea(&pressPacket[APACKET_0]);
+
+ pressPacket[APACKET_1].StateMachineNo = STATE_MACHINE_3;
+ pressPacket[APACKET_1].ActionTag = 0;
+ pressPacket[APACKET_1].WakeupTime = pressWakeup;
+ pressPacket[APACKET_1].ReceiveWindowLength = pressReceive;
+ pressPacket[APACKET_1].data = pressAckrxBuffer;
+ pressPacket[APACKET_1].next_true = APACKET_NULL;
+ pressPacket[APACKET_1].next_false = APACKET_0;
+ pressPacket[APACKET_1].condRoutine = condCase_Done;
+ pressPacket[APACKET_1].dataRoutine = dataRoutine_LL_TxAck;
+ pressPacket[APACKET_1].actionPacketNb = APACKET_1;
+ LLD_BLE_SetReservedArea(&pressPacket[APACKET_1]);
+
+ APP_LLD_BLE_SetdataRoutineOption(pressPacketNumber,pressPacketStopRx);
+ #ifdef LLD_BLE_DEBUG
+ start_timer=Debug_Start_timer();
+ #endif
+ LLD_BLE_MakeActionPacketPending(&pressPacket[APACKET_0]);
+ #ifdef LLD_BLE_DEBUG
+ stop_timer=Debug_Stop_timer();
+ #endif
+ BSP_LED_Off(LED_TXRX);
+
+ } else {
+ APP_LLD_BLE_SetdataRoutineOption(pressPacketNumberTx,pressPacketStopRx);
+ #ifdef LLD_BLE_DEBUG
+ start_timer=Debug_Start_timer();
+ #endif
+ HAL_BLE_SendPacketWithAck(pressChannel1, pressWakeup, presstxBuffer, pressAckrxBuffer, pressReceiveAck, dataRoutine_HAL_TxAck );
+ #ifdef LLD_BLE_DEBUG
+ stop_timer=Debug_Stop_timer();
+ #endif
+ BSP_LED_Off(LED_TXRX);
+ }
+}
+
+void BUTTON_SW3_ReceivePacket(void)
+{
+ LED_TXRX=LED_RED;
+
+ if (init_done ==0) {
+ init_done =1 ;
+ if (use_hal ==0) {
+ #ifdef LLD_BLE_DEBUG
+ bleparam_hal_BLE_Packet.InfoTime=(uint32_t)debug_timer;
+ #endif
+ LLD_BLE_Init(HS_STARTUP_TIME, 1, LLD_BLE_hot_ana_config_table, DISABLE);
+
+ LLD_BLE_GetStatus(&presstime);
+
+ uint8_t map[5]= {0xFF,0xFF,0xFF,0xFF,0xFF};
+ LLD_BLE_SetChannelMap(STATE_MACHINE_0, &map[0]);
+ LLD_BLE_SetChannel(STATE_MACHINE_0,pressChannel2,0);
+ LLD_BLE_SetTxAttributes(STATE_MACHINE_0, pressID, 0x555555,0);
+ LLD_BLE_SetTx_Rx_Phy(STATE_MACHINE_0, TX_PHY_2MBPS, RX_PHY_2MBPS);
+ LLD_BLE_SetBackToBackTime(BACK2BACK_TIME);
+
+ LLD_BLE_GetStatus(&presstime);
+
+ LLD_BLE_SetChannelMap(STATE_MACHINE_3, &map[0]);
+ LLD_BLE_SetChannel(STATE_MACHINE_3, pressChannel2, 0);
+ LLD_BLE_SetTxAttributes(STATE_MACHINE_3, ~pressID, 0x555555,0);
+ LLD_BLE_SetTx_Rx_Phy(STATE_MACHINE_3, TX_PHY_2MBPS, RX_PHY_2MBPS);
+ LLD_BLE_SetBackToBackTime(BACK2BACK_TIME);
+
+ } else {
+ #ifdef LLD_BLE_DEBUG
+ bleparam_hal_BLE_Packet.InfoTime=(uint32_t)debug_timer;
+ #endif
+ HAL_BLE_Init();
+ HAL_BLE_SetNetworkID(pressID);
+ }
+ BSP_LED_On(LED_GREEN);
+ BSP_LED_On(LED_RED);
+ } else if(!use_hal) {
+ LLD_BLE_GetStatus(&presstime);
+
+ pressPacket[APACKET_5].StateMachineNo = STATE_MACHINE_0;
+ pressPacket[APACKET_5].ActionTag = PLL_TRIG | TIMER_WAKEUP | RELATIVE;
+ pressPacket[APACKET_5].WakeupTime = pressWakeup;
+ pressPacket[APACKET_5].ReceiveWindowLength = pressReceive; /* does not affect for Tx */
+ pressPacket[APACKET_5].data = pressrxBuffer;
+ pressPacket[APACKET_5].next_true = APACKET_1; // replaced &pressPacket[1]
+ pressPacket[APACKET_5].next_false = APACKET_NULL; // replaced &pressPacket[1]
+ pressPacket[APACKET_5].condRoutine = condCase_Rx; //condCaseRx_Done
+ pressPacket[APACKET_5].dataRoutine = dataRoutine_LL_RxAck; //dataRoutineRx switch
+ pressPacket[APACKET_5].actionPacketNb = APACKET_5;
+ LLD_BLE_SetReservedArea(&pressPacket[APACKET_5]);
+
+ pressPacket[APACKET_1].StateMachineNo = STATE_MACHINE_3;
+ pressPacket[APACKET_1].ActionTag = TXRX;
+ pressPacket[APACKET_1].WakeupTime = pressWakeup;
+ pressPacket[APACKET_1].ReceiveWindowLength = 0;
+ pressPacket[APACKET_1].data = pressAcktxBuffer;
+ pressPacket[APACKET_1].next_true = APACKET_NULL;
+ pressPacket[APACKET_1].next_false = APACKET_5;
+ pressPacket[APACKET_1].condRoutine = condCase_Done; //condCaseRx_Ack
+ pressPacket[APACKET_1].dataRoutine = dataRoutine_LL_RxAck; //dataRoutineRx switch
+ pressPacket[APACKET_1].actionPacketNb = APACKET_1;
+ LLD_BLE_SetReservedArea(&pressPacket[APACKET_1]);
+
+ APP_LLD_BLE_SetdataRoutineOption(pressPacketNumber,pressPacketStopRx);
+ LLD_BLE_MakeActionPacketPending(&pressPacket[APACKET_5]);
+ BSP_LED_Off(LED_TXRX);
+
+ } else {
+ APP_LLD_BLE_SetdataRoutineOption(pressPacketNumberRx,pressPacketStopRx);
+ HAL_BLE_ReceivePacketWithAck(pressChannel1, pressWakeup, pressrxBuffer, pressAcktxBuffer, pressReceive, dataRoutine_HAL_RxAck );
+ BSP_LED_Off(LED_TXRX);
+ }
+}
+/* USER CODE END FD */
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+void Appli_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
+{
+ switch (GPIO_Pin)
+ {
+ case BUTTON_SW1_PIN:
+ UTIL_SEQ_SetTask(1U << CFG_TASK_HAL_BLE_INIT, CFG_SCH_PRIO_0);
+ break;
+
+ case BUTTON_SW2_PIN:
+ UTIL_SEQ_SetTask(1U << CFG_TASK_HAL_BLE_SENDPACKET, CFG_SCH_PRIO_0);
+ break;
+
+ case BUTTON_SW3_PIN:
+ UTIL_SEQ_SetTask(1U << CFG_TASK_HAL_BLE_RECEIVEPACKET, CFG_SCH_PRIO_0);
+ break;
+
+ default:
+ break;
+
+ }
+ return;
+}
+void Appli_TIM_IC_CaptureCallback(void)
+{
+}
+
+void Appli_TIM_PeriodElapsedCallback(void)
+{
+ BSP_LED_Toggle(LED_TXRX);
+}
+/* USER CODE END FD_WRAP_FUNCTIONS */
+
+/* debug */
+uint32_t Debug_Start_timer(void)
+{
+ debug_timer[0]=__HAL_TIM_GET_COUNTER(&htim2);
+ if(!debug_timer[2])
+ {
+ return 0;
+ } else
+ {
+ return(debug_timer[0]-debug_timer[2]);
+ }
+}
+uint32_t Debug_Stop_timer(void)
+{
+ debug_timer[1]=__HAL_TIM_GET_COUNTER(&htim2);
+ return(debug_timer[1]-debug_timer[0]);
+}
+
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/STM32_WPAN/App/app_lld_ble.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/STM32_WPAN/App/app_lld_ble.h
new file mode 100644
index 000000000..4e8974cb8
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/STM32_WPAN/App/app_lld_ble.h
@@ -0,0 +1,89 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_lld_ble.h
+ * Description : Header for LLD 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_LLD_BLE_H
+#define APP_LLD_BLE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+
+/* Exported types ------------------------------------------------------------*/
+
+/* 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_LLD_BLE_SET_STATE_CB,
+ ERR_LLD_BLE_ERASE_PERSISTENT_INFO,
+ ERR_LLD_BLE_CHECK_WIRELESS
+ } ErrAppLldBleIdEnum_t;
+
+/* Exported constants --------------------------------------------------------*/
+
+/* External variables --------------------------------------------------------*/
+
+/* Exported macros ------------------------------------------------------------*/
+
+/* Exported functions ------------------------------------------------------- */
+void APP_LLD_BLE_Init( void );
+void APP_LLD_BLE_Error(uint32_t ErrId, uint32_t ErrCode);
+void APP_LLD_BLE_ProcessMsgM0ToM4(void);
+void APP_LLD_BLE_Init_UART_CLI(void);
+void APP_LLD_BLE_DeInit_UART_CLI(void);
+void APP_LLD_BLE_Init_TL(void);
+/**
+ * @brief Active polling for a given delay
+ * @param microsec the delay in us unit
+ **/
+void us_delay_16m(uint32_t microsec);
+void us_delay_32m(uint32_t microsec);
+#ifdef USE_SYS_CLOCK_DIV_2
+#define us_delay us_delay_16m
+#else
+#define us_delay us_delay_32m
+#endif
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+/* only for M4 */
+uint8_t APP_LLD_BLE_SendCmdM0(uint8_t currentCmd , uint32_t* currentPt);
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+void Appli_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
+void Appli_TIM_IC_CaptureCallback(void);
+void Appli_TIM_PeriodElapsedCallback(void);
+/* USER CODE END FD_WRAP_FUNCTIONS */
+
+#endif /* APP_LLD_BLE_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/STM32_WPAN/App/lld_ble.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/STM32_WPAN/App/lld_ble.c
new file mode 100644
index 000000000..277391024
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/STM32_WPAN/App/lld_ble.c
@@ -0,0 +1,443 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : lld_ble.c
+ * Description : LLD 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 "app_common.h"
+#include "utilities_common.h"
+#include "app_entry.h"
+#include "dbg_trace.h"
+#include "lld_ble.h"
+#include "app_lld_ble.h"
+#include "tl.h"
+#include "shci.h"
+#include "stm_logging.h"
+#include "stm32_lpm.h"
+#include "stm32_seq.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 function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Private variables -----------------------------------------------*/
+/* USER CODE BEGIN PV */
+uint8_t *txBuffer_Ptr;
+extern uint8_t *rxBuffer_Ptr[8];
+extern uint32_t *rxStatus_Ptr[8];
+extern uint32_t *rxTimeStamp_Ptr[8];
+extern int *rxRSSI_Ptr[8];
+/* for HAL */
+uint32_t hal_status;
+uint32_t hal_timestamp_receive;
+int hal_rssi;
+
+extern param_hal_BLE_t bleparam_hal_BLE_Packet;
+
+uint32_t* param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+static uint32_t global_PacketNumber = 1; // NB of Successif PACKET Send or Receive
+static uint8_t global_PacketStopRx = 1; // Stop after RX
+/* USER CODE END PV */
+
+/* --------------------------- dataRoutine LEVEL -------------------------------*/
+void APP_LLD_BLE_SetdataRoutineOption(uint32_t PacketNumber, uint8_t PacketStop )
+{
+ global_PacketNumber = PacketNumber; // NB of Successif PACKET using LL Send or Receive
+ global_PacketStopRx = PacketStop; // Stop after RX
+}
+
+/* ------------------------------- HAL LEVEL -----------------------------------*/
+uint8_t HAL_BLE_Init(void)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ return(APP_LLD_BLE_SendCmdM0(HAL_BLE_INIT_CMDCODE,param_hal_BLE_IPCC));
+
+}
+
+//static uint32_t networkID = 0x71764129;
+uint8_t HAL_BLE_SetNetworkID(uint32_t ID)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ /* use param_hal_BLE_IPCC for Network ID */
+ bleparam_hal_BLE_Packet.InfoTime = ID ;// channel becomes network ID
+
+ return(APP_LLD_BLE_SendCmdM0(HAL_BLE_SETNETWORKID_CMDCODE,param_hal_BLE_IPCC));
+
+}
+
+uint8_t HAL_BLE_SendPacket(uint8_t channel, uint32_t wakeup_time, uint8_t* txBuffer, dataCase_t dataCaseTx)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+ rxStatus_Ptr[0]=&hal_status;
+ rxTimeStamp_Ptr[0]=&hal_timestamp_receive;
+ rxRSSI_Ptr[0]=&hal_rssi;
+
+
+ txBuffer_Ptr=txBuffer;
+ bleparam_hal_BLE_Packet.InfoTime = global_PacketNumber ; // used benefit of InfoTime to send parameter to M0
+
+ bleparam_hal_BLE_Packet.channel_tx = channel ;
+ bleparam_hal_BLE_Packet.WakeupTime = wakeup_time ;
+ bleparam_hal_BLE_Packet.setCase.dataCase = dataCaseTx;
+ memcpy((bleparam_hal_BLE_Packet.txrxBuffer.txBuffer),txBuffer_Ptr,txBuffer[1]+2); // to be replaced with \0 ended unit8_t
+
+ return(APP_LLD_BLE_SendCmdM0(HAL_BLE_SENDPACKET_CMDCODE,param_hal_BLE_IPCC));
+}
+
+uint8_t HAL_BLE_SendPacketWithAck(uint8_t channel, uint32_t wakeup_time, uint8_t* txBuffer, uint8_t* rxBuffer, uint32_t receive_timeout, dataCase_t dataCaseTx )
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+ rxStatus_Ptr[0]=&hal_status;
+ rxTimeStamp_Ptr[0]=&hal_timestamp_receive;
+ rxRSSI_Ptr[0]=&hal_rssi;
+
+ txBuffer_Ptr=txBuffer;
+ rxBuffer_Ptr[0]=rxBuffer;
+ bleparam_hal_BLE_Packet.InfoTime = global_PacketNumber ; // used benefit of InfoTime to send parameter to M0
+ bleparam_hal_BLE_Packet.StateMachineNo= global_PacketStopRx ; // used benefit of StateMachineNo to send parameter to M0
+
+ bleparam_hal_BLE_Packet.channel_tx = channel ;
+ bleparam_hal_BLE_Packet.WakeupTime = wakeup_time ;
+ bleparam_hal_BLE_Packet.ReceiveWindowLength = receive_timeout ;
+ bleparam_hal_BLE_Packet.setCase.dataCase = dataCaseTx;
+ memcpy((bleparam_hal_BLE_Packet.txrxBuffer.txBuffer),txBuffer_Ptr,txBuffer[1]+2); // to be replaced with \0 ended unit8_t
+
+ return(APP_LLD_BLE_SendCmdM0(HAL_BLE_SENDPACKETWITHACK_CMDCODE,param_hal_BLE_IPCC));
+}
+
+uint8_t HAL_BLE_ReceivePacket(uint8_t channel, uint32_t wakeup_time, uint8_t* rxBuffer, uint32_t receive_timeout, dataCase_t dataCaseRx)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+ rxStatus_Ptr[0]=&hal_status;
+ rxTimeStamp_Ptr[0]=&hal_timestamp_receive;
+ rxRSSI_Ptr[0]=&hal_rssi;
+
+ rxBuffer_Ptr[0]=rxBuffer;
+ bleparam_hal_BLE_Packet.InfoTime = global_PacketNumber ; // used benefit of InfoTime to send parameter to M0
+ bleparam_hal_BLE_Packet.StateMachineNo= global_PacketStopRx ; // used benefit of StateMachineNo to send parameter to M0
+
+
+ bleparam_hal_BLE_Packet.channel_rx = channel ;
+ bleparam_hal_BLE_Packet.WakeupTime = wakeup_time;
+ bleparam_hal_BLE_Packet.ReceiveWindowLength = receive_timeout ;
+ bleparam_hal_BLE_Packet.setCase.dataCase = dataCaseRx;
+
+ return(APP_LLD_BLE_SendCmdM0(HAL_BLE_RECEIVEPACKET_CMDCODE,param_hal_BLE_IPCC));
+}
+
+uint8_t HAL_BLE_ReceivePacketWithAck(uint8_t channel, uint32_t wakeup_time, uint8_t* rxBuffer, uint8_t* txBuffer, uint32_t receive_timeout, dataCase_t dataCaseRx )
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+ rxStatus_Ptr[0]=&hal_status;
+ rxTimeStamp_Ptr[0]=&hal_timestamp_receive;
+ rxRSSI_Ptr[0]=&hal_rssi;
+
+ txBuffer_Ptr=txBuffer;
+ rxBuffer_Ptr[0]=rxBuffer;
+ bleparam_hal_BLE_Packet.InfoTime = global_PacketNumber ; // used benefit of InfoTime to send parameter to M0
+ bleparam_hal_BLE_Packet.StateMachineNo= global_PacketStopRx ; // used benefit of StateMachineNo to send parameter to M0
+
+ bleparam_hal_BLE_Packet.channel_rx = channel ;
+ bleparam_hal_BLE_Packet.WakeupTime = wakeup_time;
+ bleparam_hal_BLE_Packet.ReceiveWindowLength = receive_timeout ;
+ bleparam_hal_BLE_Packet.setCase.dataCase = dataCaseRx;
+ memcpy((bleparam_hal_BLE_Packet.txrxBuffer.txBuffer),txBuffer_Ptr,txBuffer[1]+2); // to be replaced with \0 ended unit8_t
+
+ return(APP_LLD_BLE_SendCmdM0(HAL_BLE_RECEIVEPACKETWITHACK_CMDCODE,param_hal_BLE_IPCC));
+}
+
+/* ------------------------------- LL LEVEL -----------------------------------*/
+
+uint8_t LLD_BLE_GetStatus(uint32_t *time) /* return value */
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ /* use param_hal_BLE_IPCC for Network ID */
+ bleparam_hal_BLE_Packet.InfoTime= NULL;
+
+ uint8_t return_value;
+ return_value=(APP_LLD_BLE_SendCmdM0(LLD_BLE_GETSTATUS_CMDCODE,param_hal_BLE_IPCC)); /* return_value used */
+
+ *time = (bleparam_hal_BLE_Packet.InfoTime); /* pointer as result */
+ return(return_value); /* return_value send */
+
+}
+
+uint8_t LLD_BLE_StopActivity(void)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ return(APP_LLD_BLE_SendCmdM0(LLD_BLE_STOPACTIVITY_CMDCODE,param_hal_BLE_IPCC)); /* return_value send */
+}
+
+void LLD_BLE_SetEncryptionCount(uint8_t StateMachineNo, uint8_t *count_tx, uint8_t *count_rcv)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ /* use param_hal_BLE_IPCC for Network ID */
+ bleparam_hal_BLE_Packet.StateMachineNo=StateMachineNo;
+
+ for(uint8_t i = 0; i < 5; i++) {
+ bleparam_hal_BLE_Packet.txrxBuffer.txBuffer[i]=count_tx[i];
+ bleparam_hal_BLE_Packet.txrxBuffer.txBuffer[i+5]=count_rcv[i];
+ }
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETENCRYPTIONCOUNT_CMDCODE,param_hal_BLE_IPCC); /* return_value send */
+
+ return;
+}
+
+void LLD_BLE_SetEncryptionAttributes(uint8_t StateMachineNo, uint8_t *enc_iv, uint8_t *enc_key)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ /* use param_hal_BLE_IPCC for Network ID */
+ bleparam_hal_BLE_Packet.StateMachineNo=StateMachineNo;
+
+ for(uint8_t i = 0; i < 8; i++) {
+ bleparam_hal_BLE_Packet.txrxBuffer.txBuffer[i]=enc_iv[i];
+ bleparam_hal_BLE_Packet.txrxBuffer.txBuffer[i+8]=enc_key[i];
+ bleparam_hal_BLE_Packet.txrxBuffer.txBuffer[i+16]=enc_key[i+8];
+ }
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETENCRYPTIONATTRIBUTES_CMDCODE,param_hal_BLE_IPCC); /* return_value send */
+
+ return;
+}
+
+void LLD_BLE_SetEncryptFlags(uint8_t StateMachineNo, FunctionalState EncryptFlagTx, FunctionalState EncryptFlagRcv)
+{
+ /* Check the parameters */
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ /* use param_hal_BLE_IPCC for Network ID */
+ bleparam_hal_BLE_Packet.StateMachineNo=StateMachineNo;
+ bleparam_hal_BLE_Packet.channel_tx=(uint8_t)EncryptFlagTx;
+ bleparam_hal_BLE_Packet.channel_rx=(uint8_t)EncryptFlagRcv;
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETENCRYPTFLAGS_CMDCODE,param_hal_BLE_IPCC); /* return_value send */
+
+ return;
+}
+
+void LLD_BLE_EncryptPlainData(uint8_t *Key, uint8_t *plainData, uint8_t *cypherData)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ /* use param_hal_BLE_IPCC for Network ID */
+ memcpy((bleparam_hal_BLE_Packet.txrxBuffer.txBuffer),Key,128); // to be replaced with \0 ended unit8_t
+ memcpy((bleparam_hal_BLE_Packet.txrxBuffer.txBuffer+128),plainData,128); // to be replaced with \0 ended unit8_t
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_ENCRYPTPLAINDATA_CMDCODE,param_hal_BLE_IPCC); /* return_value used */
+
+ memcpy(cypherData,(bleparam_hal_BLE_Packet.txrxBuffer.rxBuffer),128); // to be replaced with \0 ended unit8_t
+
+ return;
+}
+
+void LLD_BLE_StartTone(uint8_t RF_channel, uint8_t powerLevel)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ /* use param_hal_BLE_IPCC for Network ID */
+ bleparam_hal_BLE_Packet.channel_tx= RF_channel;
+ bleparam_hal_BLE_Packet.StateMachineNo= powerLevel;
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_STARTTONE_CMDCODE,param_hal_BLE_IPCC); /* return_value send */
+
+ return;
+}
+
+/* without return */
+void LLD_BLE_SetChannelMap(uint8_t StateMachineNo, uint8_t *chan_remap) /* no return */
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ /* use param_hal_BLE_IPCC for Network ID */
+ bleparam_hal_BLE_Packet.StateMachineNo=StateMachineNo;
+
+ for(uint8_t i = 0; i < 5; i++) {
+ bleparam_hal_BLE_Packet.txrxBuffer.txBuffer[i]=chan_remap[i];
+ }
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETCHANNELMAP_CMDCODE,param_hal_BLE_IPCC); /* return_value used */
+
+ return;
+}
+
+void LLD_BLE_SetChannel(uint8_t StateMachineNo, uint8_t channel, uint8_t channel_increment)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ /* use param_hal_BLE_IPCC for Network ID */
+ bleparam_hal_BLE_Packet.StateMachineNo=StateMachineNo;
+ bleparam_hal_BLE_Packet.channel_tx= channel;
+ bleparam_hal_BLE_Packet.channel_rx= channel_increment;
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETCHANNEL_CMDCODE,param_hal_BLE_IPCC); /* return_value used */
+
+ return;
+}
+
+void LLD_BLE_SetTxAttributes(uint8_t StateMachineNo, uint32_t NetworkID, uint32_t crc_init, uint32_t sca)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ bleparam_hal_BLE_Packet.StateMachineNo=StateMachineNo;
+ bleparam_hal_BLE_Packet.InfoTime = NetworkID ;// channel becomes network ID
+ bleparam_hal_BLE_Packet.WakeupTime = crc_init;
+ bleparam_hal_BLE_Packet.ReceiveWindowLength = sca; // not used
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETTXATTRIBUTES_CMDCODE,param_hal_BLE_IPCC); /* return_value used */
+
+ return;
+}
+
+void LLD_BLE_SetBackToBackTime(uint32_t back_to_back_time)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ bleparam_hal_BLE_Packet.WakeupTime = back_to_back_time;// channel becomes network ID
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETBACKTOBACKTIME_CMDCODE,param_hal_BLE_IPCC); /* return */
+
+ return;
+}
+
+void LLD_BLE_SetTxPower(uint8_t powerLevel)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ bleparam_hal_BLE_Packet.StateMachineNo = powerLevel;// channel becomes network ID
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETTXPOWER_CMDCODE,param_hal_BLE_IPCC); /* return_value used */
+
+ return;
+}
+
+void LLD_BLE_SetTx_Rx_Phy(uint8_t StateMachineNo, uint8_t tx_phy, uint8_t rx_phy)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ bleparam_hal_BLE_Packet.StateMachineNo = StateMachineNo;// channel becomes network ID
+ bleparam_hal_BLE_Packet.channel_tx = tx_phy;// channel becomes network ID
+ bleparam_hal_BLE_Packet.channel_rx = rx_phy;// channel becomes network ID
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETTX_RX_PHY_CMDCODE,param_hal_BLE_IPCC); /* return_value used */
+
+ return;
+}
+
+void LLD_BLE_StopTone(void)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_STOPTONE_CMDCODE,param_hal_BLE_IPCC); /* return_value used */
+
+ return;
+}
+
+void LLD_BLE_SetReservedArea(ActionPacket *p)
+{
+
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ bleparam_hal_BLE_Packet.StateMachineNo=p->StateMachineNo;
+ bleparam_hal_BLE_Packet.channel_tx=p->next_true;
+ bleparam_hal_BLE_Packet.channel_rx=p->next_false;
+ bleparam_hal_BLE_Packet.WakeupTime=p->WakeupTime;
+ bleparam_hal_BLE_Packet.ReceiveWindowLength=p->ReceiveWindowLength;
+
+ bleparam_hal_BLE_Packet.actionPacketNb=(p->actionPacketNb);
+ bleparam_hal_BLE_Packet.ActionTag=(p->ActionTag);
+
+ rxStatus_Ptr[p->actionPacketNb]=&(p->status);
+ rxTimeStamp_Ptr[p->actionPacketNb]=&(p->timestamp_receive);
+ rxRSSI_Ptr[p->actionPacketNb]=&(p->rssi);
+
+ bleparam_hal_BLE_Packet.setCase.condCase=(condCase_t)p->condRoutine;
+ bleparam_hal_BLE_Packet.setCase.dataCase=(dataCase_t)p->dataRoutine;
+
+ if(bleparam_hal_BLE_Packet.ActionTag & TXRX) {
+
+ txBuffer_Ptr=p->data;
+ memcpy((bleparam_hal_BLE_Packet.txrxBuffer.txBuffer),txBuffer_Ptr,258); // to be replaced with \0 ended unit8_t
+
+ } else {
+ rxBuffer_Ptr[p->actionPacketNb]=p->data;
+ }
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETRESERVEDAREA_CMDCODE,param_hal_BLE_IPCC); /* return_value used */
+
+ return;
+
+}
+
+uint8_t LLD_BLE_MakeActionPacketPending(ActionPacket *p)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ bleparam_hal_BLE_Packet.actionPacketNb=(p->actionPacketNb);
+ bleparam_hal_BLE_Packet.InfoTime = global_PacketNumber ; // used benefit of time to send parameter to M0
+ bleparam_hal_BLE_Packet.StateMachineNo = global_PacketStopRx ;
+
+
+ return(APP_LLD_BLE_SendCmdM0(LLD_BLE_MAKEACTIONPACKETPENDING_CMDCODE,param_hal_BLE_IPCC)); /* return_value used */
+}
+
+void LLD_BLE_Init(uint16_t hs_startup_time, uint8_t low_speed_osc, uint32_t* hot_table, FunctionalState whitening)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ bleparam_hal_BLE_Packet.WakeupTime=(uint32_t)(hs_startup_time);
+ bleparam_hal_BLE_Packet.ActionTag=low_speed_osc;
+ bleparam_hal_BLE_Packet.actionPacketNb=(uint8_t)whitening;
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_INIT_CMDCODE,param_hal_BLE_IPCC); /* return_value used */
+
+ memcpy((uint8_t*)hot_table,(bleparam_hal_BLE_Packet.txrxBuffer.txBuffer),BLE_HOT_ANA_CONFIG_TABLE_LENGTH); // to be replaced with \0 ended unit8_t
+
+ return;
+
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/STM32_WPAN/App/lld_ble.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/STM32_WPAN/App/lld_ble.h
new file mode 100644
index 000000000..eabc03fe9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/STM32_WPAN/App/lld_ble.h
@@ -0,0 +1,229 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_lld_ble.h
+ * Description : Header for LLD 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 LLD_BLE_H
+#define LLD_BLE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+
+/* Exported types ------------------------------------------------------------*/
+
+/* Exported constants --------------------------------------------------------*/
+
+/* External variables --------------------------------------------------------*/
+
+/* Exported macros ------------------------------------------------------------*/
+
+/* Exported functions ------------------------------------------------------- */
+
+/* ---------------------------------------------------------------------------*/
+/* ------------------------------- LLD BLE -----------------------------------*/
+/* ---------------------------------------------------------------------------*/
+#define IRQ_RCV_OK (1UL<<31) /* The packet is received, and the CRC is valid. */
+#define BIT_TX_MODE (1UL<<18) /* The packet has been sent successfully. */
+
+#define HS_STARTUP_TIME (uint16_t)(0x001A) /* High Speed start up time 64 us */
+#define BLE_HOT_ANA_CONFIG_TABLE_LENGTH 60 /* LLD TESTING */
+
+#define RX_PHY_1MBPS 0x00
+#define RX_PHY_2MBPS 0x10
+#define TX_PHY_1MBPS 0x00
+#define TX_PHY_2MBPS 0x01
+#define BACK2BACK_TIME 50
+
+#define PLL_TRIG 0x01
+#define TXRX 0x02
+#define TIMER_WAKEUP 0x04
+#define NS_EN 0x08
+#define INC_CHAN 0x10
+#define RELATIVE 0x20
+#define TIMESTAMP_POSITION 0x80
+
+typedef enum {
+ STATE_MACHINE_0 = 0,
+ STATE_MACHINE_1,
+ STATE_MACHINE_2,
+ STATE_MACHINE_3,
+ STATE_MACHINE_4,
+ STATE_MACHINE_5,
+ STATE_MACHINE_6,
+ STATE_MACHINE_7,
+} StateMachine_t;
+
+/* condRoutine enum for condRoutine() */
+typedef enum
+ {
+ condCase_Done = 0,
+ condCase_Tx,
+ condCase_Rx,
+ condCase_Stop,
+ } condCase_t;
+
+/* dataRoutine enum for dataRoutine() */
+typedef enum
+ {
+ dataCase_Custom0 = 0,
+ dataCase_Custom1,
+ dataCase_Custom2,
+ dataCase_Custom3,
+ dataCase_Custom4,
+ dataCase_Custom5,
+ dataCase_Custom6,
+ dataCase_Custom7,
+ } dataCase_t;
+
+/* dataRoutine and condRoutine struct */
+typedef struct {
+ condCase_t condCase ; /* __I */
+ dataCase_t dataCase ; /* __I */
+} setCase_t;
+
+/* Structure for Buffer */
+typedef struct {
+ uint8_t txBuffer[260]; /* __I */ /*txBuffer + Encrypt*/
+ uint8_t rxBuffer[260]; /* __O */ /*rxBuffer + radioPacketNb=rxBuffer[257] */
+} buffer_hal_BLE_t;
+
+/* Parameter HAL LLD BLE Data Structure */
+typedef struct {
+ uint32_t WakeupTime; /* __I status_32[0]*/ /*WakeupTime + back2back + crc_init + hs_startup_time*/
+ uint32_t ReceiveWindowLength; /* __I status_32[1]*/ /*ReceiveWindowLength*/
+ uint32_t InfoTime; /* __I status_32[2]*/ /*InfoTime + NetworkID + global_PacketNumber */
+ uint32_t status; /* __O status_32[3]*/ /*status*/
+ uint32_t timestamp_receive; /* __O status_32[4]*/ /*timestamp_receive*/
+ uint32_t rssi; /* __O status_32[5]*/ /*rssi*/
+ uint8_t return_value; /* __IO */ /*return value*/
+ uint8_t channel_tx; /* __I status_8[0]*/ /*tx + flagTx + channel + tx_phy + next_true + RF_channel */
+ uint8_t channel_rx; /* __I status_8[1]*/ /*rx + flagRcv + increment + rx_phy + next_false */
+ uint8_t StateMachineNo; /* __I status_8[2]*/ /*StateMachineNo + powerLevel + global_PacketStopRx*/
+ uint8_t ActionTag; /* __I status_8[3]*/ /*ActionTag + low_speed_osc*/
+ uint8_t actionPacketNb; /* __I status_8[4]*/ /*actionPacketNb + whitening*/
+ setCase_t setCase; /* __I status_8[5] status_8[6]*/ /*condRoutine , dataRoutine*/
+ buffer_hal_BLE_t txrxBuffer; /*data*/
+} param_hal_BLE_t;
+
+typedef struct {
+ uint8_t StateMachineNo ; /* This parameter indicates the state machine number for this action. From 0 to 7. */
+ uint8_t ActionTag; /* The configuration of the current action.
+ * Action Tag: PLL_TRIG, TXRX, TIMER_WAKEUP, INC_CHAN, TIMESTAMP_POSITION, RELATIVE */
+ uint32_t WakeupTime; /* Contains the wakeup time in microsecond if it is relative.
+ * It should not be more than 24 bits if it is absolute.
+ * It only applies if TIMER_WAKEUP flag is set in ActionTag. */
+ uint32_t ReceiveWindowLength; /* Sets RX window size in microsecond. Applicable only for RX actions. */
+ uint8_t *data; /* Pointer to the array with the data to send (header, length and data field), for TX.
+ * Pointer to the array where the data received are copied, for RX.
+ * In case of RX, the array must have the max size MAX_PACKET_LENGTH. */
+ uint32_t status; /* The Status Register with the information on the action. */
+ uint32_t timestamp_receive; /* This field contains the timestamp when a packet is received.
+ * Intended to be used in the dataRoutine() callback routine. RX only. */
+ int32_t rssi; /* The rssi of the packet was received with. RX only. */
+ uint8_t next_true; /* Pointer to next ActionPacket if condRoutine() returns TRUE */
+ uint8_t next_false; /* Pointer to next ActionPacket if condRoutine() returns FALSE */
+ uint8_t condRoutine; /* User callback that decide the next ActionPacket to use.
+ * It is time critical. Routine must end within 45 us. */
+ uint8_t dataRoutine; /* User callback for managing data. */
+ uint8_t actionPacketNb; /* User callback for managing data. */
+} ActionPacket;
+
+typedef enum
+ {
+ APACKET_0 = 0,
+ APACKET_1,
+ APACKET_2,
+ APACKET_3,
+ APACKET_4,
+ APACKET_5,
+ APACKET_6,
+ APACKET_7,
+ APACKET_NULL=0xFF, // to be place at the end
+} ActionPacket_Nb;
+
+/* Enum for Cmd Code */
+typedef enum
+ {
+ /* hal_BLE.c part */
+ HAL_BLE_UNUSED_CMDCODE = 0,
+ HAL_BLE_INIT_CMDCODE ,
+ HAL_BLE_SETNETWORKID_CMDCODE,
+ HAL_BLE_SENDPACKET_CMDCODE,
+ HAL_BLE_SENDPACKETWITHACK_CMDCODE,
+ HAL_BLE_RECEIVEPACKET_CMDCODE,
+ HAL_BLE_RECEIVEPACKETWITHACK_CMDCODE,
+ /* ipBLE_lld.c part */
+ LLD_BLE_GETSTATUS_CMDCODE,
+ LLD_BLE_SETCHANNELMAP_CMDCODE,
+ LLD_BLE_SETCHANNEL_CMDCODE,
+ LLD_BLE_SETTXATTRIBUTES_CMDCODE,
+ LLD_BLE_SETBACKTOBACKTIME_CMDCODE,
+ LLD_BLE_SETTXPOWER_CMDCODE,
+ LLD_BLE_SETTX_RX_PHY_CMDCODE,
+ LLD_BLE_STOPACTIVITY_CMDCODE,
+ LLD_BLE_SETENCRYPTIONCOUNT_CMDCODE,
+ LLD_BLE_SETENCRYPTIONATTRIBUTES_CMDCODE,
+ LLD_BLE_SETENCRYPTFLAGS_CMDCODE,
+ LLD_BLE_ENCRYPTPLAINDATA_CMDCODE,
+ LLD_BLE_STARTTONE_CMDCODE,
+ LLD_BLE_STOPTONE_CMDCODE,
+ LLD_BLE_SETRESERVEDAREA_CMDCODE,
+ LLD_BLE_MAKEACTIONPACKETPENDING_CMDCODE,
+ LLD_BLE_INIT_CMDCODE,
+} hal_BLE_Code_t;
+
+uint8_t HAL_BLE_Init(void);
+uint8_t HAL_BLE_SetNetworkID(uint32_t ID);
+uint8_t HAL_BLE_SendPacket(uint8_t channel, uint32_t wakeup_time, uint8_t* txBuffer, dataCase_t dataCaseTx);
+uint8_t HAL_BLE_SendPacketWithAck(uint8_t channel, uint32_t wakeup_time, uint8_t* txBuffer, uint8_t* rxBuffer, uint32_t receive_timeout, dataCase_t dataCaseTxAck );
+uint8_t HAL_BLE_ReceivePacket(uint8_t channel, uint32_t wakeup_time, uint8_t* rxBuffer, uint32_t receive_timeout, dataCase_t dataCaseTx );
+uint8_t HAL_BLE_ReceivePacketWithAck(uint8_t channel, uint32_t wakeup_time, uint8_t* rxBuffer, uint8_t* txBuffer, uint32_t receive_timeout, dataCase_t dataCaseTxAck );
+
+uint8_t LLD_BLE_GetStatus(uint32_t *time);
+void LLD_BLE_SetChannelMap(uint8_t StateMachineNo,uint8_t *chan_remap);
+void LLD_BLE_SetChannel(uint8_t StateMachineNo, uint8_t channel,uint8_t channel_increment);
+void LLD_BLE_SetTxAttributes(uint8_t StateMachineNo, uint32_t NetworkID, uint32_t crc_init, uint32_t sca);
+void LLD_BLE_SetBackToBackTime(uint32_t back_to_back_time);
+void LLD_BLE_SetTxPower(uint8_t powerLevel);
+void LLD_BLE_SetTx_Rx_Phy(uint8_t StateMachineNo, uint8_t tx_phy, uint8_t rx_phy);
+uint8_t LLD_BLE_StopActivity(void);
+void LLD_BLE_SetEncryptionCount(uint8_t StateMachineNo, uint8_t *count_tx, uint8_t *count_rcv);
+void LLD_BLE_SetEncryptionAttributes(uint8_t StateMachineNo, uint8_t *enc_iv, uint8_t *enc_key);
+void LLD_BLE_SetEncryptFlags(uint8_t StateMachineNo, FunctionalState EncryptFlagTx, FunctionalState EncryptFlagRcv);
+void LLD_BLE_EncryptPlainData(uint8_t *Key, uint8_t *plainData, uint8_t *cypherData);
+void LLD_BLE_StartTone(uint8_t RF_channel, uint8_t powerLevel);
+void LLD_BLE_StopTone(void);
+
+//void LLD_BLE_CrystalCheck(void);
+void LLD_BLE_SetReservedArea(ActionPacket *p);
+uint8_t LLD_BLE_MakeActionPacketPending(ActionPacket *p);
+void LLD_BLE_Init(uint16_t hs_startup_time, uint8_t low_speed_osc, uint32_t* hot_table, FunctionalState whitening);
+//void LLD_BLE_IRQHandler(void);
+
+
+/* only for M4 */
+void APP_LLD_BLE_SetdataRoutineOption(uint32_t PacketNumber, uint8_t PacketStop );
+
+#endif /* LLD_BLE_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/STM32_WPAN/Target/hw_ipcc.c
new file mode 100644
index 000000000..e7049681d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/STM32_WPAN/Target/hw_ipcc.c
@@ -0,0 +1,675 @@
+/**
+ ******************************************************************************
+ * 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 LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_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 LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_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 )
+{
+ /**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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 */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_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/LLD_BLE/LLD_BLE_Pressbutton/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/readme.txt
index a5a0be784..b9474bb06 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/readme.txt
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Pressbutton/readme.txt
@@ -20,15 +20,62 @@
@par Example Description
-This example is to communicate Over The Air (OTA) using LLD_BLE between 2 boards (one send, other receive)
-in BLE Radio format not BLE Stack protocol.
+How to make blinking LED between 2 STM32WB55xx boards by pressing buttons.
+
+@note The objectives are to communicate using LLD_BLE between 2 boards,
+ in BLE Radio format not BLE Stack protocol.
+ LLD_BLE_Pressbutton can use 2 terminal to display communication between 2 boards.
+ But Appli is based to show in a very simple way a communication between 2 boards:
+ It is based on pressing button and blinking answer
+
+@note LLD_BLE is a 2-level stack implemented just over the Hardware and Radio layer.
+ Lowest Layer also called Low Level or LL
+ It is just over the Hardware and Radio Layer.
+ It contains all the API to Set/Configure/Initialize all the parameters for Sending/receiving BLE Radio format packet data
+ Over LL layer there is HAL level
+ It contains a reduced number of API to Send/Receive BLE Radio format packet with predefined parameters
+ It works by calling a set of LL API
+ It make simple and fast to Send/receive Packet
+ But It does allow the user to change all the Radio parameters
+
+@note LL is for user that want to customize the Radio and BLE parameters, it is more complex to implement
+ HAL is for user that want to Send/Receive in a very simple way less complex, without configuring LL
+ lld_ble module contains LLD API HAL and LL API
+ app_lld_ble module contains Transport Layer Command call from CPU1 to CPU2 + Buffer management + IT Radio management from CPU2
@par Keywords
-LLD_BLE, HAL send and receive Packet
+LLD_BLE, Connectivity, BLE, LLD, IPCC, HAL, Dual core, send and receive Packet
@par Directory contents
-
+
+ - LLD_BLE/LLD_BLE_Pressbutton/STM32_WPAN/App/app_lld_ble.h Header for app_lld_ble.c module
+ - LLD_BLE/LLD_BLE_Pressbutton/STM32_WPAN/App/lld_ble.h Header for lld_ble.c module
+ - LLD_BLE/LLD_BLE_Pressbutton/STM32_WPAN/App/app_lld_ble.c contains TL management and Buffer for LLD BLE Application
+ - LLD_BLE/LLD_BLE_Pressbutton/STM32_WPAN/App/lld_ble.c contains LL and HAL API
+ - LLD_BLE/LLD_BLE_Pressbutton/STM32_WPAN/Target/hw_ipcc.c IPCC Driver
+ - LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/app_common.h Header for all modules with common definition
+ - LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/app_conf.h Parameters configuration file of the application
+ - LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/app_entry.h Parameters configuration file of the application
+ - LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/gpio_lld.h Parameters for gpio configuration file of the application
+ - LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/hw_conf.h Configuration file of the HW
+ - LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/hw_if.h Configuration file of the HW
+ - LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/main.h Header for main.c module
+ - LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/stm_logging.h Header for stm_logging.c module
+ - LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/stm32_lpm_if.h Header for stm32_lpm_if.c module
+ - LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/stm32wbxx_hal_conf.h HAL configuration file
+ - LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/stm32wbxx_it.h Interrupt handlers header file
+ - LLD_BLE/LLD_BLE_Pressbutton/Core/Inc/utilities_conf.h Configuration file of the utilities
+ - LLD_BLE/LLD_BLE_Pressbutton/Core/Src/app_entry.c Initialization of the application
+ - LLD_BLE/LLD_BLE_Pressbutton/Core/Src/gpio_lld.c GPIO for for application
+ - LLD_BLE/LLD_BLE_Pressbutton/Core/Src/hw_uart.c UART Driver
+ - LLD_BLE/LLD_BLE_Pressbutton/Core/Src/main.c Main program
+ - LLD_BLE/LLD_BLE_Pressbutton/Core/Src/stm_logging.c Logging for application
+ - LLD_BLE/LLD_BLE_Pressbutton/Core/Src/stm32_lpm_if.c Low Power Manager Interface
+ - LLD_BLE/LLD_BLE_Pressbutton/Core/Src/stm32wbxx_it.c Interrupt handlers
+ - LLD_BLE/LLD_BLE_Pressbutton/Core/Src/system_stm32wbxx.c stm32wbxx system source file
+ - LLD_BLE/LLD_BLE_Pressbutton/Core/Src/stm32wbxx_hal_msp.c HAL MPS for application
+
@par Hardware and Software environment
- This application uses two STM32WB55xx devices.
@@ -64,84 +111,59 @@ In order to make the program work, you must do the following:
+ load stm32wb5x_BLE_LLD_fw.bin
- Run the application
- If you want to control this application, you can directly press buttons
- In this order and described into main.c:
-
-
- /////////////// OBJECTIVES //////////////////////////
- The objectif is to communicate Over The Air (OTA) using LLD_BLE between 2 boards (one send, other receive), in BLE Radio format not BLE Stack protocol.
-
- LLD_BLE is a 2-level stack implemented just over the Hardware and Radio layer.
- Lowest Layer also called Low Level or LL
- It is just over the Hardware and Radio Layer.
- It contains all the API to Set/Configure/Initialize all the parameters for Sending/receiving BLE Radio format packet data OTA
- Over LL layer there is HAL level
- It contains a reduced number of API to Send/Receive BLE Radio format packet with predefined parameters
- It works by calling a set of LL API
- It make simple and fast to Send/receive Packet
- But It does allow the user to change all the Radio parameters
-
- LL is for user that want to customize the Radio and BLE parameters, it is more complex to implement
- HAL is for user that want to Send/Receive in a very simple way less complex, without configuring LL
-
- lld_ble contains LLD API HAL and LL API
- app_lld_ble contains Transport Layer Command call from CPU1 to CPU2 + Buffer management + IT Radio management from CPU2
+LLD_BLE_Pressbutton used alternatively LL API and HAL API for Send/receive
- /////////////// APPLICATION //////////////////////////
- After power On or Reset (ALL the LED are OFF)
+If you want to control this application, you can directly press buttons
+In this order and described into main.c:
- 1)Press SW1 (switch API)
- In order to change (switch) the communication: based on LL API or HAL API
- using LL API is default => BLUE LED is OFF (if SW1 has not been pressed)
- using HAL API => BLUE LED is ON
- press SW1 switch from one API to another
-
- LL API and HAL API used different AccessAddress (or NetworkID)
- Switching implies to re-Init => GREEN and RED LED are OFF
+After power On or Reset (ALL the LED are OFF)
- Init must be done at the next step (even if SW1 has not been pressed) or each time SW1 is pressed
-
- 2)If GREEN and RED LED are OFF : Press SW2 or SW3 to Init => GREEN and RED LED are ON
+ 1) Press SW2 or SW3 to Init => GREEN and RED LED becomes ON after Init
+ LL API : BLUE LED is OFF
+ - LLD_BLE_Init(HS_STARTUP_TIME, 1, LLD_BLE_hot_ana_config_table, ENABLE);
+ ...
+ HAL API: BLUE LED is ON
+ - HAL_BLE_Init();
+
+ To send a Packet go to 2)
+ or
+ To receive a Packet go to 3)
- 3)If GREEN and RED LED are ON :
- Press SW2 for Send 500 Chained Packets ===> GREEN is switched off during TX
- or
- Press SW3 for receiving 400 Packets (HAL) and 500 Packets (LL) ===> RED is switched off during RX
-
- When one board Send : GREEN diode is OFF
- When one board Receive: RED diode is OFF
-
- When one board Send and other Receive and communicates with ACK,
- Sending board GREEN LED toggle (until end of 1000 TX)
- Receiving board RED LED toggle (unitl end of 1000 RX)
+ 2) Press SW2 for Send 500 Chained Packets ===> GREEN is switched off during TX
+ LL API : BLUE LED is OFF
+ - LLD_BLE_MakeActionPacketPending(); // after setting Packet is pending and start TX after TIMEOUT IT
+ ...
+ HAL API: BLUE LED is ON
+ - HAL_BLE_SendPacketWithAck(); // send is done using HAL API
+
+ or
- At the END GREEN and RED LED are ON
+ 3) Press SW3 for receiving 400 Packets (HAL) and 500 Packets (LL) ===> RED is switched off during RX
+ LL API : BLUE LED is OFF
+ - LLD_BLE_MakeActionPacketPending(); // after setting Packet is pending and start RX after TIMEOUT IT
+ ...
+ HAL API: BLUE LED is ON
+ - HAL_BLE_ReceivePacketWithAck(); // receive is done using HAL API
+
+
+ 4) Press SW1 (switch API and AccessAddress)
+ using LL API is default => BLUE LED is OFF (if SW1 has not been pressed)
+ using HAL API => BLUE LED is ON
+ press SW1 switch from one API to another
+
+
+When one board Send : GREEN LED is OFF
+When one board Receive: RED LED is OFF
- Serial Port Setup TERMINAL
- Baud Rate:115200 / Data:8 bits / Parity:none / Stop:1bit / Flow Control:none
- /////////////// MAIN CODE //////////////////////////
- A set of parameters common to HAL or LL API are proposed
+When one board Send and other Receive and communicates with ACK,
+Sending board GREEN LED toggle (Terminal shows the TX with RX Ack communication)
+Receiving board RED LED toggle (Terminal shows the RX with TX Ack communication)
- channel / WakeupTime / ReceiveWindowTime are predefined as pressChannel / pressWakeup / pressReceive
-
- networkID=pressID for HAL
- networkID=~pressID for LL
-
- TxBuffer is also predefined, presstxBufferTab maximum size is 258
- 1 for Header (set by user)
- 1 for Payload Length (set by user / or sw) should be aligned with the payload Length
- 256 max for Payload
-
- TxBuffer for ACK answer is set as pressAcktxBufferTab
-
- dataRoutine for HAL API Send is pressdataCaseTx=dataRoutine_HAL_TxAck
- dataRoutine for HAL API Receive is pressdataCaseRx=dataRoutine_HAL_RxAck
-
- Custom4 is specific for HAL API LLD_BLE_Pressbutton and it is with ACK
+At the END GREEN and RED LED are ON (Terminal shows the final number of TX/RX)
- dataRoutine for LL API Send is dataRoutine_LL_TxAck
- dataRoutine for LL API Receive is dataRoutine_LL_RxAck
+Serial Port Setup TERMINAL
+Baud Rate:115200 / Data:8 bits / Parity:none / Stop:1bit / 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/LLD_BLE/LLD_BLE_Proximity/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/app_common.h
new file mode 100644
index 000000000..5bb0f82f1
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/app_common.h
@@ -0,0 +1,124 @@
+/* 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 "main.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 *
+ * -------------------------------- */
+
+#ifndef MAX
+#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+
+#ifndef MIN
+#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
+
+#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
+
+#define CRITICAL_BEGIN( ) M_BEGIN BACKUP_PRIMASK(); DISABLE_IRQ()
+
+#define CRITICAL_END( ) RESTORE_PRIMASK(); 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/LLD_BLE/LLD_BLE_Proximity/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/app_conf.h
new file mode 100644
index 000000000..93827ccbb
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/app_conf.h
@@ -0,0 +1,347 @@
+/* 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 M0 traces/log messages
+ * This parameter defines the number of asynchronous events that can be stored in the M0 test FW before
+ * being reported to the M4 which will re-build traces/log messages before to send them to UART.
+ * This parameter is combined with the CFG_TL_MOST_EVENT_PAYLOAD_SIZE to calculate the queue size needed by M0 for traces.
+ */
+#define CFG_TL_EVT_QUEUE_LENGTH 20
+/**
+ * TL_EVENT_FRAME_SIZE is the size of the packets transfered between M0 and M4 through IPCC.
+ * Note 1 : thoose packets are first put in a trace queue (see DBG_TRACE_MSG_QUEUE_SIZE) before beeing sent to UART
+ * Note 2 : Queue size must be higher than a M0 trace buffer max size (see LOG_BUFFER_SIZE_MAX in M0 FW)
+ */
+#define CFG_TL_MOST_EVENT_PAYLOAD_SIZE 255
+
+#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 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 1
+#else
+#define CFG_LED_SUPPORTED 1
+#define CFG_BUTTON_SUPPORTED 0
+#endif /* CFG_FULL_LOW_POWER */
+
+#ifdef STM32WB35xx
+#define PUSH_BUTTON_SW1_EXTI_IRQHandler EXTI0_IRQHandler
+#define PUSH_BUTTON_SW2_EXTI_IRQHandler EXTI4_IRQHandler
+#define PUSH_BUTTON_SW3_EXTI_IRQHandler EXTI9_5_IRQHandler
+#else
+#define PUSH_BUTTON_SW1_EXTI_IRQHandler EXTI4_IRQHandler
+#define PUSH_BUTTON_SW2_EXTI_IRQHandler EXTI0_IRQHandler
+#define PUSH_BUTTON_SW3_EXTI_IRQHandler EXTI1_IRQHandler
+#endif
+/* 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_CMD_FROM_M0_TO_M4,
+ CFG_TASK_SEND_CLI_TO_M0,
+ CFG_TASK_SEND_TO_M0,
+ CFG_TASK_HAL_BLE_INIT,
+/* USER CODE BEGIN IdleTask */
+ CFG_TASK_CMD_M4_PACKET_STACKING,
+ CFG_TASK_CMD_M4_PACKET_STACK_PROCESS,
+ CFG_TASK_HAL_BLE_SENDPACKET,
+ CFG_TASK_HAL_BLE_RECEIVEPACKET,
+/* USER CODE END IdleTask */
+ CFG_TASK_SYSTEM_HCI_ASYNCH_EVT,
+ CFG_TASK_PROCESS_UART_RX_BUFFER,
+ CFG_TASK_PROCESS_UART_RX_IT,
+ CFG_TASK_PROCESS_UART_TX_IT,
+ CFG_TASK_NBR /**< Shall be last in the list */
+} CFG_IdleTask_Id_t;
+
+/**
+ * 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_RECEIVE_RSPACKEVT,
+ CFG_EVT_RECEIVE_ENDPACKEVT,
+} 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_LLDTESTS,
+ CFG_LPM_APP_LLD_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/LLD_BLE/LLD_BLE_Proximity/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/app_entry.h
new file mode 100644
index 000000000..77ead2384
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/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/LLD_BLE/LLD_BLE_Proximity/Core/Inc/gpio_lld.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/gpio_lld.h
new file mode 100644
index 000000000..71678202a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/gpio_lld.h
@@ -0,0 +1,91 @@
+/*
+ * gpio_lld.h
+ *
+ */
+
+#ifndef GPIO_LLD_H_
+#define GPIO_LLD_H_
+
+#if defined (USE_SIMU) || defined (USE_FPGA)
+/* Be carefull with GPIO used on SIMU plateform */
+// GPIOA port is used for CRC management on MASTER only
+// GPIOC ad GPIOD ports are used to send messages between the 2 DORYs
+#define GPIO_TX_PIN GPIO_PIN_8
+#define GPIO_TX_PORT GPIOB
+
+#define GPIO_1_PIN GPIO_PIN_9
+#define GPIO_1_PORT GPIOB
+#else /* on Nucleo boards */
+/* Use GPIO PB.8 to monitor TX time during valid on Boards */
+#define GPIO_TX_PIN GPIO_PIN_8
+#define GPIO_TX_PORT GPIOB
+
+#define GPIO_HARD_FAULT_PIN GPIO_PIN_4
+#define GPIO_HARD_FAULT_PORT GPIOA
+
+#define GPIO_MCO_PIN GPIO_PIN_15
+#define GPIO_MCO_PORT GPIOA
+
+#ifdef STM32WB35xx
+#define GPIO_1_PIN GPIO_PIN_3
+#define GPIO_1_PORT GPIOB
+
+#define GPIO_2_PIN GPIO_PIN_4
+#define GPIO_2_PORT GPIOB
+#else
+#define GPIO_1_PIN GPIO_PIN_2
+#define GPIO_1_PORT GPIOC
+
+#define GPIO_2_PIN GPIO_PIN_3
+#define GPIO_2_PORT GPIOC
+#endif
+#endif
+
+// External PA TX/RX pin is fixed by the chip
+#define GPIO_EXT_PA_TX_PIN GPIO_PIN_0
+#define GPIO_EXT_PA_TX_PORT GPIOB
+// External PA enable pin is chosen by user
+#define GPIO_EXT_PA_EN_PIN GPIO_PIN_9
+#define GPIO_EXT_PA_EN_PORT GPIOB
+
+void gpio_lld_phy_init( void );
+void gpio_lld_phy_gpioTx_up(void);
+void gpio_lld_phy_gpioTx_down(void);
+void gpio_lld_phy_gpioHardFault_up(void);
+void gpio_lld_phy_gpioHardFault_down(void);
+void gpio_lld_phy_gpio1_up(void);
+void gpio_lld_phy_gpio1_down(void);
+void gpio_lld_phy_gpio2_up(void);
+void gpio_lld_phy_gpio2_down(void);
+void gpio_lld_phy_deInit(void);
+
+void gpio_lld_mco_init(uint32_t mcoSource, uint32_t mcoDiv);
+void gpio_lld_mco_deInit(void);
+
+void gpio_lld_extPa_init(void);
+void gpio_lld_extPa_deInit(void);
+
+#ifdef USE_SIMU
+void gpio_lld_SimuMaster_init(void);
+void gpio_lld_SimuSlave_init(void);
+#endif
+
+void gpio_lld_lpuart_init(void);
+void gpio_lld_lpuart_deInit(void);
+
+void gpio_lld_usart_init(void);
+void gpio_lld_usart_deInit(void);
+
+#if !defined (USE_SIMU) && !defined(USE_FPGA)
+void gpio_lld_pa2_init(uint8_t mode);
+void gpio_lld_pa2_deInit(void);
+
+void gpio_lld_dtb_init(uint8_t dtbMode);
+void gpio_lld_dtb_deInit(void);
+#endif
+
+void gpio_lld_led1_toggle(void);
+void gpio_lld_led2_toggle(void);
+void gpio_lld_led3_toggle(void);
+
+#endif /* GPIO_LLD_H_ */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/hw_conf.h
new file mode 100644
index 000000000..24e76f61c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/hw_conf.h
@@ -0,0 +1,90 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : hw_conf.h
+ * Description : Hardware configuration file for 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 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 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
+
+/******************************************************************************
+ * External PA
+ *****************************************************************************/
+
+#define CFG_HW_EXTPA_ENABLED 1
+
+#endif /*HW_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/hw_if.h
new file mode 100644
index 000000000..8851f00a4
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/hw_if.h
@@ -0,0 +1,115 @@
+/* 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
+#ifdef STM32WB35xx
+#include "nucleo_wb35ce.h"
+#else
+#include "stm32wbxx_nucleo.h"
+#endif
+#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;
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern UART_HandleTypeDef hlpuart1;
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern UART_HandleTypeDef huart1;
+extern DMA_HandleTypeDef hdma_usart1_tx;
+#endif
+
+//void HW_UART_Init(hw_uart_id_t hw_uart_id);
+hw_status_t HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+hw_status_t 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));
+#if 0
+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);
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+void MX_LPUART1_UART_Init(void);
+void MX_LPUART1_UART_DeInit(void);
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+void MX_USART1_UART_Init(void);
+void MX_USART1_UART_DeInit(void);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*HW_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/main.h
new file mode 100644
index 000000000..0c024028b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/main.h
@@ -0,0 +1,107 @@
+/* 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 ------------------------------------------------------------------*/
+
+/* 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);
+void SystemClock_Config_HSE(uint32_t usePLL);
+void SystemClock_Config_MSI(uint32_t usePLL);
+
+/* USER CODE BEGIN EFP */
+
+/* USER CODE END EFP */
+
+/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN Private defines */
+
+
+/*
+ In this example TIM2 input clock (TIM2CLK) is set to APB1 clock (PCLK1),
+ since APB1 prescaler is equal to 1.
+ TIM2CLK = PCLK1
+ PCLK1 = HCLK
+ => TIM2CLK = HCLK = SystemCoreClock
+ To get TIM2 counter clock at 10 KHz, the Prescaler is computed as following:
+ Prescaler = (TIM2CLK / TIM2 counter clock) - 1
+ Prescaler = (SystemCoreClock /10 KHz) - 1
+
+ Note:
+ SystemCoreClock variable holds HCLK frequency and is defined in system_stm32wbxx.c file.
+ Each time the core clock (HCLK) changes, user had to update SystemCoreClock
+ variable value. Otherwise, any configuration based on this variable will be incorrect.
+ This variable is updated in three ways:
+ 1) by calling CMSIS function SystemCoreClockUpdate()
+ 2) by calling HAL API function HAL_RCC_GetSysClockFreq()
+ 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
+ ----------------------------------------------------------------------- */
+
+/* Compute the prescaler value to have TIMx counter clock equal to 10000 Hz */
+
+#define PRESCALER_VALUE (uint32_t)(((SystemCoreClock) / (1000000)) - 1)
+
+ /* Initialize TIMx peripheral as follows:
+ + Period = 10000 - 1
+ + Prescaler = (SystemCoreClock/10000) - 1
+ + ClockDivision = 0
+ + Counter direction = Up
+ */
+
+#define PERIOD_VALUE (1000000 - 1);
+
+
+/* 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/LLD_BLE/LLD_BLE_Proximity/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/stm32_lpm_if.h
new file mode 100644
index 000000000..dac7e2cbb
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/stm32_lpm_if.h
@@ -0,0 +1,79 @@
+/**
+ ******************************************************************************
+ * @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
+ *
+ ******************************************************************************
+ */
+
+/* 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/LLD_BLE/LLD_BLE_Proximity/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/stm32wbxx_hal_conf.h
new file mode 100644
index 000000000..365809937
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/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_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_EXTI_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_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 (32000000UL) /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (HSE_STARTUP_TIMEOUT)
+ #define HSE_STARTUP_TIMEOUT (100UL) /*!< 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 (4000000UL) /*!< 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 (16000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+ * @brief Internal Low Speed oscillator (LSI1) value.
+ */
+#if !defined (LSI1_VALUE)
+ #define LSI1_VALUE (32000UL) /*!< 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 (32000UL) /*!< 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 (32768UL) /*!< 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 (48000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI48_VALUE */
+
+#if !defined (LSE_STARTUP_TIMEOUT)
+ #define LSE_STARTUP_TIMEOUT (5000UL) /*!< 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 (48000UL) /*!< 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 (3300UL) /*!< Value of VDD in mv */
+#define TICK_INT_PRIORITY ((1UL<<__NVIC_PRIO_BITS) - 1UL) /*!< 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((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/LLD_BLE/LLD_BLE_Proximity/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/stm32wbxx_it.h
new file mode 100644
index 000000000..1fa67b9b2
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/stm32wbxx_it.h
@@ -0,0 +1,88 @@
+/* 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);
+#ifdef STM32WB35xx
+void DMA1_Channel4_IRQHandler(void);
+void DMA2_Channel4_IRQHandler(void);
+#else
+void DMA1_Channel1_IRQHandler(void);
+void DMA1_Channel2_IRQHandler(void);
+#endif
+void USART1_IRQHandler(void);
+void LPUART1_IRQHandler(void);
+/* USER CODE BEGIN EFP */
+#if 0
+void RTC_WKUP_IRQHandler(void);
+#endif
+void IPCC_C1_TX_IRQHandler(void);
+void IPCC_C1_RX_IRQHandler(void);
+#if 1 // Not needed for LLD tests : remove to use less power
+void PUSH_BUTTON_SW1_EXTI_IRQHandler(void);
+void PUSH_BUTTON_SW2_EXTI_IRQHandler(void);
+void PUSH_BUTTON_SW3_EXTI_IRQHandler(void);
+void TIM2_IRQHandler(void);
+#endif
+/* 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/LLD_BLE/LLD_BLE_Proximity/Core/Inc/stm_logging.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/stm_logging.h
new file mode 100644
index 000000000..39e9fbd2e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/stm_logging.h
@@ -0,0 +1,63 @@
+/**
+ ******************************************************************************
+ * 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/LLD_BLE/LLD_BLE_Proximity/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Inc/utilities_conf.h
new file mode 100644
index 000000000..4dde3509a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/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/LLD_BLE/LLD_BLE_Proximity/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/app_entry.c
new file mode 100644
index 000000000..dae385caf
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/app_entry.c
@@ -0,0 +1,476 @@
+/* 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 "app_entry.h"
+#include "app_lld_ble.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 -----------------------------------------------------------*/
+/* 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 -----------------------------------------------*/
+#if(CFG_DEBUG_TRACE != 0)
+size_t DbgTraceWrite(int handle, const unsigned char * buf, size_t bufSize);
+#endif
+
+/* 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);
+
+/* USER CODE BEGIN PFP */
+static void Led_Init( void );
+static void Button_Init( void );
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void APPE_Init( void )
+{
+ /**< Configure the system Power Mode */
+ SystemPower_Config();
+
+/* USER CODE BEGIN APPE_Init_1 */
+ /* initialize debugger module if supported and debug trace if activated */
+ Init_Debug();
+
+ Led_Init();
+ Button_Init();
+
+/* USER CODE END APPE_Init_1 */
+ /* Initialize all transport layers and start CPU2 which will send back a ready event to CPU1 */
+ appe_Tl_Init();
+
+ /**
+ * From now, the application is waiting for the ready event ( sub event : SHCI_SUB_EVT_CODE_READY / payload : WIRELESS_FW_RUNNING)
+ * received on the system channel before starting the LLD test appli using system message SHCI_OPCODE_C2_LLD_TESTS_INIT
+ * 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 EXTI lines */
+ LL_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+ LL_C2_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+
+#else
+ /* Disable debugger EXTI lines */
+ LL_EXTI_DisableIT_32_63(LL_EXTI_LINE_48);
+ LL_C2_EXTI_DisableIT_32_63(LL_EXTI_LINE_48);
+
+ /**
+ * Do not keep debugger enabled while in any low power mode
+ */
+ HAL_DBGMCU_DisableDBGSleepMode();
+ HAL_DBGMCU_DisableDBGStopMode();
+ HAL_DBGMCU_DisableDBGStandbyMode();
+#endif /* (CFG_DEBUGGER_SUPPORTED == 1) */
+
+#if(CFG_DEBUG_TRACE != 0)
+ DbgTraceInit();
+#endif
+
+ /* Send a first trace to debug trace port to see that M4 is alive */
+ APP_DBG("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
+#ifdef STM32WB35xx
+ APP_DBG("traces init done on Little DORY M4");
+#else
+ APP_DBG("traces init done on DORY M4");
+#endif
+ APP_DBG("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
+
+ 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 )
+{
+ // Disable internal wake-up which is active by default and is for RTC wake-up
+ LL_PWR_DisableInternWU();
+
+ // Before going to stop or standby modes, do the settings so that system clock and IP80215.4 clock
+ // start on HSI automatically
+ LL_RCC_HSI_EnableAutoFromStop();
+
+ /**
+ * 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( );
+
+ /* 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);
+
+ 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 );
+
+ /* Enable transport layer and start CPU2 */
+ 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 == FUS_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:
+ if (p_sys_event->payload[0] == WIRELESS_FW_RUNNING)
+ 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_LLD_TESTS : LLD_FATAL_ERROR \n");
+ break;
+
+ case ERR_THREAD_UNKNOWN_CMD:
+ APP_DBG("** ERR_LLD_TESTS : UNKNOWN_CMD \n");
+ break;
+
+ default:
+ APP_DBG("** ERR_LLD_TESTS : ErroCode=%d \n",ErrorCode);
+ break;
+ }
+ return;
+}
+
+static void APPE_SysEvtReadyProcessing( void )
+{
+ /* Traces channel initialization */
+ TL_TRACES_Init( );
+
+ /* LLD tests application specific init */
+ APP_LLD_BLE_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;
+}
+
+/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
+static void Led_Init( void )
+{
+#if (CFG_LED_SUPPORTED == 1U)
+ /**
+ * Leds Initialization
+ */
+#if (CFG_HW_LPUART1_ENABLED != 1) || ! defined (STM32WB35xx)
+ // On Little DORY, LED_BLUE share the GPIO PB5 with LPUART
+ BSP_LED_Init(LED_BLUE);
+ //BSP_LED_On(LED_BLUE);
+#endif
+
+//#if (CFG_HW_EXTPA_ENABLED != 1)
+ BSP_LED_Init(LED_GREEN);
+ //BSP_LED_On(LED_GREEN);
+//#endif
+
+ BSP_LED_Init(LED_RED);
+ //BSP_LED_On(LED_RED);
+#endif
+
+ return;
+}
+
+static void Button_Init( void )
+{
+ /**
+ * 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);
+
+ return;
+}
+
+/* USER CODE END FD_LOCAL_FUNCTIONS */
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+void UTIL_SEQ_Idle( void )
+{
+ /* Note that WFI (i.e. SLEEP mode) is required for SF timer tests but STOP or OFF mode will be managed by low-power test itself */
+#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)
+ {
+ default :
+ /* default case : schedule all tasks */
+ 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 )
+{
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_Init();
+#endif
+
+ 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 */
+void HAL_GPIO_EXTI_Callback( uint16_t GPIO_Pin )
+{
+ switch (GPIO_Pin)
+ {
+ case BUTTON_SW1_PIN:
+ Appli_GPIO_EXTI_Callback(BUTTON_SW1_PIN);
+ break;
+
+ case BUTTON_SW2_PIN:
+ Appli_GPIO_EXTI_Callback(BUTTON_SW2_PIN);
+ break;
+
+ case BUTTON_SW3_PIN:
+ Appli_GPIO_EXTI_Callback(BUTTON_SW3_PIN);
+ break;
+
+ default:
+ break;
+
+ }
+ return;
+}
+
+void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
+{
+ Appli_TIM_IC_CaptureCallback();
+}
+
+void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
+{
+ Appli_TIM_PeriodElapsedCallback();
+}
+
+
+/* USER CODE END FD_WRAP_FUNCTIONS */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/app_lld_ble_iar_asm.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/app_lld_ble_iar_asm.s
new file mode 100644
index 000000000..987eb201e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/app_lld_ble_iar_asm.s
@@ -0,0 +1,86 @@
+;/**
+; ******************************************************************************
+; * @file app_lld_tests_iar_asm.s
+; * @brief Common functionnalities for RF LLD tests that must be writen
+; * in assembler for IAR compilator
+; ******************************************************************************
+; * @attention
+; *
+; * <h2><center>&copy; COPYRIGHT 2018 STMicroelectronics</center></h2>
+; *
+; ******************************************************************************
+; */
+;
+;/**
+; * @brief Active polling for a given delay
+; * @param microsec the delay in us unit
+; *
+; * Caution:
+; * - This function has been implemented for system clock set to 16MHz. It must
+; * be rewiewed (twice more NOP) for 32Mhz config.
+; * - This function can be interrupted if used in interruptible part of code.
+; * - Be carefull with the use of critical section that can interrupt the reel
+; * time during input microsec value.
+; * - If 0 is given as input
+; */
+ PUBLIC us_delay_16m
+ SECTION .text:CODE:NOROOT(3)
+us_delay_16m
+loop_16m:
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ SUBS R0, R0, #1
+ BHI loop_16m
+ BX LR
+
+ PUBLIC us_delay_32m
+ SECTION .text:CODE:NOROOT(3)
+us_delay_32m
+loop_32m:
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ SUBS R0, R0, #1
+ BHI loop_32m
+ BX LR
+
+ END
+
+;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/gpio_lld.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/gpio_lld.c
new file mode 100644
index 000000000..ba3565389
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/gpio_lld.c
@@ -0,0 +1,613 @@
+/**
+ ******************************************************************************
+ * @file gpio_lld.c
+ * @author MCD Application Team
+ * @version $VERSION$
+ * @date $DATE$
+ * @brief This file contains the init of all the GPIOs used by LLD tests.
+ * It is to be used on both M0 and M4.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; COPYRIGHT(c) 2015 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 ------------------------------------------------------------------*/
+// Be carrefull with the .h included as this file must be compilable on both M0 and M4 environments
+#include "app_conf.h"
+#include "gpio_lld.h"
+
+/* Initialize GPIOs fused by PHY valid CLI */
+void gpio_lld_phy_init(void) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+ /* Enable clock(s) for GPIOs */
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+#ifdef STM32WB35xx
+#else
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+#endif
+#ifdef USE_SIMU
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOD_CLK_ENABLE();
+#endif
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+#ifdef STM32WB35xx
+#else
+ __HAL_RCC_C2GPIOC_CLK_ENABLE();
+#endif
+#ifdef USE_SIMU
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+ __HAL_RCC_C2GPIOC_CLK_ENABLE();
+ __HAL_RCC_C2GPIOD_CLK_ENABLE();
+#endif
+#endif
+
+#if defined (USE_SIMU)
+ // Initialize GPIO used to detect if current DORY is master or slave
+ // 4 GPIOs are needed while only one is enougth but this must be kept as it is
+ // because this is also used by tests which are not managed by MDG-RF
+ GPIO_InitStruct.Pin = (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH ;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ // Initialize GPIOs used to have both DORYs communicating over
+ // 13 bits of the port C and D which are cross connected in SIMU test bench
+ GPIO_InitStruct.Pin = (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH ;
+ HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13);
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH ;
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
+#endif
+
+ // configure the GPIO to be set to '1' during frame TX
+ GPIO_InitStruct.Pin = (GPIO_TX_PIN);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIO_TX_PORT, &GPIO_InitStruct);
+ gpio_lld_phy_gpioTx_down();
+
+ // configure the GPIO to be set to '1' during HardFault'
+ GPIO_InitStruct.Pin = (GPIO_HARD_FAULT_PIN);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIO_HARD_FAULT_PORT, &GPIO_InitStruct);
+ gpio_lld_phy_gpioHardFault_down();
+
+ // configure 2 GPIOs that can be used for debug purposes
+ GPIO_InitStruct.Pin = (GPIO_1_PIN);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIO_1_PORT, &GPIO_InitStruct);
+ gpio_lld_phy_gpio1_down();
+#if !defined (USE_SIMU) && !defined (USE_FPGA)
+ GPIO_InitStruct.Pin = (GPIO_2_PIN);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIO_2_PORT, &GPIO_InitStruct);
+ gpio_lld_phy_gpio2_down();
+#endif
+}
+
+/* Set PHY GPIO_TX to '1' */
+void gpio_lld_phy_gpioTx_up(void) {
+ HAL_GPIO_WritePin(GPIO_TX_PORT, GPIO_TX_PIN, GPIO_PIN_SET);
+}
+
+/* Set PHY GPIO_TX to '0' */
+void gpio_lld_phy_gpioTx_down(void) {
+ HAL_GPIO_WritePin(GPIO_TX_PORT, GPIO_TX_PIN, GPIO_PIN_RESET);
+}
+
+/* Set PHY GPIO_HARD_FAULT to '1' */
+void gpio_lld_phy_gpioHardFault_up(void) {
+ HAL_GPIO_WritePin(GPIO_HARD_FAULT_PORT, GPIO_HARD_FAULT_PIN, GPIO_PIN_SET);
+}
+
+/* Set PHY GPIO_HARD_FAULT to '0' */
+void gpio_lld_phy_gpioHardFault_down(void) {
+ HAL_GPIO_WritePin(GPIO_HARD_FAULT_PORT, GPIO_HARD_FAULT_PIN, GPIO_PIN_RESET);
+}
+
+/* Set PHY GPIO_1 to '1' */
+void gpio_lld_phy_gpio1_up(void) {
+ HAL_GPIO_WritePin(GPIO_1_PORT, GPIO_1_PIN, GPIO_PIN_SET);
+}
+
+/* Set PHY GPIO_1 to '0' */
+void gpio_lld_phy_gpio1_down(void) {
+ HAL_GPIO_WritePin(GPIO_1_PORT, GPIO_1_PIN, GPIO_PIN_RESET);
+}
+
+/* Set PHY GPIO_2 to '1' */
+void gpio_lld_phy_gpio2_up(void) {
+ HAL_GPIO_WritePin(GPIO_2_PORT, GPIO_2_PIN, GPIO_PIN_SET);
+}
+
+/* Set PHY GPIO_2 to '0' */
+void gpio_lld_phy_gpio2_down(void) {
+ HAL_GPIO_WritePin(GPIO_2_PORT, GPIO_2_PIN, GPIO_PIN_RESET);
+}
+
+/* De-initialize GPIOs fused by PHY valid CLI */
+void gpio_lld_phy_deInit(void) {
+ HAL_GPIO_DeInit(GPIO_TX_PORT, GPIO_TX_PIN);
+ HAL_GPIO_DeInit(GPIO_HARD_FAULT_PORT, GPIO_HARD_FAULT_PIN);
+ HAL_GPIO_DeInit(GPIO_1_PORT, GPIO_1_PIN);
+ HAL_GPIO_DeInit(GPIO_2_PORT, GPIO_2_PIN);
+}
+
+/* Initialize GPIOs for MCO use */
+void gpio_lld_mco_init(uint32_t mcoSource, uint32_t mcoDiv) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+ //HAL_RCC_MCOConfig(RCC_MCO3, mcoSource, mcoDiv);
+ LL_RCC_ConfigMCO(mcoSource, mcoDiv);
+
+ /* Enable clock(s) for GPIOs */
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+#endif
+
+ // configure the GPIO PA15 in AF6 to be used as MCO
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF6_MCO;
+ GPIO_InitStruct.Pin = GPIO_MCO_PIN;
+ HAL_GPIO_Init(GPIO_MCO_PORT, &GPIO_InitStruct);
+}
+
+/* De-initialize GPIOs for external PA use */
+void gpio_lld_mco_deInit(void) {
+ HAL_GPIO_DeInit(GPIO_MCO_PORT, GPIO_MCO_PIN);
+ //HAL_RCC_MCOConfig(RCC_MCO3, RCC_MCO1SOURCE_NOCLOCK, RCC_MCODIV_1);
+ LL_RCC_ConfigMCO(RCC_MCO1SOURCE_NOCLOCK, RCC_MCODIV_1);
+}
+
+/* Initialize GPIOs for external PA use */
+void gpio_lld_extPa_init(void) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+ /* Enable clock(s) for GPIOs */
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+#endif
+
+ // configure the GPIO PB0 in AF6 to be used as RF_TX_MOD_EXT_PA
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF6_RF_DTB0;
+ GPIO_InitStruct.Pin = GPIO_EXT_PA_TX_PIN;
+ HAL_GPIO_Init(GPIO_EXT_PA_TX_PORT, &GPIO_InitStruct);
+
+ // configure the GPIO which will be managed by M0 stack to enable Ext PA
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Pin = GPIO_EXT_PA_EN_PIN;
+ HAL_GPIO_Init(GPIO_EXT_PA_EN_PORT, &GPIO_InitStruct);
+}
+
+/* De-initialize GPIOs for external PA use */
+void gpio_lld_extPa_deInit(void) {
+ HAL_GPIO_DeInit(GPIO_EXT_PA_TX_PORT, GPIO_EXT_PA_TX_PIN);
+ HAL_GPIO_DeInit(GPIO_EXT_PA_EN_PORT, GPIO_EXT_PA_EN_PIN);
+}
+
+#ifdef USE_SIMU
+/* Initialize GPIOs for master DORY of the SIMU */
+void gpio_lld_SimuMaster_init(void) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+ /* Enable clock(s) for GPIOs */
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+#endif
+
+ // In DORY master only : initialize GPIO port A pin 0, 1 and, 2 to send CRC result to simulator
+ GPIO_InitStruct.Pin = (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ // In DORY master only : initialize GPIO port B pin 8 and pin 9 to be used for debug purposes
+ GPIO_InitStruct.Pin = (GPIO_TX_PIN);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH ;
+ HAL_GPIO_Init(GPIO_TX_PORT, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = (GPIO_1_PIN);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH ;
+ HAL_GPIO_Init(GPIO_1_PORT, &GPIO_InitStruct);
+}
+
+/* Initialize GPIOs for slave DORY of the SIMU */
+void gpio_lld_SimuSlave_init(void) {
+// No GPIO to initialize in DORY slave
+}
+#endif
+
+/* Initialize GPIOs used by USART */
+void gpio_lld_usart_init(void) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+ /* Enable clock(s) for GPIOs used by USART */
+#if USE_NEW_SET_OF_GPIO_FOR_USART
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+#endif
+#else
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+#endif
+#endif
+
+ /* USART1 GPIO Configuration
+ USART1_TX : PB6
+ USART1_RX : PB7
+ */
+#if USE_NEW_SET_OF_GPIO_FOR_USART
+ GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+#else
+ 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_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+#endif
+}
+
+/* De-initialize GPIOs used by USART */
+void gpio_lld_usart_deInit(void) {
+ /* USART1 GPIO Configuration
+ USART1_TX : PB6
+ USART1_RX : PB7
+ */
+#if USE_NEW_SET_OF_GPIO_FOR_USART
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9);
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_10);
+#else
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6);
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7);
+#endif
+
+ /* Do not disable clocks as they could be used by others GPIOs and it seems to not need power in STOP mode */
+}
+
+/* Initialize GPIOs used by LPUART */
+void gpio_lld_lpuart_init(void) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+#ifdef STM32WB35xx
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+#endif
+#else
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOC_CLK_ENABLE();
+#endif
+#endif
+
+ /* LPUART1 GPIO Configuration
+ LPUART1_TX : PB5 on Little DORY or PC1 on DORY
+ LPUART1_RX : PA3 on Little DORY or PC0 on DORY
+ */
+#ifdef STM32WB35xx
+ GPIO_InitStruct.Pin = 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_5;
+ 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(GPIOB, &GPIO_InitStruct);
+#else
+ GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
+ 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(GPIOC, &GPIO_InitStruct);
+#endif
+}
+
+/* De-initialize GPIOs used by LPUART */
+void gpio_lld_lpuart_deInit(void) {
+ /* LPUART1 GPIO Configuration
+ LPUART1_TX : PB5 on Little DORY PC1 on DORY
+ LPUART1_RX : PA3 on Little DORY PC0 on DORY
+ */
+#ifdef STM32WB35xx
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_3);
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_5);
+#else
+ HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0 | GPIO_PIN_1);
+#endif
+ /* Do not disable clocks as they could be used by others GPIOs and it seems to not need power in STOP mode */
+}
+
+#if !defined (USE_SIMU) && !defined(USE_FPGA)
+/* Initialize GPIO PA2 (for debug use only) */
+void gpio_lld_pa2_init(uint8_t mode) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+ /* Enable clock(s) for GPIOs */
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+#endif
+
+ if (mode == 0) {
+ GPIO_InitStruct.Pin = GPIO_PIN_2;
+ 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);
+ }
+ if (mode == 1) {
+ GPIO_InitStruct.Pin = GPIO_PIN_2;
+ 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);
+ }
+ if (mode == 2) {
+ GPIO_InitStruct.Pin = GPIO_PIN_2;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF6_RF_DTB7;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+ }
+ if (mode == 3) {
+ GPIO_InitStruct.Pin = GPIO_PIN_2;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+ }
+ if (mode == 4) {
+ GPIO_InitStruct.Pin = GPIO_PIN_2;
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+ }
+ if (mode == 5) {
+ GPIO_InitStruct.Pin = GPIO_PIN_2;
+ GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+ }
+}
+
+/* De-initialize GPIO PA2 (for debug use only) */
+void gpio_lld_pa2_deInit(void) {
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2);
+}
+
+/*
+ * Initialize GPIOs needed by DTB mode chosen (for debug use only).
+ * Only DTB0 and DTB7 configurations are coded until now.
+ * Do not forget to program the RF SPI register addr 0x30 () with the DTB cfg and DTB enable.
+ */
+void gpio_lld_dtb_init(uint8_t dtbMode) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+ uint32_t usePA = 0, pinPA = 0;
+ uint32_t usePB = 0, pinPB = 0;
+ uint32_t usePC = 0, pinPC = 0;
+
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+
+ if (dtbMode == 0) {
+ GPIO_InitStruct.Alternate = GPIO_AF6_RF_DTB0;
+
+ usePA = 1;
+ pinPA = (GPIO_PIN_0 | GPIO_PIN_1| GPIO_PIN_2| GPIO_PIN_3| GPIO_PIN_4 |
+ GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9);
+
+ usePC = 1;
+ pinPC = (GPIO_PIN_14 | GPIO_PIN_15);
+ }
+
+ if (dtbMode == 7) {
+ GPIO_InitStruct.Alternate = GPIO_AF6_RF_DTB7;
+
+ usePA = 1;
+#ifdef STM32WB35xx
+ pinPA = (GPIO_PIN_8 | GPIO_PIN_9| GPIO_PIN_10| GPIO_PIN_11| GPIO_PIN_13| GPIO_PIN_14);
+#else
+ pinPA = (GPIO_PIN_8 | GPIO_PIN_9| GPIO_PIN_10| GPIO_PIN_11);
+#endif
+
+ usePB = 1;
+#ifdef STM32WB35xx
+ //pinPB = (GPIO_PIN_2 | GPIO_PIN_7 | GPIO_PIN_8| GPIO_PIN_10| GPIO_PIN_11);
+ // PB 7 is in conflict with USART
+ pinPB = (GPIO_PIN_2 | GPIO_PIN_8);
+#else
+ //pinPB = (GPIO_PIN_2 | GPIO_PIN_7 | GPIO_PIN_8| GPIO_PIN_10| GPIO_PIN_11);
+ // PB 7 is in conflict with USART
+ pinPB = (GPIO_PIN_2 | GPIO_PIN_8| GPIO_PIN_10| GPIO_PIN_11);
+#endif
+ }
+
+ if (usePA == 1) {
+#ifdef CORE_CM4
+ // Enable GPIO PA clock for M4 use
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+#else
+ // Enable GPIO PA clock for M0 use
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+#endif
+
+ GPIO_InitStruct.Pin = pinPA;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+ }
+
+ if (usePB == 1) {
+#ifdef CORE_CM4
+ // Enable GPIO PB clock for M4 use
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+#else
+ // Enable GPIO PB clock for M0 use
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+#endif
+
+ GPIO_InitStruct.Pin = pinPB;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+ }
+
+ if (usePC == 1) {
+#ifdef CORE_CM4
+ // Enable GPIO PC clock for M4 use
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+#else
+ // Enable GPIO PC clock for M0 use
+ __HAL_RCC_C2GPIOC_CLK_ENABLE();
+#endif
+
+ GPIO_InitStruct.Pin = pinPC;
+ HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+ }
+}
+
+void gpio_lld_dtb_deInit(void) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+#ifdef CORE_CM4
+ // Enable GPIO PB clock for M4 use
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+#else
+ // Enable GPIO PB clock for M0 use
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+#endif
+
+ // configure the GPIO to be set to '1' during frame TX
+ GPIO_InitStruct.Pin = (GPIO_PIN_8);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH ;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
+}
+#endif /* ! USE_SIMU and ! USE_FPGA */
+
+// Do not initialize LED GPIOs as they are already initialized by BSP if possible (depending on board and possible GPIOs conflicts).
+// So just offer the toggle possibility for debug purposes
+/* Toggle LED1 */
+void gpio_lld_led1_toggle(void) {
+ HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
+}
+
+/* Toggle LED2 */
+void gpio_lld_led2_toggle(void) {
+ HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
+}
+
+/* Toggle LED3 */
+void gpio_lld_led3_toggle(void) {
+ HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/hw_uart.c
new file mode 100644
index 000000000..8ea61633f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/hw_uart.c
@@ -0,0 +1,484 @@
+/**
+ ******************************************************************************
+ * 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"
+
+/* Macros --------------------------------------------------------------------*/
+#define HW_UART_RX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##RxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ hal_status = 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_status = 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)
+UART_HandleTypeDef huart1;
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+DMA_HandleTypeDef hdma_usart1_tx;
+#endif
+void (*HW_huart1RxCb)(void);
+void (*HW_huart1TxCb)(void);
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+UART_HandleTypeDef hlpuart1;
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+DMA_HandleTypeDef hdma_lpuart1_tx;
+#endif
+void (*HW_hlpuart1RxCb)(void);
+void (*HW_hlpuart1TxCb)(void);
+#endif
+
+/* Functions Definition ------------------------------------------------------*/
+#if (CFG_HW_LPUART1_ENABLED == 1)
+/**
+ * @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.OverSampling = UART_OVERSAMPLING_16;
+ 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();
+ }
+}
+
+void MX_LPUART1_UART_DeInit(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.OverSampling = UART_OVERSAMPLING_16;
+ 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_DeInit(&hlpuart1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+}
+#endif
+
+#if (CFG_HW_USART1_ENABLED == 1)
+/**
+ * @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_16;
+ huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ huart1.FifoMode = UART_FIFOMODE_DISABLE;
+ 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();
+ }
+}
+
+void MX_USART1_UART_DeInit(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_16;
+ huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ huart1.FifoMode = UART_FIFOMODE_DISABLE;
+ if (HAL_UART_DeInit(&huart1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+}
+#endif
+
+hw_status_t HW_UART_Receive_IT(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_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;
+ }
+
+ 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_IT(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_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;
+ }
+
+ 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(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;
+}
+
+#if 0
+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;
+}
+#endif
+
+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/LLD_BLE/LLD_BLE_Proximity/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/main.c
new file mode 100644
index 000000000..a0cf14f24
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/main.c
@@ -0,0 +1,605 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file main.c
+ * @author MCD Application Team
+ * @brief RF LLD tests application
+ *
+ @verbatim
+ ==============================================================================
+ ##### IMPORTANT NOTE #####
+ ==============================================================================
+
+ This application requests having a M0 LLD tests 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 "app_common.h"
+#include "app_entry.h"
+#include "main.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 ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+TIM_HandleTypeDef htim2;
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+static void MX_DMA_Init(void);
+static void MX_TIM2_Init(void);
+
+/* USER CODE BEGIN PFP */
+static void SystemClock_Config(void);
+static 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 on HSE without using PLL and the periph clock needed by this application */
+ SystemClock_Config();
+
+ /* USER CODE BEGIN SysInit */
+ PeriphClock_Config();
+ Init_Exti();
+
+ /* USER CODE END SysInit */
+
+ /* Initialize all configured peripherals */
+ MX_DMA_Init();
+ MX_TIM2_Init();
+ /* USER CODE BEGIN 2 */
+ if (HAL_TIM_Base_Start(&htim2) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* 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 END WHILE */
+ }
+ /* USER CODE BEGIN 3 */
+
+ /* USER CODE END 3 */
+}
+
+/**
+ * @brief System Clock Configuration : API to be called to use HSE (with or without PLL use) as 32Mhz system clock.
+ SystemClock_Config_HSE() must be called once just after boot (to go from default MSI to HSE).
+ Then application user can call both SystemClock_Config_HSE() and SystemClock_Config_MSI() at any time.
+ * @retval None
+ */
+void SystemClock_Config_HSE(uint32_t usePLL)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+
+ /* First, just set MSI ON (with the 32Mhz range) in case it was OFF, without any update on PLL */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
+ RCC_OscInitStruct.MSIState = RCC_MSI_ON;
+ RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_10;
+ RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+ /* Select MSI as system clock in order to be able to update HSE and PLL configuration */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+
+ /* Configure HSE and PLL if needed*/
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
+ if (usePLL == 1)
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+ else
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_OFF;
+ RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV2;
+ RCC_OscInitStruct.PLL.PLLN = 8;
+ RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
+ RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV4;
+ RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV4;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ /* Configure the system clock source and the dividers according to the fact that system clock source is 32Mhz */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4 | RCC_CLOCKTYPE_HCLK2 | RCC_CLOCKTYPE_HCLK |
+ RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
+ if (usePLL == 1)
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+ else
+ 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();
+ }
+
+ // Note that function UTILS_SetFlashLatency() could be used to set the correct Flash latency
+ // (with 32Mhz, 2WS are needed if the range is changed to 1V instead of 1.2V)
+
+ /* Disable MSI Oscillator as the MSI is no more needed by the application */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
+ RCC_OscInitStruct.MSIState = RCC_MSI_OFF;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; /* No update on PLL */
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+}
+
+/**
+ * @brief System Clock Configuration : API to be called to use MSI (with or without PLL use) as 32Mhz system clock.
+ SystemClock_Config_HSE() must be called once just after boot (to go from default MSI to HSE).
+ Then application user can call both SystemClock_Config_HSE() and SystemClock_Config_MSI() at any time.
+ * @retval None
+ */
+void SystemClock_Config_MSI(uint32_t usePLL)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+
+ /* First, just set HSE ON (with the 32Mhz range) in case it was OFF, without any update on PLL */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+ /* Select HSE as system clock in order to be able to update MSI and PLL configuration */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+
+ /* Configure MSI and PLL if needed*/
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
+ RCC_OscInitStruct.MSIState = RCC_MSI_ON;
+ RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_10;
+ RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
+ if (usePLL == 1)
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+ else
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_OFF;
+ RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV2;
+ RCC_OscInitStruct.PLL.PLLN = 8;
+ RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
+ RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV4;
+ RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV4;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+
+ /* Configure the system clock source and the dividers according to the fact that system clock source is 32Mhz */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4 | RCC_CLOCKTYPE_HCLK2 | RCC_CLOCKTYPE_HCLK |
+ RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
+ if (usePLL == 1)
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+ else
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
+ 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();
+ }
+
+/* HSE cannot be stopped while using RF */
+#if 0
+ /* Disable HSE Oscillator as the HSE is no more needed by the application */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_OFF;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; /* No update on PLL */
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+#endif
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief System Clock Configuration : must be called during application start-up
+ * @retval None
+ */
+static void SystemClock_Config(void)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {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);
+
+ /* Assuming that MSI is enabled by default after boot, lets go to HSE without using PLL */
+ SystemClock_Config_HSE(0);
+
+ /* Configure Others clock */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSI48 |
+ RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI2;
+ RCC_OscInitStruct.LSEState = RCC_LSE_ON;
+ RCC_OscInitStruct.HSIState = RCC_HSI_OFF;
+ RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.LSIState = RCC_LSI_OFF;
+ RCC_OscInitStruct.LSI2CalibrationValue = 0;
+ RCC_OscInitStruct.HSI48State = RCC_HSI48_OFF;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+}
+
+/**
+ * Enable DMA controller clock
+ */
+static void MX_DMA_Init(void)
+{
+ /* DMA controller clock enable */
+ __HAL_RCC_DMAMUX1_CLK_ENABLE();
+ __HAL_RCC_DMA1_CLK_ENABLE();
+#ifdef STM32WB35xx
+ __HAL_RCC_DMA2_CLK_ENABLE();
+#endif
+
+ /* DMA interrupt init */
+#ifdef STM32WB35xx
+ /* DMA1_Channel4_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);
+ /* DMA2_Channel4_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA2_Channel4_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA2_Channel4_IRQn);
+#else
+ /* 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);
+#endif
+}
+
+static void PeriphClock_Config(void)
+{
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+
+#if USE_SMPS_ENABLED_BY_DEFAULT
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS | RCC_PERIPHCLK_RFWAKEUP | RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_LPUART1;
+ PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
+ PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
+ PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
+ PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE;
+ PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE1;
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ /* Initialize SMPS here like in BLE applis */
+ LL_PWR_SMPS_SetStartupCurrent(LL_PWR_SMPS_STARTUP_CURRENT_80MA);
+ LL_PWR_SMPS_SetOutputVoltageLevel(LL_PWR_SMPS_OUTPUT_VOLTAGE_1V40);
+ LL_PWR_SMPS_Enable();
+#else
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RFWAKEUP | RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_LPUART1;
+ PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
+ PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
+ PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+#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;
+}
+
+
+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 LPUART(25), IPCC(36), HSEM(38) */
+ LL_EXTI_DisableIT_0_31( (~0) & (~(LL_EXTI_LINE_25)) );
+ LL_EXTI_DisableIT_32_63( (~0) & (~(LL_EXTI_LINE_36 | LL_EXTI_LINE_38)) );
+
+ return;
+}
+
+/**
+ * @brief TIM2 Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_TIM2_Init(void)
+{
+
+ /* USER CODE BEGIN TIM2_Init 0 */
+
+ /* USER CODE END TIM2_Init 0 */
+
+ TIM_ClockConfigTypeDef sClockSourceConfig = {0};
+ TIM_MasterConfigTypeDef sMasterConfig = {0};
+
+ /* USER CODE BEGIN TIM2_Init 1 */
+
+ /* USER CODE END TIM2_Init 1 */
+ htim2.Instance = TIM2;
+ htim2.Init.Prescaler = PRESCALER_VALUE;
+ htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
+ htim2.Init.Period = PERIOD_VALUE;
+ htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
+ htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
+ if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
+ if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
+ sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
+ if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN TIM2_Init 2 */
+
+ /* USER CODE END TIM2_Init 2 */
+
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+
+/**
+ * @brief Declare here empty functions to over-write the default one as it declared as WEAK in HAL.
+ * This is the way to avoid systick use which is initialized by default in HAL_Init() and suspended or resumed in LPM.
+ *
+ * @param None
+ */
+HAL_StatusTypeDef HAL_InitTick( uint32_t TickPriority )
+{
+ return (HAL_OK);
+}
+
+void HAL_SuspendTick(void)
+{
+}
+
+void HAL_ResumeTick(void)
+{
+}
+
+/**
+ * @brief This function is executed in case of error occurrence.
+ * @retval None
+ */
+void Error_Handler(void)
+{
+ BSP_LED_On(LED_BLUE);
+ /* USER CODE BEGIN Error_Handler */
+ /* User can add his own implementation to report the HAL error return state */
+ /* USER CODE END Error_Handler */
+}
+
+#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 assert_failed */
+ /* 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 assert_failed */
+}
+#endif /* USE_FULL_ASSERT */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/stm32_lpm_if.c
new file mode 100644
index 000000000..d73fbdbfc
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/stm32_lpm_if.c
@@ -0,0 +1,288 @@
+ /*******************************************************************************
+ * @file stm32_lpm_if.c
+ * @author MCD Application Team
+ * @brief 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
+ *
+ ******************************************************************************
+ */
+
+/* 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 -----------------------------------------------*/
+/* USER CODE BEGIN Private_Function_Prototypes */
+static void Switch_On_HSI( void );
+
+/* 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 */
+
+/**
+ * @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
+ * @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 ) );
+// CCO : Taken from MAC project already validated in low-power
+// if(LL_RCC_GetSysClkSource( ) == LL_RCC_SYS_CLKSOURCE_STATUS_HSI)
+ if(LL_RCC_GetSysClkSource( ) != LL_RCC_SYS_CLKSOURCE_STATUS_HSE)
+ {
+ 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 */
+}
+
+/* USER CODE BEGIN Private_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 END Private_Functions */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/stm32wbxx_hal_msp.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/stm32wbxx_hal_msp.c
new file mode 100644
index 000000000..e3d6cdb29
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/stm32wbxx_hal_msp.c
@@ -0,0 +1,289 @@
+/**
+ ******************************************************************************
+ * @file stm32wbxx_hal_msp.c
+ * @author MCD Application Team
+ * @brief This file contains the HAL System and Peripheral (UARTs) MSP initialization
+ * and de-initialization functions.
+ ******************************************************************************
+ * @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 "stm32wbxx_hal.h"
+#include "app_common.h"
+#include "gpio_lld.h"
+
+/** @addtogroup STM32WBxx_HAL_Driver
+ * @{
+ */
+
+/** @defgroup HAL_MSP HAL MSP
+ * @brief HAL MSP module.
+ * @{
+ */
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+/** @defgroup HAL_MSP_Private_Functions HAL MSP Private Functions
+ * @{
+ */
+
+/**
+ * @brief Initializes the Global MSP.
+ * @note This function is called from HAL_Init() function to perform system
+ * level initialization (GPIOs, clock, DMA, interrupt).
+ * @retval None
+ */
+void HAL_MspInit(void)
+{
+
+}
+
+/**
+ * @brief DeInitializes the Global MSP.
+ * @note This functiona is called from HAL_DeInit() function to perform system
+ * level de-initialization (GPIOs, clock, DMA, interrupt).
+ * @retval None
+ */
+void HAL_MspDeInit(void)
+{
+
+}
+
+/**
+ * @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)
+{
+ HAL_DMA_MuxSyncConfigTypeDef pSyncConfig;
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ if(huart->Instance == LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspInit 0 */
+
+ /* USER CODE END LPUART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_LPUART1_CLK_ENABLE();
+
+ /* GPIOs configuration */
+ gpio_lld_lpuart_init();
+
+ /* LPUART1 DMA Init */
+ /* LPUART1_TX Init */
+#ifdef STM32WB35xx
+ hdma_lpuart1_tx.Instance = DMA1_Channel4;
+#else
+ hdma_lpuart1_tx.Instance = DMA1_Channel1;
+#endif
+ 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 */
+ }
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+ if(huart->Instance == USART1)
+ {
+ /* USER CODE BEGIN USART1_MspInit 0 */
+
+ /* USER CODE END USART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_USART1_CLK_ENABLE();
+
+ /* GPIOs configuration */
+ gpio_lld_usart_init();
+
+ /* USART1 DMA Init */
+ /* USART1_TX Init */
+#ifdef STM32WB35xx
+ hdma_usart1_tx.Instance = DMA2_Channel4;
+#else
+ hdma_usart1_tx.Instance = DMA1_Channel2;
+#endif
+ 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 */
+ }
+#endif
+}
+
+/**
+ * @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 (CFG_HW_LPUART1_ENABLED == 1)
+ if(huart->Instance == LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspDeInit 0 */
+
+ /* USER CODE END LPUART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_LPUART1_CLK_DISABLE();
+
+ /* De-init GPIOs */
+ gpio_lld_lpuart_deInit();
+
+ /* 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 */
+ }
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+ if(huart->Instance == USART1)
+ {
+ /* USER CODE BEGIN USART1_MspDeInit 0 */
+
+ /* USER CODE END USART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_USART1_CLK_DISABLE();
+
+ /* De-init GPIOs */
+ gpio_lld_usart_deInit();
+
+ /* 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 */
+ }
+#endif
+}
+
+/**
+ * @}
+ */
+/**
+* @brief TIM_Base MSP Initialization
+* This function configures the hardware resources used in this example
+* @param htim_base: TIM_Base handle pointer
+* @retval None
+*/
+void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
+{
+ if(htim_base->Instance==TIM2)
+ {
+ /* USER CODE BEGIN TIM2_MspInit 0 */
+
+ /* USER CODE END TIM2_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_TIM2_CLK_ENABLE();
+ /* TIM2 interrupt Init */
+ HAL_NVIC_SetPriority(TIM2_IRQn, 3, 0);
+ HAL_NVIC_EnableIRQ(TIM2_IRQn);
+ /* USER CODE BEGIN TIM2_MspInit 1 */
+
+ /* USER CODE END TIM2_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief TIM_Base MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param htim_base: TIM_Base handle pointer
+* @retval None
+*/
+void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base)
+{
+ if(htim_base->Instance==TIM2)
+ {
+ /* USER CODE BEGIN TIM2_MspDeInit 0 */
+
+ /* USER CODE END TIM2_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_TIM2_CLK_DISABLE();
+
+ /* TIM2 interrupt DeInit */
+ HAL_NVIC_DisableIRQ(TIM2_IRQn);
+ /* USER CODE BEGIN TIM2_MspDeInit 1 */
+
+ /* USER CODE END TIM2_MspDeInit 1 */
+ }
+
+}
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/stm32wbxx_it.c
new file mode 100644
index 000000000..74159c52a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/stm32wbxx_it.c
@@ -0,0 +1,377 @@
+/* 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 "app_common.h"
+#include "stm32wbxx_it.h"
+#include "gpio_lld.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 --------------------------------------------------------*/
+/* USER CODE BEGIN EV */
+extern TIM_HandleTypeDef htim2;
+
+/* 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 */
+ gpio_lld_phy_gpioHardFault_up();
+
+ /* 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 */
+#if 0 /* no systick used */
+ HAL_IncTick();
+#endif
+ /* 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). */
+/******************************************************************************/
+
+#ifdef STM32WB35xx
+/**
+ * @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 */
+#if (CFG_HW_LPUART1_ENABLED == 1)
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ HAL_DMA_IRQHandler(&hdma_lpuart1_tx);
+#endif
+#endif
+ /* USER CODE BEGIN DMA1_Channel4_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel4_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 */
+#if (CFG_HW_USART1_ENABLED == 1)
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ HAL_DMA_IRQHandler(&hdma_usart1_tx);
+#endif
+#endif
+ /* USER CODE BEGIN DMA2_Channel4_IRQn 1 */
+
+ /* USER CODE END DMA2_Channel4_IRQn 1 */
+}
+
+#else
+/**
+ * @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 */
+#if (CFG_HW_LPUART1_ENABLED == 1)
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ HAL_DMA_IRQHandler(&hdma_lpuart1_tx);
+#endif
+#endif
+ /* 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 */
+#if (CFG_HW_USART1_ENABLED == 1)
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ HAL_DMA_IRQHandler(&hdma_usart1_tx);
+#endif
+#endif
+ /* USER CODE BEGIN DMA1_Channel2_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel2_IRQn 1 */
+}
+#endif
+
+/**
+ * @brief This function handles USART1 global interrupt.
+ */
+void USART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN USART1_IRQn 0 */
+
+ /* USER CODE END USART1_IRQn 0 */
+#if (CFG_HW_USART1_ENABLED == 1)
+ HAL_UART_IRQHandler(&huart1);
+#endif
+ /* 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 */
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ HAL_UART_IRQHandler(&hlpuart1);
+#endif
+ /* USER CODE BEGIN LPUART1_IRQn 1 */
+
+ /* USER CODE END LPUART1_IRQn 1 */
+}
+
+/* USER CODE BEGIN 1 */
+#if 1 /* Not needed for LLD tests : removed to use less power */
+/**
+ * @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 TIM2_IRQHandler(void)
+{
+ HAL_TIM_IRQHandler(&htim2);
+}
+#endif
+
+
+#if 0 /* Not needed for LLD tests : removed to use less power */
+void RTC_WKUP_IRQHandler(void)
+{
+ HW_TS_RTC_Wakeup_Handler();
+}
+#endif /* Not needed for LLD tests : removed to use less power */
+
+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/LLD_BLE/LLD_BLE_Proximity/Core/Src/stm_logging.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/stm_logging.c
new file mode 100644
index 000000000..8c76e703c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/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/LLD_BLE/LLD_BLE_Proximity/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/system_stm32wbxx.c
new file mode 100644
index 000000000..2e42904ec
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/Core/Src/system_stm32wbxx.c
@@ -0,0 +1,357 @@
+/**
+ ******************************************************************************
+ * @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 */
+
+#if defined(STM32WB55xx) || defined(STM32WB35xx)
+ 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}};
+#endif
+
+/**
+ * @}
+ */
+
+/** @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;
+
+#if defined(STM32WB55xx)
+ /* Reset PLLSAI1CFGR register */
+ RCC->PLLSAI1CFGR = 0x22041000U;
+#endif
+
+ /* 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/LLD_BLE/LLD_BLE_Proximity/EWARM/LLD_BLE_Proximity.ewd b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/EWARM/LLD_BLE_Proximity.ewd
new file mode 100644
index 000000000..d05bbd13b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/EWARM/LLD_BLE_Proximity.ewd
@@ -0,0 +1,1419 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>LLD_BLE</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>1</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>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.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>1</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>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></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>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></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>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></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>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></state>
+ </option>
+ <option>
+ <name>CCSTLinkUsbSerialNoSelect</name>
+ <state>1</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>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/LLD_BLE/LLD_BLE_Proximity/EWARM/LLD_BLE_Proximity.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/EWARM/LLD_BLE_Proximity.ewp
new file mode 100644
index 000000000..a46fe6e8b
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/EWARM/LLD_BLE_Proximity.ewp
@@ -0,0 +1,1214 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>LLD_BLE</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>LLD_BLE/Exe</state>
+ </option>
+ <option>
+ <name>ObjPath</name>
+ <state>LLD_BLE/Obj</state>
+ </option>
+ <option>
+ <name>ListPath</name>
+ <state>LLD_BLE/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>CORE_CM4</state>
+ <state>USE_HAL_DRIVER</state>
+ <state>STM32WB55xx</state>
+ <state>USE_STM32WBXX_NUCLEO</state>
+ <state>LLD_BLE_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$/../STM32_WPAN/Target</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>
+ <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>
+ </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>LLD_BLE_Proximity.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>LLD_BLE_Proximity.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\app_lld_ble_iar_asm.s</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\gpio_lld.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_lld_ble.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\App\lld_ble.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>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.Nucleo\stm32wbxx_nucleo.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_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\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\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\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/LLD_BLE/LLD_BLE_Proximity/EWARM/LLD_BLE_Proximity.eww b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/EWARM/LLD_BLE_Proximity.eww
new file mode 100644
index 000000000..aed083bf8
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/EWARM/LLD_BLE_Proximity.eww
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workspace>
+ <project>
+ <path>$WS_DIR$\LLD_BLE_Proximity.ewp</path>
+ </project>
+ <batchBuild />
+</workspace>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/EWARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..1f886ff59
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/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/LLD_BLE/LLD_BLE_Proximity/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/EWARM/stm32wb55xx_flash_cm4.icf
new file mode 100644
index 000000000..383e53fef
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/EWARM/stm32wb55xx_flash_cm4.icf
@@ -0,0 +1,41 @@
+/*###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/LLD_BLE/LLD_BLE_Proximity/STM32_WPAN/App/app_lld_ble.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/STM32_WPAN/App/app_lld_ble.c
new file mode 100644
index 000000000..dbb1d17b4
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/STM32_WPAN/App/app_lld_ble.c
@@ -0,0 +1,1805 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_lld_ble.c
+ * Description : PROXIMITY LLD 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 "app_common.h"
+#include "utilities_common.h"
+#include "app_entry.h"
+#include "dbg_trace.h"
+#include "lld_ble.h"
+#include "app_lld_ble.h"
+#include "tl.h"
+#include "shci.h"
+#include "stm_logging.h"
+#include "stm32_lpm.h"
+#include "stm32_seq.h"
+#include "gpio_lld.h"
+
+/* Private includes -----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+typedef enum
+{
+ CMD_FROM_M0_STOP0_ON = 0,
+ CMD_FROM_M0_STOP1_ON = 1,
+ CMD_FROM_M0_STOP2_ON = 2,
+ CMD_FROM_M0_STOP_OFF = 3,
+ CMD_FROM_M0_GO_IN_WFI = 4,
+ CMD_FROM_M0_GO_DIRECTLY_IN_WFI = 5,
+ CMD_FROM_M0_USE_MSI = 6,
+ CMD_FROM_M0_USE_MSI_PLL = 7,
+ CMD_FROM_M0_USE_HSE = 8,
+ CMD_FROM_M0_USE_HSE_PLL = 9,
+ CMD_FROM_M0_EXT_PA_EN = 10,
+ CMD_FROM_M0_EXT_PA_DIS = 11,
+ CMD_FROM_M0_RADIO_STOP = 12,
+ CMD_FROM_M0_RADIO_END = 13,
+ CMD_FROM_M0_RADIO_RXACK = 14,
+ CMD_FROM_M0_RADIO_RXOK = 15,
+ CMD_FROM_M0_RADIO_RXACKEND = 16,
+ CMD_FROM_M0_RADIO_RXOKEND = 17,
+} cmdFromM0_t;
+
+enum
+{
+ CHAR_CTRLC = 3,
+ CHAR_ESC = 27,
+ CHAR_DEL = 127
+};
+
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private defines -----------------------------------------------------------*/
+#define RX_BUFFER_SIZE 258
+#define CMD_HISTORY_LENGTH 10
+#define CLI_BUFFER_SIZE 30
+#define TX_BUFFER_SIZE 268
+#define CMD_BUFFER_SIZE 8
+
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macros ------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private function prototypes -----------------------------------------------*/
+static void CheckWirelessFirmwareInfo(void);
+static void LldBleTraceError(const char * pMess, uint32_t ErrCode);
+
+static void SendM0CmdAckToM0(void);
+static void SendCmdToM0(void);
+static void SendRspAckToM0(void);
+
+static void uartRxCpltCallback(void);
+static void uartRxItProcess(void);
+static void uartRxBufferProcessMode(uint8_t uartRxCmdEnable);
+static void uartRxBufferProcess(void);
+static void uartClearChars(int nbChar);
+
+static void uartTxBufferAdd(const char * str);
+static void uartTxItProcess(void);
+static void uartTxCpltCallback(void);
+
+static void m0RadioProcess(void);
+static void m0CmdProcess(void);
+static void m0CmdStopRequired(uint32_t stopRequired);
+static void m4ConfigBeforeStop(void);
+static void m4ConfigAfterStop(void);
+
+static void Appli_ProcessMode(void);
+static void Appli_RegTask(void);
+static void Appli_Init(void);
+static void Appli_uartRxBufferPrint(void);
+
+void Appli_m0RadioProcess_RadioStop(void);
+void Appli_m0RadioProcess_RadioEnd(void);
+void Appli_m0RadioProcess_RxAck(void);
+void Appli_m0RadioProcess_RxOk(void);
+void Appli_m0RadioProcess_RxAckEnd(void);
+void Appli_m0RadioProcess_RxOkEnd(void);
+
+void Appli_m0CmdProcess_RadioStop(void);
+void Appli_m0CmdProcess_RadioEnd(void);
+void Appli_m0CmdProcess_RxAck(void);
+void Appli_m0CmdProcess_RxOk(void);
+void Appli_m0CmdProcess_RxAckEnd(void);
+void Appli_m0CmdProcess_RxOkEnd(void);
+
+/* USER CODE BEGIN PFP */
+void BUTTON_SW1_BLE_Init(void);
+void BUTTON_SW2_StartPacket(void);
+void BUTTON_SW3_StopPacket(void);
+void m4CmdPacketStacking (void);
+void m4CmdPacketStackProcess (void);
+/* USER CODE END PFP */
+
+/* debug function prototypes */
+uint32_t Debug_Start_timer(void);
+uint32_t Debug_Stop_timer(void);
+
+/* Private variables -----------------------------------------------*/
+static cmdFromM0_t m0Cmd = CMD_FROM_M0_STOP_OFF;
+
+static uint8_t txBusy;
+static uint8_t rxCmdAllowed = 0;
+static uint8_t txBuffer_Tab[TX_BUFFER_SIZE];
+static uint32_t txBuffer_wrPtr;
+static uint32_t txBuffer_rdPtr;
+static uint8_t *pTxBuff_currentWr;
+static uint8_t rxBuffer_Tab[RX_BUFFER_SIZE];
+static uint32_t rxBuffer_wrPtr;
+static uint32_t rxBuffer_rdPtr;
+static uint8_t currentCommand[CMD_BUFFER_SIZE];
+static uint32_t currentCommandPos;
+static uint8_t commandHistory[CMD_HISTORY_LENGTH][RX_BUFFER_SIZE];
+static int commandHistoryIdx;
+static int commandHistoryIdxSav;
+static uint32_t txtCommandPos;
+static uint8_t txtCommand[TX_BUFFER_SIZE];
+static char cliPrompt[CLI_BUFFER_SIZE] = "Unknown M0 appli > ";
+static uint8_t uartRxCmd = 0;
+static uint32_t delayBeforeSleepOnM4 = 100000;
+static uint8_t uartLastChar;
+static uint8_t uartPayload[RX_BUFFER_SIZE];
+
+/* used with lld_ble */
+extern uint8_t *txBuffer_Ptr;
+uint8_t *rxBuffer_Ptr[8];
+uint32_t *rxStatus_Ptr[8];
+uint32_t *rxTimeStamp_Ptr[8];
+int *rxRSSI_Ptr[8];
+
+PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static TL_LLD_BLE_Config_t LldBleConfigBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t LldBleM0CmdPacket;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t LldBleCmdRspPacket;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t currentCommand[CMD_BUFFER_SIZE];
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) param_hal_BLE_t bleparam_hal_BLE_Packet;
+
+/* debug */
+#define LLD_BLE_DEBUG
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint32_t debug_timer[4];
+uint32_t start_timer;
+uint32_t stop_timer;
+extern TIM_HandleTypeDef htim2;
+
+/* USER CODE BEGIN PV */
+/* Parameters */
+uint8_t init_done =0;
+uint8_t use_hal = 0;
+
+uint32_t proxID = 0x752D5525; // 25 transitions 0xC0
+
+uint8_t proxChannel = 13;
+uint8_t proxPower = 5;
+uint32_t proxWakeup = 1535;
+uint32_t proxReceive = 65535;
+uint32_t proxReceiveAck = 576;
+uint32_t proxtime=1234;
+
+/* data buffer Tab to send TX */
+uint8_t proxtxBufferTab[258] ={0x80,0x18,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,0x26,0x48,0x6F,0x73,
+0x73,0x65,0x70,0x68,0x26,0x48,0x6F,0x73,0x26,0x48,0x6F,0x73,
+};
+uint8_t* proxtxBuffer = proxtxBufferTab;
+
+/* data buffer ACK Tab to send TX ACK after RX */
+uint8_t proxAcktxBufferTab[258] ={0x60,0x18,
+0x4a,0x75,0x6c,0x69,0x65,0x6e,0x2b,0x4d,0x61,0x72,0x69,0x6e,
+0x4a,0x75,0x6c,0x69,0x65,0x6e,0x2b,0x4d,0x61,0x72,0x69,0x6e,
+};
+uint8_t* proxAcktxBuffer = proxAcktxBufferTab;
+
+/* data buffer Tab to receive RX (Not empty)*/
+uint8_t proxrxBufferTab[258]={0x77,0x00,
+0xAB,0xBA,0x67,0x76,0x55,0x55,0x4E,0xE4,0x9B,0xB9,0xAB,0xBA,
+};
+uint8_t* proxrxBuffer = proxrxBufferTab;
+
+/* data buffer ACK Tab to receive RX ACK after TX */
+uint8_t proxAckrxBufferTab[258]={0x33,0x00,
+0x3E,0xE3,0x28,0x82,0x64,0x46,0xC1,0x1C,0x78,0x87,0xDC,0xCD,
+};
+uint8_t* proxAckrxBuffer= proxAckrxBufferTab;
+
+/* Routines */
+/* dataRoutine enum for LL and HAL dataRoutine() */
+dataCase_t dataRoutineDone_hal_BLE = dataCase_Custom0;
+dataCase_t dataRoutineTx_hal_BLE = dataCase_Custom1;
+dataCase_t dataRoutineRx_hal_BLE = dataCase_Custom2;
+dataCase_t dataRoutineStop_hal_BLE = dataCase_Custom3;
+
+/* dataRoutine enum for LL dataRoutine() */
+dataCase_t dataRoutine_LL_TxAck = dataCase_Custom4;
+dataCase_t dataRoutine_LL_RxAck = dataCase_Custom5;
+dataCase_t dataRoutine_Action = dataCase_Custom6;
+
+/* dataRoutine enum for HAL dataRoutine() */
+dataCase_t dataRoutine_HAL_Tx = dataCase_Custom4;
+dataCase_t dataRoutine_HAL_TxAck = dataCase_Custom5;
+dataCase_t dataRoutine_HAL_Rx = dataCase_Custom6;
+dataCase_t dataRoutine_HAL_RxAck = dataCase_Custom7;
+
+/* Routines options */
+uint32_t proxPacketNumber = 100; // NB of Successif PACKET using LL Send or Receive
+uint8_t proxPacketStopRx = 1; // Stop after RX
+
+ActionPacket proxPacket[8];
+Led_TypeDef LED_TXRX=LED_BLUE;
+uint32_t proxSTDEVICEUDN[6];
+uint8_t Packet_ID[8][24];
+uint8_t Local_ID[24];
+uint8_t Recorded_ID=0;
+uint8_t init_ID = 0 ;
+uint8_t Stack_Packet=0;
+uint8_t Packet_Ptr[8][26];
+
+/* Hot config */
+uint32_t LLD_BLE_hot_ana_config_table[BLE_HOT_ANA_CONFIG_TABLE_LENGTH/4];
+
+/* Variable used with m0RadioProcess/m0CmdProcess */
+static uint8_t radioPacketNb=0;
+/* USER CODE END PV */
+
+/* Functions Definition ------------------------------------------------------*/
+void APP_LLD_BLE_Init( void )
+{
+ uint32_t devId = HAL_GetDEVID();
+ uint32_t revId = HAL_GetREVID();
+ uint8_t param[8];
+ char traceBuff[50];
+
+ SHCI_CmdStatus_t LldTestsInitStatus;
+
+ /* Check the compatibility with the Coprocessor Wireless Firmware loaded */
+ CheckWirelessFirmwareInfo();
+
+ /**
+ * Do not allow standby in the application
+ */
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP_LLD_BLE, UTIL_LPM_DISABLE);
+
+ /* No need to activate the System low power mode as it is managed by the low-power test itself */
+ UTIL_LPM_SetStopMode(1 << CFG_LPM_APP_LLD_BLE, UTIL_LPM_DISABLE );
+
+ /* Init config buffer and call TL_LLD_BLE_Init */
+ APP_LLD_BLE_Init_TL();
+
+ /* Create a task to send CLI commands to M0 via IPCC */
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_SEND_TO_M0, UTIL_SEQ_RFU, SendCmdToM0);
+
+ /* Create a task to process data received from UART and create CLI commands */
+ Appli_ProcessMode();
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_PROCESS_UART_RX_BUFFER, UTIL_SEQ_RFU, uartRxBufferProcess);
+
+ /* Create tasks to process interrupt from/to UART to avoid locking UART during IT processing */
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_PROCESS_UART_RX_IT, UTIL_SEQ_RFU, uartRxItProcess);
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_PROCESS_UART_TX_IT, UTIL_SEQ_RFU, uartTxItProcess);
+
+ /* Create a task to manage commands from M0 */
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_CMD_FROM_M0_TO_M4, UTIL_SEQ_RFU, m0CmdProcess);
+
+ /* Create Task for Appli */
+ Appli_RegTask();
+
+ /* Configure UART for receiving CLI command from PC and sending CLI response or notifications to PC */
+ txBusy = 0;
+ rxCmdAllowed = 0;
+ txBuffer_Tab[TX_BUFFER_SIZE-1] = 0;
+ txBuffer_wrPtr = 0;
+ txBuffer_rdPtr = 0;
+ rxBuffer_wrPtr = 0;
+ rxBuffer_rdPtr = 0;
+ currentCommandPos = 0;
+ commandHistoryIdx = 0;
+ commandHistoryIdxSav = 0;
+ APP_LLD_BLE_Init_UART_CLI();
+
+ /* Send LLD tests CLI start information to CLI UART */
+ uartTxBufferAdd("\r\n\n================================\r\n");
+#ifdef STM32WB35xx
+ sprintf(traceBuff, "= Little DORY");
+#else
+ sprintf(traceBuff, "= DORY");
+#endif
+ sprintf(traceBuff, "%s RF LLD BLE \r\n", traceBuff );
+ uartTxBufferAdd(traceBuff);
+ uartTxBufferAdd("================================\r\n");
+#if (CFG_FULL_LOW_POWER == 1U)
+ uartTxBufferAdd("Low-power mode is activated\r\n");
+#endif
+#if (CFG_DEBUGGER_SUPPORTED == 0U)
+ uartTxBufferAdd("Debugger de-activated\r\n");
+#endif
+#if (( CFG_DEBUG_TRACE_FULL == 0 ) && ( CFG_DEBUG_TRACE_LIGHT == 0 ))
+ uartTxBufferAdd("Trace is de-activated\r\n");
+#endif
+
+#if 0
+ APP_DBG("EXTI status");
+ sprintf(traceBuff, " IMR1 0x%08X IMR2 0x%08X", EXTI->IMR1, EXTI->IMR2);
+ APP_DBG(traceBuff);
+ sprintf(traceBuff, " EMR1 0x%08X EMR2 0x%08X", EXTI->EMR1, EXTI->EMR2);
+ APP_DBG(traceBuff);
+ sprintf(traceBuff, "C2IMR1 0x%08X C2IMR2 0x%08X", EXTI->C2IMR1, EXTI->C2IMR2);
+ APP_DBG(traceBuff);
+ sprintf(traceBuff, "C2EMR1 0x%08X C2EMR2 0x%08X", EXTI->C2EMR1, EXTI->C2EMR2);
+ APP_DBG(traceBuff);
+#endif
+
+#if 0
+ // Read the RCC_CR register
+ APP_DBG( "RCC_CR (0x%08X) = 0x%08X", (uint32_t)&(RCC->CR), RCC->CR);
+ // RCC CFGR register
+ APP_DBG( "RCC_CFGR (0x%08X) = 0x%08X", (uint32_t)&(RCC->CFGR), RCC->CFGR);
+ // PLL_CFG register
+ APP_DBG( "RCC_PLLCFGR (0x%08X) = 0x%08X", (uint32_t)&(RCC->PLLCFGR), RCC->PLLCFGR);
+#endif
+
+ /* Indicate end of M4 initialization */
+ APP_DBG("Test appli initialized on M4, wait for M0 initialization");
+
+ /* Send CLI start cmd to M0 (with device and revision ID as parameters */
+ memcpy(&param[0], &devId, 4 );
+ memcpy(&param[4], &revId, 4 );
+ LldTestsInitStatus = SHCI_C2_LLD_BLE_Init(8, param);
+ if(LldTestsInitStatus != SHCI_Success)
+ APP_DBG((char *)"!! ERROR during M0 init !!");
+
+ /* M0 init done, send first command to have M0 code info and thus, a first prompt will be printed automatically */
+ /* Do not accept new command from UART until this one is managed */
+ rxCmdAllowed = 0;
+ currentCommandPos = 5;
+ currentCommand[0] = HAL_BLE_UNUSED_CMDCODE ;/* HAL_BLE_INIT_CMDCODE cmdcode */
+ currentCommand[1] = 'i';
+ currentCommand[2] = 'n';
+ currentCommand[3] = 'f';
+ currentCommand[4] = 'o';
+ currentCommand[5] = 0;
+ /* Set corresponding task to send this command to M0 */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_SEND_TO_M0, CFG_SCH_PRIO_0);
+
+ /* Activate UART RX buffer processing task to allow USER command comming from UART */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_PROCESS_UART_RX_BUFFER, CFG_SCH_PRIO_0);
+
+ Appli_Init();
+
+}
+
+/**
+ * @brief Trace the error or the warning reported.
+ * @param ErrId :
+ * @param ErrCode
+ * @retval None
+ */
+void APP_LLD_BLE_Error(uint32_t ErrId, uint32_t ErrCode)
+{
+ switch(ErrId)
+ {
+ case ERR_LLD_BLE_SET_STATE_CB :
+ LldBleTraceError("ERROR : ERR_LLD_BLE_SET_STATE_CB ",ErrCode);
+ break;
+
+ case ERR_LLD_BLE_ERASE_PERSISTENT_INFO :
+ LldBleTraceError("ERROR : ERR_LLDT_BLE_ERASE_PERSISTENT_INFO ",ErrCode);
+ break;
+
+ case ERR_LLD_BLE_CHECK_WIRELESS :
+ LldBleTraceError("ERROR : ERR_LLD_BLE_CHECK_WIRELESS ",ErrCode);
+ break;
+
+ default :
+ LldBleTraceError("ERROR Unknown ", 0);
+ break;
+ }
+}
+
+
+/*************************************************************
+ *
+ * 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 (OpenThread or other module if any)
+ * @retval None
+ */
+static void LldBleTraceError(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 Check if the Coprocessor Wireless Firmware loaded supports Thread
+ * and display associated informations
+ * @param None
+ * @retval None
+ */
+static void CheckWirelessFirmwareInfo(void)
+{
+ WirelessFwInfo_t wireless_info_instance;
+ WirelessFwInfo_t* p_wireless_info = &wireless_info_instance;
+ char m0FwType[50] = "M0 FW Type : Unknown !! ";
+
+ if (SHCI_GetWirelessFwInfo(p_wireless_info) != SHCI_Success)
+ {
+ APP_LLD_BLE_Error((uint32_t)ERR_LLD_BLE_CHECK_WIRELESS, 0);
+ }
+ else
+ {
+ APP_DBG("**********************************************************");
+ APP_DBG("Loaded M0 TEST FW info :");
+ switch(p_wireless_info->StackType)
+ {
+ case INFO_STACK_TYPE_802154_LLD_TESTS :
+ sprintf(m0FwType, " M0 FW Type : 802.15.4 and radio LLDs tests");
+ sprintf(cliPrompt, "802.15.4 TESTS > ");
+ break;
+
+ case INFO_STACK_TYPE_802154_PHY_VALID :
+ sprintf(m0FwType, " M0 FW Type : 802.15.4 and radio PHY validation");
+ sprintf(cliPrompt, "802.15.4 valid cli > ");
+ break;
+
+ case INFO_STACK_TYPE_BLE_PHY_VALID :
+ sprintf(m0FwType, " M0 FW Type : BLE and radio PHY validation");
+ sprintf(cliPrompt, "BLE valid cli > ");
+ break;
+
+ default :
+ /* FW not supported */
+ APP_LLD_BLE_Error((uint32_t)ERR_LLD_BLE_CHECK_WIRELESS, 0);
+ break;
+ }
+ APP_DBG(m0FwType);
+
+ /* Print version */
+ APP_DBG(" M0 FW VERSION = v%d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
+
+ APP_DBG("**********************************************************");
+ }
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Perform initialization of CLI UART interface.
+ * @param None
+ * @retval None
+ */
+void APP_LLD_BLE_Init_UART_CLI(void)
+{
+#if (CFG_HW_USART1_ENABLED == 1)
+ MX_USART1_UART_Init();
+
+ /* Put the UART device in reception mode and wait for interrupt */
+ if (HW_UART_Receive_IT(CFG_CLI_UART, &rxBuffer_Tab[rxBuffer_wrPtr], 1, uartRxCpltCallback) != hw_uart_ok)
+ APP_DBG((char *)"!! HAL_UART_Receive_IT error on M4 in APP_LLD_BLE_Init_UART_CLI !!");
+#endif
+}
+
+/**
+ * @brief Perform de-initialization of CLI UART interface.
+ * @param None
+ * @retval None
+ */
+void APP_LLD_BLE_DeInit_UART_CLI(void)
+{
+#if (CFG_HW_USART1_ENABLED == 1)
+ MX_USART1_UART_DeInit();
+#endif
+}
+
+static void uartRxCpltCallback(void)
+{
+ /* This callback is called :
+ - during RX isr (huart->RxISR)
+ - after bytes copy in buffer specified in last call to HW_UART_Receive_IT()
+ - when number of bytes specified in last call to HW_UART_Receive_IT() is acheived */
+
+ /* Prepare buffer to receive next character */
+ if ( rxCmdAllowed ) {
+ /* Increment read pointer index and manage buffer rollover */
+ rxBuffer_wrPtr++;
+ if(rxBuffer_wrPtr >= RX_BUFFER_SIZE)
+ rxBuffer_wrPtr = 0;
+ }
+
+ /* Re-put UART device in reception mode (not during IT to avoid locking the device while perhaps in transmit phase) */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_PROCESS_UART_RX_IT, CFG_SCH_PRIO_0);
+}
+
+static void uartRxItProcess(void)
+{
+ /* Put the UART device in reception mode and wait for interrupt */
+ if (HW_UART_Receive_IT(CFG_CLI_UART, &rxBuffer_Tab[rxBuffer_wrPtr], 1, uartRxCpltCallback) != hw_uart_ok)
+ APP_DBG((char *)"!! HAL_UART_Receive_IT error on M4 in uartRxItProcess !!");
+}
+
+static void uartClearChars(int nbChar)
+{
+ char clearCmd[2];
+
+ clearCmd[0] = CHAR_DEL;
+ clearCmd[1] = 0;
+ for (int i = 0; i < nbChar; i++) {
+ uartTxBufferAdd(clearCmd);
+ }
+}
+
+static void uartRxBufferProcessMode(uint8_t uartRxCmdEnable) /* 1 for Cmd ; 0 for Print */
+{
+ uartRxCmd=uartRxCmdEnable;
+}
+
+static void uartRxBufferProcess( void )
+{
+ char last_char[2];
+ static int8_t escape = -1;
+ static uint8_t escape_seq[3] = {0};
+
+ /* Ensure that last_char buffer contains a string with the char and a \0 (usefull to send echo or CHAR_DEL to UART) */
+ last_char[1] = 0;
+
+ if(uartRxCmd) {
+ /* Interpret and Command the character reception from UART */
+ while (rxBuffer_rdPtr != rxBuffer_wrPtr ) {
+ last_char[0] = rxBuffer_Tab[rxBuffer_rdPtr];
+ if( escape >= 0 ) {
+ escape_seq[escape++] = last_char[0];
+ if ( escape == 2 ) {
+ if ( strcmp((char*)escape_seq, "[A") == 0 ) { // UP
+ uartClearChars(currentCommandPos);
+ commandHistoryIdx = (commandHistoryIdx > 0) ? (commandHistoryIdx - 1) : (CMD_HISTORY_LENGTH - 1);
+ strcpy((char*)currentCommand,(char*)commandHistory[commandHistoryIdx]);
+ currentCommandPos = strlen((char*)currentCommand);
+ uartTxBufferAdd((char*)currentCommand);
+ }
+ if ( strcmp((char*)escape_seq, "[B") == 0 ) { // DOWN
+ uartClearChars(currentCommandPos);
+ commandHistoryIdx = (commandHistoryIdx < (CMD_HISTORY_LENGTH - 1)) ? (commandHistoryIdx + 1) : 0;
+ strcpy((char*)currentCommand,(char*)commandHistory[commandHistoryIdx]);
+ currentCommandPos = strlen((char*)currentCommand);
+ uartTxBufferAdd((char*)currentCommand);
+ }
+ escape = -1;
+ }
+ }
+ else if ( last_char[0] == CHAR_DEL ) {
+ if ( currentCommandPos > 0 ) {
+ currentCommandPos--;
+ uartTxBufferAdd(last_char);
+ }
+ }
+ else if ( last_char[0] == CHAR_ESC ) {
+ escape = 0;
+ }
+ else if ( last_char[0] == CHAR_CTRLC ) {
+ /* Just send a new prompt to wait for a new command */
+ currentCommandPos = 0;
+ uartTxBufferAdd("\r\n");
+ uartTxBufferAdd(cliPrompt);
+ }
+ else if ( ( last_char[0] == '\r' ) || ( last_char[0] == '\n' )) {
+ if (currentCommandPos == 0) {
+ /* User just typed 'enter' without any command, so, just send a new prompt to wait for a new command */
+ uartTxBufferAdd("\r\n");
+ uartTxBufferAdd(cliPrompt);
+ } else {
+ /* Do not accept new command from UART until this one is managed */
+ rxCmdAllowed = 0;
+
+ /* Put a end of line in UART TX buffer to have the echo sent */
+ uartTxBufferAdd("\r\n");
+
+ /* Copy the current command in history buffer before to send it to M0 */
+ memcpy(commandHistory[commandHistoryIdxSav],currentCommand,currentCommandPos);
+ /* add a \0 to avoid reseting end of command history buffer */
+ commandHistory[commandHistoryIdxSav][currentCommandPos] = 0;
+ commandHistoryIdxSav = (commandHistoryIdxSav+1) % CMD_HISTORY_LENGTH;
+ commandHistoryIdx = commandHistoryIdxSav;
+
+ /* UART task scheduling to send it to M0 */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_SEND_TO_M0, CFG_SCH_PRIO_0);
+ }
+ }
+ else {
+ /* Put the char in UART TX buffer to have the echo sent */
+ uartTxBufferAdd(last_char);
+ /* Put the char in the current command buffer */
+ currentCommand[currentCommandPos++] = last_char[0];
+ }
+
+ /* Increment read pointer index and manage buffer rollover */
+ rxBuffer_rdPtr++;
+ if(rxBuffer_rdPtr >= RX_BUFFER_SIZE)
+ rxBuffer_rdPtr = 0;
+ }
+ } else {
+ /* Interpret and Print the character reception from UART */
+ while (rxBuffer_rdPtr != rxBuffer_wrPtr ) {
+ last_char[0] = rxBuffer_Tab[rxBuffer_rdPtr];
+ if( escape >= 0 ) {
+ escape_seq[escape++] = last_char[0];
+ if ( escape == 2 ) {
+ if ( strcmp((char*)escape_seq, "[A") == 0 ) { // UP
+ uartClearChars(txtCommandPos);
+ commandHistoryIdx = (commandHistoryIdx > 0) ? (commandHistoryIdx - 1) : (CMD_HISTORY_LENGTH - 1);
+ strcpy((char*)txtCommand,(char*)commandHistory[commandHistoryIdx]);
+ txtCommandPos = strlen((char*)txtCommand);
+ uartTxBufferAdd((char*)txtCommand);
+ }
+ if ( strcmp((char*)escape_seq, "[B") == 0 ) { // DOWN
+ uartClearChars(txtCommandPos);
+ commandHistoryIdx = (commandHistoryIdx < (CMD_HISTORY_LENGTH - 1)) ? (commandHistoryIdx + 1) : 0;
+ strcpy((char*)txtCommand,(char*)commandHistory[commandHistoryIdx]);
+ txtCommandPos = strlen((char*)txtCommand);
+ uartTxBufferAdd((char*)txtCommand);
+ }
+ escape = -1;
+ }
+ }
+ else if ( last_char[0] == CHAR_DEL ) {
+ if ( txtCommandPos > 0 ) {
+ txtCommandPos--;
+ uartTxBufferAdd(last_char);
+ }
+ }
+ else if ( last_char[0] == CHAR_ESC ) {
+ escape = 0;
+ }
+ else if ( last_char[0] == CHAR_CTRLC ) {
+ /* Just send a new prompt to wait for a new command */
+ txtCommandPos = 0;
+ uartTxBufferAdd("\r\n");
+ uartTxBufferAdd(cliPrompt);
+ }
+ else if ( ( last_char[0] == '\r' ) || ( last_char[0] == '\n' )) {
+ if (txtCommandPos == 0) {
+ /* User just typed 'enter' without any command, so, just send a new prompt to wait for a new command */
+ uartTxBufferAdd("\r\n");
+ uartTxBufferAdd(cliPrompt);
+ uartLastChar=0;
+
+ } else {
+ /* Do not accept new command from UART until this one is managed */
+ rxCmdAllowed = 0;
+
+ /* Put a end of line in UART TX buffer to have the echo sent */
+ uartTxBufferAdd("\r\n");
+
+ /* Copy the current command in history buffer before to send it to M0 */
+ memcpy(commandHistory[commandHistoryIdxSav],txtCommand,txtCommandPos);
+ /* add a \0 to avoid reseting end of command history buffer */
+ commandHistory[commandHistoryIdxSav][txtCommandPos] = 0;
+ commandHistoryIdxSav = (commandHistoryIdxSav+1) % CMD_HISTORY_LENGTH;
+ commandHistoryIdx = commandHistoryIdxSav;
+
+ /* UART task scheduling to send it to M0 */
+ /* Send Packet with UART Char as Payload */
+ uartPayload[0]= 0xAA; // Appli Header
+ uartPayload[1]= txtCommandPos; // Appli Length
+ memcpy(&uartPayload[2],txtCommand,txtCommandPos);
+ txtCommandPos=0;
+ Appli_uartRxBufferPrint();
+ uartLastChar=1;
+
+ }
+ }
+ else {
+ /* Put the char in UART TX buffer to have the echo sent */
+ uartTxBufferAdd(last_char);
+ /* Put the char in the current command buffer */
+ txtCommand[txtCommandPos++] = last_char[0];
+ }
+
+ /* Increment read pointer index and manage buffer rollover */
+ rxBuffer_rdPtr++;
+ if(rxBuffer_rdPtr >= RX_BUFFER_SIZE)
+ rxBuffer_rdPtr = 0;
+ }
+ }
+
+ /* Re-activate UART RX buffer processing task */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_PROCESS_UART_RX_BUFFER, CFG_SCH_PRIO_0);
+}
+
+uint32_t txBufferFullCount;
+static void uartTxBufferAdd(const char * str)
+{
+ uint16_t bytesToWrite = strlen(str);
+ uint32_t txBufferFull = 0;
+
+ if (bytesToWrite) {
+ CRITICAL_BEGIN();
+ {
+ uint16_t remainingBytesToWrite = bytesToWrite;
+ uint32_t currentWrPtr = txBuffer_wrPtr;
+ uint8_t * currentWrAddr = &txBuffer_Tab[txBuffer_wrPtr];
+
+ while ((remainingBytesToWrite > 0) && (txBufferFull == 0)) {
+ if ((txBuffer_rdPtr == (currentWrPtr + 1)) || ((txBuffer_rdPtr == 0) && (currentWrPtr == (TX_BUFFER_SIZE - 1)))) {
+ /* If there is not enougth place (i.e. write pointer is just behind read pointer in the circular buffer),
+ buffer is full, so do not consider new string */
+ /* !! No trace here as it is under CRITICAL section */
+ txBufferFull = 1;
+ } else {
+ *currentWrAddr = str[bytesToWrite - remainingBytesToWrite];
+ remainingBytesToWrite--;
+
+ /* Increment write pointer index and manage buffer rollover */
+ currentWrPtr++;
+ if(currentWrPtr >= TX_BUFFER_SIZE)
+ currentWrPtr = 0;
+ currentWrAddr = &txBuffer_Tab[currentWrPtr];
+ }
+ }
+
+ if (txBufferFull == 0) {
+ txBuffer_wrPtr = currentWrPtr;
+ }
+ }
+ CRITICAL_END();
+
+ if (txBufferFull == 0) {
+ if (txBusy == 0) {
+ txBusy = 1;
+ uartTxCpltCallback();
+ }
+ } else {
+ txBufferFullCount++;
+ APP_DBG((char *)"!! TX buffer full : %u", txBufferFullCount);
+ }
+ }
+}
+
+static void uartTxCpltCallback(void)
+{
+ /* Prepare buffer to receive next character */
+ if ( txBuffer_rdPtr != txBuffer_wrPtr ) {
+ /* Re-put UART device in reception mode (not during IT to avoid locking the device while perhaps in transmit phase) */
+ pTxBuff_currentWr = &txBuffer_Tab[txBuffer_rdPtr];
+ UTIL_SEQ_SetTask(1U << CFG_TASK_PROCESS_UART_TX_IT, CFG_SCH_PRIO_0);
+
+ /* Increment write pointer index and manage buffer rollover */
+ txBuffer_rdPtr++;
+ if(txBuffer_rdPtr >= TX_BUFFER_SIZE)
+ txBuffer_rdPtr = 0;
+ } else {
+ txBusy = 0;
+ }
+}
+
+static void uartTxItProcess(void)
+{
+ /* Put the UART device in transmission mode and wait for interrupts :
+ - 1 to write the data in TDR register
+ - 1 when char is sent
+ - 1 to indicate end of transmit if several chars are to be transmitted */
+ if (HW_UART_Transmit_IT(CFG_CLI_UART, pTxBuff_currentWr, 1, uartTxCpltCallback) != hw_uart_ok)
+ APP_DBG((char *)"!! HAL_UART_Transmit_IT error on M4 in uart TX callback !!");
+}
+
+/**
+ * @brief Process sends CLI command to M0.
+ * @param None
+ * @retval None
+ */
+static void SendCmdToM0(void)
+{
+ memset(LldBleCmdRspPacket.cmdserial.cmd.payload, 0x0U, 255U);
+ *(uint32_t *)LldBleCmdRspPacket.cmdserial.cmd.payload = (uint32_t)currentCommand;
+ *(uint32_t *)&LldBleCmdRspPacket.cmdserial.cmd.payload[4] = currentCommandPos;
+ LldBleCmdRspPacket.cmdserial.cmd.plen = 8;
+ LldBleCmdRspPacket.cmdserial.cmd.cmdcode = 0x0;
+
+ TL_LLD_BLE_SendCmd();
+}
+
+/**
+ * @brief Perform initialization of TL for LLD tests.
+ * @param None
+ * @retval None
+ */
+void APP_LLD_BLE_Init_TL(void)
+{
+ LldBleConfigBuffer.p_LldBleCmdRspBuffer = (uint8_t*)&LldBleCmdRspPacket;
+ LldBleConfigBuffer.p_LldBleM0CmdBuffer = (uint8_t*)&LldBleM0CmdPacket;
+
+ TL_LLD_BLE_Init( &LldBleConfigBuffer );
+}
+
+static void m0RadioProcess(void)
+{
+ switch (m0Cmd) {
+ case CMD_FROM_M0_RADIO_STOP :
+ Appli_m0RadioProcess_RadioStop();
+ break;
+
+ case CMD_FROM_M0_RADIO_END :
+ Appli_m0RadioProcess_RadioEnd();
+ break;
+
+ case CMD_FROM_M0_RADIO_RXACK :
+ Appli_m0RadioProcess_RxAck();
+ break;
+
+ case CMD_FROM_M0_RADIO_RXOK :
+ Appli_m0RadioProcess_RxOk();
+ break;
+
+ case CMD_FROM_M0_RADIO_RXACKEND :
+ Appli_m0RadioProcess_RxAckEnd();
+ break;
+
+ case CMD_FROM_M0_RADIO_RXOKEND :
+ Appli_m0RadioProcess_RxOkEnd();
+ break;
+
+ default:
+ break;
+ }
+}
+
+static void m0CmdProcess(void)
+{
+ switch (m0Cmd) {
+
+ case CMD_FROM_M0_RADIO_STOP :
+ Appli_m0CmdProcess_RadioStop();
+ break;
+
+ case CMD_FROM_M0_RADIO_END :
+ Appli_m0CmdProcess_RadioEnd();
+ break;
+
+ case CMD_FROM_M0_RADIO_RXACK :
+ Appli_m0CmdProcess_RxAck();
+ break;
+
+ case CMD_FROM_M0_RADIO_RXOK :
+ Appli_m0CmdProcess_RxOk();
+ break;
+
+ case CMD_FROM_M0_RADIO_RXACKEND :
+ Appli_m0CmdProcess_RxAckEnd();
+ break;
+
+ case CMD_FROM_M0_RADIO_RXOKEND :
+ Appli_m0CmdProcess_RxOkEnd();
+ break;
+
+ case CMD_FROM_M0_STOP0_ON :
+ m0CmdStopRequired(0);
+ break;
+
+ case CMD_FROM_M0_STOP1_ON :
+ m0CmdStopRequired(1);
+ break;
+
+ case CMD_FROM_M0_STOP2_ON :
+ m0CmdStopRequired(2);
+ break;
+
+ case CMD_FROM_M0_STOP_OFF :
+ // Nothing done here as the goal of this command is just to have an IPCC interrupt
+ // that will make the M4 going out of STOP or WFI
+ break;
+
+ case CMD_FROM_M0_GO_IN_WFI :
+ m0CmdStopRequired(3);
+ break;
+
+ case CMD_FROM_M0_GO_DIRECTLY_IN_WFI :
+ m0CmdStopRequired(4);
+ break;
+
+ case CMD_FROM_M0_USE_MSI :
+ SystemClock_Config_MSI(0);
+ break;
+
+ case CMD_FROM_M0_USE_MSI_PLL :
+ SystemClock_Config_MSI(1);
+ break;
+
+ case CMD_FROM_M0_USE_HSE :
+ SystemClock_Config_HSE(0);
+ break;
+
+ case CMD_FROM_M0_USE_HSE_PLL :
+ SystemClock_Config_HSE(1);
+ break;
+
+#if (CFG_HW_EXTPA_ENABLED == 1)
+ case CMD_FROM_M0_EXT_PA_EN :
+ gpio_lld_extPa_init();
+ // Indicate to M0 which GPIO must be managed
+ SHCI_C2_ExtpaConfig((uint32_t)GPIO_EXT_PA_EN_PORT, GPIO_EXT_PA_EN_PIN, EXT_PA_ENABLED_HIGH, EXT_PA_ENABLED);
+ break;
+
+ case CMD_FROM_M0_EXT_PA_DIS :
+ gpio_lld_extPa_deInit();
+ SHCI_C2_ExtpaConfig((uint32_t)GPIO_EXT_PA_EN_PORT, GPIO_EXT_PA_EN_PIN, EXT_PA_ENABLED_HIGH, EXT_PA_DISABLED);
+ break;
+#endif
+
+ default:
+ break;
+ }
+}
+
+static void m4ConfigBeforeStop(void)
+{
+ // Clear C1 Stop flag if any remaining
+ LL_PWR_ClearFlag_C1STOP_C1STB();
+}
+
+static void m4ConfigAfterStop(void)
+{
+ // Clear C1 Stop flag
+ LL_PWR_ClearFlag_C1STOP_C1STB();
+}
+
+static void m0CmdStopRequired(uint32_t stopRequired)
+{
+ switch (stopRequired) {
+ case 0:
+ // flush IPC and trace before sleeping. Let time to M0 to set RF in sleep and to be in STOP if needed
+ us_delay(delayBeforeSleepOnM4);
+
+ // Stop UART and its GPIOs to reduce power consumption
+ APP_LLD_BLE_DeInit_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_DeInit();
+#endif
+
+ // trial for no IT (ex RF) at low speed
+ CRITICAL_BEGIN();
+
+ // Prepare system to be stopped
+ m4ConfigBeforeStop();
+
+ // Enter selected STOP mode
+ HAL_PWREx_EnterSTOP0Mode(PWR_STOPENTRY_WFI);
+
+ // Restart system
+ m4ConfigAfterStop();
+
+ // Restart UART before to go out of critical area to not have to send trace from M0 before to restart it
+ APP_LLD_BLE_Init_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_Init();
+#endif
+
+ // trial for no IT (ex RF) at low speed
+ CRITICAL_END();
+
+ APP_DBG("M4 back from STOP0");
+ break;
+
+ case 1:
+ // flush IPC and trace before sleeping. Let time to M0 to set RF in sleep and to be in STOP if needed
+ us_delay(delayBeforeSleepOnM4);
+
+ // Stop UART and its GPIOs to reduce power consumption
+ APP_LLD_BLE_DeInit_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_DeInit();
+#endif
+
+ // trial for no IT (ex RF) at low speed
+ CRITICAL_BEGIN();
+
+ // Prepare system to be stopped
+ m4ConfigBeforeStop();
+
+ // Enter selected STOP mode
+ HAL_PWREx_EnterSTOP1Mode(PWR_STOPENTRY_WFI);
+
+ // Restart system
+ m4ConfigAfterStop();
+
+ // Restart UART before to go out of critical area to not have to send trace from M0 before to restart it
+ APP_LLD_BLE_Init_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_Init();
+#endif
+
+ // trial for no IT (ex RF) at low speed
+ CRITICAL_END();
+
+ APP_DBG("M4 back from STOP1");
+ break;
+
+ case 2:
+ // flush IPC and trace before sleeping. Let time to M0 to set RF in sleep and to be in STOP if needed
+ us_delay(delayBeforeSleepOnM4);
+
+ // Stop UART and its GPIOs to reduce power consumption
+ APP_LLD_BLE_DeInit_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_DeInit();
+#endif
+
+ // trial for no IT (ex RF) at low speed
+ CRITICAL_BEGIN();
+
+ // Prepare system to be stopped
+ m4ConfigBeforeStop();
+
+ // Enter selected STOP mode
+ HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
+
+ // Restart system
+ m4ConfigAfterStop();
+
+ // Restart UART before to go out of critical area to not have to send trace from M0 before to restart it
+ APP_LLD_BLE_Init_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_Init();
+#endif
+
+ // trial for no IT (ex RF) at low speed
+ CRITICAL_END();
+
+ APP_DBG("M4 back from STOP2");
+ break;
+
+ case 3:
+ // flush IPC and trace before sleeping. Let time to M0 to set RF in sleep and to be in STOP if needed
+ us_delay(delayBeforeSleepOnM4);
+
+ // Stop UART and its GPIOs to reduce power consumption
+ APP_LLD_BLE_DeInit_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_DeInit();
+#endif
+
+ // trial for no IT (ex RF) at low speed
+ CRITICAL_BEGIN();
+
+ __WFI();
+ // Restart UART before to go out of critical area to not have to send trace from M0 before to restart it
+ APP_LLD_BLE_Init_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_Init();
+#endif
+
+ // trial for no IT (ex RF) at low speed
+ CRITICAL_END();
+
+ APP_DBG("M4 back from WFI");
+ break;
+
+ case 4:
+ // Put M4 in WFI without delay :
+ // - In some cases, it is recomanded to limit the M4 activity to avoid Flash access which can slow down the M0 which share it with M4
+ // - But, be carrefull as WFI can be blocking as there is no more interrupts
+ // - As example, if not used, SF timer test is failed.
+ __WFI();
+ APP_DBG("M4 back from WFI (without delay)");
+ break;
+
+ default:
+ break;
+ }
+}
+
+/**
+ * @brief Send Ack to M0 CLI Response channel.
+ * @param None
+ * @retval None
+ */
+static void SendRspAckToM0(void)
+{
+ /* Notify M0 that CLI notification has been taken into account */
+ TL_LLD_BLE_SendRspAck();
+}
+
+/**
+ * @brief This function is called when notification on CLI TL Channel from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_CmdPacket_t
+ * @return None
+ */
+void TL_LLD_BLE_ReceiveRsp( TL_CmdPacket_t * Notbuffer )
+{
+
+ uint8_t l_size = Notbuffer->cmdserial.cmd.plen;
+ char * sourceBuf = (char *)Notbuffer->cmdserial.cmd.payload;
+
+ if (l_size > 0)
+ {
+ if (strncmp(sourceBuf, "Resp_End", 9) == 0)
+ {
+ /* This is an answer to indicate that the CLI command has been completed */
+ UTIL_SEQ_SetEvt(1U << CFG_EVT_RECEIVE_RSPACKEVT);
+
+ /* Write a promp to UART and allow to receive a new command */
+ //sprintf(cliPrompt, "LLD BLE > ");
+ //uartTxBufferAdd("\r\n");
+ //uartTxBufferAdd(cliPrompt);
+
+ currentCommandPos = 0;
+ rxCmdAllowed = 1;
+ }
+ else
+ {
+ /* This is just a trace from M0, write to CLI UART buffer */
+ uartTxBufferAdd(sourceBuf);
+ }
+ }
+ else
+ {
+ APP_DBG((char *)"!! Empty M0 CLI response received by M4 !!");
+ }
+ SendRspAckToM0();
+}
+
+/**
+ * @brief Send Ack to M0 CLI Response channel.
+ * @param None
+ * @retval None
+ */
+static void SendM0CmdAckToM0(void)
+{
+ /* Notify M0 that CLI notification has been taken into account */
+ TL_LLD_BLE_SendM0CmdAck();
+}
+
+/**
+ * @brief This function is called when notification on CLI TL Channel from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_CmdPacket_t
+ * @return None
+ */
+void TL_LLD_BLE_ReceiveM0Cmd( TL_CmdPacket_t * cmdBuffer )
+{
+ //TL_CmdPacket_t* l_CliBuffer = (TL_CmdPacket_t*)Notbuffer;
+ uint8_t bufferSize = cmdBuffer->cmdserial.cmd.plen;
+ char * bufferAddr = (char *)cmdBuffer->cmdserial.cmd.payload;
+ //uint32_t length = *(uint32_t *)&l_CliBuffer->cmdserial.cmd.payload[4];
+
+ if (bufferSize > 0)
+ {
+ if (strncmp(bufferAddr, "Radio_Stop", 10) == 0)
+ {
+ m0Cmd = CMD_FROM_M0_RADIO_STOP;
+
+ /* Action under IT */
+ m0RadioProcess();
+
+ /* Action under Sequencer */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+
+ }
+ else if (strncmp(bufferAddr, "Radio_End", 9) == 0)
+ {
+ m0Cmd = CMD_FROM_M0_RADIO_END;
+
+ /* Action under IT */
+ m0RadioProcess();
+
+ /* Action under Sequencer */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+
+ }
+ else if (strncmp(bufferAddr, "Radio_RxAckEnd", 14) == 0)
+ {
+ m0Cmd = CMD_FROM_M0_RADIO_RXACKEND;
+
+ /* Action under IT */
+ m0RadioProcess();
+
+ /* Action under Sequencer */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+
+ }
+ else if (strncmp(bufferAddr, "Radio_RxOkEnd", 13) == 0)
+ {
+ m0Cmd = CMD_FROM_M0_RADIO_RXOKEND;
+
+ /* Action under IT */
+ m0RadioProcess();
+
+ /* Action under Sequencer */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+
+ }
+ else if (strncmp(bufferAddr, "Radio_RxAck", 11) == 0)
+ {
+ m0Cmd = CMD_FROM_M0_RADIO_RXACK;
+
+ /* Action under IT */
+ m0RadioProcess();
+
+ /* Action under Sequencer */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+
+ }
+ else if (strncmp(bufferAddr, "Radio_RxOk", 10) == 0)
+ {
+ m0Cmd = CMD_FROM_M0_RADIO_RXOK;
+
+ /* Action under IT */
+ m0RadioProcess();
+
+ /* Action under Sequencer */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+
+ }
+ else if (strncmp(bufferAddr, "stop0_on", 8) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_STOP0_ON;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "stop1_on", 8) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_STOP1_ON;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "stop2_on", 8) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_STOP2_ON;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "stop_off", 8) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_STOP_OFF;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "go_in_wfi", 9) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_GO_IN_WFI;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "go_directly_in_wfi", 18) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_GO_DIRECTLY_IN_WFI;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "use_msi_no_pll", 14) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_USE_MSI;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "use_msi_pll", 11) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_USE_MSI_PLL;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "use_hse_no_pll", 14) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_USE_HSE;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "use_hse_pll", 11) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_USE_HSE_PLL;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "ext_pa_enable", 13) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_EXT_PA_EN;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "ext_pa_disable", 14) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_EXT_PA_DIS;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else
+ {
+ APP_DBG((char *)"!! Unknown M0 command received by M4 !!");
+ }
+ }
+ else
+ {
+ APP_DBG((char *)"!! Empty M0 command received by M4 !!");
+ }
+ SendM0CmdAckToM0();
+}
+
+/**
+ * @brief This function is called to Send Command to M0, Every lld_ble API call this function
+ *
+ * @param currentCmd : a value of the lld_ble API
+ * @param currentPt : a pointer to param_hal_BLE_t
+ * @return M0 return value
+ */
+uint8_t APP_LLD_BLE_SendCmdM0(uint8_t currentCmd , uint32_t* currentPt)
+{
+ /* M0 init done, send first command to have M0 code info and thus, a first prompt will be printed automatically */
+ /* Do not accept new command from UART until this one is managed */
+ rxCmdAllowed = 0;
+ currentCommandPos = 5;
+ currentCommand[0] = currentCmd ;
+ currentCommand[1] = (uint8_t)((((uint32_t)(currentPt)) >> 0) & 0xFF);
+ currentCommand[2] = (uint8_t)((((uint32_t)(currentPt)) >> 8) & 0xFF);
+ currentCommand[3] = (uint8_t)((((uint32_t)(currentPt)) >> 16) & 0xFF);
+ currentCommand[4] = (uint8_t)((((uint32_t)(currentPt)) >> 24) & 0xFF);
+
+ currentCommand[5] = 0;
+
+ /* Set corresponding task to send this command to M0 */
+ //UTIL_SEQ_SetTask(1U << CFG_TASK_SEND_TO_M0, CFG_SCH_PRIO_0);
+ UTIL_SEQ_ClrEvt(1U << CFG_EVT_RECEIVE_RSPACKEVT);
+ SendCmdToM0();
+
+ UTIL_SEQ_WaitEvt(1U << CFG_EVT_RECEIVE_RSPACKEVT);
+
+ /* Activate UART RX buffer processing task to allow USER command comming from UART */
+ //UTIL_SEQ_SetTask(1U << CFG_TASK_PROCESS_UART_RX_BUFFER, CFG_SCH_PRIO_0);
+ return(((param_hal_BLE_t*)(currentPt))->return_value);
+
+}
+
+/**
+ * @brief As the default systick is not used, declare here, at least, an empty function to
+ * over-write the default one as it declared as WEAK in HAL.
+ */
+void HAL_Delay(__IO uint32_t Delay)
+{
+ us_delay(Delay*1000);
+ return;
+}
+
+/* USER CODE BEGIN FD */
+/* Appli common functions */
+void Appli_ProcessMode(void)
+{
+ uartRxBufferProcessMode(1); /* cmd mode */
+}
+
+void Appli_RegTask(void)
+{
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_HAL_BLE_INIT , UTIL_SEQ_RFU, BUTTON_SW1_BLE_Init);
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_HAL_BLE_SENDPACKET , UTIL_SEQ_RFU, BUTTON_SW2_StartPacket);
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_HAL_BLE_RECEIVEPACKET , UTIL_SEQ_RFU, BUTTON_SW3_StopPacket);
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_CMD_M4_PACKET_STACKING, UTIL_SEQ_RFU, m4CmdPacketStacking);
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_CMD_M4_PACKET_STACK_PROCESS, UTIL_SEQ_RFU, m4CmdPacketStackProcess);
+}
+
+void Appli_Init(void)
+{
+ proxSTDEVICEUDN[0]=LL_FLASH_GetUDN();
+ proxSTDEVICEUDN[1]=(LL_FLASH_GetSTCompanyID() << 8)| LL_FLASH_GetDeviceID();
+ proxSTDEVICEUDN[2]=HAL_GetDEVID();
+ proxSTDEVICEUDN[3]=HAL_GetUIDw0();
+ proxSTDEVICEUDN[4]=HAL_GetUIDw1();
+ proxSTDEVICEUDN[5]=HAL_GetUIDw2();
+
+ uint8_t i = 0;
+ for (i=0; i<(6*4);i++)
+ {
+ proxtxBufferTab[i+2]=(uint8_t)(proxSTDEVICEUDN[i/4]>>((i%4)*8) & 0xFF);
+ proxAcktxBufferTab[i+2]=~proxtxBufferTab[i+2];
+ }
+}
+
+void Appli_uartRxBufferPrint(void)
+{
+ sprintf(cliPrompt, "LLD BLE > ");
+ uartTxBufferAdd(cliPrompt);
+}
+
+/* Appli radio functions */
+void Appli_m0RadioProcess_RadioStop(void)
+{
+ /* copy status from M0 BLE Radio */
+ radioPacketNb=bleparam_hal_BLE_Packet.txrxBuffer.rxBuffer[257];
+ *rxStatus_Ptr[radioPacketNb]=bleparam_hal_BLE_Packet.status; // status
+}
+
+void Appli_m0RadioProcess_RadioEnd(void)
+{
+ /* copy status from M0 BLE Radio */
+ radioPacketNb=bleparam_hal_BLE_Packet.txrxBuffer.rxBuffer[257];
+ *rxStatus_Ptr[radioPacketNb]=bleparam_hal_BLE_Packet.status; // status
+ UTIL_SEQ_PauseTask(1U <<CFG_TASK_CMD_M4_PACKET_STACK_PROCESS);
+}
+
+void Appli_m0RadioProcess_RxAck(void)
+{
+ /* copy status from M0 BLE Radio */
+ radioPacketNb=bleparam_hal_BLE_Packet.txrxBuffer.rxBuffer[257];
+ *rxStatus_Ptr[radioPacketNb]=bleparam_hal_BLE_Packet.status; // status
+}
+
+void Appli_m0RadioProcess_RxOk(void)
+{
+ /* copy status from M0 BLE Radio */
+ radioPacketNb=bleparam_hal_BLE_Packet.txrxBuffer.rxBuffer[257];
+ *rxStatus_Ptr[radioPacketNb]=bleparam_hal_BLE_Packet.status; // status
+ *rxTimeStamp_Ptr[radioPacketNb]=bleparam_hal_BLE_Packet.timestamp_receive; // timestamp_receive
+ *rxRSSI_Ptr[radioPacketNb]=bleparam_hal_BLE_Packet.rssi; // rssi
+ /* copy payload from M0 BLE Radio */
+ memcpy(rxBuffer_Ptr[radioPacketNb],(bleparam_hal_BLE_Packet.txrxBuffer.rxBuffer),258);
+ UTIL_SEQ_PauseTask(1U <<CFG_TASK_CMD_M4_PACKET_STACK_PROCESS);
+}
+
+void Appli_m0RadioProcess_RxAckEnd(void)
+{
+ /* copy status from M0 BLE Radio */
+ radioPacketNb=bleparam_hal_BLE_Packet.txrxBuffer.rxBuffer[257];
+ *rxStatus_Ptr[radioPacketNb]=bleparam_hal_BLE_Packet.status; // status
+}
+
+void Appli_m0RadioProcess_RxOkEnd(void)
+{
+ /* copy status from M0 BLE Radio */
+ radioPacketNb=bleparam_hal_BLE_Packet.txrxBuffer.rxBuffer[257];
+ *rxStatus_Ptr[radioPacketNb]=bleparam_hal_BLE_Packet.status; // status
+}
+
+
+void Appli_m0CmdProcess_RadioStop(void)
+{
+ HAL_TIM_Base_Stop_IT(&htim2);
+
+ uint8_t j;
+ extern uint8_t Packet_ID[8][24];
+ extern uint8_t Local_ID[24];
+ extern uint8_t Recorded_ID;
+
+ sprintf(cliPrompt, "\r\nLocal ID > ");
+ for (j=0 ; j<2; j++) //24
+ {
+ sprintf(cliPrompt, "%s %2x ",cliPrompt, Local_ID[j]); // Record ID from Stack_Packet
+ }
+
+ while(Recorded_ID)
+ {
+ sprintf(cliPrompt, "%s\r\nRadio Get ID %d> " ,cliPrompt ,Recorded_ID);
+ for (j=0 ; j<2; j++) //24
+ {
+ sprintf(cliPrompt, "%s %2x ",cliPrompt, Packet_ID[Recorded_ID-1][j]); // Record ID from Stack_Packet
+ }
+ Recorded_ID--;
+ }
+ uartTxBufferAdd(cliPrompt);
+}
+
+void Appli_m0CmdProcess_RadioEnd(void)
+{
+ UTIL_SEQ_SetTask(1U <<CFG_TASK_CMD_M4_PACKET_STACKING , CFG_SCH_PRIO_0);
+ if(uartLastChar) uartLastChar=0;
+}
+
+void Appli_m0CmdProcess_RxAck(void)
+{
+}
+
+void Appli_m0CmdProcess_RxOk(void)
+{
+ UTIL_SEQ_SetTask(1U <<CFG_TASK_CMD_M4_PACKET_STACKING , CFG_SCH_PRIO_0);
+}
+
+void Appli_m0CmdProcess_RxAckEnd(void)
+{
+}
+
+void Appli_m0CmdProcess_RxOkEnd(void)
+{
+}
+
+/* Appli custom functions */
+void BUTTON_SW1_BLE_Init(void)
+{
+ #ifdef LLD_BLE_DEBUG
+ bleparam_hal_BLE_Packet.InfoTime=(uint32_t)debug_timer;
+ #endif
+ LLD_BLE_Init(HS_STARTUP_TIME, 1, LLD_BLE_hot_ana_config_table, ENABLE); // lecozj ENABLE for whitening
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_M4_PACKET_STACKING, CFG_SCH_PRIO_0);
+
+ BSP_LED_On(LED_BLUE);
+
+}
+
+
+// ___________________________
+// | _____ |
+// | true |---=>|2:TX |__|
+// | _____ | | |_____| _____
+// |=>|0:RX |___| |_____________|1:RX |
+// | |_____|___ _____________|_____|<=-|
+// | | | _____ _____ |
+// | false |---=>|3:TX |--=>|4:RX |___|
+// | |_____| |_____|___
+// |_______________________________________|
+//
+void BUTTON_SW2_StartPacket(void)
+{
+ LED_TXRX=LED_GREEN;
+
+ LLD_BLE_GetStatus(&proxtime);
+
+ uint8_t map[5]= {0xFF,0xFF,0xFF,0xFF,0xFF};
+ LLD_BLE_SetChannelMap(STATE_MACHINE_3, &map[0]);
+ LLD_BLE_SetChannel(STATE_MACHINE_3, proxChannel, 0);
+ LLD_BLE_SetTxAttributes(STATE_MACHINE_3, proxID, 0x555555,0);
+ LLD_BLE_SetTx_Rx_Phy(STATE_MACHINE_3, TX_PHY_2MBPS, RX_PHY_2MBPS);
+ LLD_BLE_SetTxPower(proxPower);
+ LLD_BLE_SetBackToBackTime(BACK2BACK_TIME);
+
+ //uint8_t map[5]= {0xBB,0xFF,0xFF,0xFF,0xBB};
+ LLD_BLE_SetChannelMap(STATE_MACHINE_0, &map[0]);
+ LLD_BLE_SetChannel(STATE_MACHINE_0,(proxChannel+2),0);
+ LLD_BLE_SetTxAttributes(STATE_MACHINE_0, ~proxID, 0x555555,0);
+ LLD_BLE_SetTx_Rx_Phy(STATE_MACHINE_0, TX_PHY_2MBPS, RX_PHY_2MBPS);
+ LLD_BLE_SetBackToBackTime(BACK2BACK_TIME);
+
+
+ proxPacket[APACKET_0].StateMachineNo = STATE_MACHINE_0; // First RX
+ proxPacket[APACKET_0].ActionTag = PLL_TRIG | TIMER_WAKEUP | RELATIVE;
+ proxPacket[APACKET_0].WakeupTime = proxWakeup;
+ proxPacket[APACKET_0].ReceiveWindowLength = proxReceive;
+ proxPacket[APACKET_0].data = proxrxBuffer;
+ proxPacket[APACKET_0].next_true = APACKET_2; // Ack
+ proxPacket[APACKET_0].next_false = APACKET_3;
+ proxPacket[APACKET_0].condRoutine = condCase_Rx;
+ proxPacket[APACKET_0].dataRoutine = dataRoutine_Action;
+ proxPacket[APACKET_0].actionPacketNb = APACKET_0;
+ LLD_BLE_SetReservedArea(&proxPacket[APACKET_0]);
+
+ proxPacket[APACKET_1].StateMachineNo = STATE_MACHINE_0; // Second RX
+ proxPacket[APACKET_1].ActionTag = PLL_TRIG | TIMER_WAKEUP | RELATIVE;
+ proxPacket[APACKET_1].WakeupTime = 4*proxReceive;
+ proxPacket[APACKET_1].ReceiveWindowLength = proxReceive;
+ proxPacket[APACKET_1].data = proxrxBuffer;
+ proxPacket[APACKET_1].next_true = APACKET_2; // back to RX
+ proxPacket[APACKET_1].next_false = APACKET_3;
+ proxPacket[APACKET_1].condRoutine = condCase_Rx;
+ proxPacket[APACKET_1].dataRoutine = dataRoutine_Action;
+ proxPacket[APACKET_1].actionPacketNb = APACKET_1;
+ LLD_BLE_SetReservedArea(&proxPacket[APACKET_1]);
+
+ proxPacket[APACKET_2].StateMachineNo = STATE_MACHINE_3; // TX Ack State Machine of ACK
+ proxPacket[APACKET_2].ActionTag = TXRX ;
+ proxPacket[APACKET_2].WakeupTime = proxWakeup;
+ proxPacket[APACKET_2].ReceiveWindowLength = 0; /* does not affect for Tx */
+ proxPacket[APACKET_2].data = proxAcktxBuffer;
+ proxPacket[APACKET_2].next_true = APACKET_0;
+ proxPacket[APACKET_2].next_false = APACKET_NULL;
+ proxPacket[APACKET_2].condRoutine = condCase_Done;
+ proxPacket[APACKET_2].dataRoutine = dataRoutineDone_hal_BLE; // return TRUE
+ proxPacket[APACKET_2].actionPacketNb = APACKET_2;
+ LLD_BLE_SetReservedArea(&proxPacket[APACKET_2]);
+
+ proxPacket[APACKET_3].StateMachineNo = STATE_MACHINE_0;
+ proxPacket[APACKET_3].ActionTag = TXRX ;
+ proxPacket[APACKET_3].WakeupTime = proxWakeup;
+ proxPacket[APACKET_3].ReceiveWindowLength = 0 ; /* does not affect for Tx */
+ proxPacket[APACKET_3].data = proxtxBuffer;
+ proxPacket[APACKET_3].next_true = APACKET_4; // Ack
+ proxPacket[APACKET_3].next_false = APACKET_NULL;
+ proxPacket[APACKET_3].condRoutine = condCase_Done;
+ proxPacket[APACKET_3].dataRoutine = dataRoutine_Action;
+ proxPacket[APACKET_3].actionPacketNb = APACKET_3;
+ LLD_BLE_SetReservedArea(&proxPacket[APACKET_3]);
+
+ proxPacket[APACKET_4].StateMachineNo = STATE_MACHINE_3; // RX Ack State Machine of ACK
+ proxPacket[APACKET_4].ActionTag = 0;
+ proxPacket[APACKET_4].WakeupTime = proxWakeup;
+ proxPacket[APACKET_4].ReceiveWindowLength = proxReceiveAck;
+ proxPacket[APACKET_4].data = proxAckrxBuffer;
+ proxPacket[APACKET_4].next_true = APACKET_1; // Ack
+ proxPacket[APACKET_4].next_false = APACKET_0;
+ proxPacket[APACKET_4].condRoutine = condCase_Rx;
+ proxPacket[APACKET_4].dataRoutine = dataRoutineDone_hal_BLE;
+ proxPacket[APACKET_4].actionPacketNb = APACKET_4;
+ LLD_BLE_SetReservedArea(&proxPacket[APACKET_4]);
+
+ APP_LLD_BLE_SetdataRoutineOption(proxPacketNumber,proxPacketStopRx);
+ #ifdef LLD_BLE_DEBUG
+ start_timer=Debug_Start_timer();
+ #endif
+ LLD_BLE_MakeActionPacketPending(&proxPacket[APACKET_0]);
+ #ifdef LLD_BLE_DEBUG
+ stop_timer=Debug_Stop_timer();
+ #endif
+ BSP_LED_On(LED_TXRX);
+
+}
+
+void BUTTON_SW3_StopPacket(void)
+{
+ LED_TXRX=LED_GREEN;
+ //LLD_BLE_StopActivity();
+ proxPacket[APACKET_1].next_true = APACKET_NULL;
+ proxPacket[APACKET_3].next_true = APACKET_NULL;
+ LLD_BLE_SetReservedArea(&proxPacket[APACKET_1]);
+ LLD_BLE_SetReservedArea(&proxPacket[APACKET_3]);
+
+ BSP_LED_Off(LED_TXRX);
+}
+
+void m4CmdPacketStacking(void) // CFG_TASK_CMD_M4_PACKET_STACKING
+{
+ uint8_t i=0;
+ for (i=0 ; i<8 ; i++) // parsed all the actionPacket and keep packet with data not empty
+ {
+ if ((proxPacket[i].status & BIT_TX_MODE)==0 && (proxPacket[i].status & IRQ_RCV_OK)!=0)
+ {
+ if( ((proxPacket[i].rssi)+80) > 0)
+ {
+ // SEMA start
+ memcpy(Packet_Ptr[Stack_Packet++],proxPacket[i].data,26);
+ proxPacket[i].status=0;
+ // SEMA end
+ }
+ } else if ((proxPacket[i].status & BIT_TX_MODE)!=0) {
+ proxPacket[i].WakeupTime = (proxPacket[i].WakeupTime == proxWakeup)? ((__HAL_TIM_GET_COUNTER(&htim2)%3)*proxReceive+proxReceive): proxWakeup;
+ //LLD_BLE_SetReservedArea(&proxPacket[i]);
+ proxPacket[i].status=0;
+ }
+ }
+ //UTIL_SEQ_PauseTask(CFG_TASK_CMD_M4_PACKET_STACKING);
+ UTIL_SEQ_ResumeTask(1U <<CFG_TASK_CMD_M4_PACKET_STACK_PROCESS);
+ UTIL_SEQ_SetTask(1U <<CFG_TASK_CMD_M4_PACKET_STACK_PROCESS , CFG_SCH_PRIO_0);
+
+
+}
+
+void m4CmdPacketStackProcess(void) // CFG_TASK_CMD_M4_PACKET_STACK_PROCESS
+{
+ uint8_t i=0, j=0;
+ if(init_ID++==0) memcpy(Local_ID,(uint8_t*)proxSTDEVICEUDN,24); // init [0] with local ID
+
+ if (Stack_Packet>0)
+ {
+ if (Recorded_ID<8) /* write max of 8 ID*/
+ {
+ for (j=0 ; j<24; j++)
+ {
+ Packet_ID[Recorded_ID][j]=Packet_Ptr[Stack_Packet-1][j+2] ; // Record ID from Stack_Packet
+ }
+ Stack_Packet--;
+ if (Recorded_ID==0)
+ {
+ Recorded_ID++; // no compare We keep first
+ } else {
+ uint8_t comp_ID = 0 ;
+ for (i=0 ; i<Recorded_ID; i++) /* compare */
+ {
+ comp_ID = 0 ;
+ for (j=0 ; j<24; j++)
+ {
+ if (Packet_ID[i][j]==Packet_ID[Recorded_ID][j])
+ {
+ comp_ID++ ;
+ continue; // continue to compare
+ } else {
+ break; // go to next comparison as it is different
+ }
+ }
+ if (comp_ID==24) break; // We already have this ID as all the 24 bytes are similar
+ }
+ if (comp_ID!=24)
+ {
+ Recorded_ID++; // We do not removed we keep this ID
+ }
+ }
+ }
+ UTIL_SEQ_SetTask(1U <<CFG_TASK_CMD_M4_PACKET_STACK_PROCESS , CFG_SCH_PRIO_0);
+ }
+}
+/* USER CODE END FD */
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+void Appli_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
+{
+ switch (GPIO_Pin)
+ {
+ case BUTTON_SW1_PIN:
+ UTIL_SEQ_SetTask(1U << CFG_TASK_HAL_BLE_INIT, CFG_SCH_PRIO_0);
+ break;
+
+ case BUTTON_SW2_PIN:
+ UTIL_SEQ_SetTask(1U << CFG_TASK_HAL_BLE_SENDPACKET, CFG_SCH_PRIO_0);
+ break;
+
+ case BUTTON_SW3_PIN:
+ UTIL_SEQ_SetTask(1U << CFG_TASK_HAL_BLE_RECEIVEPACKET, CFG_SCH_PRIO_0);
+ break;
+
+ default:
+ break;
+
+ }
+ return;
+}
+void Appli_TIM_IC_CaptureCallback(void)
+{
+}
+
+void Appli_TIM_PeriodElapsedCallback(void)
+{
+}
+/* USER CODE END FD_WRAP_FUNCTIONS */
+
+/* debug */
+uint32_t Debug_Start_timer(void)
+{
+ debug_timer[0]=__HAL_TIM_GET_COUNTER(&htim2);
+ if(!debug_timer[2])
+ {
+ return 0;
+ } else
+ {
+ return(debug_timer[0]-debug_timer[2]);
+ }
+}
+uint32_t Debug_Stop_timer(void)
+{
+ debug_timer[1]=__HAL_TIM_GET_COUNTER(&htim2);
+ return(debug_timer[1]-debug_timer[0]);
+}
+
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/STM32_WPAN/App/app_lld_ble.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/STM32_WPAN/App/app_lld_ble.h
new file mode 100644
index 000000000..4e8974cb8
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/STM32_WPAN/App/app_lld_ble.h
@@ -0,0 +1,89 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_lld_ble.h
+ * Description : Header for LLD 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_LLD_BLE_H
+#define APP_LLD_BLE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+
+/* Exported types ------------------------------------------------------------*/
+
+/* 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_LLD_BLE_SET_STATE_CB,
+ ERR_LLD_BLE_ERASE_PERSISTENT_INFO,
+ ERR_LLD_BLE_CHECK_WIRELESS
+ } ErrAppLldBleIdEnum_t;
+
+/* Exported constants --------------------------------------------------------*/
+
+/* External variables --------------------------------------------------------*/
+
+/* Exported macros ------------------------------------------------------------*/
+
+/* Exported functions ------------------------------------------------------- */
+void APP_LLD_BLE_Init( void );
+void APP_LLD_BLE_Error(uint32_t ErrId, uint32_t ErrCode);
+void APP_LLD_BLE_ProcessMsgM0ToM4(void);
+void APP_LLD_BLE_Init_UART_CLI(void);
+void APP_LLD_BLE_DeInit_UART_CLI(void);
+void APP_LLD_BLE_Init_TL(void);
+/**
+ * @brief Active polling for a given delay
+ * @param microsec the delay in us unit
+ **/
+void us_delay_16m(uint32_t microsec);
+void us_delay_32m(uint32_t microsec);
+#ifdef USE_SYS_CLOCK_DIV_2
+#define us_delay us_delay_16m
+#else
+#define us_delay us_delay_32m
+#endif
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+/* only for M4 */
+uint8_t APP_LLD_BLE_SendCmdM0(uint8_t currentCmd , uint32_t* currentPt);
+
+/* USER CODE BEGIN FD_WRAP_FUNCTIONS */
+void Appli_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
+void Appli_TIM_IC_CaptureCallback(void);
+void Appli_TIM_PeriodElapsedCallback(void);
+/* USER CODE END FD_WRAP_FUNCTIONS */
+
+#endif /* APP_LLD_BLE_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/STM32_WPAN/App/lld_ble.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/STM32_WPAN/App/lld_ble.c
new file mode 100644
index 000000000..277391024
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/STM32_WPAN/App/lld_ble.c
@@ -0,0 +1,443 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : lld_ble.c
+ * Description : LLD 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 "app_common.h"
+#include "utilities_common.h"
+#include "app_entry.h"
+#include "dbg_trace.h"
+#include "lld_ble.h"
+#include "app_lld_ble.h"
+#include "tl.h"
+#include "shci.h"
+#include "stm_logging.h"
+#include "stm32_lpm.h"
+#include "stm32_seq.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 function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Private variables -----------------------------------------------*/
+/* USER CODE BEGIN PV */
+uint8_t *txBuffer_Ptr;
+extern uint8_t *rxBuffer_Ptr[8];
+extern uint32_t *rxStatus_Ptr[8];
+extern uint32_t *rxTimeStamp_Ptr[8];
+extern int *rxRSSI_Ptr[8];
+/* for HAL */
+uint32_t hal_status;
+uint32_t hal_timestamp_receive;
+int hal_rssi;
+
+extern param_hal_BLE_t bleparam_hal_BLE_Packet;
+
+uint32_t* param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+static uint32_t global_PacketNumber = 1; // NB of Successif PACKET Send or Receive
+static uint8_t global_PacketStopRx = 1; // Stop after RX
+/* USER CODE END PV */
+
+/* --------------------------- dataRoutine LEVEL -------------------------------*/
+void APP_LLD_BLE_SetdataRoutineOption(uint32_t PacketNumber, uint8_t PacketStop )
+{
+ global_PacketNumber = PacketNumber; // NB of Successif PACKET using LL Send or Receive
+ global_PacketStopRx = PacketStop; // Stop after RX
+}
+
+/* ------------------------------- HAL LEVEL -----------------------------------*/
+uint8_t HAL_BLE_Init(void)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ return(APP_LLD_BLE_SendCmdM0(HAL_BLE_INIT_CMDCODE,param_hal_BLE_IPCC));
+
+}
+
+//static uint32_t networkID = 0x71764129;
+uint8_t HAL_BLE_SetNetworkID(uint32_t ID)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ /* use param_hal_BLE_IPCC for Network ID */
+ bleparam_hal_BLE_Packet.InfoTime = ID ;// channel becomes network ID
+
+ return(APP_LLD_BLE_SendCmdM0(HAL_BLE_SETNETWORKID_CMDCODE,param_hal_BLE_IPCC));
+
+}
+
+uint8_t HAL_BLE_SendPacket(uint8_t channel, uint32_t wakeup_time, uint8_t* txBuffer, dataCase_t dataCaseTx)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+ rxStatus_Ptr[0]=&hal_status;
+ rxTimeStamp_Ptr[0]=&hal_timestamp_receive;
+ rxRSSI_Ptr[0]=&hal_rssi;
+
+
+ txBuffer_Ptr=txBuffer;
+ bleparam_hal_BLE_Packet.InfoTime = global_PacketNumber ; // used benefit of InfoTime to send parameter to M0
+
+ bleparam_hal_BLE_Packet.channel_tx = channel ;
+ bleparam_hal_BLE_Packet.WakeupTime = wakeup_time ;
+ bleparam_hal_BLE_Packet.setCase.dataCase = dataCaseTx;
+ memcpy((bleparam_hal_BLE_Packet.txrxBuffer.txBuffer),txBuffer_Ptr,txBuffer[1]+2); // to be replaced with \0 ended unit8_t
+
+ return(APP_LLD_BLE_SendCmdM0(HAL_BLE_SENDPACKET_CMDCODE,param_hal_BLE_IPCC));
+}
+
+uint8_t HAL_BLE_SendPacketWithAck(uint8_t channel, uint32_t wakeup_time, uint8_t* txBuffer, uint8_t* rxBuffer, uint32_t receive_timeout, dataCase_t dataCaseTx )
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+ rxStatus_Ptr[0]=&hal_status;
+ rxTimeStamp_Ptr[0]=&hal_timestamp_receive;
+ rxRSSI_Ptr[0]=&hal_rssi;
+
+ txBuffer_Ptr=txBuffer;
+ rxBuffer_Ptr[0]=rxBuffer;
+ bleparam_hal_BLE_Packet.InfoTime = global_PacketNumber ; // used benefit of InfoTime to send parameter to M0
+ bleparam_hal_BLE_Packet.StateMachineNo= global_PacketStopRx ; // used benefit of StateMachineNo to send parameter to M0
+
+ bleparam_hal_BLE_Packet.channel_tx = channel ;
+ bleparam_hal_BLE_Packet.WakeupTime = wakeup_time ;
+ bleparam_hal_BLE_Packet.ReceiveWindowLength = receive_timeout ;
+ bleparam_hal_BLE_Packet.setCase.dataCase = dataCaseTx;
+ memcpy((bleparam_hal_BLE_Packet.txrxBuffer.txBuffer),txBuffer_Ptr,txBuffer[1]+2); // to be replaced with \0 ended unit8_t
+
+ return(APP_LLD_BLE_SendCmdM0(HAL_BLE_SENDPACKETWITHACK_CMDCODE,param_hal_BLE_IPCC));
+}
+
+uint8_t HAL_BLE_ReceivePacket(uint8_t channel, uint32_t wakeup_time, uint8_t* rxBuffer, uint32_t receive_timeout, dataCase_t dataCaseRx)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+ rxStatus_Ptr[0]=&hal_status;
+ rxTimeStamp_Ptr[0]=&hal_timestamp_receive;
+ rxRSSI_Ptr[0]=&hal_rssi;
+
+ rxBuffer_Ptr[0]=rxBuffer;
+ bleparam_hal_BLE_Packet.InfoTime = global_PacketNumber ; // used benefit of InfoTime to send parameter to M0
+ bleparam_hal_BLE_Packet.StateMachineNo= global_PacketStopRx ; // used benefit of StateMachineNo to send parameter to M0
+
+
+ bleparam_hal_BLE_Packet.channel_rx = channel ;
+ bleparam_hal_BLE_Packet.WakeupTime = wakeup_time;
+ bleparam_hal_BLE_Packet.ReceiveWindowLength = receive_timeout ;
+ bleparam_hal_BLE_Packet.setCase.dataCase = dataCaseRx;
+
+ return(APP_LLD_BLE_SendCmdM0(HAL_BLE_RECEIVEPACKET_CMDCODE,param_hal_BLE_IPCC));
+}
+
+uint8_t HAL_BLE_ReceivePacketWithAck(uint8_t channel, uint32_t wakeup_time, uint8_t* rxBuffer, uint8_t* txBuffer, uint32_t receive_timeout, dataCase_t dataCaseRx )
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+ rxStatus_Ptr[0]=&hal_status;
+ rxTimeStamp_Ptr[0]=&hal_timestamp_receive;
+ rxRSSI_Ptr[0]=&hal_rssi;
+
+ txBuffer_Ptr=txBuffer;
+ rxBuffer_Ptr[0]=rxBuffer;
+ bleparam_hal_BLE_Packet.InfoTime = global_PacketNumber ; // used benefit of InfoTime to send parameter to M0
+ bleparam_hal_BLE_Packet.StateMachineNo= global_PacketStopRx ; // used benefit of StateMachineNo to send parameter to M0
+
+ bleparam_hal_BLE_Packet.channel_rx = channel ;
+ bleparam_hal_BLE_Packet.WakeupTime = wakeup_time;
+ bleparam_hal_BLE_Packet.ReceiveWindowLength = receive_timeout ;
+ bleparam_hal_BLE_Packet.setCase.dataCase = dataCaseRx;
+ memcpy((bleparam_hal_BLE_Packet.txrxBuffer.txBuffer),txBuffer_Ptr,txBuffer[1]+2); // to be replaced with \0 ended unit8_t
+
+ return(APP_LLD_BLE_SendCmdM0(HAL_BLE_RECEIVEPACKETWITHACK_CMDCODE,param_hal_BLE_IPCC));
+}
+
+/* ------------------------------- LL LEVEL -----------------------------------*/
+
+uint8_t LLD_BLE_GetStatus(uint32_t *time) /* return value */
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ /* use param_hal_BLE_IPCC for Network ID */
+ bleparam_hal_BLE_Packet.InfoTime= NULL;
+
+ uint8_t return_value;
+ return_value=(APP_LLD_BLE_SendCmdM0(LLD_BLE_GETSTATUS_CMDCODE,param_hal_BLE_IPCC)); /* return_value used */
+
+ *time = (bleparam_hal_BLE_Packet.InfoTime); /* pointer as result */
+ return(return_value); /* return_value send */
+
+}
+
+uint8_t LLD_BLE_StopActivity(void)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ return(APP_LLD_BLE_SendCmdM0(LLD_BLE_STOPACTIVITY_CMDCODE,param_hal_BLE_IPCC)); /* return_value send */
+}
+
+void LLD_BLE_SetEncryptionCount(uint8_t StateMachineNo, uint8_t *count_tx, uint8_t *count_rcv)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ /* use param_hal_BLE_IPCC for Network ID */
+ bleparam_hal_BLE_Packet.StateMachineNo=StateMachineNo;
+
+ for(uint8_t i = 0; i < 5; i++) {
+ bleparam_hal_BLE_Packet.txrxBuffer.txBuffer[i]=count_tx[i];
+ bleparam_hal_BLE_Packet.txrxBuffer.txBuffer[i+5]=count_rcv[i];
+ }
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETENCRYPTIONCOUNT_CMDCODE,param_hal_BLE_IPCC); /* return_value send */
+
+ return;
+}
+
+void LLD_BLE_SetEncryptionAttributes(uint8_t StateMachineNo, uint8_t *enc_iv, uint8_t *enc_key)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ /* use param_hal_BLE_IPCC for Network ID */
+ bleparam_hal_BLE_Packet.StateMachineNo=StateMachineNo;
+
+ for(uint8_t i = 0; i < 8; i++) {
+ bleparam_hal_BLE_Packet.txrxBuffer.txBuffer[i]=enc_iv[i];
+ bleparam_hal_BLE_Packet.txrxBuffer.txBuffer[i+8]=enc_key[i];
+ bleparam_hal_BLE_Packet.txrxBuffer.txBuffer[i+16]=enc_key[i+8];
+ }
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETENCRYPTIONATTRIBUTES_CMDCODE,param_hal_BLE_IPCC); /* return_value send */
+
+ return;
+}
+
+void LLD_BLE_SetEncryptFlags(uint8_t StateMachineNo, FunctionalState EncryptFlagTx, FunctionalState EncryptFlagRcv)
+{
+ /* Check the parameters */
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ /* use param_hal_BLE_IPCC for Network ID */
+ bleparam_hal_BLE_Packet.StateMachineNo=StateMachineNo;
+ bleparam_hal_BLE_Packet.channel_tx=(uint8_t)EncryptFlagTx;
+ bleparam_hal_BLE_Packet.channel_rx=(uint8_t)EncryptFlagRcv;
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETENCRYPTFLAGS_CMDCODE,param_hal_BLE_IPCC); /* return_value send */
+
+ return;
+}
+
+void LLD_BLE_EncryptPlainData(uint8_t *Key, uint8_t *plainData, uint8_t *cypherData)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ /* use param_hal_BLE_IPCC for Network ID */
+ memcpy((bleparam_hal_BLE_Packet.txrxBuffer.txBuffer),Key,128); // to be replaced with \0 ended unit8_t
+ memcpy((bleparam_hal_BLE_Packet.txrxBuffer.txBuffer+128),plainData,128); // to be replaced with \0 ended unit8_t
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_ENCRYPTPLAINDATA_CMDCODE,param_hal_BLE_IPCC); /* return_value used */
+
+ memcpy(cypherData,(bleparam_hal_BLE_Packet.txrxBuffer.rxBuffer),128); // to be replaced with \0 ended unit8_t
+
+ return;
+}
+
+void LLD_BLE_StartTone(uint8_t RF_channel, uint8_t powerLevel)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ /* use param_hal_BLE_IPCC for Network ID */
+ bleparam_hal_BLE_Packet.channel_tx= RF_channel;
+ bleparam_hal_BLE_Packet.StateMachineNo= powerLevel;
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_STARTTONE_CMDCODE,param_hal_BLE_IPCC); /* return_value send */
+
+ return;
+}
+
+/* without return */
+void LLD_BLE_SetChannelMap(uint8_t StateMachineNo, uint8_t *chan_remap) /* no return */
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ /* use param_hal_BLE_IPCC for Network ID */
+ bleparam_hal_BLE_Packet.StateMachineNo=StateMachineNo;
+
+ for(uint8_t i = 0; i < 5; i++) {
+ bleparam_hal_BLE_Packet.txrxBuffer.txBuffer[i]=chan_remap[i];
+ }
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETCHANNELMAP_CMDCODE,param_hal_BLE_IPCC); /* return_value used */
+
+ return;
+}
+
+void LLD_BLE_SetChannel(uint8_t StateMachineNo, uint8_t channel, uint8_t channel_increment)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ /* use param_hal_BLE_IPCC for Network ID */
+ bleparam_hal_BLE_Packet.StateMachineNo=StateMachineNo;
+ bleparam_hal_BLE_Packet.channel_tx= channel;
+ bleparam_hal_BLE_Packet.channel_rx= channel_increment;
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETCHANNEL_CMDCODE,param_hal_BLE_IPCC); /* return_value used */
+
+ return;
+}
+
+void LLD_BLE_SetTxAttributes(uint8_t StateMachineNo, uint32_t NetworkID, uint32_t crc_init, uint32_t sca)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ bleparam_hal_BLE_Packet.StateMachineNo=StateMachineNo;
+ bleparam_hal_BLE_Packet.InfoTime = NetworkID ;// channel becomes network ID
+ bleparam_hal_BLE_Packet.WakeupTime = crc_init;
+ bleparam_hal_BLE_Packet.ReceiveWindowLength = sca; // not used
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETTXATTRIBUTES_CMDCODE,param_hal_BLE_IPCC); /* return_value used */
+
+ return;
+}
+
+void LLD_BLE_SetBackToBackTime(uint32_t back_to_back_time)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ bleparam_hal_BLE_Packet.WakeupTime = back_to_back_time;// channel becomes network ID
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETBACKTOBACKTIME_CMDCODE,param_hal_BLE_IPCC); /* return */
+
+ return;
+}
+
+void LLD_BLE_SetTxPower(uint8_t powerLevel)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ bleparam_hal_BLE_Packet.StateMachineNo = powerLevel;// channel becomes network ID
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETTXPOWER_CMDCODE,param_hal_BLE_IPCC); /* return_value used */
+
+ return;
+}
+
+void LLD_BLE_SetTx_Rx_Phy(uint8_t StateMachineNo, uint8_t tx_phy, uint8_t rx_phy)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ bleparam_hal_BLE_Packet.StateMachineNo = StateMachineNo;// channel becomes network ID
+ bleparam_hal_BLE_Packet.channel_tx = tx_phy;// channel becomes network ID
+ bleparam_hal_BLE_Packet.channel_rx = rx_phy;// channel becomes network ID
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETTX_RX_PHY_CMDCODE,param_hal_BLE_IPCC); /* return_value used */
+
+ return;
+}
+
+void LLD_BLE_StopTone(void)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_STOPTONE_CMDCODE,param_hal_BLE_IPCC); /* return_value used */
+
+ return;
+}
+
+void LLD_BLE_SetReservedArea(ActionPacket *p)
+{
+
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ bleparam_hal_BLE_Packet.StateMachineNo=p->StateMachineNo;
+ bleparam_hal_BLE_Packet.channel_tx=p->next_true;
+ bleparam_hal_BLE_Packet.channel_rx=p->next_false;
+ bleparam_hal_BLE_Packet.WakeupTime=p->WakeupTime;
+ bleparam_hal_BLE_Packet.ReceiveWindowLength=p->ReceiveWindowLength;
+
+ bleparam_hal_BLE_Packet.actionPacketNb=(p->actionPacketNb);
+ bleparam_hal_BLE_Packet.ActionTag=(p->ActionTag);
+
+ rxStatus_Ptr[p->actionPacketNb]=&(p->status);
+ rxTimeStamp_Ptr[p->actionPacketNb]=&(p->timestamp_receive);
+ rxRSSI_Ptr[p->actionPacketNb]=&(p->rssi);
+
+ bleparam_hal_BLE_Packet.setCase.condCase=(condCase_t)p->condRoutine;
+ bleparam_hal_BLE_Packet.setCase.dataCase=(dataCase_t)p->dataRoutine;
+
+ if(bleparam_hal_BLE_Packet.ActionTag & TXRX) {
+
+ txBuffer_Ptr=p->data;
+ memcpy((bleparam_hal_BLE_Packet.txrxBuffer.txBuffer),txBuffer_Ptr,258); // to be replaced with \0 ended unit8_t
+
+ } else {
+ rxBuffer_Ptr[p->actionPacketNb]=p->data;
+ }
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_SETRESERVEDAREA_CMDCODE,param_hal_BLE_IPCC); /* return_value used */
+
+ return;
+
+}
+
+uint8_t LLD_BLE_MakeActionPacketPending(ActionPacket *p)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ bleparam_hal_BLE_Packet.actionPacketNb=(p->actionPacketNb);
+ bleparam_hal_BLE_Packet.InfoTime = global_PacketNumber ; // used benefit of time to send parameter to M0
+ bleparam_hal_BLE_Packet.StateMachineNo = global_PacketStopRx ;
+
+
+ return(APP_LLD_BLE_SendCmdM0(LLD_BLE_MAKEACTIONPACKETPENDING_CMDCODE,param_hal_BLE_IPCC)); /* return_value used */
+}
+
+void LLD_BLE_Init(uint16_t hs_startup_time, uint8_t low_speed_osc, uint32_t* hot_table, FunctionalState whitening)
+{
+ //param_hal_BLE_IPCC=(uint32_t*)(&bleparam_hal_BLE_Packet);
+
+ bleparam_hal_BLE_Packet.WakeupTime=(uint32_t)(hs_startup_time);
+ bleparam_hal_BLE_Packet.ActionTag=low_speed_osc;
+ bleparam_hal_BLE_Packet.actionPacketNb=(uint8_t)whitening;
+
+ APP_LLD_BLE_SendCmdM0(LLD_BLE_INIT_CMDCODE,param_hal_BLE_IPCC); /* return_value used */
+
+ memcpy((uint8_t*)hot_table,(bleparam_hal_BLE_Packet.txrxBuffer.txBuffer),BLE_HOT_ANA_CONFIG_TABLE_LENGTH); // to be replaced with \0 ended unit8_t
+
+ return;
+
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/STM32_WPAN/App/lld_ble.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/STM32_WPAN/App/lld_ble.h
new file mode 100644
index 000000000..eabc03fe9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/STM32_WPAN/App/lld_ble.h
@@ -0,0 +1,229 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_lld_ble.h
+ * Description : Header for LLD 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 LLD_BLE_H
+#define LLD_BLE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+
+/* Exported types ------------------------------------------------------------*/
+
+/* Exported constants --------------------------------------------------------*/
+
+/* External variables --------------------------------------------------------*/
+
+/* Exported macros ------------------------------------------------------------*/
+
+/* Exported functions ------------------------------------------------------- */
+
+/* ---------------------------------------------------------------------------*/
+/* ------------------------------- LLD BLE -----------------------------------*/
+/* ---------------------------------------------------------------------------*/
+#define IRQ_RCV_OK (1UL<<31) /* The packet is received, and the CRC is valid. */
+#define BIT_TX_MODE (1UL<<18) /* The packet has been sent successfully. */
+
+#define HS_STARTUP_TIME (uint16_t)(0x001A) /* High Speed start up time 64 us */
+#define BLE_HOT_ANA_CONFIG_TABLE_LENGTH 60 /* LLD TESTING */
+
+#define RX_PHY_1MBPS 0x00
+#define RX_PHY_2MBPS 0x10
+#define TX_PHY_1MBPS 0x00
+#define TX_PHY_2MBPS 0x01
+#define BACK2BACK_TIME 50
+
+#define PLL_TRIG 0x01
+#define TXRX 0x02
+#define TIMER_WAKEUP 0x04
+#define NS_EN 0x08
+#define INC_CHAN 0x10
+#define RELATIVE 0x20
+#define TIMESTAMP_POSITION 0x80
+
+typedef enum {
+ STATE_MACHINE_0 = 0,
+ STATE_MACHINE_1,
+ STATE_MACHINE_2,
+ STATE_MACHINE_3,
+ STATE_MACHINE_4,
+ STATE_MACHINE_5,
+ STATE_MACHINE_6,
+ STATE_MACHINE_7,
+} StateMachine_t;
+
+/* condRoutine enum for condRoutine() */
+typedef enum
+ {
+ condCase_Done = 0,
+ condCase_Tx,
+ condCase_Rx,
+ condCase_Stop,
+ } condCase_t;
+
+/* dataRoutine enum for dataRoutine() */
+typedef enum
+ {
+ dataCase_Custom0 = 0,
+ dataCase_Custom1,
+ dataCase_Custom2,
+ dataCase_Custom3,
+ dataCase_Custom4,
+ dataCase_Custom5,
+ dataCase_Custom6,
+ dataCase_Custom7,
+ } dataCase_t;
+
+/* dataRoutine and condRoutine struct */
+typedef struct {
+ condCase_t condCase ; /* __I */
+ dataCase_t dataCase ; /* __I */
+} setCase_t;
+
+/* Structure for Buffer */
+typedef struct {
+ uint8_t txBuffer[260]; /* __I */ /*txBuffer + Encrypt*/
+ uint8_t rxBuffer[260]; /* __O */ /*rxBuffer + radioPacketNb=rxBuffer[257] */
+} buffer_hal_BLE_t;
+
+/* Parameter HAL LLD BLE Data Structure */
+typedef struct {
+ uint32_t WakeupTime; /* __I status_32[0]*/ /*WakeupTime + back2back + crc_init + hs_startup_time*/
+ uint32_t ReceiveWindowLength; /* __I status_32[1]*/ /*ReceiveWindowLength*/
+ uint32_t InfoTime; /* __I status_32[2]*/ /*InfoTime + NetworkID + global_PacketNumber */
+ uint32_t status; /* __O status_32[3]*/ /*status*/
+ uint32_t timestamp_receive; /* __O status_32[4]*/ /*timestamp_receive*/
+ uint32_t rssi; /* __O status_32[5]*/ /*rssi*/
+ uint8_t return_value; /* __IO */ /*return value*/
+ uint8_t channel_tx; /* __I status_8[0]*/ /*tx + flagTx + channel + tx_phy + next_true + RF_channel */
+ uint8_t channel_rx; /* __I status_8[1]*/ /*rx + flagRcv + increment + rx_phy + next_false */
+ uint8_t StateMachineNo; /* __I status_8[2]*/ /*StateMachineNo + powerLevel + global_PacketStopRx*/
+ uint8_t ActionTag; /* __I status_8[3]*/ /*ActionTag + low_speed_osc*/
+ uint8_t actionPacketNb; /* __I status_8[4]*/ /*actionPacketNb + whitening*/
+ setCase_t setCase; /* __I status_8[5] status_8[6]*/ /*condRoutine , dataRoutine*/
+ buffer_hal_BLE_t txrxBuffer; /*data*/
+} param_hal_BLE_t;
+
+typedef struct {
+ uint8_t StateMachineNo ; /* This parameter indicates the state machine number for this action. From 0 to 7. */
+ uint8_t ActionTag; /* The configuration of the current action.
+ * Action Tag: PLL_TRIG, TXRX, TIMER_WAKEUP, INC_CHAN, TIMESTAMP_POSITION, RELATIVE */
+ uint32_t WakeupTime; /* Contains the wakeup time in microsecond if it is relative.
+ * It should not be more than 24 bits if it is absolute.
+ * It only applies if TIMER_WAKEUP flag is set in ActionTag. */
+ uint32_t ReceiveWindowLength; /* Sets RX window size in microsecond. Applicable only for RX actions. */
+ uint8_t *data; /* Pointer to the array with the data to send (header, length and data field), for TX.
+ * Pointer to the array where the data received are copied, for RX.
+ * In case of RX, the array must have the max size MAX_PACKET_LENGTH. */
+ uint32_t status; /* The Status Register with the information on the action. */
+ uint32_t timestamp_receive; /* This field contains the timestamp when a packet is received.
+ * Intended to be used in the dataRoutine() callback routine. RX only. */
+ int32_t rssi; /* The rssi of the packet was received with. RX only. */
+ uint8_t next_true; /* Pointer to next ActionPacket if condRoutine() returns TRUE */
+ uint8_t next_false; /* Pointer to next ActionPacket if condRoutine() returns FALSE */
+ uint8_t condRoutine; /* User callback that decide the next ActionPacket to use.
+ * It is time critical. Routine must end within 45 us. */
+ uint8_t dataRoutine; /* User callback for managing data. */
+ uint8_t actionPacketNb; /* User callback for managing data. */
+} ActionPacket;
+
+typedef enum
+ {
+ APACKET_0 = 0,
+ APACKET_1,
+ APACKET_2,
+ APACKET_3,
+ APACKET_4,
+ APACKET_5,
+ APACKET_6,
+ APACKET_7,
+ APACKET_NULL=0xFF, // to be place at the end
+} ActionPacket_Nb;
+
+/* Enum for Cmd Code */
+typedef enum
+ {
+ /* hal_BLE.c part */
+ HAL_BLE_UNUSED_CMDCODE = 0,
+ HAL_BLE_INIT_CMDCODE ,
+ HAL_BLE_SETNETWORKID_CMDCODE,
+ HAL_BLE_SENDPACKET_CMDCODE,
+ HAL_BLE_SENDPACKETWITHACK_CMDCODE,
+ HAL_BLE_RECEIVEPACKET_CMDCODE,
+ HAL_BLE_RECEIVEPACKETWITHACK_CMDCODE,
+ /* ipBLE_lld.c part */
+ LLD_BLE_GETSTATUS_CMDCODE,
+ LLD_BLE_SETCHANNELMAP_CMDCODE,
+ LLD_BLE_SETCHANNEL_CMDCODE,
+ LLD_BLE_SETTXATTRIBUTES_CMDCODE,
+ LLD_BLE_SETBACKTOBACKTIME_CMDCODE,
+ LLD_BLE_SETTXPOWER_CMDCODE,
+ LLD_BLE_SETTX_RX_PHY_CMDCODE,
+ LLD_BLE_STOPACTIVITY_CMDCODE,
+ LLD_BLE_SETENCRYPTIONCOUNT_CMDCODE,
+ LLD_BLE_SETENCRYPTIONATTRIBUTES_CMDCODE,
+ LLD_BLE_SETENCRYPTFLAGS_CMDCODE,
+ LLD_BLE_ENCRYPTPLAINDATA_CMDCODE,
+ LLD_BLE_STARTTONE_CMDCODE,
+ LLD_BLE_STOPTONE_CMDCODE,
+ LLD_BLE_SETRESERVEDAREA_CMDCODE,
+ LLD_BLE_MAKEACTIONPACKETPENDING_CMDCODE,
+ LLD_BLE_INIT_CMDCODE,
+} hal_BLE_Code_t;
+
+uint8_t HAL_BLE_Init(void);
+uint8_t HAL_BLE_SetNetworkID(uint32_t ID);
+uint8_t HAL_BLE_SendPacket(uint8_t channel, uint32_t wakeup_time, uint8_t* txBuffer, dataCase_t dataCaseTx);
+uint8_t HAL_BLE_SendPacketWithAck(uint8_t channel, uint32_t wakeup_time, uint8_t* txBuffer, uint8_t* rxBuffer, uint32_t receive_timeout, dataCase_t dataCaseTxAck );
+uint8_t HAL_BLE_ReceivePacket(uint8_t channel, uint32_t wakeup_time, uint8_t* rxBuffer, uint32_t receive_timeout, dataCase_t dataCaseTx );
+uint8_t HAL_BLE_ReceivePacketWithAck(uint8_t channel, uint32_t wakeup_time, uint8_t* rxBuffer, uint8_t* txBuffer, uint32_t receive_timeout, dataCase_t dataCaseTxAck );
+
+uint8_t LLD_BLE_GetStatus(uint32_t *time);
+void LLD_BLE_SetChannelMap(uint8_t StateMachineNo,uint8_t *chan_remap);
+void LLD_BLE_SetChannel(uint8_t StateMachineNo, uint8_t channel,uint8_t channel_increment);
+void LLD_BLE_SetTxAttributes(uint8_t StateMachineNo, uint32_t NetworkID, uint32_t crc_init, uint32_t sca);
+void LLD_BLE_SetBackToBackTime(uint32_t back_to_back_time);
+void LLD_BLE_SetTxPower(uint8_t powerLevel);
+void LLD_BLE_SetTx_Rx_Phy(uint8_t StateMachineNo, uint8_t tx_phy, uint8_t rx_phy);
+uint8_t LLD_BLE_StopActivity(void);
+void LLD_BLE_SetEncryptionCount(uint8_t StateMachineNo, uint8_t *count_tx, uint8_t *count_rcv);
+void LLD_BLE_SetEncryptionAttributes(uint8_t StateMachineNo, uint8_t *enc_iv, uint8_t *enc_key);
+void LLD_BLE_SetEncryptFlags(uint8_t StateMachineNo, FunctionalState EncryptFlagTx, FunctionalState EncryptFlagRcv);
+void LLD_BLE_EncryptPlainData(uint8_t *Key, uint8_t *plainData, uint8_t *cypherData);
+void LLD_BLE_StartTone(uint8_t RF_channel, uint8_t powerLevel);
+void LLD_BLE_StopTone(void);
+
+//void LLD_BLE_CrystalCheck(void);
+void LLD_BLE_SetReservedArea(ActionPacket *p);
+uint8_t LLD_BLE_MakeActionPacketPending(ActionPacket *p);
+void LLD_BLE_Init(uint16_t hs_startup_time, uint8_t low_speed_osc, uint32_t* hot_table, FunctionalState whitening);
+//void LLD_BLE_IRQHandler(void);
+
+
+/* only for M4 */
+void APP_LLD_BLE_SetdataRoutineOption(uint32_t PacketNumber, uint8_t PacketStop );
+
+#endif /* LLD_BLE_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/STM32_WPAN/Target/hw_ipcc.c
new file mode 100644
index 000000000..e7049681d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/STM32_WPAN/Target/hw_ipcc.c
@@ -0,0 +1,675 @@
+/**
+ ******************************************************************************
+ * 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 LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_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 LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_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 )
+{
+ /**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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 */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_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/LLD_BLE/LLD_BLE_Proximity/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/readme.txt
index 99abde026..9c6c587ae 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/readme.txt
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/LLD_BLE/LLD_BLE_Proximity/readme.txt
@@ -20,15 +20,62 @@
@par Example Description
-This example is to communicate Over The Air (OTA) using LLD_BLE between several boards in BLE Radio format not BLE Stack protocol.
- LLD_BLE_Proximity is an application that catch Local ID of Board in proximity.
+How to create a Proximity detection with all other boards that are running this same application.
+
+@note The objectives are to communicate using LLD_BLE between several boards,
+ in BLE Radio format not BLE Stack protocol.
+ LLD_BLE_Proximity is an application that catch Local ID of Board in proximity
+ This is a solution for detecting people sick of Covid-19 that we have in contact very close.
+ Current config less than -80 dBm is not takin into account (>4 meters distance)
+
+@note LLD_BLE is a 2-level stack implemented just over the Hardware and Radio layer.
+ Lowest Layer also called Low Level or LL
+ It is just over the Hardware and Radio Layer.
+ It contains all the API to Set/Configure/Initialize all the parameters for Sending/receiving BLE Radio format packet data
+ Over LL layer there is HAL level
+ It contains a reduced number of API to Send/Receive BLE Radio format packet with predefined parameters
+ It works by calling a set of LL API
+ It make simple and fast to Send/receive Packet
+ But It does allow the user to change all the Radio parameters
+
+@note LL is for user that want to customize the Radio and BLE parameters, it is more complex to implement
+ HAL is for user that want to Send/Receive in a very simple way less complex, without configuring LL
+ lld_ble module contains LLD API HAL and LL API
+ app_lld_ble module contains Transport Layer Command call from CPU1 to CPU2 + Buffer management + IT Radio management from CPU2
@par Keywords
-LLD_BLE, HAL send and receive Packet
+LLD_BLE, Connectivity, BLE, LLD, IPCC, HAL, Dual core, send and receive Packet
@par Directory contents
+ - LLD_BLE/LLD_BLE_Proximity/STM32_WPAN/App/app_lld_ble.h Header for app_lld_ble.c module
+ - LLD_BLE/LLD_BLE_Proximity/STM32_WPAN/App/lld_ble.h Header for lld_ble.c module
+ - LLD_BLE/LLD_BLE_Proximity/STM32_WPAN/App/app_lld_ble.c contains TL management and Buffer for LLD BLE Application
+ - LLD_BLE/LLD_BLE_Proximity/STM32_WPAN/App/lld_ble.c contains LL and HAL API
+ - LLD_BLE/LLD_BLE_Proximity/STM32_WPAN/Target/hw_ipcc.c IPCC Driver
+ - LLD_BLE/LLD_BLE_Proximity/Core/Inc/app_common.h Header for all modules with common definition
+ - LLD_BLE/LLD_BLE_Proximity/Core/Inc/app_conf.h Parameters configuration file of the application
+ - LLD_BLE/LLD_BLE_Proximity/Core/Inc/app_entry.h Parameters configuration file of the application
+ - LLD_BLE/LLD_BLE_Proximity/Core/Inc/gpio_lld.h Parameters for gpio configuration file of the application
+ - LLD_BLE/LLD_BLE_Proximity/Core/Inc/hw_conf.h Configuration file of the HW
+ - LLD_BLE/LLD_BLE_Proximity/Core/Inc/hw_if.h Configuration file of the HW
+ - LLD_BLE/LLD_BLE_Proximity/Core/Inc/main.h Header for main.c module
+ - LLD_BLE/LLD_BLE_Proximity/Core/Inc/stm_logging.h Header for stm_logging.c module
+ - LLD_BLE/LLD_BLE_Proximity/Core/Inc/stm32_lpm_if.h Header for stm32_lpm_if.c module
+ - LLD_BLE/LLD_BLE_Proximity/Core/Inc/stm32wbxx_hal_conf.h HAL configuration file
+ - LLD_BLE/LLD_BLE_Proximity/Core/Inc/stm32wbxx_it.h Interrupt handlers header file
+ - LLD_BLE/LLD_BLE_Proximity/Core/Inc/utilities_conf.h Configuration file of the utilities
+ - LLD_BLE/LLD_BLE_Proximity/Core/Src/app_entry.c Initialization of the application
+ - LLD_BLE/LLD_BLE_Proximity/Core/Src/gpio_lld.c GPIO for for application
+ - LLD_BLE/LLD_BLE_Proximity/Core/Src/hw_uart.c UART Driver
+ - LLD_BLE/LLD_BLE_Proximity/Core/Src/main.c Main program
+ - LLD_BLE/LLD_BLE_Proximity/Core/Src/stm_logging.c Logging for application
+ - LLD_BLE/LLD_BLE_Proximity/Core/Src/stm32_lpm_if.c Low Power Manager Interface
+ - LLD_BLE/LLD_BLE_Proximity/Core/Src/stm32wbxx_it.c Interrupt handlers
+ - LLD_BLE/LLD_BLE_Proximity/Core/Src/system_stm32wbxx.c stm32wbxx system source file
+ - LLD_BLE/LLD_BLE_Proximity/Core/Src/stm32wbxx_hal_msp.c HAL MPS for application
+
@par Hardware and Software environment
- This application uses two STM32WB55xx devices.
@@ -64,77 +111,53 @@ In order to make the program work, you must do the following:
+ load stm32wb5x_BLE_LLD_fw.bin
- Run the application
- If you want to control this application, you can directly press buttons and put in proximity some board
- In this order and described into main.c:
-
-
- /////////////// OBJECTIVES //////////////////////////
- The objectif is to communicate Over The Air (OTA) using LLD_BLE between several boards, in BLE Radio format not BLE Stack protocol.
- LLD_BLE_Proximity is an application that catch Local ID of Board in proximity
- This is answer for detecting people sick of Covid-19 that we have in contact very close during the last 14 days (or more)
- With current config less than -80 dBm is not takin into account (>4 meters distance)
-
- LLD_BLE is a 2-level stack implemented just over the Hardware and Radio layer.
- Lowest Layer also called Low Level or LL
- It is just over the Hardware and Radio Layer.
- It contains all the API to Set/Configure/Initialize all the parameters for Sending/receiving BLE Radio format packet data OTA
- Over LL layer there is HAL level
- It contains a reduced number of API to Send/Receive BLE Radio format packet with predefined parameters
- It works by calling a set of LL API
- It make simple and fast to Send/receive Packet
- But It does allow the user to change all the Radio parameters
-
- lld_ble contains LLD API HAL and LL API
- app_lld_ble contains Transport Layer Command call from CPU1 to CPU2 + Buffer management + IT Radio management from CPU2
-
- /////////////// APPLICATION //////////////////////////
- After power On or Reset (ALL the LED are OFF)
- 1) Press SW1 to Init
- 2) Press SW2 to Launch Application from 0:RX ActionPacket
-// ___________________________
-// | Ack _____ |
-// | true |---=>|2:TX |__|
-// | _____ | | |_____| _____
-// |=>|0:RX |___| |_____________|1:RX |
-// | |_____|___ _____________|_____|<=-|
-// | | | _____ _____ |
-// | false |---=>|3:TX |--=>|4:RX |___|
-// | |_____| Ack|_____|___
-// |_______________________________________|
- During 0:RX in RXMode it listen OTA if TX is done from Another Board for same AccessAddress at same Channel
- If detecting:true it launch a 2:TX ACK packet (different AccessAddress and MachineState for Ack)
- If not it launch the 3:TX packet with its own ID and wait for 4:RX ACK (different AccessAddress and MachineState for Ack)
- If 4:RX is true: it means that other device has send its 2:TX packet (Same Ack AccessAddress and MachineState)
- Then it launch a 4:RX after a long wakeup to make this device out the OTA detection during few RX)
- If 4:RX is false: no device has send a Ack 2:TX it start again to listen 0:RX after a regular wakeup.
- 1:RX is equivalent to 0:RX but it is done after a longer wakeup.
+LLD_BLE_Proximity used only LL API not HAL
+
+If you want to control this application, you can directly press buttons and put in proximity some board
+In this order and described into main.c:
+
+After power On or Reset (ALL the LED are OFF)
+
+ 1) Press SW1 to Init:
+
+ 2) Press SW2 to Launch Application from 0:RX ActionPacket:
+
+ ActionPacket filling
+ ___________________________
+ | Ack _____ |
+ | true |---=>|2:TX |__|
+ | _____ | | |_____| _____
+ |=>|0:RX |___| |_____________|1:RX |
+ | |_____|___ _____________|_____|<=-|
+ | | | _____ _____ |
+ | false |---=>|3:TX |--=>|4:RX |___|
+ | |_____| Ack|_____|___
+ |_______________________________________|
+
+ After SW1 and SW2
+ 0:RX (RX mode and listen if TX is send from another board)
+ if true => 2:TX (send a TX Ack) and goes back to 0:RX
+ if false => 3:TX (send its Local ID) and goes to 4:RX
+ 4:RX (RX mode and listen if a TX Ack is send from another board)
+ if true => 1:RX (RX mode and listen if TX is send from another board = equivalent to 0:RX )
+ if false => 0:RX
+
+ 1:RX and 0:RX differs that 1:RX has a Wakeup time much longer that 0:RX
+ It makes the board in sleep mode for a while in order to allow other board to comunicate
+
+
3) Press SW3 to stop Radio and Display Results on terminal
+
Exemple:
Local ID > c6 17 // Current device ID under terminal
Radio Get ID 3> 6f b8 // device detected
Radio Get ID 2> f2 b5 // device detected
Radio Get ID 1> a 2f // device detected
- Serial Port Setup TERMINAL
- Baud Rate:115200 / Data:8 bits / Parity:none / Stop:1bit / Flow Control:none
-
- /////////////// MAIN CODE //////////////////////////
- A set of parameters common to LL API are proposed
+Serial Port Setup TERMINAL
+Baud Rate:115200 / Data:8 bits / Parity:none / Stop:1bit / Flow Control:none
- channel / WakeupTime / ReceiveWindowTime are predefined as proxChannel / proxWakeup / proxReceive
-
- networkID=~proxID for LL data (statemachine 0)
- networkID=proxID for LL ack (statemachine 3)
-
- TxBuffer is also predefined, presstxBufferTab maximum size is 258
- 1 for Header (set by user)
- 1 for Payload Length 0x18 (set by user)
- 0x18(24) payload is proxSTDEVICEUDN[0:5]
-
- TxBuffer for ACK answer (proxAcktxBuffer) is complementary to TxBuffer for data (proxtxBuffer)
-
- dataRoutine_Action and dataRoutineDone_hal_BLE are used
-
+0x18(24) payload is proxSTDEVICEUDN[0:5]
* <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
*/ \ No newline at end of file
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_FFD/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_FFD/Core/Inc/app_common.h
index be54b9054..780a38902 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_FFD/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_FFD/Core/Inc/app_common.h
@@ -61,9 +61,13 @@ extern "C" {
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_FFD/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_FFD/Core/Src/app_entry.c
index 7f893e6e0..91e591703 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_FFD/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_FFD/Core/Src/app_entry.c
@@ -168,7 +168,7 @@ void APP_ENTRY_Init_FFD(void)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
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/STM32CubeIDE/.cproject b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_FFD/STM32CubeIDE/.cproject
index fe26ffcbb..3b24dc19a 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_FFD/STM32CubeIDE/.cproject
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_FFD/STM32CubeIDE/.cproject
@@ -17,19 +17,19 @@
<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="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.822367624" name="Debug" parent="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug">
<folderInfo id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.822367624." name="/" resourcePath="">
<toolChain id="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.debug.23906" name="MCU ARM GCC" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.debug">
- <option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.type.412468442" name="Internal Toolchain Type" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.type" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.version.1310690698" name="Internal Toolchain Version" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.version" value="7-2018-q2-update" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.1411155016" name="Mcu" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu" value="STM32WB55RGVx" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.843593374" name="CpuId" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid" value="0" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.751624754" name="CpuCoreId" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid" value="0" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.2097236772" name="Floating-point unit" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.value.fpv4-sp-d16" valueType="enumerated"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.1293221614" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.hard" valueType="enumerated"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.200900112" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" value="genericBoard" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.590741265" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.3 || Debug || true || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32 || STM32WB55RGVx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../../Core/Inc | ../../../../../../../Utilities/lpm/tiny_lpm | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci | ../../../../../../../Utilities/sequencer | ../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl | ../../../../../../../Middlewares/ST/STM32_WPAN/mac_802_15_4/core/inc | ../../STM32_WPAN/App | ../../../../../../../Middlewares/ST/STM32_WPAN | ../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo | ../../STM32_WPAN/Target | ../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc | ../../../../../../../Middlewares/ST/STM32_WPAN/utilities | ../../../../../../../Drivers/CMSIS/Include || || || USE_HAL_DRIVER | USE_STM32WBXX_NUCLEO | MAC_802_15_4_WB | CORE_CM4 | STM32WB55xx || || || || || ${workspace_loc:/${ProjName}/STM32WB55RGVX_FLASH.ld} || true || NonSecure || || || " valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.type.412468442" name="Internal Toolchain Type" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.type" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.version.1310690698" name="Internal Toolchain Version" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.version" useByScannerDiscovery="false" value="7-2018-q2-update" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.1411155016" name="Mcu" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu" useByScannerDiscovery="false" value="STM32WB55RGVx" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.843593374" name="CpuId" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid" useByScannerDiscovery="false" value="0" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.751624754" name="CpuCoreId" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid" useByScannerDiscovery="false" value="0" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.2097236772" name="Floating-point unit" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.value.fpv4-sp-d16" valueType="enumerated"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.1293221614" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.hard" valueType="enumerated"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.200900112" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="genericBoard" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.590741265" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.3 || Debug || true || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32 || STM32WB55RGVx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../../Core/Inc | ../../../../../../../Utilities/lpm/tiny_lpm | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci | ../../../../../../../Utilities/sequencer | ../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl | ../../../../../../../Middlewares/ST/STM32_WPAN/mac_802_15_4/core/inc | ../../STM32_WPAN/app | ../../../../../../../Middlewares/ST/STM32_WPAN | ../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo | ../../STM32_WPAN/Target | ../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc | ../../../../../../../Middlewares/ST/STM32_WPAN/utilities | ../../../../../../../Drivers/CMSIS/Include || || || USE_HAL_DRIVER | USE_STM32WBXX_NUCLEO | MAC_802_15_4_WB | CORE_CM4 | STM32WB55xx || || || || || ${workspace_loc:/${ProjName}/STM32WB55RGVX_FLASH.ld} || true || NonSecure || || || " valueType="string"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.237576402" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/>
<builder buildPath="${workspace_loc:/Mac_802_15_4_FFD}/Debug" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.608800004" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.151623437" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler">
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.2073829536" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.value.g3" valueType="enumerated"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.2073829536" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.value.g3" valueType="enumerated"/>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input.1549041427" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input"/>
</tool>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.579588600" name="MCU GCC Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler">
@@ -67,7 +67,7 @@
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.777722730" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level" useByScannerDiscovery="false"/>
</tool>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.1466636609" name="MCU GCC Linker" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker">
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script.713008218" name="Linker Script (-T)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" value="${workspace_loc:/${ProjName}/STM32WB55RGVX_FLASH.ld}" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script.713008218" name="Linker Script (-T)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" useByScannerDiscovery="false" value="${workspace_loc:/${ProjName}/STM32WB55RGVX_FLASH.ld}" valueType="string"/>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input.1085078217" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input">
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
@@ -106,19 +106,19 @@
<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="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.1111331837" name="Release" parent="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release">
<folderInfo id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.1111331837." name="/" resourcePath="">
<toolChain id="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.release.1792777644" name="MCU ARM GCC" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.release">
- <option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.type.1387741971" name="Internal Toolchain Type" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.type" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.version.461071355" name="Internal Toolchain Version" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.version" value="7-2018-q2-update" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.1530250499" name="Mcu" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu" value="STM32WB55RGVx" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.2027013950" name="CpuId" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid" value="0" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.10298176" name="CpuCoreId" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid" value="0" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.826608028" name="Floating-point unit" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.value.fpv4-sp-d16" valueType="enumerated"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.1538497567" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.hard" valueType="enumerated"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.387070260" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" value="genericBoard" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.1254014482" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.3 || Release || false || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32 || STM32WB55RGVx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../../Core/Inc | ../../../../../../../Utilities/lpm/tiny_lpm | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci | ../../../../../../../Utilities/sequencer | ../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl | ../../../../../../../Middlewares/ST/STM32_WPAN/mac_802_15_4/core/inc | ../../STM32_WPAN/App | ../../../../../../../Middlewares/ST/STM32_WPAN | ../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo | ../../STM32_WPAN/Target | ../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc | ../../../../../../../Middlewares/ST/STM32_WPAN/utilities | ../../../../../../../Drivers/CMSIS/Include || || || USE_HAL_DRIVER | USE_STM32WBXX_NUCLEO | MAC_802_15_4_WB | CORE_CM4 | STM32WB55xx || || || || || ${workspace_loc:/${ProjName}/STM32WB55RGVX_FLASH.ld} || true || NonSecure || Size || || " valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.type.1387741971" name="Internal Toolchain Type" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.type" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.version.461071355" name="Internal Toolchain Version" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.version" useByScannerDiscovery="false" value="7-2018-q2-update" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.1530250499" name="Mcu" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu" useByScannerDiscovery="false" value="STM32WB55RGVx" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.2027013950" name="CpuId" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid" useByScannerDiscovery="false" value="0" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.10298176" name="CpuCoreId" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid" useByScannerDiscovery="false" value="0" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.826608028" name="Floating-point unit" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.value.fpv4-sp-d16" valueType="enumerated"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.1538497567" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.hard" valueType="enumerated"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.387070260" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="genericBoard" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.1254014482" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.3 || Release || false || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32 || STM32WB55RGVx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../../Core/Inc | ../../../../../../../Utilities/lpm/tiny_lpm | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci | ../../../../../../../Utilities/sequencer | ../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl | ../../../../../../../Middlewares/ST/STM32_WPAN/mac_802_15_4/core/inc | ../../STM32_WPAN/app | ../../../../../../../Middlewares/ST/STM32_WPAN | ../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo | ../../STM32_WPAN/Target | ../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc | ../../../../../../../Middlewares/ST/STM32_WPAN/utilities | ../../../../../../../Drivers/CMSIS/Include || || || USE_HAL_DRIVER | USE_STM32WBXX_NUCLEO | MAC_802_15_4_WB | CORE_CM4 | STM32WB55xx || || || || || ${workspace_loc:/${ProjName}/STM32WB55RGVX_FLASH.ld} || true || NonSecure || Size || || " valueType="string"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.1069902050" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/>
<builder buildPath="${workspace_loc:/Mac_802_15_4_FFD}/Release" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.1290546880" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.472067587" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler">
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.742643117" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.value.g0" valueType="enumerated"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.742643117" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.value.g0" valueType="enumerated"/>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input.381453950" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input"/>
</tool>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.1877829246" name="MCU GCC Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler">
@@ -155,7 +155,7 @@
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.1241239393" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.value.os" valueType="enumerated"/>
</tool>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.1680835051" name="MCU GCC Linker" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker">
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script.409846319" name="Linker Script (-T)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" value="${workspace_loc:/${ProjName}/STM32WB55RGVX_FLASH.ld}" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script.409846319" name="Linker Script (-T)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" useByScannerDiscovery="false" value="${workspace_loc:/${ProjName}/STM32WB55RGVX_FLASH.ld}" valueType="string"/>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input.504859928" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input">
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
@@ -192,6 +192,6 @@
<autodiscovery enabled="false" problemReportingEnabled="true" selectedProfileId=""/>
</scannerConfigBuildInfo>
</storageModule>
- <storageModule moduleId="refreshScope"/>
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
+ <storageModule moduleId="refreshScope"/>
</cproject>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_FFD/STM32CubeIDE/.project b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_FFD/STM32CubeIDE/.project
index cdad5e613..98c86085b 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_FFD/STM32CubeIDE/.project
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_FFD/STM32CubeIDE/.project
@@ -147,52 +147,52 @@
<locationURI>$%7BPARENT-6-PROJECT_LOC%7D/Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</locationURI>
</link>
<link>
- <name>Application/User/Core/Src/app_entry.c</name>
+ <name>Application/User/Core/src/app_entry.c</name>
<type>1</type>
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/Core/Src/app_entry.c</locationURI>
</link>
<link>
- <name>Application/User/Core/Src/hw_uart.c</name>
+ <name>Application/User/Core/src/hw_uart.c</name>
<type>1</type>
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/Core/Src/hw_uart.c</locationURI>
</link>
<link>
- <name>Application/User/Core/Src/main.c</name>
+ <name>Application/User/Core/src/main.c</name>
<type>1</type>
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/Core/Src/main.c</locationURI>
</link>
<link>
- <name>Application/User/Core/Src/stm32_lpm_if.c</name>
+ <name>Application/User/Core/src/stm32_lpm_if.c</name>
<type>1</type>
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/Core/Src/stm32_lpm_if.c</locationURI>
</link>
<link>
- <name>Application/User/Core/Src/stm32wbxx_it.c</name>
+ <name>Application/User/Core/src/stm32wbxx_it.c</name>
<type>1</type>
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/Core/Src/stm32wbxx_it.c</locationURI>
</link>
<link>
- <name>Application/User/Core/Src/stm_logging.c</name>
+ <name>Application/User/Core/src/stm_logging.c</name>
<type>1</type>
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/Core/Src/stm_logging.c</locationURI>
</link>
<link>
- <name>Application/User/Core/Src/system_stm32wbxx.c</name>
+ <name>Application/User/Core/src/system_stm32wbxx.c</name>
<type>1</type>
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/Core/Src/system_stm32wbxx.c</locationURI>
</link>
<link>
- <name>Application/User/STM32_WPAN/App/app_ffd_mac_802_15_4.c</name>
+ <name>Application/User/STM32_WPAN/app/app_ffd_mac_802_15_4.c</name>
<type>1</type>
- <locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/App/app_ffd_mac_802_15_4.c</locationURI>
+ <locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/app/app_ffd_mac_802_15_4.c</locationURI>
</link>
<link>
- <name>Application/User/STM32_WPAN/App/app_ffd_mac_802_15_4_process.c</name>
+ <name>Application/User/STM32_WPAN/app/app_ffd_mac_802_15_4_process.c</name>
<type>1</type>
- <locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/App/app_ffd_mac_802_15_4_process.c</locationURI>
+ <locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/app/app_ffd_mac_802_15_4_process.c</locationURI>
</link>
<link>
- <name>Application/User/STM32_WPAN/Target/hw_ipcc.c</name>
+ <name>Application/User/STM32_WPAN/target/hw_ipcc.c</name>
<type>1</type>
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/Target/hw_ipcc.c</locationURI>
</link>
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 a58b95cad..e7049681d 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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/src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/Core/src/app_entry.c
index 6dab820bc..c14385640 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/Core/src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_LPM_Periodic_Transmit/Core/src/app_entry.c
@@ -158,7 +158,7 @@ static void APPE_StatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
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 034b7d16e..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
@@ -116,9 +116,9 @@ void HAL_LPTIM_MspInit(LPTIM_HandleTypeDef* hlptim)
/* USER CODE END LPTIM1_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_LPTIM1_CLK_ENABLE();
-
+
__HAL_RCC_GPIOC_CLK_ENABLE();
- /**LPTIM1 GPIO Configuration
+ /**LPTIM1 GPIO Configuration
PC3 ------> LPTIM1_ETR
*/
GPIO_InitStruct.Pin = GPIO_PIN_3;
@@ -176,8 +176,8 @@ void HAL_LPTIM_MspDeInit(LPTIM_HandleTypeDef* hlptim)
/* USER CODE END LPTIM1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_LPTIM1_CLK_DISABLE();
-
- /**LPTIM1 GPIO Configuration
+
+ /**LPTIM1 GPIO Configuration
PC3 ------> LPTIM1_ETR
*/
HAL_GPIO_DeInit(GPIOC, GPIO_PIN_3);
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/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 a58b95cad..e7049681d 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_RFD/Core/Inc/app_common.h
index be54b9054..780a38902 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_RFD/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_RFD/Core/Inc/app_common.h
@@ -61,9 +61,13 @@ extern "C" {
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_RFD/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_RFD/Core/Src/app_entry.c
index 57fb920dc..3a868ccce 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_RFD/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_RFD/Core/Src/app_entry.c
@@ -167,7 +167,7 @@ void APP_ENTRY_Init_RFD(void)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
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/STM32CubeIDE/.cproject b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_RFD/STM32CubeIDE/.cproject
index 3e166611b..83fc05333 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_RFD/STM32CubeIDE/.cproject
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_RFD/STM32CubeIDE/.cproject
@@ -17,19 +17,19 @@
<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="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1257326225" name="Debug" parent="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug">
<folderInfo id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1257326225." name="/" resourcePath="">
<toolChain id="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.debug.1913612848" name="MCU ARM GCC" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.debug">
- <option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.type.123666698" name="Internal Toolchain Type" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.type" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.version.2133554822" name="Internal Toolchain Version" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.version" value="7-2018-q2-update" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.1413033568" name="Mcu" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu" value="STM32WB55RGVx" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.623558832" name="CpuId" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid" value="0" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.1076063389" name="CpuCoreId" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid" value="0" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.43228532" name="Floating-point unit" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.value.fpv4-sp-d16" valueType="enumerated"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.780954045" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.hard" valueType="enumerated"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.101790436" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" value="genericBoard" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.2092712380" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.3 || Debug || true || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32 || STM32WB55RGVx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../../Core/Inc | ../../../../../../../Utilities/lpm/tiny_lpm | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci | ../../../../../../../Utilities/sequencer | ../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl | ../../../../../../../Middlewares/ST/STM32_WPAN/mac_802_15_4/core/inc | ../../STM32_WPAN/App | ../../../../../../../Middlewares/ST/STM32_WPAN | ../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo | ../../STM32_WPAN/Target | ../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc | ../../../../../../../Middlewares/ST/STM32_WPAN/utilities | ../../../../../../../Drivers/CMSIS/Include || || || USE_HAL_DRIVER | USE_STM32WBXX_NUCLEO | MAC_802_15_4_WB | CORE_CM4 | STM32WB55xx || || || || || ${workspace_loc:/${ProjName}/STM32WB55RGVX_FLASH.ld} || true || NonSecure || || || " valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.type.123666698" name="Internal Toolchain Type" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.type" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.version.2133554822" name="Internal Toolchain Version" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.version" useByScannerDiscovery="false" value="7-2018-q2-update" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.1413033568" name="Mcu" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu" useByScannerDiscovery="false" value="STM32WB55RGVx" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.623558832" name="CpuId" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid" useByScannerDiscovery="false" value="0" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.1076063389" name="CpuCoreId" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid" useByScannerDiscovery="false" value="0" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.43228532" name="Floating-point unit" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.value.fpv4-sp-d16" valueType="enumerated"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.780954045" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.hard" valueType="enumerated"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.101790436" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="genericBoard" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.2092712380" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.3 || Debug || true || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32 || STM32WB55RGVx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../../Core/Inc | ../../../../../../../Utilities/lpm/tiny_lpm | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci | ../../../../../../../Utilities/sequencer | ../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl | ../../../../../../../Middlewares/ST/STM32_WPAN/mac_802_15_4/core/inc | ../../STM32_WPAN/app | ../../../../../../../Middlewares/ST/STM32_WPAN | ../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo | ../../STM32_WPAN/Target | ../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc | ../../../../../../../Middlewares/ST/STM32_WPAN/utilities | ../../../../../../../Drivers/CMSIS/Include || || || USE_HAL_DRIVER | USE_STM32WBXX_NUCLEO | MAC_802_15_4_WB | CORE_CM4 | STM32WB55xx || || || || || ${workspace_loc:/${ProjName}/STM32WB55RGVX_FLASH.ld} || true || NonSecure || || || " valueType="string"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.1629723478" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/>
<builder buildPath="${workspace_loc:/Mac_802_15_4_RFD}/Debug" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.262439728" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.55205635" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler">
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.1450959061" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.value.g3" valueType="enumerated"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.1450959061" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.value.g3" valueType="enumerated"/>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input.1596836675" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input"/>
</tool>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.2110136695" name="MCU GCC Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler">
@@ -67,7 +67,7 @@
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.1467539987" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level" useByScannerDiscovery="false"/>
</tool>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.902085907" name="MCU GCC Linker" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker">
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script.829158448" name="Linker Script (-T)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" value="${workspace_loc:/${ProjName}/STM32WB55RGVX_FLASH.ld}" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script.829158448" name="Linker Script (-T)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" useByScannerDiscovery="false" value="${workspace_loc:/${ProjName}/STM32WB55RGVX_FLASH.ld}" valueType="string"/>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input.2123564940" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input">
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
@@ -106,19 +106,19 @@
<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="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.1447113938" name="Release" parent="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release">
<folderInfo id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.1447113938." name="/" resourcePath="">
<toolChain id="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.release.1786999121" name="MCU ARM GCC" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.release">
- <option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.type.834912733" name="Internal Toolchain Type" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.type" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.version.1691357342" name="Internal Toolchain Version" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.version" useByScannerDiscovery="false" value="7-2018-q2-update" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.551338020" name="Mcu" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu" useByScannerDiscovery="false" value="STM32WB55RGVx" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.2047539956" name="CpuId" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid" useByScannerDiscovery="false" value="0" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.1377829710" name="CpuCoreId" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid" useByScannerDiscovery="false" value="0" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.1540594653" name="Floating-point unit" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.value.fpv4-sp-d16" valueType="enumerated"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.2055826013" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.hard" valueType="enumerated"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.2111309491" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="genericBoard" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.2136254425" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.3 || Release || false || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32 || STM32WB55RGVx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../../Core/Inc | ../../../../../../../Utilities/lpm/tiny_lpm | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci | ../../../../../../../Utilities/sequencer | ../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl | ../../../../../../../Middlewares/ST/STM32_WPAN/mac_802_15_4/core/inc | ../../STM32_WPAN/App | ../../../../../../../Middlewares/ST/STM32_WPAN | ../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo | ../../STM32_WPAN/Target | ../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc | ../../../../../../../Middlewares/ST/STM32_WPAN/utilities | ../../../../../../../Drivers/CMSIS/Include || || || USE_HAL_DRIVER | USE_STM32WBXX_NUCLEO | MAC_802_15_4_WB | CORE_CM4 | STM32WB55xx || || || || || ${workspace_loc:/${ProjName}/STM32WB55RGVX_FLASH.ld} || true || NonSecure || Size || || " valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.type.834912733" name="Internal Toolchain Type" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.type" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.version.1691357342" name="Internal Toolchain Version" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.version" value="7-2018-q2-update" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.551338020" name="Mcu" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu" value="STM32WB55RGVx" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.2047539956" name="CpuId" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid" value="0" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.1377829710" name="CpuCoreId" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid" value="0" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.1540594653" name="Floating-point unit" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.value.fpv4-sp-d16" valueType="enumerated"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.2055826013" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.hard" valueType="enumerated"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.2111309491" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" value="genericBoard" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.2136254425" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.3 || Release || false || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32 || STM32WB55RGVx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../../Core/Inc | ../../../../../../../Utilities/lpm/tiny_lpm | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci | ../../../../../../../Utilities/sequencer | ../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl | ../../../../../../../Middlewares/ST/STM32_WPAN/mac_802_15_4/core/inc | ../../STM32_WPAN/app | ../../../../../../../Middlewares/ST/STM32_WPAN | ../../../../../../../Drivers/BSP/P-NUCLEO-WB55.Nucleo | ../../STM32_WPAN/Target | ../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc | ../../../../../../../Middlewares/ST/STM32_WPAN/utilities | ../../../../../../../Drivers/CMSIS/Include || || || USE_HAL_DRIVER | USE_STM32WBXX_NUCLEO | MAC_802_15_4_WB | CORE_CM4 | STM32WB55xx || || || || || ${workspace_loc:/${ProjName}/STM32WB55RGVX_FLASH.ld} || true || NonSecure || Size || || " valueType="string"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.1513037317" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/>
<builder buildPath="${workspace_loc:/Mac_802_15_4_RFD}/Release" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.481328156" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.227508187" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler">
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.26437945" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.value.g0" valueType="enumerated"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.26437945" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.value.g0" valueType="enumerated"/>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input.137194049" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input"/>
</tool>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.1935227636" name="MCU GCC Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler">
@@ -155,7 +155,7 @@
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.1314226962" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.value.os" valueType="enumerated"/>
</tool>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.2092221847" name="MCU GCC Linker" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker">
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script.1925586624" name="Linker Script (-T)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" useByScannerDiscovery="false" value="${workspace_loc:/${ProjName}/STM32WB55RGVX_FLASH.ld}" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script.1925586624" name="Linker Script (-T)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" value="${workspace_loc:/${ProjName}/STM32WB55RGVX_FLASH.ld}" valueType="string"/>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input.796932415" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input">
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
@@ -192,6 +192,5 @@
<autodiscovery enabled="false" problemReportingEnabled="true" selectedProfileId=""/>
</scannerConfigBuildInfo>
</storageModule>
- <storageModule moduleId="refreshScope"/>
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
</cproject>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_RFD/STM32CubeIDE/.project b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_RFD/STM32CubeIDE/.project
index b37f4516f..2178c5958 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_RFD/STM32CubeIDE/.project
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Mac_802_15_4/Mac_802_15_4_RFD/STM32CubeIDE/.project
@@ -147,52 +147,52 @@
<locationURI>$%7BPARENT-6-PROJECT_LOC%7D/Middlewares/ST/STM32_WPAN/utilities/stm_queue.c</locationURI>
</link>
<link>
- <name>Application/User/Core/Src/app_entry.c</name>
+ <name>Application/User/Core/src/app_entry.c</name>
<type>1</type>
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/Core/Src/app_entry.c</locationURI>
</link>
<link>
- <name>Application/User/Core/Src/hw_uart.c</name>
+ <name>Application/User/Core/src/hw_uart.c</name>
<type>1</type>
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/Core/Src/hw_uart.c</locationURI>
</link>
<link>
- <name>Application/User/Core/Src/main.c</name>
+ <name>Application/User/Core/src/main.c</name>
<type>1</type>
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/Core/Src/main.c</locationURI>
</link>
<link>
- <name>Application/User/Core/Src/stm32_lpm_if.c</name>
+ <name>Application/User/Core/src/stm32_lpm_if.c</name>
<type>1</type>
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/Core/Src/stm32_lpm_if.c</locationURI>
</link>
<link>
- <name>Application/User/Core/Src/stm32wbxx_it.c</name>
+ <name>Application/User/Core/src/stm32wbxx_it.c</name>
<type>1</type>
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/Core/Src/stm32wbxx_it.c</locationURI>
</link>
<link>
- <name>Application/User/Core/Src/stm_logging.c</name>
+ <name>Application/User/Core/src/stm_logging.c</name>
<type>1</type>
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/Core/Src/stm_logging.c</locationURI>
</link>
<link>
- <name>Application/User/Core/Src/system_stm32wbxx.c</name>
+ <name>Application/User/Core/src/system_stm32wbxx.c</name>
<type>1</type>
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/Core/Src/system_stm32wbxx.c</locationURI>
</link>
<link>
- <name>Application/User/STM32_WPAN/App/app_rfd_mac_802_15_4.c</name>
+ <name>Application/User/STM32_WPAN/app/app_rfd_mac_802_15_4.c</name>
<type>1</type>
- <locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/App/app_rfd_mac_802_15_4.c</locationURI>
+ <locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/app/app_rfd_mac_802_15_4.c</locationURI>
</link>
<link>
- <name>Application/User/STM32_WPAN/App/app_rfd_mac_802_15_4_process.c</name>
+ <name>Application/User/STM32_WPAN/app/app_rfd_mac_802_15_4_process.c</name>
<type>1</type>
- <locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/App/app_rfd_mac_802_15_4_process.c</locationURI>
+ <locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/app/app_rfd_mac_802_15_4_process.c</locationURI>
</link>
<link>
- <name>Application/User/STM32_WPAN/Target/hw_ipcc.c</name>
+ <name>Application/User/STM32_WPAN/target/hw_ipcc.c</name>
<type>1</type>
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/Target/hw_ipcc.c</locationURI>
</link>
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 a58b95cad..e7049681d 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/app_common.h
new file mode 100644
index 000000000..2ea61770a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/app_common.h
@@ -0,0 +1,120 @@
+/* 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"
+#include "main.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
+
+#define CRITICAL_BEGIN( ) M_BEGIN BACKUP_PRIMASK(); DISABLE_IRQ()
+
+#define CRITICAL_END( ) RESTORE_PRIMASK(); 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/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/app_conf.h
new file mode 100644
index 000000000..048581eb1
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/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"
+#ifdef COMMON_RF_DBG_GPIO
+#include "gpio_lld.h"
+#endif
+
+/******************************************************************************
+ * Transport Layer
+ ******************************************************************************/
+/**
+ * Queue length of M0 traces/log messages
+ * This parameter defines the number of asynchronous events that can be stored in the M0 test FW before
+ * being reported to the M4 which will re-build traces/log messages before to send them to UART.
+ * This parameter is combined with the CFG_TL_MOST_EVENT_PAYLOAD_SIZE to calculate the queue size needed by M0 for traces.
+ */
+#define CFG_TL_EVT_QUEUE_LENGTH 20
+/**
+ * TL_EVENT_FRAME_SIZE is the size of the packets transfered between M0 and M4 through IPCC.
+ * Note 1 : thoose packets are first put in a trace queue (see DBG_TRACE_MSG_QUEUE_SIZE) before beeing sent to UART
+ * Note 2 : Queue size must be higher than a M0 trace buffer max size (see LOG_BUFFER_SIZE_MAX in M0 FW)
+ */
+#define CFG_TL_MOST_EVENT_PAYLOAD_SIZE 255
+
+#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 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 */
+
+// In LLD tests, need to support LPM without FULL low-power
+#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
+
+#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 */
+
+#ifdef STM32WB35xx
+#define PUSH_BUTTON_SW1_EXTI_IRQHandler EXTI0_IRQHandler
+#define PUSH_BUTTON_SW2_EXTI_IRQHandler EXTI4_IRQHandler
+#define PUSH_BUTTON_SW3_EXTI_IRQHandler EXTI9_5_IRQHandler
+#else
+#define PUSH_BUTTON_SW1_EXTI_IRQHandler EXTI4_IRQHandler
+#define PUSH_BUTTON_SW2_EXTI_IRQHandler EXTI0_IRQHandler
+#define PUSH_BUTTON_SW3_EXTI_IRQHandler EXTI1_IRQHandler
+#endif
+/* 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_CMD_FROM_M0_TO_M4,
+ CFG_TASK_SEND_CLI_TO_M0,
+ CFG_TASK_SYSTEM_HCI_ASYNCH_EVT,
+ CFG_TASK_PROCESS_UART_RX_BUFFER,
+ CFG_TASK_PROCESS_UART_RX_IT,
+ CFG_TASK_PROCESS_UART_TX_IT,
+ /* USER CODE BEGIN CFG_IdleTask_Id_t */
+ /* USER CODE END CFG_IdleTask_Id_t */
+ CFG_TASK_NBR /**< Shall be last in the list */
+} CFG_IdleTask_Id_t;
+
+/**
+ * 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,
+ /* USER CODE BEGIN CFG_IdleEvt_Id_t */
+
+ /* USER CODE END CFG_IdleEvt_Id_t */
+} CFG_IdleEvt_Id_t;
+
+/* USER CODE BEGIN DEFINE_EVENT */
+
+/* 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_LLDTESTS,
+ /* USER CODE BEGIN CFG_LPM_Id_t */
+
+ /* USER CODE END CFG_LPM_Id_t */
+} CFG_LPM_Id_t;
+
+typedef enum {
+ LPM_NO_STOP = 0xFF,
+ LPM_STOP_0 = LL_PWR_MODE_STOP0,
+ LPM_STOP_1 = LL_PWR_MODE_STOP1,
+ LPM_STOP_2 = LL_PWR_MODE_STOP2,
+ LPM_STAND_BY = LL_PWR_MODE_STANDBY,
+ LPM_SHUT_DOWN = LL_PWR_MODE_SHUTDOWN
+} LPM_lowPower_mode_t;
+
+extern LPM_lowPower_mode_t M4_LPM_mode;
+
+/******************************************************************************
+ * 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/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/app_entry.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/app_entry.h
new file mode 100644
index 000000000..48c467aaa
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/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/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/app_lld_tests.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/app_lld_tests.h
new file mode 100644
index 000000000..548953297
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/app_lld_tests.h
@@ -0,0 +1,98 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_lld_tests.h
+ * Description : Header for RF LLDs tests 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_LLD_TESTS_H
+#define APP_LLD_TESTS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+
+/* 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_LLDTESTS_REC_MULTI_MSG_FROM_M0,
+ ERR_LLDTESTS_SET_STATE_CB,
+ ERR_LLDTESTS_ERASE_PERSISTENT_INFO,
+ ERR_LLDTESTS_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_LLDTESTS_Init( void );
+void APP_LLDTESTS_Error(uint32_t ErrId, uint32_t ErrCode);
+void APP_LLDTESTS_ProcessMsgM0ToM4(void);
+void APP_LLDTESTS_Init_UART_CLI(void);
+void APP_LLDTESTS_DeInit_UART_CLI(void);
+void APP_LLDTESTS_Init_TL(void);
+/**
+ * @brief Active polling for a given delay
+ * @param microsec the delay in us unit
+ **/
+void us_delay_16m(uint32_t microsec);
+void us_delay_32m(uint32_t microsec);
+#ifdef USE_SYS_CLOCK_DIV_2
+#define us_delay us_delay_16m
+#else
+#define us_delay us_delay_32m
+#endif
+/* USER CODE BEGIN EF */
+
+/* USER CODE END EF */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* APP_LLD_TESTS_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/gpio_lld.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/gpio_lld.h
new file mode 100644
index 000000000..5a9f0a790
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/gpio_lld.h
@@ -0,0 +1,114 @@
+/*
+ * gpio_lld.h
+ *
+ */
+
+#ifndef GPIO_LLD_H_
+#define GPIO_LLD_H_
+
+#if defined (USE_SIMU) || defined (USE_FPGA)
+/* Be carefull with GPIO used on SIMU plateform */
+// GPIOA port is used for CRC management on MASTER only
+// GPIOC ad GPIOD ports are used to send messages between the 2 DORYs
+#define GPIO_TX_PIN GPIO_PIN_8
+#define GPIO_TX_PORT GPIOB
+
+#define GPIO_1_PIN GPIO_PIN_9
+#define GPIO_1_PORT GPIOB
+#else /* on Nucleo boards */
+/* Use GPIO PB.8 to monitor TX time during valid on Boards */
+#define GPIO_TX_PIN GPIO_PIN_8
+#define GPIO_TX_PORT GPIOB
+
+#define GPIO_HARD_FAULT_PIN GPIO_PIN_4
+#define GPIO_HARD_FAULT_PORT GPIOA
+
+#define GPIO_MCO_PIN GPIO_PIN_15
+#define GPIO_MCO_PORT GPIOA
+
+#ifdef STM32WB35xx
+#define GPIO_1_PIN GPIO_PIN_3
+#define GPIO_1_PORT GPIOB
+
+#define GPIO_2_PIN GPIO_PIN_4
+#define GPIO_2_PORT GPIOB
+#else
+#define GPIO_1_PIN GPIO_PIN_2
+#define GPIO_1_PORT GPIOC
+
+#define GPIO_2_PIN GPIO_PIN_3
+#define GPIO_2_PORT GPIOC
+#endif
+#endif
+
+// External PA TX/RX pin is fixed by the chip
+#define GPIO_EXT_PA_TX_PIN GPIO_PIN_0
+#define GPIO_EXT_PA_TX_PORT GPIOB
+// External PA enable pin is chosen by user
+#define GPIO_EXT_PA_EN_PIN GPIO_PIN_9
+#define GPIO_EXT_PA_EN_PORT GPIOB
+
+void gpio_lld_phy_init( void );
+void gpio_lld_phy_gpioTx_up(void);
+void gpio_lld_phy_gpioTx_down(void);
+void gpio_lld_phy_gpioHardFault_up(void);
+void gpio_lld_phy_gpioHardFault_down(void);
+void gpio_lld_phy_gpio1_up(void);
+void gpio_lld_phy_gpio1_down(void);
+void gpio_lld_phy_gpio2_up(void);
+void gpio_lld_phy_gpio2_down(void);
+void gpio_lld_phy_deInit(void);
+
+void gpio_lld_mco_init(uint32_t mcoSource, uint32_t mcoDiv);
+void gpio_lld_mco_deInit(void);
+
+void gpio_lld_extPa_init(void);
+void gpio_lld_extPa_deInit(void);
+void gpio_lld_phy_extPaEn_up(void);
+void gpio_lld_phy_extPaEn_down(void);
+
+#ifdef USE_SIMU
+void gpio_lld_SimuMaster_init(void);
+void gpio_lld_SimuSlave_init(void);
+#endif
+
+void gpio_lld_lpuart_init(void);
+void gpio_lld_lpuart_deInit(void);
+
+void gpio_lld_usart_init(void);
+void gpio_lld_usart_deInit(void);
+
+#if !defined (USE_SIMU) && !defined(USE_FPGA)
+void gpio_lld_pa2_init(uint8_t mode, uint8_t speed);
+void gpio_lld_pa2_deInit(void);
+
+void gpio_lld_dtb_init(uint8_t dtbMode);
+void gpio_lld_dtb_deInit(void);
+#endif
+
+void gpio_lld_led1_toggle(void);
+void gpio_lld_led2_toggle(void);
+void gpio_lld_led3_toggle(void);
+
+void gpio_lld_phy_dbg_init(void);
+void gpio_lld_phy_pa0_up(void);
+void gpio_lld_phy_pa0_down(void);
+void gpio_lld_phy_pa1_up(void);
+void gpio_lld_phy_pa1_down(void);
+void gpio_lld_phy_pa5_up(void);
+void gpio_lld_phy_pa5_down(void);
+void gpio_lld_phy_pa7_up(void);
+void gpio_lld_phy_pa7_down(void);
+#ifndef STM32WB35xx
+void gpio_lld_phy_pb12_up(void);
+void gpio_lld_phy_pb12_down(void);
+void gpio_lld_phy_pb13_up(void);
+void gpio_lld_phy_pb13_down(void);
+void gpio_lld_phy_pb14_up(void);
+void gpio_lld_phy_pb14_down(void);
+void gpio_lld_phy_pb15_up(void);
+void gpio_lld_phy_pb15_down(void);
+void gpio_lld_phy_pc5_up(void);
+void gpio_lld_phy_pc5_down(void);
+#endif
+#endif /* GPIO_LLD_H_ */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/hw_conf.h
new file mode 100644
index 000000000..e246ac0b3
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/hw_conf.h
@@ -0,0 +1,90 @@
+/* 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 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
+
+/******************************************************************************
+ * External PA
+ *****************************************************************************/
+
+#define CFG_HW_EXTPA_ENABLED 1
+
+#endif /*HW_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/hw_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/hw_if.h
new file mode 100644
index 000000000..8cfe37eed
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/hw_if.h
@@ -0,0 +1,100 @@
+/* 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"
+#include "stm32wbxx_ll_usart.h"
+#include "stm32wbxx_ll_lpuart.h"
+
+#ifdef USE_STM32WBXX_USB_DONGLE
+#include "stm32wbxx_usb_dongle.h"
+#endif
+#ifdef USE_STM32WBXX_NUCLEO
+#ifdef STM32WB35xx
+#include "nucleo_wb35ce.h"
+#else
+#include "stm32wbxx_nucleo.h"
+#endif
+#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);
+ hw_status_t HW_UART_Receive_IT(hw_uart_id_t hw_uart_id, uint8_t *pData, uint16_t Size, void (*Callback)(void));
+ hw_status_t 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_LL(hw_uart_id_t hw_uart_id, uint8_t data);
+ hw_status_t HW_UART_Transmit_DMA(hw_uart_id_t hw_uart_id, uint8_t *p_data, uint16_t size, void (*Callback)(void));
+#if 0
+ 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);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*HW_IF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/main.h
new file mode 100644
index 000000000..b59d35a43
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/main.h
@@ -0,0 +1,99 @@
+/* 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 variables --------------------------------------------------------*/
+#if (CFG_HW_LPUART1_ENABLED == 1)
+extern UART_HandleTypeDef hlpuart1;
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+extern DMA_HandleTypeDef hdma_lpuart1_tx;
+#endif
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+extern UART_HandleTypeDef huart1;
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+extern DMA_HandleTypeDef hdma_usart1_tx;
+#endif
+#endif
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void Error_Handler(void);
+void SystemClock_Config_HSE(uint32_t usePLL);
+void SystemClock_Config_MSI(uint32_t usePLL, uint32_t stopHSE);
+#if (CFG_HW_LPUART1_ENABLED == 1)
+void MX_LPUART1_UART_Init(void);
+void MX_LPUART1_UART_DeInit(void);
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+void MX_USART1_UART_Init(void);
+void MX_USART1_UART_DeInit(void);
+#endif
+
+
+/* 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/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/stm32_lpm_if.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/stm32_lpm_if.h
new file mode 100644
index 000000000..70abecaa9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/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/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/stm32wbxx_hal_conf.h
new file mode 100644
index 000000000..1484e8f53
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/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_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_EXTI_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_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 (32000000UL) /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (HSE_STARTUP_TIMEOUT)
+ #define HSE_STARTUP_TIMEOUT (100UL) /*!< 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 (4000000UL) /*!< 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 (16000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+ * @brief Internal Low Speed oscillator (LSI1) value.
+ */
+#if !defined (LSI1_VALUE)
+ #define LSI1_VALUE (32000UL) /*!< 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 (32000UL) /*!< 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 (32768UL) /*!< 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 (48000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI48_VALUE */
+
+#if !defined (LSE_STARTUP_TIMEOUT)
+ #define LSE_STARTUP_TIMEOUT (5000UL) /*!< 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 (48000UL) /*!< 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 (3300UL) /*!< Value of VDD in mv */
+#define TICK_INT_PRIORITY ((1UL<<__NVIC_PRIO_BITS) - 1UL) /*!< tick interrupt priority (lowest by default) */
+#define USE_RTOS 0
+#define PREFETCH_ENABLE 1
+#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((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/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/stm32wbxx_it.h
new file mode 100644
index 000000000..9244f937e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/stm32wbxx_it.h
@@ -0,0 +1,87 @@
+/* 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);
+#ifdef STM32WB35xx
+void DMA1_Channel4_IRQHandler(void);
+void DMA2_Channel4_IRQHandler(void);
+#else
+void DMA1_Channel1_IRQHandler(void);
+void DMA1_Channel2_IRQHandler(void);
+#endif
+void USART1_IRQHandler(void);
+void LPUART1_IRQHandler(void);
+/* USER CODE BEGIN EFP */
+#if 0
+void RTC_WKUP_IRQHandler(void);
+#endif
+void IPCC_C1_TX_IRQHandler(void);
+void IPCC_C1_RX_IRQHandler(void);
+#if 0 // Not needed for LLD tests : remove to use less power
+void PUSH_BUTTON_SW1_EXTI_IRQHandler(void);
+void PUSH_BUTTON_SW2_EXTI_IRQHandler(void);
+void PUSH_BUTTON_SW3_EXTI_IRQHandler(void);
+#endif
+/* 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/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/stm_logging.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/stm_logging.h
new file mode 100644
index 000000000..39e9fbd2e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/stm_logging.h
@@ -0,0 +1,63 @@
+/**
+ ******************************************************************************
+ * 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/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/utilities_conf.h
new file mode 100644
index 000000000..4dde3509a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/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/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/app_entry.c
new file mode 100644
index 000000000..a36cacba3
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/app_entry.c
@@ -0,0 +1,441 @@
+/* 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_lld_tests.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 -----------------------------------------------------------*/
+/* 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 -----------------------------------------------*/
+#if(CFG_DEBUG_TRACE != 0)
+size_t DbgTraceWrite(int handle, const unsigned char * buf, size_t bufSize);
+#endif
+
+/* 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);
+
+/* 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 */
+
+/* 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 and start CPU2 which will send back a ready event to CPU1 */
+
+ /**
+ * From now, the application is waiting for the ready event ( sub event : SHCI_SUB_EVT_CODE_READY / payload : WIRELESS_FW_RUNNING)
+ * received on the system channel before starting the LLD test appli using system message SHCI_OPCODE_C2_LLD_TESTS_INIT
+ * 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 EXTI lines */
+ LL_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+ LL_C2_EXTI_EnableIT_32_63(LL_EXTI_LINE_48);
+
+#else
+ /* Disable debugger EXTI lines */
+ LL_EXTI_DisableIT_32_63(LL_EXTI_LINE_48);
+ LL_C2_EXTI_DisableIT_32_63(LL_EXTI_LINE_48);
+
+ /**
+ * Do not keep debugger enabled while in any low power mode
+ */
+ HAL_DBGMCU_DisableDBGSleepMode();
+ HAL_DBGMCU_DisableDBGStopMode();
+ HAL_DBGMCU_DisableDBGStandbyMode();
+
+#endif /* (CFG_DEBUGGER_SUPPORTED == 1) */
+
+#if(CFG_DEBUG_TRACE != 0)
+ DbgTraceInit();
+#endif
+
+ /* Send a first trace to debug trace port to see that M4 is alive */
+ APP_DBG("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
+#ifdef STM32WB35xx
+ APP_DBG("traces init done on Little DORY M4");
+#else
+ APP_DBG("traces init done on DORY M4");
+#endif
+ APP_DBG("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
+
+ 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( );
+
+ 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 == FUS_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:
+ if (p_sys_event->payload[0] == WIRELESS_FW_RUNNING)
+ 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_LLD_TESTS : LLD_FATAL_ERROR \n");
+ break;
+ case ERR_THREAD_UNKNOWN_CMD:
+ APP_DBG("** ERR_LLD_TESTS : UNKNOWN_CMD \n");
+ break;
+ default:
+ APP_DBG("** ERR_LLD_TESTS : ErroCode=%d \n",ErrorCode);
+ break;
+ }
+ return;
+}
+
+static void APPE_SysEvtReadyProcessing( void )
+{
+ /* Traces channel initialization */
+ TL_TRACES_Init( );
+
+ APP_LLDTESTS_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
+ */
+#if (CFG_HW_LPUART1_ENABLED != 1) || ! defined (STM32WB35xx)
+ // On Little DORY, LED_BLUE share the GPIO PB5 with LPUART
+ BSP_LED_Init(LED_BLUE);
+#endif
+
+#if (CFG_HW_EXTPA_ENABLED != 1)
+ BSP_LED_Init(LED_GREEN);
+#endif
+
+ BSP_LED_Init(LED_RED);
+ BSP_LED_On(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;
+}
+
+/* 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)
+ {
+ 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 )
+{
+#ifdef CFG_DEBUG_TRACE_UART
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_Init();
+ return;
+#endif
+#endif
+}
+
+/**
+ * @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 */
+void HAL_GPIO_EXTI_Callback( uint16_t GPIO_Pin )
+{
+ switch (GPIO_Pin)
+ {
+#if (CFG_BUTTON_SUPPORTED == 1U)
+ 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;
+#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/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/app_lld_tests.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/app_lld_tests.c
new file mode 100644
index 000000000..bae0c5809
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/app_lld_tests.c
@@ -0,0 +1,1060 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * File Name : app_lld_tests.c
+ * Description : RF LLDs tests 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_lld_tests.h"
+#include "tl.h"
+#include "shci.h"
+#include "stm_logging.h"
+#include "stm32_lpm.h"
+#include "stm32_lpm_if.h"
+#include "stm32_seq.h"
+#include "gpio_lld.h"
+
+/* Private includes -----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private defines -----------------------------------------------------------*/
+#define CLI_CMD_BUFFER_SIZE 1024U
+#define CLI_CMD_HISTORY_LENGTH 10U
+#define UART_TX_BUFFER_SIZE 4096U
+// Delay to let M4 flushing traces or CLI printf : a delay is already set on M0 side and seems enougth
+#define DELAY_BEFORE_WFI_ON_M4 10U
+
+/* USER CODE BEGIN PD */
+/* USER CODE END PD */
+
+/* Private macros ------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private function prototypes -----------------------------------------------*/
+static void APP_LLDTESTS_CheckWirelessFirmwareInfo(void);
+static void APP_LLDTESTS_TraceError(const char * pMess, uint32_t ErrCode);
+
+static void SendCliCmdToM0(void);
+static void SendCliRspAckToM0(void);
+static void SendM0CmdAckToM0(void);
+
+static void uartRxCpltCallback(void);
+static void uartRxItProcess(void);
+static void uartRxBufferProcess(void);
+static void uartClearChars(int nbChar);
+static void uartTxBufferAdd(const char * str);
+static void uartTxLlAdd(const char * str);
+static void uartTxItProcess(void);
+static void uartTxCpltCallback(void);
+
+static void m0CmdProcess(void);
+static void m0CmdStopRequired(uint32_t stopRequired);
+
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Private variables -----------------------------------------------*/
+typedef enum
+{
+ CMD_FROM_M0_STOP0_ON = 0,
+ CMD_FROM_M0_STOP1_ON = 1,
+ CMD_FROM_M0_STOP2_ON = 2,
+ CMD_FROM_M0_STOP_OFF = 3,
+ CMD_FROM_M0_GO_IN_WFI = 4,
+ CMD_FROM_M0_GO_DIRECTLY_IN_WFI = 5,
+ CMD_FROM_M0_USE_MSI = 6,
+ CMD_FROM_M0_USE_MSI_HSE = 7,
+ CMD_FROM_M0_USE_MSI_PLL = 8,
+ CMD_FROM_M0_USE_MSI_PLL_HSE = 9,
+ CMD_FROM_M0_USE_HSE = 10,
+ CMD_FROM_M0_USE_HSE_PLL = 11,
+ CMD_FROM_M0_EXT_PA_EN = 12,
+ CMD_FROM_M0_EXT_PA_DIS = 13,
+ CMD_FROM_M0_GENE_HARD_FAULT = 14,
+} cmdFromM0_t;
+static cmdFromM0_t m0Cmd = CMD_FROM_M0_STOP_OFF;
+
+enum
+{
+ CHAR_CTRLC = 3,
+ CHAR_ESC = 27,
+ CHAR_DEL = 127
+};
+
+static uint8_t txBusy;
+static uint8_t rxCmdAllowed = 0;
+static uint8_t txBuffer[UART_TX_BUFFER_SIZE+1];
+static uint32_t txBuffer_wrPtr;
+static uint32_t txBuffer_rdPtr;
+static uint8_t *pTxBuff_currentWr;
+static uint32_t txBufferFullCount;
+static uint8_t rxBuffer[CLI_CMD_BUFFER_SIZE];
+static uint32_t rxBuffer_wrPtr;
+static uint32_t rxBuffer_rdPtr;
+static uint8_t currentCommand[CLI_CMD_BUFFER_SIZE];
+static uint32_t currentCommandPos;
+static uint8_t commandHistory[CLI_CMD_HISTORY_LENGTH][CLI_CMD_BUFFER_SIZE];
+static int commandHistoryIdx;
+static int commandHistoryIdxSav;
+static char cliPrompt[30] = "Unknown M0 appli > ";
+
+PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static TL_LLD_tests_Config_t LldTestsConfigBuffer;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t LldTestsM0CmdPacket;
+PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t LldTestsCliCmdRspPacket;
+
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Functions Definition ------------------------------------------------------*/
+
+void APP_LLDTESTS_Init( void )
+{
+ uint32_t devId = HAL_GetDEVID();
+ uint32_t revId = HAL_GetREVID();
+ uint8_t param[8];
+ char traceBuff[50];
+
+ /* USER CODE BEGIN APP_LLDTESTS_INIT_1 */
+ /* Do not allow stop mode before Thread is initialized */
+ UTIL_LPM_SetStopMode(1 << CFG_LPM_APP_LLDTESTS, UTIL_LPM_DISABLE);
+ /* USER CODE END APP_LLDTESTS_INIT_1 */
+
+ SHCI_CmdStatus_t LldTestsInitStatus;
+
+ /* Check the compatibility with the Coprocessor Wireless Firmware loaded */
+ APP_LLDTESTS_CheckWirelessFirmwareInfo();
+
+ /**
+ * Do not allow standby in the application
+ */
+ UTIL_LPM_SetOffMode(1U << CFG_LPM_APP_LLDTESTS, UTIL_LPM_DISABLE);
+
+
+ /* Init config buffer and call TL_LLDTESTS_Init */
+ APP_LLDTESTS_Init_TL();
+
+ /* Create a task to send CLI commands to M0 via IPCC */
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_SEND_CLI_TO_M0, UTIL_SEQ_RFU, SendCliCmdToM0);
+
+ /* Create a task to process data received from UART and create CLI commands */
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_PROCESS_UART_RX_BUFFER, UTIL_SEQ_RFU, uartRxBufferProcess);
+
+ /* Create tasks to process interrupt from/to UART to avoid locking UART during IT processing */
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_PROCESS_UART_RX_IT, UTIL_SEQ_RFU, uartRxItProcess);
+ UTIL_SEQ_RegTask( 1<<CFG_TASK_PROCESS_UART_TX_IT, UTIL_SEQ_RFU, uartTxItProcess);
+
+ /* Create a task to manage commands from M0 */
+ UTIL_SEQ_RegTask( 1<< CFG_TASK_CMD_FROM_M0_TO_M4, UTIL_SEQ_RFU, m0CmdProcess);
+
+ /* Configure UART for receiving CLI command from PC and sending CLI response or notifications to PC */
+ txBusy = 0;
+ rxCmdAllowed = 0;
+ txBuffer[UART_TX_BUFFER_SIZE] = 0;
+ txBuffer_wrPtr = 0;
+ txBuffer_rdPtr = 0;
+ rxBuffer_wrPtr = 0;
+ rxBuffer_rdPtr = 0;
+ currentCommandPos = 0;
+ commandHistoryIdx = 0;
+ commandHistoryIdxSav = 0;
+ APP_LLDTESTS_Init_UART_CLI();
+
+ /* Send LLD tests CLI start information to CLI UART */
+ uartTxBufferAdd("\r\n\n=================================\r\n");
+#ifdef STM32WB35xx
+ sprintf(traceBuff, "(STM32WB35)");
+#elif STM32WB55xx
+ sprintf(traceBuff, "(STM32WB55)");
+#else
+#error Unnknown target
+#endif
+ sprintf(traceBuff, "%s RF 802_15_4 LLDs test\r\n", traceBuff);
+ uartTxBufferAdd(traceBuff);
+ uartTxBufferAdd("=================================\r\n");
+
+#if (CFG_LPM_SUPPORTED == 1U)
+ uartTxBufferAdd("Low-power manager is activated\r\n");
+#endif
+#if (CFG_DEBUGGER_SUPPORTED == 0U)
+ uartTxBufferAdd("Debugger de-activated\r\n");
+#endif
+#if (( CFG_DEBUG_TRACE_FULL == 0 ) && ( CFG_DEBUG_TRACE_LIGHT == 0 ))
+ uartTxBufferAdd("Trace is de-activated\r\n");
+#endif
+
+ /* Debug initialization */
+#ifdef COMMON_RF_DBG_GPIO
+ gpio_lld_phy_dbg_init();
+#endif
+
+#if 0
+ APP_DBG("EXTI status");
+ sprintf(traceBuff, " IMR1 0x%08X IMR2 0x%08X", EXTI->IMR1, EXTI->IMR2);
+ APP_DBG(traceBuff);
+ sprintf(traceBuff, " EMR1 0x%08X EMR2 0x%08X", EXTI->EMR1, EXTI->EMR2);
+ APP_DBG(traceBuff);
+ sprintf(traceBuff, "C2IMR1 0x%08X C2IMR2 0x%08X", EXTI->C2IMR1, EXTI->C2IMR2);
+ APP_DBG(traceBuff);
+ sprintf(traceBuff, "C2EMR1 0x%08X C2EMR2 0x%08X", EXTI->C2EMR1, EXTI->C2EMR2);
+ APP_DBG(traceBuff);
+#endif
+
+#if 0
+ // Read the RCC_CR register
+ APP_DBG( "RCC_CR (0x%08X) = 0x%08X", (uint32_t)&(RCC->CR), RCC->CR);
+ // RCC CFGR register
+ APP_DBG( "RCC_CFGR (0x%08X) = 0x%08X", (uint32_t)&(RCC->CFGR), RCC->CFGR);
+ // PLL_CFG register
+ APP_DBG( "RCC_PLLCFGR (0x%08X) = 0x%08X", (uint32_t)&(RCC->PLLCFGR), RCC->PLLCFGR);
+#endif
+
+ /* Indicate end of M4 initialization */
+ APP_DBG("Test appli initialized on M4, wait for M0 initialization");
+
+ /* Send CLI start cmd to M0 (with device and revision ID as parameters */
+ memcpy(&param[0], &devId, 4 );
+ memcpy(&param[4], &revId, 4 );
+ LldTestsInitStatus = SHCI_C2_LLDTESTS_Init(8, param);
+ if(LldTestsInitStatus != SHCI_Success)
+ APP_DBG((char *)"!! ERROR during M0 init !!");
+
+ /* M0 init done, send first command to have M0 code info and thus, a first prompt will be printed automatically */
+ /* Do not accept new command from UART until this one is managed */
+ rxCmdAllowed = 0;
+ currentCommandPos = 4;
+ currentCommand[0] = 'i';
+ currentCommand[1] = 'n';
+ currentCommand[2] = 'f';
+ currentCommand[3] = 'o';
+ currentCommand[4] = 0;
+ /* Set corresponding task to send this command to M0 */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_SEND_CLI_TO_M0, CFG_SCH_PRIO_0);
+
+ /* Activate UART RX buffer processing task to allow USER command comming from UART */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_PROCESS_UART_RX_BUFFER, CFG_SCH_PRIO_0);
+
+ /* USER CODE BEGIN APP_LLDTESTS_INIT_2 */
+ /* Allow stop mode after Thread initialization*/
+ UTIL_LPM_SetStopMode(1 << CFG_LPM_APP_LLDTESTS, UTIL_LPM_ENABLE);
+ /* USER CODE END APP_LLDTESTS_INIT_2 */
+}
+
+/**
+ * @brief Trace the error or the warning reported.
+ * @param ErrId :
+ * @param ErrCode
+ * @retval None
+ */
+void APP_LLDTESTS_Error(uint32_t ErrId, uint32_t ErrCode)
+{
+ /* USER CODE BEGIN APP_LLDTESTS_Error_1 */
+
+ /* USER CODE END APP_LLDTESTS_Error_1 */
+ switch(ErrId)
+ {
+ case ERR_LLDTESTS_SET_STATE_CB :
+ APP_LLDTESTS_TraceError("ERROR : ERR_LLDTESTS_SET_STATE_CB ",ErrCode);
+ break;
+
+ case ERR_LLDTESTS_ERASE_PERSISTENT_INFO :
+ APP_LLDTESTS_TraceError("ERROR : ERR_LLDTESTS_ERASE_PERSISTENT_INFO ",ErrCode);
+ break;
+
+ case ERR_LLDTESTS_CHECK_WIRELESS :
+ APP_LLDTESTS_TraceError("ERROR : ERR_LLDTESTS_CHECK_WIRELESS ",ErrCode);
+ break;
+
+ /* USER CODE BEGIN APP_LLDTESTS_Error_2 */
+
+ /* USER CODE END APP_LLDTESTS_Error_2 */
+
+ default :
+ APP_LLDTESTS_TraceError("ERROR Unknown ", 0);
+ break;
+ }
+}
+
+/*************************************************************
+ *
+ * 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 (OpenThread or other module if any)
+ * @retval None
+ */
+static void APP_LLDTESTS_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_LLDTESTS_CheckWirelessFirmwareInfo(void)
+{
+ WirelessFwInfo_t wireless_info_instance;
+ WirelessFwInfo_t* p_wireless_info = &wireless_info_instance;
+ char m0FwType[50] = "M0 FW Type : Unknown !! ";
+
+ if (SHCI_GetWirelessFwInfo(p_wireless_info) != SHCI_Success)
+ {
+ APP_LLDTESTS_Error((uint32_t)ERR_LLDTESTS_CHECK_WIRELESS, 0);
+ }
+ else
+ {
+ APP_DBG("**********************************************************");
+ APP_DBG("Loaded M0 TEST FW info :");
+ switch(p_wireless_info->StackType)
+ {
+ case INFO_STACK_TYPE_802154_LLD_TESTS :
+ sprintf(m0FwType, " M0 FW Type : 802.15.4 and radio LLDs tests");
+ sprintf(cliPrompt, "802.15.4 TESTS > ");
+ break;
+
+ case INFO_STACK_TYPE_802154_PHY_VALID :
+ sprintf(m0FwType, " M0 FW Type : 802.15.4 and radio PHY validation");
+ sprintf(cliPrompt, "802.15.4 valid cli > ");
+ break;
+
+ case INFO_STACK_TYPE_BLE_PHY_VALID :
+ sprintf(m0FwType, " M0 FW Type : BLE and radio PHY validation");
+ sprintf(cliPrompt, "BLE valid cli > ");
+ break;
+
+ case INFO_STACK_TYPE_BLE_LLD_TESTS :
+ sprintf(m0FwType, " M0 FW Type : BLE and radio LLDs tests");
+ sprintf(cliPrompt, "BLE TESTS > ");
+ break;
+
+ default :
+ /* FW not supported */
+ APP_LLDTESTS_Error((uint32_t)ERR_LLDTESTS_CHECK_WIRELESS, 0);
+ break;
+ }
+ APP_DBG(m0FwType);
+
+ /* Print version */
+ APP_DBG(" M0 FW VERSION = v%d.%d.%d", p_wireless_info->VersionMajor, p_wireless_info->VersionMinor, p_wireless_info->VersionSub);
+
+ APP_DBG("**********************************************************");
+ }
+}
+
+/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
+
+/* USER CODE END FD_LOCAL_FUNCTIONS */
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief Perform initialization of CLI UART interface.
+ * @param None
+ * @retval None
+ */
+void APP_LLDTESTS_Init_UART_CLI(void)
+{
+#if (CFG_HW_USART1_ENABLED == 1)
+ MX_USART1_UART_Init();
+
+ /* Put the UART device in reception mode and wait for interrupt */
+ if (HW_UART_Receive_IT(CFG_CLI_UART, &rxBuffer[rxBuffer_wrPtr], 1, uartRxCpltCallback) != hw_uart_ok)
+ APP_DBG((char *)"!! HAL_UART_Receive_IT error on M4 in APP_LLDTESTS_Init_UART_CLI !!");
+#endif
+}
+
+/**
+ * @brief Perform de-initialization of CLI UART interface.
+ * @param None
+ * @retval None
+ */
+void APP_LLDTESTS_DeInit_UART_CLI(void)
+{
+#if (CFG_HW_USART1_ENABLED == 1)
+ MX_USART1_UART_DeInit();
+#endif
+}
+
+static void uartRxCpltCallback(void)
+{
+ /* This callback is called :
+ - during RX isr (huart->RxISR)
+ - after bytes copy in buffer specified in last call to HW_UART_Receive_IT()
+ - when number of bytes specified in last call to HW_UART_Receive_IT() is acheived */
+
+ /* Prepare buffer to receive next character */
+ if ( rxCmdAllowed ) {
+ /* Increment read pointer index and manage buffer rollover */
+ rxBuffer_wrPtr++;
+ if(rxBuffer_wrPtr >= CLI_CMD_BUFFER_SIZE)
+ rxBuffer_wrPtr = 0;
+ }
+
+ /* Re-put UART device in reception mode (not during IT to avoid locking the device while perhaps in transmit phase) */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_PROCESS_UART_RX_IT, CFG_SCH_PRIO_0);
+}
+
+static void uartRxItProcess(void)
+{
+ /* Put the UART device in reception mode and wait for interrupt */
+ if (HW_UART_Receive_IT(CFG_CLI_UART, &rxBuffer[rxBuffer_wrPtr], 1, uartRxCpltCallback) != hw_uart_ok)
+ APP_DBG((char *)"!! HAL_UART_Receive_IT error on M4 in uartRxItProcess !!");
+}
+
+static void uartClearChars(int nbChar)
+{
+ char clearCmd[2];
+
+ clearCmd[0] = CHAR_DEL;
+ clearCmd[1] = 0;
+ for (int i = 0; i < nbChar; i++) {
+ uartTxLlAdd(clearCmd);
+ }
+}
+
+static void uartRxBufferProcess( void )
+{
+ char last_char[2];
+ static int8_t escape = -1;
+ static uint8_t escape_seq[3] = {0};
+
+ /* Ensure that last_char buffer contains a string with the char and a \0 (usefull to send echo or CHAR_DEL to UART) */
+ last_char[1] = 0;
+
+ /* Interpret the character reception from UART (only if rxCmdAllowed is activated and read pointer reached write one)*/
+ while (rxBuffer_rdPtr != rxBuffer_wrPtr ) {
+ last_char[0] = rxBuffer[rxBuffer_rdPtr];
+ if( escape >= 0 ) {
+ escape_seq[escape++] = last_char[0];
+ if ( escape == 2 ) {
+ if ( strcmp((char*)escape_seq, "[A") == 0 ) { // UP
+ uartClearChars(currentCommandPos);
+ commandHistoryIdx = (commandHistoryIdx > 0) ? (commandHistoryIdx - 1) : (CLI_CMD_HISTORY_LENGTH - 1);
+ strcpy((char*)currentCommand,(char*)commandHistory[commandHistoryIdx]);
+ currentCommandPos = strlen((char*)currentCommand);
+ uartTxLlAdd((char*)currentCommand);
+ }
+ if ( strcmp((char*)escape_seq, "[B") == 0 ) { // DOWN
+ uartClearChars(currentCommandPos);
+ commandHistoryIdx = (commandHistoryIdx < (CLI_CMD_HISTORY_LENGTH - 1)) ? (commandHistoryIdx + 1) : 0;
+ strcpy((char*)currentCommand,(char*)commandHistory[commandHistoryIdx]);
+ currentCommandPos = strlen((char*)currentCommand);
+ uartTxLlAdd((char*)currentCommand);
+ }
+ escape = -1;
+ }
+ }
+ else if ( last_char[0] == CHAR_DEL ) {
+ if ( currentCommandPos > 0 ) {
+ currentCommandPos--;
+ uartTxLlAdd(last_char);
+ }
+ }
+ else if ( last_char[0] == CHAR_ESC ) {
+ escape = 0;
+ }
+ else if ( last_char[0] == CHAR_CTRLC ) {
+ /* Just send a new prompt to wait for a new command */
+ currentCommandPos = 0;
+ uartTxLlAdd("\r\n");
+ uartTxLlAdd(cliPrompt);
+ }
+ else if ( ( last_char[0] == '\r' ) || ( last_char[0] == '\n' )) {
+ if (currentCommandPos == 0) {
+ /* User just typed 'enter' without any command, so, just send a new prompt to wait for a new command */
+ uartTxLlAdd("\r\n");
+ uartTxLlAdd(cliPrompt);
+ } else {
+ /* Do not accept new command from UART until this one is managed */
+ rxCmdAllowed = 0;
+
+ /* Put a end of line in UART TX buffer to have the echo sent */
+ uartTxLlAdd("\r\n");
+ /* add a \0 to indicate end of command to M0 and to have it in command history (needed to use strlen()) */
+ currentCommand[currentCommandPos++] = 0;
+
+ /* Copy the current command in history buffer before to send it to M0 */
+ memcpy(commandHistory[commandHistoryIdxSav],currentCommand,currentCommandPos);
+ commandHistoryIdxSav = (commandHistoryIdxSav+1) % CLI_CMD_HISTORY_LENGTH;
+ commandHistoryIdx = commandHistoryIdxSav;
+
+ /* UART task scheduling to send it to M0 */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_SEND_CLI_TO_M0, CFG_SCH_PRIO_0);
+ }
+ }
+ else {
+ /* Put the char in UART TX buffer to have the echo sent */
+ uartTxLlAdd(last_char);
+ /* Put the char in the current command buffer */
+ currentCommand[currentCommandPos++] = last_char[0];
+ }
+
+ /* Increment read pointer index and manage buffer rollover */
+ rxBuffer_rdPtr++;
+ if(rxBuffer_rdPtr >= CLI_CMD_BUFFER_SIZE)
+ rxBuffer_rdPtr = 0;
+ }
+
+ /* Re-activate UART RX buffer processing task */
+ UTIL_SEQ_SetTask(1U << CFG_TASK_PROCESS_UART_RX_BUFFER, CFG_SCH_PRIO_0);
+}
+
+static void uartTxLlAdd(const char * str)
+{
+ uint16_t bytesToWrite = strlen(str);
+
+ if (bytesToWrite) {
+ uint16_t remainingBytesToWrite = bytesToWrite;
+
+ while (remainingBytesToWrite > 0) {
+ HW_UART_Transmit_LL(CFG_CLI_UART, str[bytesToWrite - remainingBytesToWrite]);
+ remainingBytesToWrite--;
+ }
+ }
+}
+
+static void uartTxBufferAdd(const char * str)
+{
+ uint16_t bytesToWrite = strlen(str);
+ uint32_t txBufferFull = 0;
+
+ if (bytesToWrite) {
+ CRITICAL_BEGIN();
+ {
+ uint16_t remainingBytesToWrite = bytesToWrite;
+ uint32_t currentWrPtr = txBuffer_wrPtr;
+ uint8_t * currentWrAddr = &txBuffer[txBuffer_wrPtr];
+
+ while ((remainingBytesToWrite > 0) && (txBufferFull == 0)) {
+ if ((txBuffer_rdPtr == (currentWrPtr + 1)) || ((txBuffer_rdPtr == 0) && (currentWrPtr == (UART_TX_BUFFER_SIZE - 1)))) {
+ /* If there is not enougth place (i.e. write pointer is just behind read pointer in the circular buffer),
+ buffer is full, so do not consider new string */
+ /* !! No trace here as it is under CRITICAL section */
+ txBufferFull = 1;
+ } else {
+ *currentWrAddr = str[bytesToWrite - remainingBytesToWrite];
+ remainingBytesToWrite--;
+
+ /* Increment write pointer index and manage buffer rollover */
+ currentWrPtr++;
+ if(currentWrPtr >= UART_TX_BUFFER_SIZE)
+ currentWrPtr = 0;
+ currentWrAddr = &txBuffer[currentWrPtr];
+ }
+ }
+
+ if (txBufferFull == 0) {
+ txBuffer_wrPtr = currentWrPtr;
+ }
+ }
+ CRITICAL_END();
+
+ if (txBufferFull == 0) {
+ if (txBusy == 0) {
+ txBusy = 1;
+ uartTxCpltCallback();
+ }
+ } else {
+ txBufferFullCount++;
+ APP_DBG((char *)"!! TX buffer full : %u", txBufferFullCount);
+ }
+ }
+}
+
+static void uartTxCpltCallback(void)
+{
+ /* Prepare buffer to receive next character */
+ if ( txBuffer_rdPtr != txBuffer_wrPtr ) {
+ /* Re-put UART device in reception mode (not during IT to avoid locking the device while perhaps in transmit phase) */
+ pTxBuff_currentWr = &txBuffer[txBuffer_rdPtr];
+ UTIL_SEQ_SetTask(1U << CFG_TASK_PROCESS_UART_TX_IT, CFG_SCH_PRIO_0);
+
+ /* Increment write pointer index and manage buffer rollover */
+ txBuffer_rdPtr++;
+ if(txBuffer_rdPtr >= UART_TX_BUFFER_SIZE)
+ txBuffer_rdPtr = 0;
+ } else {
+ txBusy = 0;
+ }
+}
+
+static void uartTxItProcess(void)
+{
+ /* Put the UART device in transmission mode and wait for interrupts :
+ - 1 to write the data in TDR register
+ - 1 when char is sent
+ - 1 to indicate end of transmit if several chars are to be transmitted */
+ if (HW_UART_Transmit_IT(CFG_CLI_UART, pTxBuff_currentWr, 1, uartTxCpltCallback) != hw_uart_ok)
+ APP_DBG((char *)"!! HAL_UART_Transmit_IT error on M4 in uart TX callback !!");
+}
+
+/**
+ * @brief Process sends CLI command to M0.
+ * @param None
+ * @retval None
+ */
+static void SendCliCmdToM0(void)
+{
+#if (CFG_LED_SUPPORTED == 1U)
+ BSP_LED_Off((LED_RED));
+#endif
+ memset(LldTestsCliCmdRspPacket.cmdserial.cmd.payload, 0x0U, 255U);
+ *(uint32_t *)LldTestsCliCmdRspPacket.cmdserial.cmd.payload = (uint32_t)currentCommand;
+ *(uint32_t *)&LldTestsCliCmdRspPacket.cmdserial.cmd.payload[4] = currentCommandPos;
+ LldTestsCliCmdRspPacket.cmdserial.cmd.plen = 8;
+ LldTestsCliCmdRspPacket.cmdserial.cmd.cmdcode = 0x0;
+#if 0
+ if (strcmp((char *)currentCommand, "info") == 0)
+ APP_DBG((char *)"!! info command sent to M0 : txwr %u - txrd %u - full cnt %u - rxwr %u - rxrd %u", txBuffer_wrPtr, txBuffer_rdPtr, txBufferFullCount, rxBuffer_wrPtr, rxBuffer_rdPtr);
+ if (strcmp((char *)currentCommand, "RX_get_LQI") == 0)
+ APP_DBG((char *)"!! RX_get_LQI command sent to M0 : txwr %u - txrd %u - full cnt %u - rxwr %u - rxrd %u", txBuffer_wrPtr, txBuffer_rdPtr, txBufferFullCount, rxBuffer_wrPtr, rxBuffer_rdPtr);
+#endif
+
+ TL_LLDTESTS_SendCliCmd();
+}
+
+/**
+ * @brief Perform initialization of TL for LLD tests.
+ * @param None
+ * @retval None
+ */
+void APP_LLDTESTS_Init_TL(void)
+{
+ LldTestsConfigBuffer.p_LldTestsCliCmdRspBuffer = (uint8_t*)&LldTestsCliCmdRspPacket;
+ LldTestsConfigBuffer.p_LldTestsM0CmdBuffer = (uint8_t*)&LldTestsM0CmdPacket;
+
+ TL_LLDTESTS_Init( &LldTestsConfigBuffer );
+}
+
+static void m0CmdProcess(void)
+{
+ switch (m0Cmd) {
+ case CMD_FROM_M0_STOP0_ON :
+ m0CmdStopRequired(0);
+ break;
+
+ case CMD_FROM_M0_STOP1_ON :
+ m0CmdStopRequired(1);
+ break;
+
+ case CMD_FROM_M0_STOP2_ON :
+ m0CmdStopRequired(2);
+ break;
+
+ case CMD_FROM_M0_STOP_OFF :
+ // Nothing done here as the goal of this command is just to have an IPCC interrupt
+ // that will make the M4 going out of STOP or WFI
+ break;
+
+ case CMD_FROM_M0_GO_IN_WFI :
+ m0CmdStopRequired(3);
+ break;
+
+ case CMD_FROM_M0_GO_DIRECTLY_IN_WFI :
+ m0CmdStopRequired(4);
+ break;
+
+ case CMD_FROM_M0_USE_MSI :
+ SystemClock_Config_MSI(0, 1);
+ break;
+
+ case CMD_FROM_M0_USE_MSI_HSE :
+ SystemClock_Config_MSI(0, 0);
+ break;
+
+ case CMD_FROM_M0_USE_MSI_PLL :
+ SystemClock_Config_MSI(1, 1);
+ break;
+
+ case CMD_FROM_M0_USE_MSI_PLL_HSE :
+ SystemClock_Config_MSI(1, 0);
+ break;
+
+ case CMD_FROM_M0_USE_HSE :
+ SystemClock_Config_HSE(0);
+ break;
+
+ case CMD_FROM_M0_USE_HSE_PLL :
+ SystemClock_Config_HSE(1);
+ break;
+
+#if (CFG_HW_EXTPA_ENABLED == 1)
+ case CMD_FROM_M0_EXT_PA_EN :
+ gpio_lld_extPa_init();
+ // Indicate to M0 which GPIO must be managed
+ SHCI_C2_ExtpaConfig((uint32_t)GPIO_EXT_PA_EN_PORT, GPIO_EXT_PA_EN_PIN, EXT_PA_ENABLED_HIGH, EXT_PA_ENABLED);
+ break;
+
+ case CMD_FROM_M0_EXT_PA_DIS :
+ gpio_lld_extPa_deInit();
+ SHCI_C2_ExtpaConfig((uint32_t)GPIO_EXT_PA_EN_PORT, GPIO_EXT_PA_EN_PIN, EXT_PA_ENABLED_HIGH, EXT_PA_DISABLED);
+ break;
+#endif
+
+ case CMD_FROM_M0_GENE_HARD_FAULT :
+ {
+ // Use this debug command to have a hard fault
+ volatile uint32_t * badAddrPointer = (uint32_t *)0x20050000;
+ // No trace possible here as another task must be scheduled
+ //APP_DBG("Hard fault generated on M4");
+ //us_delay(1000);
+ *badAddrPointer = 0xF;
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+static void m0CmdStopRequired(uint32_t stopRequired)
+{
+ switch (stopRequired) {
+ case 0:
+ // flush IPC and trace before sleeping. Let time to M0 to set RF in sleep and to be in STOP if needed
+ us_delay(DELAY_BEFORE_WFI_ON_M4);
+
+ // Stop UART and its GPIOs to reduce power consumption
+ APP_LLDTESTS_DeInit_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_DeInit();
+#endif
+
+ M4_LPM_mode = LPM_STOP_0;
+ UTIL_LPM_EnterLowPower();
+
+ // Restart UART before to go out of critical area to not have to send trace from M0 before to restart it
+ APP_LLDTESTS_Init_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_Init();
+#endif
+
+ APP_DBG("M4 back from STOP0");
+ break;
+
+ case 1:
+ // flush IPC and trace before sleeping. Let time to M0 to set RF in sleep and to be in STOP if needed
+ us_delay(DELAY_BEFORE_WFI_ON_M4);
+
+ // Stop UART and its GPIOs to reduce power consumption
+ APP_LLDTESTS_DeInit_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_DeInit();
+#endif
+
+ M4_LPM_mode = LPM_STOP_1;
+ UTIL_LPM_EnterLowPower();
+
+ // Restart UART before to go out of critical area to not have to send trace from M0 before to restart it
+ APP_LLDTESTS_Init_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_Init();
+#endif
+
+ APP_DBG("M4 back from STOP1");
+ break;
+
+ case 2:
+ // flush IPC and trace before sleeping. Let time to M0 to set RF in sleep and to be in STOP if needed
+ us_delay(DELAY_BEFORE_WFI_ON_M4);
+
+ // Stop UART and its GPIOs to reduce power consumption
+ APP_LLDTESTS_DeInit_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_DeInit();
+#endif
+
+ M4_LPM_mode = LPM_STOP_2;
+ UTIL_LPM_EnterLowPower();
+
+ // Restart UART before to go out of critical area to not have to send trace from M0 before to restart it
+ APP_LLDTESTS_Init_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_Init();
+#endif
+
+ APP_DBG("M4 back from STOP2");
+ break;
+
+ case 3:
+ // flush IPC and trace before sleeping. Let time to M0 to set RF in sleep and to be in STOP if needed
+ us_delay(DELAY_BEFORE_WFI_ON_M4);
+
+ // Stop UART and its GPIOs to reduce power consumption
+ APP_LLDTESTS_DeInit_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_DeInit();
+#endif
+
+ M4_LPM_mode = LPM_NO_STOP;
+ __WFI();
+
+ // Restart UART before to go out of critical area to not have to send trace from M0 before to restart it
+ APP_LLDTESTS_Init_UART_CLI();
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ MX_LPUART1_UART_Init();
+#endif
+
+ APP_DBG("M4 back from WFI");
+ break;
+
+ case 4:
+ // Put M4 in WFI without delay :
+ // - In some cases, it is recomanded to limit the M4 activity to avoid Flash access which can slow down the M0 which share it with M4
+ // - But, be carrefull as WFI can be blocking as there is no more interrupts
+ // - As example, if not used, SF timer test is failed.
+ __WFI();
+ APP_DBG("M4 back from WFI (without delay)");
+ break;
+
+ default:
+ break;
+ }
+}
+
+/**
+ * @brief Send Ack to M0 CLI Response channel.
+ * @param None
+ * @retval None
+ */
+static void SendCliRspAckToM0(void)
+{
+ /* Notify M0 that CLI notification has been taken into account */
+ TL_LLDTESTS_SendCliRspAck();
+}
+
+/**
+ * @brief This function is called when notification on CLI TL Channel from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_CmdPacket_t
+ * @return None
+ */
+void TL_LLDTESTS_ReceiveCliRsp( TL_CmdPacket_t * Notbuffer )
+{
+ TL_CmdPacket_t* l_CliBuffer = (TL_CmdPacket_t*)Notbuffer;
+ uint8_t l_size = l_CliBuffer->cmdserial.cmd.plen;
+ char * sourceBuf = (char *)*(uint32_t *)l_CliBuffer->cmdserial.cmd.payload;
+ uint32_t length = *(uint32_t *)&l_CliBuffer->cmdserial.cmd.payload[4];
+
+ if ((l_size > 0) && (length > 0))
+ {
+ if (strncmp(sourceBuf, "CLI_Resp end", 12) == 0)
+ {
+ /* This is an answer to indicate that the CLI command has been completed */
+#if (CFG_LED_SUPPORTED == 1U)
+ BSP_LED_On(LED_RED);
+#endif
+ /* Write a promp to UART and allow to receive a new command */
+ uartTxBufferAdd(cliPrompt);
+
+ currentCommandPos = 0;
+ rxCmdAllowed = 1;
+ }
+ else
+ {
+ /* This is a test result or a test trace from M0 to write to CLI UART buffer */
+ uartTxBufferAdd(sourceBuf);
+ }
+ }
+ else
+ {
+ APP_DBG((char *)"!! Empty M0 CLI response received by M4 !!");
+ }
+ SendCliRspAckToM0();
+}
+
+/**
+ * @brief Send Ack to M0 CLI Response channel.
+ * @param None
+ * @retval None
+ */
+static void SendM0CmdAckToM0(void)
+{
+ /* Notify M0 that CLI notification has been taken into account */
+ TL_LLDTESTS_SendM0CmdAck();
+}
+
+/**
+ * @brief This function is called when notification on CLI TL Channel from M0+ is received.
+ *
+ * @param Notbuffer : a pointer to TL_CmdPacket_t
+ * @return None
+ */
+void TL_LLDTESTS_ReceiveM0Cmd( TL_CmdPacket_t * cmdBuffer )
+{
+ uint8_t bufferSize = cmdBuffer->cmdserial.cmd.plen;
+ char * bufferAddr = (char *)cmdBuffer->cmdserial.cmd.payload;
+
+ if (bufferSize > 0)
+ {
+ if (strncmp(bufferAddr, "stop0_on", 8) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_STOP0_ON;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "stop1_on", 8) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_STOP1_ON;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "stop2_on", 8) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_STOP2_ON;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "stop_off", 8) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_STOP_OFF;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "go_in_wfi", 9) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_GO_IN_WFI;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "go_directly_in_wfi", 18) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_GO_DIRECTLY_IN_WFI;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "use_msi_no_pll_hse_off", 22) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_USE_MSI;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "use_msi_no_pll_hse_on", 21) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_USE_MSI_HSE;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "use_msi_pll_hse_off", 19) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_USE_MSI_PLL;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "use_msi_pll_hse_on", 18) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_USE_MSI_PLL_HSE;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "use_hse_no_pll", 14) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_USE_HSE;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "use_hse_pll", 11) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_USE_HSE_PLL;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "ext_pa_enable", 13) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_EXT_PA_EN;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "ext_pa_disable", 14) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_EXT_PA_DIS;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else if (strncmp(bufferAddr, "generate_hard_fault", 19) == 0)
+ {
+ // Save the command
+ m0Cmd = CMD_FROM_M0_GENE_HARD_FAULT;
+ // Set the task to process the command
+ UTIL_SEQ_SetTask(1U << CFG_TASK_CMD_FROM_M0_TO_M4, CFG_SCH_PRIO_0);
+ }
+ else
+ {
+ APP_DBG((char *)"!! Unknown M0 command received by M4 !!");
+ }
+ }
+ else
+ {
+ APP_DBG((char *)"!! Empty M0 command received by M4 !!");
+ }
+ SendM0CmdAckToM0();
+}
+
+/* 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/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/app_lld_tests_iar_asm.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/app_lld_tests_iar_asm.s
new file mode 100644
index 000000000..987eb201e
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/app_lld_tests_iar_asm.s
@@ -0,0 +1,86 @@
+;/**
+; ******************************************************************************
+; * @file app_lld_tests_iar_asm.s
+; * @brief Common functionnalities for RF LLD tests that must be writen
+; * in assembler for IAR compilator
+; ******************************************************************************
+; * @attention
+; *
+; * <h2><center>&copy; COPYRIGHT 2018 STMicroelectronics</center></h2>
+; *
+; ******************************************************************************
+; */
+;
+;/**
+; * @brief Active polling for a given delay
+; * @param microsec the delay in us unit
+; *
+; * Caution:
+; * - This function has been implemented for system clock set to 16MHz. It must
+; * be rewiewed (twice more NOP) for 32Mhz config.
+; * - This function can be interrupted if used in interruptible part of code.
+; * - Be carefull with the use of critical section that can interrupt the reel
+; * time during input microsec value.
+; * - If 0 is given as input
+; */
+ PUBLIC us_delay_16m
+ SECTION .text:CODE:NOROOT(3)
+us_delay_16m
+loop_16m:
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ SUBS R0, R0, #1
+ BHI loop_16m
+ BX LR
+
+ PUBLIC us_delay_32m
+ SECTION .text:CODE:NOROOT(3)
+us_delay_32m
+loop_32m:
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ SUBS R0, R0, #1
+ BHI loop_32m
+ BX LR
+
+ END
+
+;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/gpio_lld.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/gpio_lld.c
new file mode 100644
index 000000000..fe5788ff9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/gpio_lld.c
@@ -0,0 +1,726 @@
+/**
+ ******************************************************************************
+ * @file gpio_lld.c
+ * @author MCD Application Team
+ * @version $VERSION$
+ * @date $DATE$
+ * @brief This file contains the init of all the GPIOs used by LLD tests.
+ * It is to be used on both M0 and M4.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; COPYRIGHT(c) 2015 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 ------------------------------------------------------------------*/
+// Be carrefull with the .h included as this file must be compilable on both M0 and M4 environments
+#include "app_conf.h"
+#include "gpio_lld.h"
+
+/* Initialize GPIOs fused by PHY valid CLI */
+void gpio_lld_phy_init(void) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+ /* Enable clock(s) for GPIOs */
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+#ifdef STM32WB35xx
+#else
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+#endif
+#ifdef USE_SIMU
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOD_CLK_ENABLE();
+#endif
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+#ifdef STM32WB35xx
+#else
+ __HAL_RCC_C2GPIOC_CLK_ENABLE();
+#endif
+#ifdef USE_SIMU
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+ __HAL_RCC_C2GPIOC_CLK_ENABLE();
+ __HAL_RCC_C2GPIOD_CLK_ENABLE();
+#endif
+#endif
+
+#if defined (USE_SIMU)
+ // Initialize GPIO used to detect if current DORY is master or slave
+ // 4 GPIOs are needed while only one is enougth but this must be kept as it is
+ // because this is also used by tests which are not managed by MDG-RF
+ GPIO_InitStruct.Pin = (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH ;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ // Initialize GPIOs used to have both DORYs communicating over
+ // 13 bits of the port C and D which are cross connected in SIMU test bench
+ GPIO_InitStruct.Pin = (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH ;
+ HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13);
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH ;
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
+#endif
+
+ // configure the GPIO to be set to '1' during frame TX
+ GPIO_InitStruct.Pin = (GPIO_TX_PIN);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIO_TX_PORT, &GPIO_InitStruct);
+ gpio_lld_phy_gpioTx_down();
+
+ // configure the GPIO to be set to '1' during HardFault'
+ GPIO_InitStruct.Pin = (GPIO_HARD_FAULT_PIN);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIO_HARD_FAULT_PORT, &GPIO_InitStruct);
+ gpio_lld_phy_gpioHardFault_down();
+
+ // configure 2 GPIOs that can be used for debug purposes
+ GPIO_InitStruct.Pin = (GPIO_1_PIN);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIO_1_PORT, &GPIO_InitStruct);
+ gpio_lld_phy_gpio1_down();
+#if !defined (USE_SIMU) && !defined (USE_FPGA)
+ GPIO_InitStruct.Pin = (GPIO_2_PIN);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIO_2_PORT, &GPIO_InitStruct);
+ gpio_lld_phy_gpio2_down();
+#endif
+}
+
+/* Set PHY GPIO_TX to '1' */
+void gpio_lld_phy_gpioTx_up(void) {
+ HAL_GPIO_WritePin(GPIO_TX_PORT, GPIO_TX_PIN, GPIO_PIN_SET);
+}
+
+/* Set PHY GPIO_TX to '0' */
+void gpio_lld_phy_gpioTx_down(void) {
+ HAL_GPIO_WritePin(GPIO_TX_PORT, GPIO_TX_PIN, GPIO_PIN_RESET);
+}
+
+/* Set PHY GPIO_HARD_FAULT to '1' */
+void gpio_lld_phy_gpioHardFault_up(void) {
+ HAL_GPIO_WritePin(GPIO_HARD_FAULT_PORT, GPIO_HARD_FAULT_PIN, GPIO_PIN_SET);
+}
+
+/* Set PHY GPIO_HARD_FAULT to '0' */
+void gpio_lld_phy_gpioHardFault_down(void) {
+ HAL_GPIO_WritePin(GPIO_HARD_FAULT_PORT, GPIO_HARD_FAULT_PIN, GPIO_PIN_RESET);
+}
+
+/* Set PHY GPIO_1 to '1' */
+void gpio_lld_phy_gpio1_up(void) {
+ HAL_GPIO_WritePin(GPIO_1_PORT, GPIO_1_PIN, GPIO_PIN_SET);
+}
+
+/* Set PHY GPIO_1 to '0' */
+void gpio_lld_phy_gpio1_down(void) {
+ HAL_GPIO_WritePin(GPIO_1_PORT, GPIO_1_PIN, GPIO_PIN_RESET);
+}
+
+/* Set PHY GPIO_2 to '1' */
+void gpio_lld_phy_gpio2_up(void) {
+ HAL_GPIO_WritePin(GPIO_2_PORT, GPIO_2_PIN, GPIO_PIN_SET);
+}
+
+/* Set PHY GPIO_2 to '0' */
+void gpio_lld_phy_gpio2_down(void) {
+ HAL_GPIO_WritePin(GPIO_2_PORT, GPIO_2_PIN, GPIO_PIN_RESET);
+}
+
+/* De-initialize GPIOs fused by PHY valid CLI */
+void gpio_lld_phy_deInit(void) {
+ HAL_GPIO_DeInit(GPIO_TX_PORT, GPIO_TX_PIN);
+ HAL_GPIO_DeInit(GPIO_HARD_FAULT_PORT, GPIO_HARD_FAULT_PIN);
+ HAL_GPIO_DeInit(GPIO_1_PORT, GPIO_1_PIN);
+ HAL_GPIO_DeInit(GPIO_2_PORT, GPIO_2_PIN);
+}
+
+/* Initialize GPIOs for MCO use */
+void gpio_lld_mco_init(uint32_t mcoSource, uint32_t mcoDiv) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+ //HAL_RCC_MCOConfig(RCC_MCO3, mcoSource, mcoDiv);
+ LL_RCC_ConfigMCO(mcoSource, mcoDiv);
+
+ /* Enable clock(s) for GPIOs */
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+#endif
+
+ // configure the GPIO PA15 in AF6 to be used as MCO
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF6_MCO;
+ GPIO_InitStruct.Pin = GPIO_MCO_PIN;
+ HAL_GPIO_Init(GPIO_MCO_PORT, &GPIO_InitStruct);
+}
+
+/* De-initialize GPIOs for external PA use */
+void gpio_lld_mco_deInit(void) {
+ HAL_GPIO_DeInit(GPIO_MCO_PORT, GPIO_MCO_PIN);
+ //HAL_RCC_MCOConfig(RCC_MCO3, RCC_MCO1SOURCE_NOCLOCK, RCC_MCODIV_1);
+ LL_RCC_ConfigMCO(RCC_MCO1SOURCE_NOCLOCK, RCC_MCODIV_1);
+}
+
+/* Initialize GPIOs for external PA use */
+void gpio_lld_extPa_init(void) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+ /* Enable clock(s) for GPIOs */
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+#endif
+
+ // configure the GPIO PB0 in AF6 to be used as RF_TX_MOD_EXT_PA
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF6_RF_DTB0;
+ GPIO_InitStruct.Pin = GPIO_EXT_PA_TX_PIN;
+ HAL_GPIO_Init(GPIO_EXT_PA_TX_PORT, &GPIO_InitStruct);
+
+ // configure the GPIO which will be managed by M0 stack to enable Ext PA
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Pin = GPIO_EXT_PA_EN_PIN;
+ HAL_GPIO_Init(GPIO_EXT_PA_EN_PORT, &GPIO_InitStruct);
+}
+
+/* De-initialize GPIOs for external PA use */
+void gpio_lld_extPa_deInit(void) {
+ HAL_GPIO_DeInit(GPIO_EXT_PA_TX_PORT, GPIO_EXT_PA_TX_PIN);
+ HAL_GPIO_DeInit(GPIO_EXT_PA_EN_PORT, GPIO_EXT_PA_EN_PIN);
+}
+
+/* Set EXT PA EN to '1' */
+void gpio_lld_phy_extPaEn_up(void) {
+ HAL_GPIO_WritePin(GPIO_EXT_PA_EN_PORT, GPIO_EXT_PA_EN_PIN, GPIO_PIN_SET);
+}
+
+/* Set EXT PA EN to '0' */
+void gpio_lld_phy_extPaEn_down(void) {
+ HAL_GPIO_WritePin(GPIO_EXT_PA_EN_PORT, GPIO_EXT_PA_EN_PIN, GPIO_PIN_RESET);
+}
+
+#ifdef USE_SIMU
+/* Initialize GPIOs for master DORY of the SIMU */
+void gpio_lld_SimuMaster_init(void) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+ /* Enable clock(s) for GPIOs */
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+#endif
+
+ // In DORY master only : initialize GPIO port A pin 0, 1 and, 2 to send CRC result to simulator
+ GPIO_InitStruct.Pin = (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ // In DORY master only : initialize GPIO port B pin 8 and pin 9 to be used for debug purposes
+ GPIO_InitStruct.Pin = (GPIO_TX_PIN);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH ;
+ HAL_GPIO_Init(GPIO_TX_PORT, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = (GPIO_1_PIN);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH ;
+ HAL_GPIO_Init(GPIO_1_PORT, &GPIO_InitStruct);
+}
+
+/* Initialize GPIOs for slave DORY of the SIMU */
+void gpio_lld_SimuSlave_init(void) {
+// No GPIO to initialize in DORY slave
+}
+#endif
+
+/* Initialize GPIOs used by USART */
+void gpio_lld_usart_init(void) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+ /* Enable clock(s) for GPIOs used by USART */
+#if USE_NEW_SET_OF_GPIO_FOR_USART
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+#endif
+#else
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+#endif
+#endif
+
+ /* USART1 GPIO Configuration
+ USART1_TX : PB6
+ USART1_RX : PB7
+ */
+#if USE_NEW_SET_OF_GPIO_FOR_USART
+ GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+#else
+ 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_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+#endif
+}
+
+/* De-initialize GPIOs used by USART */
+void gpio_lld_usart_deInit(void) {
+ /* USART1 GPIO Configuration
+ USART1_TX : PB6
+ USART1_RX : PB7
+ */
+#if USE_NEW_SET_OF_GPIO_FOR_USART
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9);
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_10);
+#else
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6);
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7);
+#endif
+
+ /* Do not disable clocks as they could be used by others GPIOs and it seems to not need power in STOP mode */
+}
+
+/* Initialize GPIOs used by LPUART */
+void gpio_lld_lpuart_init(void) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+#ifdef STM32WB35xx
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+#endif
+#else
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOC_CLK_ENABLE();
+#endif
+#endif
+
+ /* LPUART1 GPIO Configuration
+ LPUART1_TX : PB5 on Little DORY or PC1 on DORY
+ LPUART1_RX : PA3 on Little DORY or PC0 on DORY
+ */
+#ifdef STM32WB35xx
+ GPIO_InitStruct.Pin = 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_5;
+ 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(GPIOB, &GPIO_InitStruct);
+#else
+ GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
+ 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(GPIOC, &GPIO_InitStruct);
+#endif
+}
+
+/* De-initialize GPIOs used by LPUART */
+void gpio_lld_lpuart_deInit(void) {
+ /* LPUART1 GPIO Configuration
+ LPUART1_TX : PB5 on Little DORY PC1 on DORY
+ LPUART1_RX : PA3 on Little DORY PC0 on DORY
+ */
+#ifdef STM32WB35xx
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_3);
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_5);
+#else
+ HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0 | GPIO_PIN_1);
+#endif
+ /* Do not disable clocks as they could be used by others GPIOs and it seems to not need power in STOP mode */
+}
+
+#if !defined (USE_SIMU) && !defined(USE_FPGA)
+/* Initialize GPIO PA2 (for debug use only) */
+void gpio_lld_pa2_init(uint8_t mode, uint8_t speed) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+ /* Enable clock(s) for GPIOs */
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+#endif
+
+ if (mode == 0) {
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Alternate = GPIO_AF8_LPUART1;
+ } else if (mode == 1) {
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Alternate = GPIO_AF6_RF_DTB7;
+ } else if (mode == 2) {
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ } else if (mode == 3) {
+ GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ } else {
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ }
+
+ if (speed <= GPIO_SPEED_FREQ_VERY_HIGH) {
+ GPIO_InitStruct.Speed = speed;
+ } else {
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ }
+
+ GPIO_InitStruct.Pin = GPIO_PIN_2;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+}
+
+/* De-initialize GPIO PA2 (for debug use only) */
+void gpio_lld_pa2_deInit(void) {
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2);
+}
+
+/*
+ * Initialize GPIOs needed by DTB mode chosen (for debug use only).
+ * Only DTB0 and DTB7 configurations are coded until now.
+ * Do not forget to program the RF SPI register addr 0x30 () with the DTB cfg and DTB enable.
+ */
+void gpio_lld_dtb_init(uint8_t dtbMode) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+ uint32_t usePA = 0, pinPA = 0;
+ uint32_t usePB = 0, pinPB = 0;
+ uint32_t usePC = 0, pinPC = 0;
+
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+
+ if (dtbMode == 0) {
+ GPIO_InitStruct.Alternate = GPIO_AF6_RF_DTB0;
+
+ usePA = 1;
+ pinPA = (GPIO_PIN_0 | GPIO_PIN_1| GPIO_PIN_2| GPIO_PIN_3| GPIO_PIN_4 |
+ GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9);
+
+ usePC = 1;
+ pinPC = (GPIO_PIN_14 | GPIO_PIN_15);
+ }
+
+ if (dtbMode == 7) {
+ GPIO_InitStruct.Alternate = GPIO_AF6_RF_DTB7;
+
+ usePA = 1;
+#ifdef STM32WB35xx
+ pinPA = (GPIO_PIN_8 | GPIO_PIN_9| GPIO_PIN_10| GPIO_PIN_11| GPIO_PIN_13| GPIO_PIN_14);
+#else
+ pinPA = (GPIO_PIN_8 | GPIO_PIN_9| GPIO_PIN_10| GPIO_PIN_11);
+#endif
+
+ usePB = 1;
+#ifdef STM32WB35xx
+ //pinPB = (GPIO_PIN_2 | GPIO_PIN_7 | GPIO_PIN_8| GPIO_PIN_10| GPIO_PIN_11);
+ // PB 7 is in conflict with USART
+ pinPB = (GPIO_PIN_2 | GPIO_PIN_8);
+#else
+ //pinPB = (GPIO_PIN_2 | GPIO_PIN_7 | GPIO_PIN_8| GPIO_PIN_10| GPIO_PIN_11);
+ // PB 7 is in conflict with USART
+ pinPB = (GPIO_PIN_2 | GPIO_PIN_8| GPIO_PIN_10| GPIO_PIN_11);
+#endif
+ }
+
+ if (usePA == 1) {
+#ifdef CORE_CM4
+ // Enable GPIO PA clock for M4 use
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+#else
+ // Enable GPIO PA clock for M0 use
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+#endif
+
+ GPIO_InitStruct.Pin = pinPA;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+ }
+
+ if (usePB == 1) {
+#ifdef CORE_CM4
+ // Enable GPIO PB clock for M4 use
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+#else
+ // Enable GPIO PB clock for M0 use
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+#endif
+
+ GPIO_InitStruct.Pin = pinPB;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+ }
+
+ if (usePC == 1) {
+#ifdef CORE_CM4
+ // Enable GPIO PC clock for M4 use
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+#else
+ // Enable GPIO PC clock for M0 use
+ __HAL_RCC_C2GPIOC_CLK_ENABLE();
+#endif
+
+ GPIO_InitStruct.Pin = pinPC;
+ HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+ }
+}
+
+void gpio_lld_dtb_deInit(void) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+#ifdef CORE_CM4
+ // Enable GPIO PB clock for M4 use
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+#else
+ // Enable GPIO PB clock for M0 use
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+#endif
+
+ // configure the GPIO to be set to '1' during frame TX
+ GPIO_InitStruct.Pin = (GPIO_PIN_8);
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH ;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
+}
+#endif /* ! USE_SIMU and ! USE_FPGA */
+
+// Do not initialize LED GPIOs as they are already initialized by BSP if possible (depending on board and possible GPIOs conflicts).
+// So just offer the toggle possibility for debug purposes
+/* Toggle LED1 */
+void gpio_lld_led1_toggle(void) {
+ HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
+}
+
+/* Toggle LED2 */
+void gpio_lld_led2_toggle(void) {
+ HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
+}
+
+/* Toggle LED3 */
+void gpio_lld_led3_toggle(void) {
+ HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
+}
+
+/* Initialize GPIOs fused by PHY valid CLI */
+void gpio_lld_phy_dbg_init(void) {
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+#ifdef CORE_CM4
+ // Enable GPIO clocks for M4 use
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+#else
+ // Enable GPIO clocks for M0 use
+ __HAL_RCC_C2GPIOA_CLK_ENABLE();
+ __HAL_RCC_C2GPIOB_CLK_ENABLE();
+ __HAL_RCC_C2GPIOC_CLK_ENABLE();
+#endif
+
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_5 | GPIO_PIN_7;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+#ifndef STM32WB35xx
+ GPIO_InitStruct.Pin = GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+ GPIO_InitStruct.Pin = GPIO_PIN_5;
+ HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+#endif
+}
+
+/* Set GPIO PA0 to '1' */
+void gpio_lld_phy_pa0_up(void) {
+ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
+}
+
+/* Set GPIO PA0 to '0' */
+void gpio_lld_phy_pa0_down(void) {
+ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
+}
+
+/* Set GPIO PA1 to '1' */
+void gpio_lld_phy_pa1_up(void) {
+ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
+}
+
+/* Set GPIO PA1 to '0' */
+void gpio_lld_phy_pa1_down(void) {
+ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
+}
+
+/* Set GPIO PA5 to '1' */
+void gpio_lld_phy_pa5_up(void) {
+ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
+}
+
+/* Set GPIO PA5 to '0' */
+void gpio_lld_phy_pa5_down(void) {
+ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
+}
+
+/* Set GPIO PA7 to '1' */
+void gpio_lld_phy_pa7_up(void) {
+ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET);
+}
+
+/* Set GPIO PA7 to '0' */
+void gpio_lld_phy_pa7_down(void) {
+ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
+}
+
+#ifndef STM32WB35xx
+/* Set GPIO PB12 to '1' */
+void gpio_lld_phy_pb12_up(void) {
+ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
+}
+
+/* Set GPIO PB12 to '0' */
+void gpio_lld_phy_pb12_down(void) {
+ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
+}
+
+/* Set GPIO PB13 to '1' */
+void gpio_lld_phy_pb13_up(void) {
+ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);
+}
+
+/* Set GPIO PB13 to '0' */
+void gpio_lld_phy_pb13_down(void) {
+ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);
+}
+
+/* Set GPIO PB14 to '1' */
+void gpio_lld_phy_pb14_up(void) {
+ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
+}
+
+/* Set GPIO PB14 to '0' */
+void gpio_lld_phy_pb14_down(void) {
+ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
+}
+
+/* Set GPIO PB15 to '1' */
+void gpio_lld_phy_pb15_up(void) {
+ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET);
+}
+
+/* Set GPIO PB15 to '0' */
+void gpio_lld_phy_pb15_down(void) {
+ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);
+}
+
+/* Set GPIO PC5 to '1' */
+void gpio_lld_phy_pc5_up(void) {
+ HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET);
+}
+
+/* Set GPIO PC5 to '0' */
+void gpio_lld_phy_pc5_down(void) {
+ HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET);
+}
+#endif
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/hw_ipcc.c
new file mode 100644
index 000000000..e7049681d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/hw_ipcc.c
@@ -0,0 +1,675 @@
+/**
+ ******************************************************************************
+ * 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 LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_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 LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_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 )
+{
+ /**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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 */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_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/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/hw_uart.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/hw_uart.c
new file mode 100644
index 000000000..f6c490fd1
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/hw_uart.c
@@ -0,0 +1,387 @@
+/**
+ ******************************************************************************
+ * 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"
+
+/* Macros --------------------------------------------------------------------*/
+#define HW_UART_RX_IT(__HANDLE__, __USART_BASE__) \
+ do{ \
+ HW_##__HANDLE__##RxCb = cb; \
+ (__HANDLE__).Instance = (__USART_BASE__); \
+ hal_status = 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_status = 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)
+ void (*HW_huart1RxCb)(void);
+ void (*HW_huart1TxCb)(void);
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ void (*HW_hlpuart1RxCb)(void);
+ void (*HW_hlpuart1TxCb)(void);
+#endif
+
+/* Functions Definition ------------------------------------------------------*/
+hw_status_t HW_UART_Receive_IT(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_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;
+ }
+
+ 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_IT(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_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;
+ }
+
+ 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(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;
+}
+
+// To be use carrefuly as it must only be used when the UART is not used by another task or interrupt context
+hw_status_t HW_UART_Transmit_LL(hw_uart_id_t hw_uart_id, uint8_t data)
+{
+ hw_status_t hw_status = hw_uart_ok;
+
+ switch (hw_uart_id)
+ {
+#if (CFG_HW_USART1_ENABLED == 1)
+ case hw_uart1:
+ while (!(LL_USART_IsActiveFlag_TXE_TXFNF(USART1))) {};
+ LL_USART_TransmitData8(USART1, data);
+ break;
+#endif
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ case hw_lpuart1:
+ while (!(LL_LPUART_IsActiveFlag_TXE_TXFNF(LPUART1))) {};
+ LL_LPUART_TransmitData8(LPUART1, data);
+ break;
+#endif
+
+ 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;
+}
+
+#if 0
+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;
+}
+#endif
+
+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/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/main.c
new file mode 100644
index 000000000..21cce6969
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/main.c
@@ -0,0 +1,728 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : main.c
+ * @brief : Main program body
+ *
+ @verbatim
+ ==============================================================================
+ ##### IMPORTANT NOTE #####
+ ==============================================================================
+
+ This application requests having a M0 LLD tests 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 "app_common.h"
+#include "main.h"
+#include "app_entry.h"
+#include "app_lld_tests.h"
+#include "stm_logging.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 ---------------------------------------------------------*/
+#if (CFG_HW_LPUART1_ENABLED == 1)
+UART_HandleTypeDef hlpuart1;
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+DMA_HandleTypeDef hdma_lpuart1_tx;
+#endif
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+UART_HandleTypeDef huart1;
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+DMA_HandleTypeDef hdma_usart1_tx;
+#endif
+#endif
+
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+void SystemClock_Config(void);
+static void MX_DMA_Init(void);
+/* USER CODE BEGIN PFP */
+static 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_DMA_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};
+
+ /** 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
+ * Assuming that MSI is enabled by default after boot, lets go to HSE without using PLL
+ */
+ SystemClock_Config_HSE(0);
+ /* Configure Others clocks */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSI48 |
+ RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI2;
+ RCC_OscInitStruct.LSEState = RCC_LSE_ON;
+ RCC_OscInitStruct.HSIState = RCC_HSI_OFF;
+ RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.LSIState = RCC_LSI_OFF;
+ RCC_OscInitStruct.LSI2CalibrationValue = 0;
+ RCC_OscInitStruct.HSI48State = RCC_HSI48_OFF;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+}
+
+/**
+ * @brief System Clock Configuration : API to be called to use HSE (with or without PLL use) as 32Mhz system clock.
+ SystemClock_Config_HSE() must be called once just after boot (to go from default MSI to HSE).
+ Then application user can call both SystemClock_Config_HSE() and SystemClock_Config_MSI() at any time.
+ * @retval None
+ */
+void SystemClock_Config_HSE(uint32_t usePLL)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+
+ /* First, just set MSI ON (with the 32Mhz range) in case it was OFF, without any update on PLL */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
+ RCC_OscInitStruct.MSIState = RCC_MSI_ON;
+ RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_10;
+ RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+ /* Select MSI as system clock in order to be able to update HSE and PLL configuration */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+
+ /* Configure HSE and PLL if needed*/
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
+ if (usePLL == 1)
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+ else
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_OFF;
+ RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV2;
+ RCC_OscInitStruct.PLL.PLLN = 8;
+ RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
+ RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV4;
+ RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV4;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ /* Configure the system clock source and the dividers according to the fact that system clock source is 32Mhz */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4 | RCC_CLOCKTYPE_HCLK2 | RCC_CLOCKTYPE_HCLK |
+ RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
+ if (usePLL == 1)
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+ else
+ 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();
+ }
+
+ // Note that function UTILS_SetFlashLatency() could be used to set the correct Flash latency
+ // (with 32Mhz, 2WS are needed if the range is changed to 1V instead of 1.2V)
+
+ /* Disable MSI Oscillator as the MSI is no more needed by the application */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
+ RCC_OscInitStruct.MSIState = RCC_MSI_OFF;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; /* No update on PLL */
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+ /* USER CODE BEGIN Smps */
+
+ /* USER CODE END Smps */
+}
+
+/**
+ * @brief System Clock Configuration : API to be called to use MSI (with or without PLL use) as 32Mhz system clock.
+ SystemClock_Config_HSE() must be called once just after boot (to go from default MSI to HSE).
+ Then application user can call both SystemClock_Config_HSE() and SystemClock_Config_MSI() at any time.
+ * @retval None
+ */
+void SystemClock_Config_MSI(uint32_t usePLL, uint32_t stopHSE)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+
+ /* First, just set HSE ON (with the 32Mhz range) in case it was OFF, without any update on PLL */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+ /* Select HSE as system clock in order to be able to update MSI and PLL configuration */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+
+ /* Configure MSI and PLL if needed*/
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
+ RCC_OscInitStruct.MSIState = RCC_MSI_ON;
+ RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_10;
+ RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
+ if (usePLL == 1)
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+ else
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_OFF;
+ RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV2;
+ RCC_OscInitStruct.PLL.PLLN = 8;
+ RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
+ RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV4;
+ RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV4;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+
+ /* Configure the system clock source and the dividers according to the fact that system clock source is 32Mhz */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4 | RCC_CLOCKTYPE_HCLK2 | RCC_CLOCKTYPE_HCLK |
+ RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
+ if (usePLL == 1)
+ {
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+ }
+ else
+ {
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
+ }
+ 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();
+ }
+
+ if (stopHSE == 1) {
+ /* Disable HSE Oscillator as the HSE is no more needed by the application */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_OFF;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; /* No update on PLL */
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ /* Initialization Error */
+ Error_Handler();
+ }
+ }
+}
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+/**
+ * @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.OverSampling = UART_OVERSAMPLING_16;
+ 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 */
+
+}
+
+void MX_LPUART1_UART_DeInit(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.OverSampling = UART_OVERSAMPLING_16;
+ 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_DeInit(&hlpuart1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+}
+#endif
+
+#if (CFG_HW_USART1_ENABLED == 1)
+/**
+ * @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_16;
+ huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ huart1.FifoMode = UART_FIFOMODE_DISABLE;
+ 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 */
+
+}
+
+void MX_USART1_UART_DeInit(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_16;
+ huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
+ huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
+ huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+ huart1.FifoMode = UART_FIFOMODE_DISABLE;
+ if (HAL_UART_DeInit(&huart1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+}
+#endif
+
+
+/**
+ * Enable DMA controller clock
+ */
+static void MX_DMA_Init(void)
+{
+
+ /* DMA controller clock enable */
+ __HAL_RCC_DMAMUX1_CLK_ENABLE();
+ __HAL_RCC_DMA1_CLK_ENABLE();
+#ifdef STM32WB35xx
+ __HAL_RCC_DMA2_CLK_ENABLE();
+#endif
+
+ /* DMA interrupt init */
+#ifdef STM32WB35xx
+ /* DMA1_Channel4_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);
+ /* DMA2_Channel4_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA2_Channel4_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA2_Channel4_IRQn);
+#else
+ /* 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);
+#endif
+}
+
+/* USER CODE BEGIN 4 */
+static void PeriphClock_Config(void)
+{
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+
+#if USE_SMPS_ENABLED_BY_DEFAULT
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS | RCC_PERIPHCLK_RFWAKEUP | RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_LPUART1;
+ PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
+ PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
+ PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
+ PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE;
+ PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE1;
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ /* Initialize SMPS here like in BLE applis */
+ LL_PWR_SMPS_SetStartupCurrent(LL_PWR_SMPS_STARTUP_CURRENT_80MA);
+ LL_PWR_SMPS_SetOutputVoltageLevel(LL_PWR_SMPS_OUTPUT_VOLTAGE_1V40);
+ LL_PWR_SMPS_Enable();
+#else
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RFWAKEUP | RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_LPUART1;
+ PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
+ PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
+ PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+#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 LPUART(25), IPCC(36), HSEM(38) */
+ LL_EXTI_DisableIT_0_31( (~0) & (~(LL_EXTI_LINE_25)) );
+ LL_EXTI_DisableIT_32_63( (~0) & (~(LL_EXTI_LINE_36 | LL_EXTI_LINE_38)) );
+
+ return;
+}
+
+/*************************************************************
+ *
+ * WRAP FUNCTIONS
+ *
+ *************************************************************/
+/**
+ * @brief As the default systick is not used, declare here, at least, an empty function to
+ * over-write the default one as it declared as WEAK in HAL.
+ */
+void HAL_Delay(__IO uint32_t Delay)
+{
+ us_delay(Delay*1000);
+ return;
+}
+
+/**
+ * @brief Declare here empty functions to over-write the default one as it declared as WEAK in HAL.
+ * This is the way to avoid systick use which is initialized by default in HAL_Init() and suspended or resumed in LPM.
+ *
+ * @param None
+ */
+HAL_StatusTypeDef HAL_InitTick( uint32_t TickPriority )
+{
+ return (HAL_OK);
+}
+
+void HAL_SuspendTick(void)
+{
+}
+
+void HAL_ResumeTick(void)
+{
+}
+/* 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/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/stm32_lpm_if.c
new file mode 100644
index 000000000..367e663a1
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/stm32_lpm_if.c
@@ -0,0 +1,334 @@
+/* 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 Enter_Low_Power( void );
+static void Exit_Low_Power( void );
+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 */
+LPM_lowPower_mode_t M4_LPM_mode = LPM_NO_STOP;
+
+
+/* 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 */
+ M4_LPM_mode = LPM_STAND_BY;
+
+ /**
+ * 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 */
+ M4_LPM_mode = LPM_NO_STOP;
+
+ 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();
+
+ Enter_Low_Power();
+
+#ifdef COMMON_RF_DBG_GPIO
+ gpio_lld_phy_pa0_up();
+#endif
+
+ /************************************************************************************
+ * ENTER STOP MODE
+ ***********************************************************************************/
+ if ((M4_LPM_mode != LPM_STOP_0) && (M4_LPM_mode != LPM_STOP_1) && (M4_LPM_mode != LPM_STOP_2)) {
+ M4_LPM_mode = LPM_STOP_2;
+ }
+ LL_PWR_SetPowerMode( (uint32_t) M4_LPM_mode );
+
+ 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();
+
+#ifdef COMMON_RF_DBG_GPIO
+ gpio_lld_phy_pa0_down();
+#endif
+/* USER CODE END PWR_EnterStopMode */
+}
+
+/**
+ * @brief Exits Low Power Stop Mode
+ * @param none
+ * @retval none
+ */
+void PWR_ExitStopMode( void )
+{
+/* USER CODE BEGIN PWR_ExitStopMode */
+#ifdef COMMON_RF_DBG_GPIO
+ gpio_lld_phy_pa0_up();
+#endif
+
+ M4_LPM_mode = LPM_NO_STOP;
+
+ Exit_Low_Power();
+
+ HAL_ResumeTick();
+
+#ifdef COMMON_RF_DBG_GPIO
+ gpio_lld_phy_pa0_down();
+#endif
+/* 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 */
+ M4_LPM_mode = LPM_NO_STOP;
+
+ 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 */
+ M4_LPM_mode = LPM_NO_STOP;
+
+ HAL_ResumeTick();
+
+/* USER CODE END PWR_ExitSleepMode */
+}
+
+/*************************************************************
+ *
+ * LOCAL FUNCTIONS
+ *
+ *************************************************************/
+static void Enter_Low_Power( void )
+{
+ /**
+ * 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 );
+}
+
+static void Exit_Low_Power( void )
+{
+ /**
+ * 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_HSE)
+ {
+ 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 );
+}
+
+/**
+ * @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/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/stm32wbxx_hal_msp.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/stm32wbxx_hal_msp.c
new file mode 100644
index 000000000..b6210573a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/stm32wbxx_hal_msp.c
@@ -0,0 +1,255 @@
+/* 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 "app_common.h"
+#include "main.h"
+#include "gpio_lld.h"
+/* USER CODE BEGIN Includes */
+#include "app_conf.h"
+/* USER CODE END Includes */
+
+/* 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 */
+ /* HSEM_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(HSEM_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(HSEM_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)
+{
+ HAL_DMA_MuxSyncConfigTypeDef pSyncConfig;
+
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ if(huart->Instance==LPUART1)
+ {
+ /* USER CODE BEGIN LPUART1_MspInit 0 */
+
+ /* USER CODE END LPUART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_LPUART1_CLK_ENABLE();
+
+ /**LPUART1 GPIO Configuration
+ */
+ gpio_lld_lpuart_init();
+
+ /* LPUART1 DMA Init */
+ /* LPUART1_TX Init */
+#ifdef STM32WB35xx
+ hdma_lpuart1_tx.Instance = DMA1_Channel4;
+#else
+ hdma_lpuart1_tx.Instance = DMA1_Channel1;
+#endif
+ 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 */
+ }
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+ if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspInit 0 */
+
+ /* USER CODE END USART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_USART1_CLK_ENABLE();
+
+ /**USART1 GPIO Configuration
+ */
+ gpio_lld_usart_init();
+
+ /* USART1 DMA Init */
+ /* USART1_TX Init */
+#ifdef STM32WB35xx
+ hdma_usart1_tx.Instance = DMA2_Channel4;
+#else
+ hdma_usart1_tx.Instance = DMA1_Channel2;
+#endif
+ 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 */
+ }
+#endif
+}
+
+/**
+* @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 (CFG_HW_LPUART1_ENABLED == 1)
+ 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
+ */
+ gpio_lld_lpuart_deInit();
+
+ /* 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 */
+ }
+#endif
+#if (CFG_HW_USART1_ENABLED == 1)
+ 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
+ */
+ gpio_lld_usart_deInit();
+
+ /* 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 */
+ }
+#endif
+
+}
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/stm32wbxx_it.c
new file mode 100644
index 000000000..44f6810d9
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/stm32wbxx_it.c
@@ -0,0 +1,367 @@
+/* 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 "app_common.h"
+#include "main.h"
+#include "stm32wbxx_it.h"
+#include "gpio_lld.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 --------------------------------------------------------*/
+
+/* 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 */
+ gpio_lld_phy_gpioHardFault_up();
+
+ /* 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 */
+#if 0 /* no systick used */
+ HAL_IncTick();
+#endif
+ /* 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). */
+/******************************************************************************/
+
+#ifdef STM32WB35xx
+/**
+ * @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 */
+#if (CFG_HW_LPUART1_ENABLED == 1)
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ HAL_DMA_IRQHandler(&hdma_lpuart1_tx);
+#endif
+#endif
+ /* USER CODE BEGIN DMA1_Channel4_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel4_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 */
+#if (CFG_HW_USART1_ENABLED == 1)
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ HAL_DMA_IRQHandler(&hdma_usart1_tx);
+#endif
+#endif
+ /* USER CODE BEGIN DMA2_Channel4_IRQn 1 */
+
+ /* USER CODE END DMA2_Channel4_IRQn 1 */
+}
+
+#else
+/**
+ * @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 */
+#if (CFG_HW_LPUART1_ENABLED == 1)
+#if (CFG_HW_LPUART1_DMA_TX_SUPPORTED == 1)
+ HAL_DMA_IRQHandler(&hdma_lpuart1_tx);
+#endif
+#endif
+ /* 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 */
+#if (CFG_HW_USART1_ENABLED == 1)
+#if (CFG_HW_USART1_DMA_TX_SUPPORTED == 1)
+ HAL_DMA_IRQHandler(&hdma_usart1_tx);
+#endif
+#endif
+ /* USER CODE BEGIN DMA1_Channel2_IRQn 1 */
+
+ /* USER CODE END DMA1_Channel2_IRQn 1 */
+}
+#endif
+
+/**
+ * @brief This function handles USART1 global interrupt.
+ */
+void USART1_IRQHandler(void)
+{
+ /* USER CODE BEGIN USART1_IRQn 0 */
+
+ /* USER CODE END USART1_IRQn 0 */
+#if (CFG_HW_USART1_ENABLED == 1)
+ HAL_UART_IRQHandler(&huart1);
+#endif
+ /* 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 */
+#if (CFG_HW_LPUART1_ENABLED == 1)
+ HAL_UART_IRQHandler(&hlpuart1);
+#endif
+ /* USER CODE BEGIN LPUART1_IRQn 1 */
+
+ /* USER CODE END LPUART1_IRQn 1 */
+}
+
+/* USER CODE BEGIN 1 */
+#if 0 /* Not needed for LLD tests : removed to use less power */
+/**
+ * @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();
+}
+#endif /* Not needed for LLD tests : removed to use less power */
+
+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/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/stm_logging.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/stm_logging.c
new file mode 100644
index 000000000..8c76e703c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/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/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/system_stm32wbxx.c
new file mode 100644
index 000000000..2e42904ec
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/system_stm32wbxx.c
@@ -0,0 +1,357 @@
+/**
+ ******************************************************************************
+ * @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 */
+
+#if defined(STM32WB55xx) || defined(STM32WB35xx)
+ 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}};
+#endif
+
+/**
+ * @}
+ */
+
+/** @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;
+
+#if defined(STM32WB55xx)
+ /* Reset PLLSAI1CFGR register */
+ RCC->PLLSAI1CFGR = 0x22041000U;
+#endif
+
+ /* 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/Phy_802_15_4/Phy_802_15_4_Cli/EWARM/Phy_802_15_4_Cli.ewd b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/EWARM/Phy_802_15_4_Cli.ewd
new file mode 100644
index 000000000..861e684a1
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/EWARM/Phy_802_15_4_Cli.ewd
@@ -0,0 +1,1419 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Phy_802_15_4_Cli</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>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></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/Phy_802_15_4/Phy_802_15_4_Cli/EWARM/Phy_802_15_4_Cli.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/EWARM/Phy_802_15_4_Cli.ewp
new file mode 100644
index 000000000..6f9f7993f
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/EWARM/Phy_802_15_4_Cli.ewp
@@ -0,0 +1,1194 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <fileVersion>3</fileVersion>
+ <configuration>
+ <name>Phy_802_15_4_Cli</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>Phy_802_15_4_Cli/Exe</state>
+ </option>
+ <option>
+ <name>ObjPath</name>
+ <state>Phy_802_15_4_Cli/Obj</state>
+ </option>
+ <option>
+ <name>ListPath</name>
+ <state>Phy_802_15_4_Cli/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>CORE_CM4</state>
+ <state>USE_HAL_DRIVER</state>
+ <state>STM32WB55xx</state>
+ <state>USE_STM32WBXX_NUCLEO</state>
+ <state>LLD_TESTS_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$/../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include</state>
+ <state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Include</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$/../../../../../../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>
+ </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>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>Phy_802_15_4_Cli.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>Phy_802_15_4_Cli.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\app_lld_tests.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\app_lld_tests_iar_asm.s</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\gpio_lld.c</name>
+ </file>
+ <file>
+ <name>$PROJ_DIR$\..\Core\Src\hw_ipcc.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>
+ </group>
+ <group>
+ <name>Drivers</name>
+ <group>
+ <name>BSP</name>
+ <file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Drivers\BSP\P-NUCLEO-WB55.Nucleo\stm32wbxx_nucleo.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_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\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\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\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/Phy_802_15_4/Phy_802_15_4_Cli/EWARM/Phy_802_15_4_Cli.eww b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/EWARM/Phy_802_15_4_Cli.eww
new file mode 100644
index 000000000..4467458e3
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/EWARM/Phy_802_15_4_Cli.eww
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<workspace>
+ <project>
+ <path>$WS_DIR$\Phy_802_15_4_Cli.ewp</path>
+ </project>
+ <batchBuild />
+</workspace>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/EWARM/startup_stm32wb55xx_cm4.s b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/EWARM/startup_stm32wb55xx_cm4.s
new file mode 100644
index 000000000..1f886ff59
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/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/Phy_802_15_4/Phy_802_15_4_Cli/EWARM/stm32wb55xx_flash_cm4.icf b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/EWARM/stm32wb55xx_flash_cm4.icf
new file mode 100644
index 000000000..5f36da686
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/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/Phy_802_15_4/Phy_802_15_4_Cli/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/readme.txt
new file mode 100644
index 000000000..bf4f8e71d
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Phy_802_15_4/Phy_802_15_4_Cli/readme.txt
@@ -0,0 +1,151 @@
+/**
+ @page Phy_802_15_4_cli application
+
+ @verbatim
+ ******************************************************************************
+ * @file /Phy_802_15_4/Phy_802_15_4_Cli/readme.txt
+ * @author MCD Application Team
+ * @brief Description of the Phy_802_15_4_Cli 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
+
+How to create a "PHY_802.15.4 command line interface" application on STM32WB55xx boards using terminals.
+
+@note A dedicated application allows the control and the test of the 802_15_4 radio via a command line interface.
+ This application request the usage of the following wireless copro binary: stm32wb5x_Phy_802_15_4_fw.bin.
+
+@note For this application it is requested to have:
+
+ 1 STM32WB55xx board loaded with:
+ - wireless coprocessor : stm32wb5x_Phy_802_15_4_fw.bin
+ - application : Phy_802_15_4_Cli
+
+ The commands are sent via an UART from an HyperTerminal (PC) to the STM32WB55RG_Nucleo Board.
+ At startup. after typing return on the HyperTerminal, a prompt '802.15.4 valid cli >' should
+ be displayed on the Hyperterminal.
+ The Hyperterminal must be configured as follow :
+
+ - BaudRate = 115200 baud
+ - Word Length = 8 Bits
+ - Stop Bit = 1 bit
+ - Parity = none
+ - Flow control = none
+
+
+ ___________________________
+ | |
+ | ________________| _____________________________________
+ | |USART1 | | HyperTerminal 1 |
+ | | | |=> Used to ctrl the stack via Cli Cmd|
+ | | | | |
+ | | | | |
+ | | |______________________| |
+ | | |______________________| ST_Link virtual port |
+ | | | ST_Link Cable | |
+ | | | | |
+ | | | | |
+ | | | | |
+ | |________________| |_____________________________________|
+ | |
+ | |
+ |_STM32WB55RG_Nucleo________|
+
+
+
+
+ - Through these commands, it is possible to control and configure the board.
+
+ - On the HyperTerminal, the user can type the command 'Help' in order to display the list of all
+ commands available.
+
+ - As an example, the user can launch the following commands
+
+ 802.15.4 valid cli >Help
+ -> List all commands available
+
+ 802.15.4 valid cli >Set_channel 18
+ -> Set the channel to 18
+
+
+@par Keywords
+
+Zigbee, 802.15.4
+
+@par Directory contents
+
+ - Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/app_common.h Header for all modules with common definition
+ - Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/app_conf.h Parameters configuration file of the application
+ - Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/app_entry.h Parameters configuration file of the application
+ - Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/app_lld_tests.h Header for lld test of the application
+ - Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/gpio_lld.h Parameters for gpio configuration file of the application
+ - Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/hw_conf.h Configuration file of the HW
+ - Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/hw_if.h Configuration file of the HW
+ - Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/main.h Header for main.c module
+ - Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/stm_logging.h Header for stm_logging.c module
+ - Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/stm32_lpm_if.h Header for stm32_lpm_if.c module
+ - Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/stm32wbxx_hal_conf.h HAL configuration file
+ - Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/stm32wbxx_it.h Interrupt handlers header file
+ - Phy_802_15_4/Phy_802_15_4_Cli/Core/Inc/utilities_conf.h Configuration file of the utilities
+ - Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/app_entry.c Initialization of the application
+ - Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/app_lld_tests.c lld test of the application
+ - Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/gpio_lld.c GPIO for for application
+ - Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/hw_ipcc.c IPCC lld test Driver
+ - Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/hw_uart.c UART Driver
+ - Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/main.c Main program
+ - Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/stm_logging.c Logging for application
+ - Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/stm32_lpm_if.c Low Power Manager Interface
+ - Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/stm32wbxx_it.c Interrupt handlers
+ - Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/system_stm32wbxx.c stm32wbxx system source file
+ - Phy_802_15_4/Phy_802_15_4_Cli/Core/Src/stm32wbxx_hal_msp.c HAL MPS for 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_Phy_802_15_4_fw.bin binary
+
+ This application requests having the stm32wb5x_Phy_802_15_4_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.
+
+
+
+ * <h3><center>&copy; COPYRIGHT STMicroelectronics</center></h3>
+*/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Cli_Cmd/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Cli_Cmd/Core/Inc/app_common.h
index 836f40dcf..cf8a5baa6 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Cli_Cmd/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Cli_Cmd/Core/Inc/app_common.h
@@ -66,9 +66,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Cli_Cmd/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Cli_Cmd/Core/Inc/stm32wbxx_hal_conf.h
index 573cacb53..a39ca90c0 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Cli_Cmd/Core/Inc/stm32wbxx_hal_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Cli_Cmd/Core/Inc/stm32wbxx_hal_conf.h
@@ -40,7 +40,7 @@
#define HAL_HSEM_MODULE_ENABLED
/*#define HAL_I2C_MODULE_ENABLED */
/*#define HAL_I2S_MODULE_ENABLED */
-/*#define HAL_IPCC_MODULE_ENABLED */
+#define HAL_IPCC_MODULE_ENABLED
/*#define HAL_IRDA_MODULE_ENABLED */
/*#define HAL_IWDG_MODULE_ENABLED */
/*#define HAL_LCD_MODULE_ENABLED */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Cli_Cmd/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Cli_Cmd/Core/Src/app_entry.c
index 73d01917e..3519f712a 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Cli_Cmd/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Cli_Cmd/Core/Src/app_entry.c
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "main.h"
@@ -237,7 +238,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Cli_Cmd/STM32_WPAN/App/app_thread.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Cli_Cmd/STM32_WPAN/App/app_thread.c
index 6b8b777ea..82d390f89 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Cli_Cmd/STM32_WPAN/App/app_thread.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Cli_Cmd/STM32_WPAN/App/app_thread.c
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "utilities_common.h"
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 6da319929..e7049681d 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,37 +582,37 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
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
index 836f40dcf..cf8a5baa6 100644
--- 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
@@ -66,9 +66,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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
index 573cacb53..a39ca90c0 100644
--- 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
@@ -40,7 +40,7 @@
#define HAL_HSEM_MODULE_ENABLED
/*#define HAL_I2C_MODULE_ENABLED */
/*#define HAL_I2S_MODULE_ENABLED */
-/*#define HAL_IPCC_MODULE_ENABLED */
+#define HAL_IPCC_MODULE_ENABLED
/*#define HAL_IRDA_MODULE_ENABLED */
/*#define HAL_IWDG_MODULE_ENABLED */
/*#define HAL_LCD_MODULE_ENABLED */
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
index b2f7e6d82..1483d99f9 100644
--- 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
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "main.h"
@@ -237,7 +238,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
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
index b5bca3362..b34baab98 100644
--- 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
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "utilities_common.h"
@@ -90,32 +91,30 @@ static void RxCpltCallback(void);
/* 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_CoapDataReqHandler(void * pContext,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo);
static void APP_THREAD_SendDataResponse(otCoapHeader * pRequestHeader,
const otMessageInfo * pMessageInfo);
-static void APP_THREAD_ProvisioningReqHandler(otCoapHeader * pHeader,
+static void APP_THREAD_ProvisioningReqHandler(
+ void * pContext,
+ 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,
+static void APP_THREAD_ProvisioningRespHandler(
+ void * pContext,
+ 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,
+static void APP_THREAD_DataRespHandler(
+ void * pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo,
otError Result);
@@ -148,8 +147,8 @@ PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ThreadNotifRspEvtBuffer[size
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 otCoapResource OT_RessourceDataTransfer = {C_RESSOURCE_DATA_TRANSFER, APP_THREAD_CoapDataReqHandler,"DataTransferCtx", NULL};
+static otCoapResource OT_RessourceProvisionning = {C_RESSOURCE_Provisioning, APP_THREAD_ProvisioningReqHandler,"ProvisioningCtx", NULL};
static otMessageInfo OT_MessageInfo = {0};
static otCoapHeader OT_Header = {0};
static uint8_t OT_Command = 0;
@@ -570,28 +569,17 @@ static void APP_THREAD_SendNextBuffer(void)
}
/**
- * @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 pContext : Context
* @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)
+static void APP_THREAD_CoapDataReqHandler(void * pContext,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo)
{
do
{
@@ -661,14 +649,16 @@ static void APP_THREAD_SendDataResponse(otCoapHeader * pRequestHeader,
/**
* @brief This function is used to handle the APP_THREAD_AskProvisioning handler
*
+ * @param pContext : Context
* @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)
+static void APP_THREAD_ProvisioningReqHandler(void * pContext,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo)
{
(void)pMessage;
@@ -770,8 +760,8 @@ static void APP_THREAD_ProvisioningReqSend()
error = otCoapSendRequest(NULL,
pOT_Message,
&OT_MessageInfo,
- &APP_THREAD_DummyRespHandler,
- (void*)&APP_THREAD_ProvisioningRespHandler);
+ &APP_THREAD_ProvisioningRespHandler,
+ "myContextProvisioning");
} while (false);
if (error != OT_ERROR_NONE && pOT_Message != NULL)
@@ -784,13 +774,16 @@ static void APP_THREAD_ProvisioningReqSend()
* @brief This function is used to manage the APP_THREAD_AskProvisioning response
* handler.
*
+ * @param pContext context
* @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,
+static void APP_THREAD_ProvisioningRespHandler(
+ void * pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo,
otError Result)
@@ -869,8 +862,8 @@ static void APP_THREAD_SendCoapUnicastRequest()
error = otCoapSendRequest(NULL,
pOT_Message,
&OT_MessageInfo,
- &APP_THREAD_DummyRespHandler,
- (void*)&APP_THREAD_DataRespHandler);
+ &APP_THREAD_DataRespHandler,
+ "myContextUnicats");
if (error != OT_ERROR_NONE && pOT_Message != NULL)
{
@@ -882,18 +875,22 @@ static void APP_THREAD_SendCoapUnicastRequest()
* @brief This function manages the data response handler
* and reschedules the sending of data.
*
+ * @param pContext context
* @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,
+static void APP_THREAD_DataRespHandler(
+ void * pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo,
otError Result)
{
/* Prevent unused argument(s) compilation warning */
+ UNUSED(pContext);
UNUSED(pHeader);
UNUSED(pMessage);
UNUSED(pMessageInfo);
@@ -910,29 +907,6 @@ static void APP_THREAD_DataRespHandler(otCoapHeader * pHeader,
}
}
-/**
- * @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 */
/*************************************************************
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
index 6da319929..e7049681d 100644
--- 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,37 +582,37 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic/Core/Inc/app_common.h
index 836f40dcf..cf8a5baa6 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic/Core/Inc/app_common.h
@@ -66,9 +66,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic/Core/Inc/stm32wbxx_hal_conf.h
index 573cacb53..a39ca90c0 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic/Core/Inc/stm32wbxx_hal_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic/Core/Inc/stm32wbxx_hal_conf.h
@@ -40,7 +40,7 @@
#define HAL_HSEM_MODULE_ENABLED
/*#define HAL_I2C_MODULE_ENABLED */
/*#define HAL_I2S_MODULE_ENABLED */
-/*#define HAL_IPCC_MODULE_ENABLED */
+#define HAL_IPCC_MODULE_ENABLED
/*#define HAL_IRDA_MODULE_ENABLED */
/*#define HAL_IWDG_MODULE_ENABLED */
/*#define HAL_LCD_MODULE_ENABLED */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic/Core/Src/app_entry.c
index 23ad32002..4e6c6fe74 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic/Core/Src/app_entry.c
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "main.h"
@@ -237,7 +238,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic/STM32_WPAN/App/app_thread.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic/STM32_WPAN/App/app_thread.c
index fcc88df47..cdbc455ba 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic/STM32_WPAN/App/app_thread.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic/STM32_WPAN/App/app_thread.c
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "utilities_common.h"
@@ -90,24 +91,19 @@ static void RxCpltCallback(void);
/* USER CODE BEGIN PFP */
static void APP_THREAD_CoapSendRequest(otCoapResource* pCoapRessource, otCoapType CoapType, otCoapCode CoapCode, const char *Address, uint8_t* Payload, uint16_t Size);
-static void APP_THREAD_DummyReqHandler(void * p_context,
- otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo);
-static void APP_THREAD_CoapRequestHandler(otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo);
+
+static void APP_THREAD_CoapRequestHandler(void * pContext,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo);
static void APP_THREAD_CoapSendDataResponse(otCoapHeader * pRequestHeader,
const otMessageInfo * pMessageInfo);
-static void APP_THREAD_CoapDataRespHandler(otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo,
- otError Result);
-static void APP_THREAD_CoapDummyRespHandler(void * p_context,
- otCoapHeader * pHeader,
+static void APP_THREAD_CoapDataRespHandler(
+ void * aContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo,
- otError Result);
+ otError result);
static void APP_THREAD_InitPayloadWrite(void);
static void APP_THREAD_SendCoapMsg(void);
@@ -141,7 +137,7 @@ PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ThreadNotifRspEvtBuffer[size
PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t ThreadCliCmdBuffer;
/* USER CODE BEGIN PV */
-static otCoapResource OT_Ressource = {C_RESSOURCE, APP_THREAD_DummyReqHandler, (void*)APP_THREAD_CoapRequestHandler, NULL};
+static otCoapResource OT_Ressource = {C_RESSOURCE, APP_THREAD_CoapRequestHandler,"MyOwnContext", NULL};
static otMessageInfo OT_MessageInfo = {0};
static otCoapHeader OT_Header = {0};
static otMessage* pOT_Message = NULL;
@@ -521,8 +517,8 @@ static void APP_THREAD_CoapSendRequest(otCoapResource* pCoapRessource,
error = otCoapSendRequest(NULL,
pOT_Message,
&OT_MessageInfo,
- &APP_THREAD_CoapDummyRespHandler,
- (void*)&APP_THREAD_CoapDataRespHandler);
+ &APP_THREAD_CoapDataRespHandler,
+ "COAP context");
}
}while(false);
@@ -534,31 +530,21 @@ static void APP_THREAD_CoapSendRequest(otCoapResource* pCoapRessource,
}
/**
- * @brief Dummy request handler
- *
- * @param None
- * @retval None
- */
-static void APP_THREAD_DummyReqHandler(void * p_context,
- otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo)
-{
-}
-
-/**
* @brief Handler called when the server receives a COAP request.
*
+ * @param pContext : Context
* @param pHeader : Header
* @param pMessage : Message
* @param pMessageInfo : Message information
* @retval None
*/
-static void APP_THREAD_CoapRequestHandler(otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo)
+static void APP_THREAD_CoapRequestHandler(void * pContext,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo)
+
{
- APP_DBG(" Received CoAP request");
+ APP_DBG(" Received CoAP request (context = %s)",pContext);
/* USER CODE BEGIN APP_THREAD_CoapRequestHandler */
if (otMessageRead(pMessage, otMessageGetOffset(pMessage), &PayloadRead, sizeof(PayloadRead)) != sizeof(PayloadRead))
{
@@ -615,57 +601,36 @@ static void APP_THREAD_CoapSendDataResponse(otCoapHeader * pRequestHeader,
/**
* @brief This function manages the data response handler.
*
+ * @param pHeader context
* @param pHeader header
* @param pMessage message pointer
* @param pMessageInfo message info pointer
- * @param Result error code
+ * @param result error code
* @retval None
*/
-static void APP_THREAD_CoapDataRespHandler(otCoapHeader * pHeader,
+static void APP_THREAD_CoapDataRespHandler(
+ void * pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo,
- otError Result)
+ otError result)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(pHeader);
UNUSED(pMessage);
UNUSED(pMessageInfo);
- if (Result == OT_ERROR_NONE)
+ if (result == OT_ERROR_NONE)
{
- APP_DBG("APP_THREAD_CoapDataRespHandler : NO ERROR");
+ APP_DBG("APP_THREAD_CoapDataRespHandler : NO ERROR with context = %s",pContext);
}
else
{
- APP_DBG("APP_THREAD_CoapDataRespHandler : WARNING Result");
+ APP_DBG("APP_THREAD_CoapDataRespHandler : WARNING Result = %d wih context = %s",result,pContext);
}
}
/**
- * @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_CoapDummyRespHandler(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 Initialize CoAP write buffer.
* @param None
* @retval None
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 6da319929..e7049681d 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,37 +582,37 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Inc/app_common.h
index 47b2867f1..c3499322e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Inc/app_common.h
@@ -64,9 +64,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Inc/stm32wbxx_hal_conf.h
index ea9aa40d0..7f1537260 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Inc/stm32wbxx_hal_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Inc/stm32wbxx_hal_conf.h
@@ -39,7 +39,7 @@
/*#define HAL_CRC_MODULE_ENABLED */
#define HAL_HSEM_MODULE_ENABLED
/*#define HAL_I2C_MODULE_ENABLED */
-/*#define HAL_IPCC_MODULE_ENABLED */
+#define HAL_IPCC_MODULE_ENABLED
/*#define HAL_IRDA_MODULE_ENABLED */
/*#define HAL_IWDG_MODULE_ENABLED */
/*#define HAL_LCD_MODULE_ENABLED */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Inc/stm32wbxx_it.h
index 07cbd808c..a3a535f13 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Inc/stm32wbxx_it.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Inc/stm32wbxx_it.h
@@ -24,7 +24,7 @@
#ifdef __cplusplus
extern "C" {
-#endif
+#endif
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Src/app_entry.c
index 0952bca6a..56068f514 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Src/app_entry.c
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "main.h"
@@ -243,7 +244,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Src/main.c
index e078a1467..b33e7275d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Src/main.c
@@ -37,6 +37,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "app_entry.h"
@@ -166,11 +167,10 @@ void SystemClock_Config(void)
/** Configure LSE Drive Capability
*/
__HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
- /** Configure the main internal regulator output voltage
+ /** Configure the main internal regulator output voltage
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
- /** Initializes the RCC Oscillators according to the specified parameters
- * in the RCC_OscInitTypeDef structure.
+ /** Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
|RCC_OSCILLATORTYPE_LSE;
@@ -183,7 +183,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
@@ -199,7 +199,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Initializes the peripherals clocks
+ /** Initializes the peripherals clocks
*/
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
|RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
@@ -368,10 +368,10 @@ static void MX_RTC_Init(void)
}
-/**
+/**
* Enable DMA controller clock
*/
-static void MX_DMA_Init(void)
+static void MX_DMA_Init(void)
{
/* DMA controller clock enable */
@@ -607,7 +607,7 @@ void Error_Handler(void)
* @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) */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Src/stm32wbxx_hal_msp.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Src/stm32wbxx_hal_msp.c
index 89b5dd605..9c338486d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Src/stm32wbxx_hal_msp.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Src/stm32wbxx_hal_msp.c
@@ -118,11 +118,11 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
/* USER CODE END LPUART1_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_LPUART1_CLK_ENABLE();
-
+
__HAL_RCC_GPIOA_CLK_ENABLE();
- /**LPUART1 GPIO Configuration
+ /**LPUART1 GPIO Configuration
PA2 ------> LPUART1_TX
- PA3 ------> LPUART1_RX
+ PA3 ------> LPUART1_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
@@ -163,13 +163,13 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
/* 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
+ /**USART1 GPIO Configuration
PA11 ------> USART1_CTS
PB6 ------> USART1_TX
- PB7 ------> USART1_RX
+ PB7 ------> USART1_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
@@ -228,10 +228,10 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
/* USER CODE END LPUART1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_LPUART1_CLK_DISABLE();
-
- /**LPUART1 GPIO Configuration
+
+ /**LPUART1 GPIO Configuration
PA2 ------> LPUART1_TX
- PA3 ------> LPUART1_RX
+ PA3 ------> LPUART1_RX
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
@@ -251,11 +251,11 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
/* USER CODE END USART1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_USART1_CLK_DISABLE();
-
- /**USART1 GPIO Configuration
+
+ /**USART1 GPIO Configuration
PA11 ------> USART1_CTS
PB6 ------> USART1_TX
- PB7 ------> USART1_RX
+ PB7 ------> USART1_RX
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11);
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Src/stm32wbxx_it.c
index 1c9658111..b0026e595 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Src/stm32wbxx_it.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/Core/Src/stm32wbxx_it.c
@@ -66,7 +66,7 @@ extern UART_HandleTypeDef huart1;
/* USER CODE END EV */
/******************************************************************************/
-/* Cortex Processor Interruption and Exception Handlers */
+/* Cortex Processor Interruption and Exception Handlers */
/******************************************************************************/
/**
* @brief This function handles Non maskable interrupt.
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/STM32_WPAN/App/app_thread.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/STM32_WPAN/App/app_thread.c
index 4cf5bf62b..ac57fe673 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/STM32_WPAN/App/app_thread.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_Generic_Ota/STM32_WPAN/App/app_thread.c
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "utilities_common.h"
@@ -103,28 +104,23 @@ static void RxCpltCallback(void);
/* USER CODE BEGIN PFP */
static void APP_THREAD_CoapSendRequest(otCoapResource* pCoapRessource, otCoapType CoapType, otCoapCode CoapCode, const char *Address, uint8_t* Payload, uint16_t Size);
-static void APP_THREAD_DummyReqHandler(void * p_context,
- otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo);
-static void APP_THREAD_CoapRequestHandler(otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo);
+static void APP_THREAD_CoapRequestHandler(void * pContext,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo);
static void APP_THREAD_CoapSendDataResponse(otCoapHeader * pRequestHeader,
const otMessageInfo * pMessageInfo);
-static void APP_THREAD_CoapDataRespHandler(otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo,
- otError Result);
-static void APP_THREAD_CoapDummyRespHandler(void * p_context,
- otCoapHeader * pHeader,
+static void APP_THREAD_CoapDataRespHandler(
+ void * pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo,
otError Result);
-static void APP_THREAD_CoapRequestHandlerFuotaReboot(otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo);
+static void APP_THREAD_CoapRequestHandlerFuotaReboot(void * pContext,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo);
static void APP_THREAD_InitPayloadWrite(void);
static void APP_THREAD_SendCoapMsg(void);
@@ -159,8 +155,8 @@ PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ThreadNotifRspEvtBuffer[size
PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t ThreadCliCmdBuffer;
/* USER CODE BEGIN PV */
-static otCoapResource OT_Ressource = {C_RESSOURCE, APP_THREAD_DummyReqHandler, (void*)APP_THREAD_CoapRequestHandler, NULL};
-static otCoapResource OT_Ressource_FuotaReboot = {C_RESSOURCE_FUOTA_REBOOT, APP_THREAD_DummyReqHandler, (void*)APP_THREAD_CoapRequestHandlerFuotaReboot, NULL};
+static otCoapResource OT_Ressource = {C_RESSOURCE, APP_THREAD_CoapRequestHandler,"StdContext", NULL};
+static otCoapResource OT_Ressource_FuotaReboot = {C_RESSOURCE_FUOTA_REBOOT, APP_THREAD_CoapRequestHandlerFuotaReboot,"FuotaContext", NULL};
static otMessageInfo OT_MessageInfo = {0};
static otCoapHeader OT_Header = {0};
@@ -552,8 +548,8 @@ static void APP_THREAD_CoapSendRequest(otCoapResource* pCoapRessource,
error = otCoapSendRequest(NULL,
pOT_Message,
&OT_MessageInfo,
- &APP_THREAD_CoapDummyRespHandler,
- (void*)&APP_THREAD_CoapDataRespHandler);
+ &APP_THREAD_CoapDataRespHandler,
+ "myContext");
}
}while(false);
@@ -565,29 +561,18 @@ static void APP_THREAD_CoapSendRequest(otCoapResource* pCoapRessource,
}
/**
- * @brief Dummy request handler
- *
- * @param None
- * @retval None
- */
-static void APP_THREAD_DummyReqHandler(void * p_context,
- otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo)
-{
-}
-
-/**
* @brief Handler called when the server receives a COAP request.
*
+ * @param pContext : Context
* @param pHeader : Header
* @param pMessage : Message
* @param pMessageInfo : Message information
* @retval None
*/
-static void APP_THREAD_CoapRequestHandler(otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo)
+static void APP_THREAD_CoapRequestHandler(void * pContext,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo)
{
APP_DBG(" Received CoAP request");
/* USER CODE BEGIN APP_THREAD_CoapRequestHandler */
@@ -646,18 +631,22 @@ static void APP_THREAD_CoapSendDataResponse(otCoapHeader * pRequestHeader,
/**
* @brief This function manages the data response handler.
*
+ * @param pContext context
* @param pHeader header
* @param pMessage message pointer
* @param pMessageInfo message info pointer
* @param Result error code
* @retval None
*/
-static void APP_THREAD_CoapDataRespHandler(otCoapHeader * pHeader,
+static void APP_THREAD_CoapDataRespHandler(
+ void * pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo,
otError Result)
{
/* Prevent unused argument(s) compilation warning */
+ UNUSED(pContext);
UNUSED(pHeader);
UNUSED(pMessage);
UNUSED(pMessageInfo);
@@ -673,30 +662,6 @@ static void APP_THREAD_CoapDataRespHandler(otCoapHeader * pHeader,
}
/**
- * @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_CoapDummyRespHandler(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 Initialize CoAP write buffer.
* @param None
* @retval None
@@ -768,14 +733,16 @@ static bool APP_THREAD_CheckMsgValidity(void)
/**
* @brief Handler called when the server receives a COAP request.
*
+ * @param pContext : Context
* @param pHeader : Header
* @param pMessage : Message
* @param pMessageInfo : Message information
* @retval None
*/
-static void APP_THREAD_CoapRequestHandlerFuotaReboot(otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo)
+static void APP_THREAD_CoapRequestHandlerFuotaReboot(void * pContext,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo)
{
uint32_t l_data = 0;
APP_DBG(" Received CoAP request on %s", C_RESSOURCE_FUOTA_REBOOT);
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 a58b95cad..e7049681d 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_MultiBoard/Core/Inc/app_common.h
index 836f40dcf..cf8a5baa6 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_MultiBoard/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_MultiBoard/Core/Inc/app_common.h
@@ -66,9 +66,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_MultiBoard/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_MultiBoard/Core/Inc/stm32wbxx_hal_conf.h
index 573cacb53..a39ca90c0 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_MultiBoard/Core/Inc/stm32wbxx_hal_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_MultiBoard/Core/Inc/stm32wbxx_hal_conf.h
@@ -40,7 +40,7 @@
#define HAL_HSEM_MODULE_ENABLED
/*#define HAL_I2C_MODULE_ENABLED */
/*#define HAL_I2S_MODULE_ENABLED */
-/*#define HAL_IPCC_MODULE_ENABLED */
+#define HAL_IPCC_MODULE_ENABLED
/*#define HAL_IRDA_MODULE_ENABLED */
/*#define HAL_IWDG_MODULE_ENABLED */
/*#define HAL_LCD_MODULE_ENABLED */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_MultiBoard/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_MultiBoard/Core/Src/app_entry.c
index 47465dbf9..a64d5fdf2 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_MultiBoard/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_MultiBoard/Core/Src/app_entry.c
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "main.h"
@@ -237,7 +238,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_MultiBoard/STM32_WPAN/App/app_thread.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_MultiBoard/STM32_WPAN/App/app_thread.c
index 7a5ebac29..7689a4918 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_MultiBoard/STM32_WPAN/App/app_thread.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Coap_MultiBoard/STM32_WPAN/App/app_thread.c
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "utilities_common.h"
@@ -89,24 +90,18 @@ static void RxCpltCallback(void);
#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
/* USER CODE BEGIN PFP */
-static void APP_THREAD_DummyReqHandler(void * p_context,
- otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo);
-static void APP_THREAD_CoapRequestHandler(otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo);
-static void APP_THREAD_CoapRespHandler(otCoapHeader * pHeader,
+static void APP_THREAD_CoapRequestHandler(void * pContext,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo);
+static void APP_THREAD_CoapRespHandler(
+ void * pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo,
otError Result);
static void APP_THREAD_DataRespSend(otCoapHeader * pRequestHeader,
const otMessageInfo * pMessageInfo);
-static void APP_THREAD_DummyRespHandler(void * p_context,
- otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo,
- otError Result);
static void APP_THREAD_SendCoapMsg(void);
static void APP_THREAD_SendNextbuffer(void);
static void APP_THREAD_IdentifyBoard(void);
@@ -141,7 +136,7 @@ PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ThreadNotifRspEvtBuffer[size
PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t ThreadCliCmdBuffer;
/* USER CODE BEGIN PV */
-static otCoapResource OT_Ressource = {C_RESSOURCE, APP_THREAD_DummyReqHandler, (void*)APP_THREAD_CoapRequestHandler, NULL};
+static otCoapResource OT_Ressource = {C_RESSOURCE, APP_THREAD_CoapRequestHandler,"myContext", NULL};
static otMessageInfo OT_MessageInfo = {0};
static otCoapHeader OT_Header = {0};
static uint8_t OT_Command = 0;
@@ -536,8 +531,8 @@ static void APP_THREAD_SendCoapUnicastRequest(uint8_t device_receiver)
error = otCoapSendRequest(NULL,
pOT_Message,
&OT_MessageInfo,
- &APP_THREAD_DummyRespHandler,
- (void*)&APP_THREAD_CoapRespHandler);
+ &APP_THREAD_CoapRespHandler,
+ "myContext");
if (error != OT_ERROR_NONE && pOT_Message != NULL)
{
@@ -547,29 +542,18 @@ static void APP_THREAD_SendCoapUnicastRequest(uint8_t device_receiver)
}
/**
- * @brief Dummy request handler
- *
- * @param None
- * @retval None
- */
-static void APP_THREAD_DummyReqHandler(void * p_context,
- otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo)
-{
-}
-
-/**
* @brief Handler called when the server receives a COAP request.
*
+ * @param pContext : Context
* @param pHeader : Header
* @param pMessage : Message
* @param pMessageInfo : Message information
* @retval None
*/
-static void APP_THREAD_CoapRequestHandler(otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo)
+static void APP_THREAD_CoapRequestHandler(void * pContext,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo)
{
APP_DBG(" ********* APP_THREAD_CoapRequestHandler \r\n");
do
@@ -719,13 +703,16 @@ static void APP_THREAD_AllocateUnicastIpAddr(uint8_t boardId, uint8_t flagNewIpA
* @brief This function manages the data response handler
* and reschedules the sending of data.
*
+ * @param pContext context
* @param pHeader header
* @param pMessage message pointer
* @param pMessageInfo message info pointer
* @param Result
* @retval None
*/
-static void APP_THREAD_CoapRespHandler(otCoapHeader * pHeader,
+static void APP_THREAD_CoapRespHandler(
+ void * pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo,
otError Result)
@@ -741,26 +728,6 @@ static void APP_THREAD_CoapRespHandler(otCoapHeader * pHeader,
}
/**
- * @brief This function is used to set the EndDevice mode
- *
- * @param None
- * @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 Warn the user that a COAP request has been
* received
*
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 6da319929..e7049681d 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,37 +582,37 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Commissioning/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Commissioning/Core/Inc/app_common.h
index 836f40dcf..cf8a5baa6 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Commissioning/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Commissioning/Core/Inc/app_common.h
@@ -66,9 +66,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Commissioning/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Commissioning/Core/Inc/stm32wbxx_hal_conf.h
index 573cacb53..a39ca90c0 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Commissioning/Core/Inc/stm32wbxx_hal_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Commissioning/Core/Inc/stm32wbxx_hal_conf.h
@@ -40,7 +40,7 @@
#define HAL_HSEM_MODULE_ENABLED
/*#define HAL_I2C_MODULE_ENABLED */
/*#define HAL_I2S_MODULE_ENABLED */
-/*#define HAL_IPCC_MODULE_ENABLED */
+#define HAL_IPCC_MODULE_ENABLED
/*#define HAL_IRDA_MODULE_ENABLED */
/*#define HAL_IWDG_MODULE_ENABLED */
/*#define HAL_LCD_MODULE_ENABLED */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Commissioning/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Commissioning/Core/Src/app_entry.c
index cee4ad09d..b93e1028a 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Commissioning/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Commissioning/Core/Src/app_entry.c
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "main.h"
@@ -237,7 +238,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Commissioning/STM32_WPAN/App/app_thread.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Commissioning/STM32_WPAN/App/app_thread.c
index 0a65a1476..0b5ec45b4 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Commissioning/STM32_WPAN/App/app_thread.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Commissioning/STM32_WPAN/App/app_thread.c
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "utilities_common.h"
@@ -531,8 +532,9 @@ static void APP_THREAD_ConfigJoiner(void)
}
/**
- * @brief Dummy request handler
- * @param
+ * @brief APP_THREAD_JoinerHandler
+ * @param OtError
+ * @param pContext
* @retval None
*/
static void APP_THREAD_JoinerHandler(otError OtError, void *pContext)
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 6da319929..e7049681d 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,37 +582,37 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_FTD_Coap_Multicast/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_FTD_Coap_Multicast/Core/Inc/app_common.h
index 836f40dcf..cf8a5baa6 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_FTD_Coap_Multicast/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_FTD_Coap_Multicast/Core/Inc/app_common.h
@@ -66,9 +66,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_FTD_Coap_Multicast/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_FTD_Coap_Multicast/Core/Inc/stm32wbxx_hal_conf.h
index 573cacb53..a39ca90c0 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_FTD_Coap_Multicast/Core/Inc/stm32wbxx_hal_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_FTD_Coap_Multicast/Core/Inc/stm32wbxx_hal_conf.h
@@ -40,7 +40,7 @@
#define HAL_HSEM_MODULE_ENABLED
/*#define HAL_I2C_MODULE_ENABLED */
/*#define HAL_I2S_MODULE_ENABLED */
-/*#define HAL_IPCC_MODULE_ENABLED */
+#define HAL_IPCC_MODULE_ENABLED
/*#define HAL_IRDA_MODULE_ENABLED */
/*#define HAL_IWDG_MODULE_ENABLED */
/*#define HAL_LCD_MODULE_ENABLED */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_FTD_Coap_Multicast/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_FTD_Coap_Multicast/Core/Src/app_entry.c
index f098478c6..a21f01b05 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_FTD_Coap_Multicast/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_FTD_Coap_Multicast/Core/Src/app_entry.c
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "main.h"
@@ -237,7 +238,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_FTD_Coap_Multicast/STM32_WPAN/App/app_thread.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_FTD_Coap_Multicast/STM32_WPAN/App/app_thread.c
index 1da982710..88b07ff89 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_FTD_Coap_Multicast/STM32_WPAN/App/app_thread.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_FTD_Coap_Multicast/STM32_WPAN/App/app_thread.c
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "utilities_common.h"
@@ -104,11 +105,8 @@ static void RxCpltCallback(void);
/* USER CODE BEGIN PFP */
static void APP_THREAD_SendCoapMsg(void);
static void APP_THREAD_SendCoapMulticastRequest(uint8_t command);
-static void APP_THREAD_DummyReqHandler(void * p_context,
- otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo);
-static void APP_THREAD_CoapRequestHandler(otCoapHeader * pHeader,
+static void APP_THREAD_CoapRequestHandler(void * pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo);
/* USER CODE END PFP */
@@ -139,7 +137,7 @@ PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ThreadNotifRspEvtBuffer[size
PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t ThreadCliCmdBuffer;
/* USER CODE BEGIN PV */
-static otCoapResource OT_Ressource = {C_RESSOURCE, APP_THREAD_DummyReqHandler, (void*)APP_THREAD_CoapRequestHandler, NULL};
+static otCoapResource OT_Ressource = {C_RESSOURCE, APP_THREAD_CoapRequestHandler, "myContext", NULL};
static otMessageInfo OT_MessageInfo = {0};
static uint8_t OT_Command = 0;
static otCoapHeader OT_Header = {0};
@@ -471,17 +469,6 @@ static void APP_THREAD_CheckWirelessFirmwareInfo(void)
}
}
/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
-/**
- * @brief Dummy request handler
- * @param
- * @retval None
- */
-static void APP_THREAD_DummyReqHandler(void * p_context,
- otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo)
-{
-}
/**
* @brief Task associated to the push button.
@@ -495,12 +482,15 @@ static void APP_THREAD_SendCoapMsg(void)
/**
* @brief Handler called when the server receives a COAP request.
+ *
+ * @param pContext : Context
* @param pHeader : Header
* @param pMessage : Message
* @param pMessageInfo : Message information
* @retval None
*/
-static void APP_THREAD_CoapRequestHandler(otCoapHeader * pHeader,
+static void APP_THREAD_CoapRequestHandler(void * pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo)
{
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 6da319929..e7049681d 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,37 +582,37 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Inc/app_common.h
index 47b2867f1..c3499322e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Inc/app_common.h
@@ -64,9 +64,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Inc/stm32wbxx_hal_conf.h
index ea9aa40d0..7f1537260 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Inc/stm32wbxx_hal_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Inc/stm32wbxx_hal_conf.h
@@ -39,7 +39,7 @@
/*#define HAL_CRC_MODULE_ENABLED */
#define HAL_HSEM_MODULE_ENABLED
/*#define HAL_I2C_MODULE_ENABLED */
-/*#define HAL_IPCC_MODULE_ENABLED */
+#define HAL_IPCC_MODULE_ENABLED
/*#define HAL_IRDA_MODULE_ENABLED */
/*#define HAL_IWDG_MODULE_ENABLED */
/*#define HAL_LCD_MODULE_ENABLED */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Inc/stm32wbxx_it.h
index 07cbd808c..a3a535f13 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Inc/stm32wbxx_it.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Inc/stm32wbxx_it.h
@@ -24,7 +24,7 @@
#ifdef __cplusplus
extern "C" {
-#endif
+#endif
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Src/app_entry.c
index a6a664e18..f4dcf100b 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Src/app_entry.c
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "main.h"
@@ -242,7 +243,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Src/main.c
index e078a1467..b33e7275d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Src/main.c
@@ -37,6 +37,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "app_entry.h"
@@ -166,11 +167,10 @@ void SystemClock_Config(void)
/** Configure LSE Drive Capability
*/
__HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
- /** Configure the main internal regulator output voltage
+ /** Configure the main internal regulator output voltage
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
- /** Initializes the RCC Oscillators according to the specified parameters
- * in the RCC_OscInitTypeDef structure.
+ /** Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
|RCC_OSCILLATORTYPE_LSE;
@@ -183,7 +183,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
@@ -199,7 +199,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Initializes the peripherals clocks
+ /** Initializes the peripherals clocks
*/
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
|RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
@@ -368,10 +368,10 @@ static void MX_RTC_Init(void)
}
-/**
+/**
* Enable DMA controller clock
*/
-static void MX_DMA_Init(void)
+static void MX_DMA_Init(void)
{
/* DMA controller clock enable */
@@ -607,7 +607,7 @@ void Error_Handler(void)
* @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) */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Src/stm32wbxx_hal_msp.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Src/stm32wbxx_hal_msp.c
index 89b5dd605..9c338486d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Src/stm32wbxx_hal_msp.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Src/stm32wbxx_hal_msp.c
@@ -118,11 +118,11 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
/* USER CODE END LPUART1_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_LPUART1_CLK_ENABLE();
-
+
__HAL_RCC_GPIOA_CLK_ENABLE();
- /**LPUART1 GPIO Configuration
+ /**LPUART1 GPIO Configuration
PA2 ------> LPUART1_TX
- PA3 ------> LPUART1_RX
+ PA3 ------> LPUART1_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
@@ -163,13 +163,13 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
/* 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
+ /**USART1 GPIO Configuration
PA11 ------> USART1_CTS
PB6 ------> USART1_TX
- PB7 ------> USART1_RX
+ PB7 ------> USART1_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
@@ -228,10 +228,10 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
/* USER CODE END LPUART1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_LPUART1_CLK_DISABLE();
-
- /**LPUART1 GPIO Configuration
+
+ /**LPUART1 GPIO Configuration
PA2 ------> LPUART1_TX
- PA3 ------> LPUART1_RX
+ PA3 ------> LPUART1_RX
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
@@ -251,11 +251,11 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
/* USER CODE END USART1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_USART1_CLK_DISABLE();
-
- /**USART1 GPIO Configuration
+
+ /**USART1 GPIO Configuration
PA11 ------> USART1_CTS
PB6 ------> USART1_TX
- PB7 ------> USART1_RX
+ PB7 ------> USART1_RX
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11);
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Src/stm32wbxx_it.c
index 1c9658111..b0026e595 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Src/stm32wbxx_it.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/Core/Src/stm32wbxx_it.c
@@ -66,7 +66,7 @@ extern UART_HandleTypeDef huart1;
/* USER CODE END EV */
/******************************************************************************/
-/* Cortex Processor Interruption and Exception Handlers */
+/* Cortex Processor Interruption and Exception Handlers */
/******************************************************************************/
/**
* @brief This function handles Non maskable interrupt.
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/STM32_WPAN/App/app_thread.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/STM32_WPAN/App/app_thread.c
index f28eb8efe..d906d3a33 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/STM32_WPAN/App/app_thread.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota/STM32_WPAN/App/app_thread.c
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "utilities_common.h"
@@ -106,24 +107,25 @@ static void RxCpltCallback(void);
static void Delete_Sectors( void );
static uint32_t GetFirstSecureSector(void);
-static void APP_THREAD_DummyReqHandler(void * p_context,
+static void APP_THREAD_CoapReqHandlerFuotaProvisioning(
+ void * pContext,
otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo);
-
-static void APP_THREAD_CoapReqHandlerFuotaProvisioning(otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo);
static void APP_THREAD_ProvisioningRespSend(otCoapHeader * pRequestHeader,
const otMessageInfo * pMessageInfo);
-static void APP_THREAD_CoapReqHandlerFuota(otCoapHeader * pHeader,
+static void APP_THREAD_CoapReqHandlerFuota(
+ void * pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo);
static void APP_THREAD_CoapSendDataResponseFuota(otCoapHeader * pRequestHeader,
const otMessageInfo * pMessageInfo);
-static void APP_THREAD_CoapReqHandlerFuotaParameters(otCoapHeader * pHeader,
+static void APP_THREAD_CoapReqHandlerFuotaParameters(
+ void * pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo);
static void APP_THREAD_CoapSendRespFuotaParameters(otCoapHeader * pRequestHeader,
@@ -160,9 +162,9 @@ PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ThreadNotifRspEvtBuffer[size
PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t ThreadCliCmdBuffer;
/* USER CODE BEGIN PV */
-static otCoapResource OT_RessourceFuotaProvisioning = {C_RESSOURCE_FUOTA_PROVISIONING, APP_THREAD_DummyReqHandler, (void*)APP_THREAD_CoapReqHandlerFuotaProvisioning, NULL};
-static otCoapResource OT_RessourceFuotaParameters = {C_RESSOURCE_FUOTA_PARAMETERS, APP_THREAD_DummyReqHandler, (void*)APP_THREAD_CoapReqHandlerFuotaParameters, NULL};
-static otCoapResource OT_RessourceFuotaSend = {C_RESSOURCE_FUOTA_SEND, APP_THREAD_DummyReqHandler, (void*)APP_THREAD_CoapReqHandlerFuota, NULL};
+static otCoapResource OT_RessourceFuotaProvisioning = {C_RESSOURCE_FUOTA_PROVISIONING, APP_THREAD_CoapReqHandlerFuotaProvisioning,"myCtxProvisioning", NULL};
+static otCoapResource OT_RessourceFuotaParameters = {C_RESSOURCE_FUOTA_PARAMETERS, APP_THREAD_CoapReqHandlerFuotaParameters, "myCtxReqFuotaParamHdl", NULL};
+static otCoapResource OT_RessourceFuotaSend = {C_RESSOURCE_FUOTA_SEND, APP_THREAD_CoapReqHandlerFuota,"myCtxReqFuotaHdl", NULL};
static uint8_t OT_Command = 0;
static otMessageInfo OT_MessageInfo = {0};
@@ -580,27 +582,17 @@ static uint32_t GetFirstSecureSector(void)
}
/**
- * @brief Dummy request handler
- *
- * @param None
- * @retval None
- */
-static void APP_THREAD_DummyReqHandler(void * p_context,
- otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo)
-{
-}
-
-/**
* @brief Handler called when the server receives a COAP request.
*
+ * @param pContext : Context
* @param pHeader : Header
* @param pMessage : Message
* @param pMessageInfo : Message information
* @retval None
*/
-static void APP_THREAD_CoapReqHandlerFuotaProvisioning(otCoapHeader * pHeader,
+static void APP_THREAD_CoapReqHandlerFuotaProvisioning(
+ void * pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo)
{
@@ -667,12 +659,15 @@ static void APP_THREAD_ProvisioningRespSend(otCoapHeader * pRequestHeader,
/**
* @brief Handler called when the server receives a COAP request.
*
+ * @param pContext : Context
* @param pHeader : Header
* @param pMessage : Message
* @param pMessageInfo : Message information
* @retval None
*/
-static void APP_THREAD_CoapReqHandlerFuotaParameters(otCoapHeader * pHeader,
+static void APP_THREAD_CoapReqHandlerFuotaParameters(
+ void * pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo)
{
@@ -764,12 +759,15 @@ static APP_THREAD_StatusTypeDef APP_THREAD_CheckDeviceCapabilities(void)
/**
* @brief Handler called when the server receives a COAP request.
*
+ * @param pContext : Context
* @param pHeader : Header
* @param pMessage : Message
* @param pMessageInfo : Message information
* @retval None
*/
-static void APP_THREAD_CoapReqHandlerFuota(otCoapHeader * pHeader,
+static void APP_THREAD_CoapReqHandlerFuota(
+ void *pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo)
{
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 a58b95cad..e7049681d 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Inc/app_common.h
index 47b2867f1..c3499322e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Inc/app_common.h
@@ -64,9 +64,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Inc/stm32wbxx_hal_conf.h
index ea9aa40d0..7f1537260 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Inc/stm32wbxx_hal_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Inc/stm32wbxx_hal_conf.h
@@ -39,7 +39,7 @@
/*#define HAL_CRC_MODULE_ENABLED */
#define HAL_HSEM_MODULE_ENABLED
/*#define HAL_I2C_MODULE_ENABLED */
-/*#define HAL_IPCC_MODULE_ENABLED */
+#define HAL_IPCC_MODULE_ENABLED
/*#define HAL_IRDA_MODULE_ENABLED */
/*#define HAL_IWDG_MODULE_ENABLED */
/*#define HAL_LCD_MODULE_ENABLED */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Inc/stm32wbxx_it.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Inc/stm32wbxx_it.h
index 9cc9cdd38..e80726d02 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Inc/stm32wbxx_it.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Inc/stm32wbxx_it.h
@@ -24,7 +24,7 @@
#ifdef __cplusplus
extern "C" {
-#endif
+#endif
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Src/app_entry.c
index 31fbea623..13dde910b 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Src/app_entry.c
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "main.h"
@@ -242,7 +243,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Src/main.c
index e078a1467..b33e7275d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Src/main.c
@@ -37,6 +37,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "app_entry.h"
@@ -166,11 +167,10 @@ void SystemClock_Config(void)
/** Configure LSE Drive Capability
*/
__HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
- /** Configure the main internal regulator output voltage
+ /** Configure the main internal regulator output voltage
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
- /** Initializes the RCC Oscillators according to the specified parameters
- * in the RCC_OscInitTypeDef structure.
+ /** Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
|RCC_OSCILLATORTYPE_LSE;
@@ -183,7 +183,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
@@ -199,7 +199,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Initializes the peripherals clocks
+ /** Initializes the peripherals clocks
*/
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
|RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
@@ -368,10 +368,10 @@ static void MX_RTC_Init(void)
}
-/**
+/**
* Enable DMA controller clock
*/
-static void MX_DMA_Init(void)
+static void MX_DMA_Init(void)
{
/* DMA controller clock enable */
@@ -607,7 +607,7 @@ void Error_Handler(void)
* @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) */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Src/stm32wbxx_hal_msp.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Src/stm32wbxx_hal_msp.c
index 89b5dd605..9c338486d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Src/stm32wbxx_hal_msp.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Src/stm32wbxx_hal_msp.c
@@ -118,11 +118,11 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
/* USER CODE END LPUART1_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_LPUART1_CLK_ENABLE();
-
+
__HAL_RCC_GPIOA_CLK_ENABLE();
- /**LPUART1 GPIO Configuration
+ /**LPUART1 GPIO Configuration
PA2 ------> LPUART1_TX
- PA3 ------> LPUART1_RX
+ PA3 ------> LPUART1_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
@@ -163,13 +163,13 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
/* 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
+ /**USART1 GPIO Configuration
PA11 ------> USART1_CTS
PB6 ------> USART1_TX
- PB7 ------> USART1_RX
+ PB7 ------> USART1_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
@@ -228,10 +228,10 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
/* USER CODE END LPUART1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_LPUART1_CLK_DISABLE();
-
- /**LPUART1 GPIO Configuration
+
+ /**LPUART1 GPIO Configuration
PA2 ------> LPUART1_TX
- PA3 ------> LPUART1_RX
+ PA3 ------> LPUART1_RX
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
@@ -251,11 +251,11 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
/* USER CODE END USART1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_USART1_CLK_DISABLE();
-
- /**USART1 GPIO Configuration
+
+ /**USART1 GPIO Configuration
PA11 ------> USART1_CTS
PB6 ------> USART1_TX
- PB7 ------> USART1_RX
+ PB7 ------> USART1_RX
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11);
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Src/stm32wbxx_it.c
index 55f3752b9..150f4e248 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Src/stm32wbxx_it.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/Core/Src/stm32wbxx_it.c
@@ -66,7 +66,7 @@ extern UART_HandleTypeDef huart1;
/* USER CODE END EV */
/******************************************************************************/
-/* Cortex Processor Interruption and Exception Handlers */
+/* Cortex Processor Interruption and Exception Handlers */
/******************************************************************************/
/**
* @brief This function handles Non maskable interrupt.
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/STM32_WPAN/App/app_thread.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/STM32_WPAN/App/app_thread.c
index 19712e540..740cd8735 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/STM32_WPAN/App/app_thread.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_Ota_Server/STM32_WPAN/App/app_thread.c
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "utilities_common.h"
@@ -80,7 +81,6 @@ typedef enum
#define FUOTA_NUMBER_WORDS_64BITS 50
#define FUOTA_PAYLOAD_SIZE (FUOTA_NUMBER_WORDS_64BITS * 8)
-typedef void (*CoapRespHandlerCallback) (otCoapHeader * pHeader, otMessage * pMessage,const otMessageInfo * pMessageInfo,otError Result);
/* USER CODE END PD */
/* Private macros ------------------------------------------------------------*/
@@ -124,31 +124,28 @@ static void APP_THREAD_CoapSendRequest(otCoapResource* pCoapRessource,
APP_THREAD_CoapAddressTypeDef_t CoapAddressType,
uint8_t* Payload,
uint16_t Size,
- CoapRespHandlerCallback RespHandlerCb);
-
-static void APP_THREAD_DummyReqHandler(void * p_context,
- otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo);
-static void APP_THREAD_ProvisioningRespHandler(otCoapHeader * pHeader,
+ otCoapResponseHandler RespHandlerCb);
+static void APP_THREAD_ProvisioningRespHandler(
+ void * pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo,
otError Result);
-static void APP_THREAD_CoapDummyRespHandler(void * p_context,
- otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo,
- otError Result);
-
-static void APP_THREAD_CoapRespHandlerFuotaSend(otCoapHeader * pHeader,
+static void APP_THREAD_CoapRespHandlerFuotaSend(
+ void * pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo,
otError Result);
-static void APP_THREAD_CoapRespHandlerFuotaReboot(otCoapHeader * pHeader,
+static void APP_THREAD_CoapRespHandlerFuotaReboot(
+ void * pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo,
otError Result);
-static void APP_THREAD_CoapRespHandlerFuotaParameters(otCoapHeader * pHeader,
+static void APP_THREAD_CoapRespHandlerFuotaParameters(
+ void * pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo,
otError Result);
@@ -190,10 +187,10 @@ PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ThreadNotifRspEvtBuffer[size
PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t ThreadCliCmdBuffer;
/* USER CODE BEGIN PV */
-static otCoapResource OT_RessourceFuotaProvisioning = {C_RESSOURCE_FUOTA_PROVISIONING, APP_THREAD_DummyReqHandler, NULL, NULL};
-static otCoapResource OT_RessourceFuotaParameters = {C_RESSOURCE_FUOTA_PARAMETERS, APP_THREAD_DummyReqHandler, NULL, NULL};
-static otCoapResource OT_RessourceFuotaSend = {C_RESSOURCE_FUOTA_SEND, APP_THREAD_DummyReqHandler, NULL, NULL};
-static otCoapResource OT_RessourceFuotaReboot = {C_RESSOURCE_FUOTA_REBOOT, APP_THREAD_DummyReqHandler, NULL, NULL};
+static otCoapResource OT_RessourceFuotaProvisioning = {C_RESSOURCE_FUOTA_PROVISIONING, NULL, NULL, NULL};
+static otCoapResource OT_RessourceFuotaParameters = {C_RESSOURCE_FUOTA_PARAMETERS, NULL, NULL, NULL};
+static otCoapResource OT_RessourceFuotaSend = {C_RESSOURCE_FUOTA_SEND, NULL, NULL, NULL};
+static otCoapResource OT_RessourceFuotaReboot = {C_RESSOURCE_FUOTA_REBOOT, NULL, NULL, NULL};
static uint8_t OT_Command = 0;
static otMessageInfo OT_MessageInfo = {0};
@@ -548,7 +545,7 @@ static void APP_THREAD_CoapSendRequest(otCoapResource* pCoapRessource,
APP_THREAD_CoapAddressTypeDef_t CoapAddressType,
uint8_t* Payload,
uint16_t Size,
- CoapRespHandlerCallback RespHandlerCb)
+ otCoapResponseHandler RespHandlerCb)
{
otError error = OT_ERROR_NONE;
OT_BufferIdSend = 0;
@@ -607,8 +604,8 @@ static void APP_THREAD_CoapSendRequest(otCoapResource* pCoapRessource,
error = otCoapSendRequest(NULL,
pOT_Message,
&OT_MessageInfo,
- &APP_THREAD_CoapDummyRespHandler,
- (void*)RespHandlerCb);
+ RespHandlerCb,
+ "myContext");
}while(false);
if (error != OT_ERROR_NONE && pOT_Message != NULL)
@@ -619,19 +616,6 @@ static void APP_THREAD_CoapSendRequest(otCoapResource* pCoapRessource,
}
/**
- * @brief Dummy request handler
- *
- * @param None
- * @retval None
- */
-static void APP_THREAD_DummyReqHandler(void * p_context,
- otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo)
-{
-}
-
-/**
* @brief This function manages the response handler for provisioning.
*
* @param pHeader header
@@ -640,7 +624,9 @@ static void APP_THREAD_DummyReqHandler(void * p_context,
* @param Result error code
* @retval None
*/
-static void APP_THREAD_ProvisioningRespHandler(otCoapHeader * pHeader,
+static void APP_THREAD_ProvisioningRespHandler(
+ void * pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo,
otError Result)
@@ -678,7 +664,9 @@ static void APP_THREAD_ProvisioningRespHandler(otCoapHeader * pHeader,
* @param Result error code
* @retval None
*/
-static void APP_THREAD_CoapRespHandlerFuotaSend(otCoapHeader * pHeader,
+static void APP_THREAD_CoapRespHandlerFuotaSend(
+ void * pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo,
otError Result)
@@ -694,30 +682,6 @@ static void APP_THREAD_CoapRespHandlerFuotaSend(otCoapHeader * pHeader,
}
/**
- * @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_CoapDummyRespHandler(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 Set FUOTA parameters for APP FW.
* @param None
* @retval None
@@ -1071,13 +1035,16 @@ static void APP_THREAD_FuotaReboot(void)
/**
* @brief This function manages the response handler for the request of reboot on Thread_Ota.
*
+ * @param pContext context
* @param pHeader header
* @param pMessage message pointer
* @param pMessageInfo message info pointer
* @param Result error code
* @retval None
*/
-static void APP_THREAD_CoapRespHandlerFuotaReboot(otCoapHeader * pHeader,
+static void APP_THREAD_CoapRespHandlerFuotaReboot(
+ void * pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo,
otError Result)
@@ -1095,13 +1062,16 @@ static void APP_THREAD_CoapRespHandlerFuotaReboot(otCoapHeader * pHeader,
/**
* @brief This function manages the response handler for the request of reboot on Thread_Ota.
*
+ * @param pContext context
* @param pHeader header
* @param pMessage message pointer
* @param pMessageInfo message info pointer
* @param Result error code
* @retval None
*/
-static void APP_THREAD_CoapRespHandlerFuotaParameters(otCoapHeader * pHeader,
+static void APP_THREAD_CoapRespHandlerFuotaParameters(
+ void * pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo,
otError Result)
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 a58b95cad..e7049681d 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Inc/app_common.h
index 836f40dcf..cf8a5baa6 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Inc/app_common.h
@@ -66,9 +66,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Inc/stm32wbxx_hal_conf.h
index 77f717cfa..f10220845 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Inc/stm32wbxx_hal_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Inc/stm32wbxx_hal_conf.h
@@ -40,7 +40,7 @@
#define HAL_HSEM_MODULE_ENABLED
/*#define HAL_I2C_MODULE_ENABLED */
/*#define HAL_I2S_MODULE_ENABLED */
-/*#define HAL_IPCC_MODULE_ENABLED */
+#define HAL_IPCC_MODULE_ENABLED
/*#define HAL_IRDA_MODULE_ENABLED */
/*#define HAL_IWDG_MODULE_ENABLED */
/*#define HAL_LCD_MODULE_ENABLED */
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 9b2a560ce..bef33d5f8 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
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "main.h"
@@ -270,7 +271,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Src/app_freertos.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Src/app_freertos.c
index 5182501b9..33518a6d1 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Src/app_freertos.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Src/app_freertos.c
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "FreeRTOS.h"
#include "task.h"
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Src/freertos_port.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Src/freertos_port.c
index b203861fe..dcb7c6a53 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Src/freertos_port.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Src/freertos_port.c
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Src/stm32wbxx_hal_timebase_tim.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Src/stm32wbxx_hal_timebase_tim.c
index 2dc3ac5b3..646176be8 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Src/stm32wbxx_hal_timebase_tim.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/Core/Src/stm32wbxx_hal_timebase_tim.c
@@ -55,6 +55,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "stm32wbxx_hal.h"
#include "stm32wbxx_hal_tim.h"
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/STM32_WPAN/App/app_thread.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/STM32_WPAN/App/app_thread.c
index e784b26af..af84e0723 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/STM32_WPAN/App/app_thread.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_FreeRTOS/STM32_WPAN/App/app_thread.c
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "utilities_common.h"
@@ -141,11 +142,8 @@ static void APP_THREAD_FreeRTOSSendCLIToM0Task(void *argument);
/* USER CODE BEGIN PFP */
static void APP_THREAD_SendCoapMsg(void);
static void APP_THREAD_SendCoapMulticastRequest(uint8_t command);
-static void APP_THREAD_DummyReqHandler(void * p_context,
- otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo);
-static void APP_THREAD_CoapRequestHandler(otCoapHeader * pHeader,
+static void APP_THREAD_CoapRequestHandler(void * pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo);
@@ -191,7 +189,7 @@ static osThreadId_t OsTaskCliId; /* Task used to manage CLI comamnd
#endif /* (CFG_FULL_LOW_POWER == 0) */
/* USER CODE BEGIN PV */
-static otCoapResource OT_Ressource = {C_RESSOURCE, APP_THREAD_DummyReqHandler, (void*)APP_THREAD_CoapRequestHandler, NULL};
+static otCoapResource OT_Ressource = {C_RESSOURCE, APP_THREAD_CoapRequestHandler, "myCtx", NULL};
static otMessageInfo OT_MessageInfo = {0};
static uint8_t OT_Command = 0;
static otCoapHeader OT_Header = {0};
@@ -669,12 +667,14 @@ static void APP_THREAD_SendCoapMsg(void)
/**
* @brief Handler called when the server receives a COAP request.
+ * @param pContext : Context
* @param pHeader : Header
* @param pMessage : Message
* @param pMessageInfo : Message information
* @retval None
*/
-static void APP_THREAD_CoapRequestHandler(otCoapHeader * pHeader,
+static void APP_THREAD_CoapRequestHandler(void * pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo)
{
@@ -791,17 +791,6 @@ static void APP_THREAD_SetThreadMode( void )
osThreadFlagsSet(OsTaskSetSedModeId,1);
}
-/**
- * @brief Dummy request handler
- * @param
- * @retval None
- */
-static void APP_THREAD_DummyReqHandler(void * p_context,
- otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo)
-{
-}
/* USER CODE END FD_LOCAL_FUNCTIONS */
/*************************************************************
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 6da319929..e7049681d 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,37 +582,37 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_Multicast/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_Multicast/Core/Inc/app_common.h
index 836f40dcf..cf8a5baa6 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_Multicast/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_Multicast/Core/Inc/app_common.h
@@ -66,9 +66,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_Multicast/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_Multicast/Core/Inc/stm32wbxx_hal_conf.h
index 573cacb53..a39ca90c0 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_Multicast/Core/Inc/stm32wbxx_hal_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_Multicast/Core/Inc/stm32wbxx_hal_conf.h
@@ -40,7 +40,7 @@
#define HAL_HSEM_MODULE_ENABLED
/*#define HAL_I2C_MODULE_ENABLED */
/*#define HAL_I2S_MODULE_ENABLED */
-/*#define HAL_IPCC_MODULE_ENABLED */
+#define HAL_IPCC_MODULE_ENABLED
/*#define HAL_IRDA_MODULE_ENABLED */
/*#define HAL_IWDG_MODULE_ENABLED */
/*#define HAL_LCD_MODULE_ENABLED */
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 f6529a4ad..183b8db99 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
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "main.h"
@@ -237,7 +238,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_Multicast/STM32_WPAN/App/app_thread.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_Multicast/STM32_WPAN/App/app_thread.c
index 159441088..a2888840c 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_Multicast/STM32_WPAN/App/app_thread.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Thread/Thread_SED_Coap_Multicast/STM32_WPAN/App/app_thread.c
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "utilities_common.h"
@@ -93,11 +94,8 @@ static void RxCpltCallback(void);
/* USER CODE BEGIN PFP */
static void APP_THREAD_SendCoapMsg(void);
static void APP_THREAD_SendCoapMulticastRequest(uint8_t command);
-static void APP_THREAD_DummyReqHandler(void * p_context,
- otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo);
-static void APP_THREAD_CoapRequestHandler(otCoapHeader * pHeader,
+static void APP_THREAD_CoapRequestHandler(void * pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo);
static void APP_THREAD_SetSleepyEndDeviceMode(void);
@@ -131,7 +129,7 @@ PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ThreadNotifRspEvtBuffer[size
PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static TL_CmdPacket_t ThreadCliCmdBuffer;
/* USER CODE BEGIN PV */
-static otCoapResource OT_Ressource = {C_RESSOURCE, APP_THREAD_DummyReqHandler, (void*)APP_THREAD_CoapRequestHandler, NULL};
+static otCoapResource OT_Ressource = {C_RESSOURCE, APP_THREAD_CoapRequestHandler,"myCtx", NULL};
static otMessageInfo OT_MessageInfo = {0};
static uint8_t OT_Command = 0;
static otCoapHeader OT_Header = {0};
@@ -548,12 +546,14 @@ static void APP_THREAD_SendCoapMsg(void)
/**
* @brief Handler called when the server receives a COAP request.
+ * @param pContext : Context
* @param pHeader : Header
* @param pMessage : Message
* @param pMessageInfo : Message information
* @retval None
*/
-static void APP_THREAD_CoapRequestHandler(otCoapHeader * pHeader,
+static void APP_THREAD_CoapRequestHandler(void * pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo)
{
@@ -670,17 +670,6 @@ static void APP_THREAD_SetThreadMode( void )
UTIL_SEQ_SetTask(TASK_SET_THREAD_MODE,CFG_SCH_PRIO_1);
}
-/**
- * @brief Dummy request handler
- * @param
- * @retval None
- */
-static void APP_THREAD_DummyReqHandler(void * p_context,
- otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo)
-{
-}
/* USER CODE END FD_LOCAL_FUNCTIONS */
/*************************************************************
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 6da319929..e7049681d 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,37 +582,37 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
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
index 836f40dcf..cf8a5baa6 100644
--- 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
@@ -66,9 +66,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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
index f580a14ee..d5db0e33f 100644
--- 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
@@ -40,7 +40,7 @@
#define HAL_HSEM_MODULE_ENABLED
/*#define HAL_I2C_MODULE_ENABLED */
/*#define HAL_I2S_MODULE_ENABLED */
-/*#define HAL_IPCC_MODULE_ENABLED */
+#define HAL_IPCC_MODULE_ENABLED
/*#define HAL_IRDA_MODULE_ENABLED */
/*#define HAL_IWDG_MODULE_ENABLED */
/*#define HAL_LCD_MODULE_ENABLED */
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
index 07cbd808c..a3a535f13 100644
--- 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
@@ -24,7 +24,7 @@
#ifdef __cplusplus
extern "C" {
-#endif
+#endif
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
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
index 81698db9e..7a153e763 100644
--- 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
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "main.h"
@@ -235,7 +236,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
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
index c30d673c2..2874778d1 100644
--- 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
@@ -37,6 +37,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "app_entry.h"
@@ -165,11 +166,10 @@ void SystemClock_Config(void)
*/
HAL_PWR_EnableBkUpAccess();
__HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
- /** Configure the main internal regulator output voltage
+ /** Configure the main internal regulator output voltage
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
- /** Initializes the RCC Oscillators according to the specified parameters
- * in the RCC_OscInitTypeDef structure.
+ /** Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
|RCC_OSCILLATORTYPE_LSE;
@@ -182,7 +182,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
@@ -198,7 +198,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Initializes the peripherals clocks
+ /** Initializes the peripherals clocks
*/
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
|RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
@@ -366,10 +366,10 @@ static void MX_RTC_Init(void)
}
-/**
+/**
* Enable DMA controller clock
*/
-static void MX_DMA_Init(void)
+static void MX_DMA_Init(void)
{
/* DMA controller clock enable */
@@ -605,7 +605,7 @@ void Error_Handler(void)
* @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) */
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
index 20ff7a299..6fdb80557 100644
--- 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
@@ -118,11 +118,11 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
/* USER CODE END LPUART1_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_LPUART1_CLK_ENABLE();
-
+
__HAL_RCC_GPIOA_CLK_ENABLE();
- /**LPUART1 GPIO Configuration
+ /**LPUART1 GPIO Configuration
PA2 ------> LPUART1_TX
- PA3 ------> LPUART1_RX
+ PA3 ------> LPUART1_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
@@ -163,13 +163,13 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
/* 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
+ /**USART1 GPIO Configuration
PA11 ------> USART1_CTS
PB6 ------> USART1_TX
- PB7 ------> USART1_RX
+ PB7 ------> USART1_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
@@ -228,10 +228,10 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
/* USER CODE END LPUART1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_LPUART1_CLK_DISABLE();
-
- /**LPUART1 GPIO Configuration
+
+ /**LPUART1 GPIO Configuration
PA2 ------> LPUART1_TX
- PA3 ------> LPUART1_RX
+ PA3 ------> LPUART1_RX
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
@@ -251,11 +251,11 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
/* USER CODE END USART1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_USART1_CLK_DISABLE();
-
- /**USART1 GPIO Configuration
+
+ /**USART1 GPIO Configuration
PA11 ------> USART1_CTS
PB6 ------> USART1_TX
- PB7 ------> USART1_RX
+ PB7 ------> USART1_RX
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11);
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
index 60caa009c..636b316a4 100644
--- 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
@@ -66,7 +66,7 @@ extern UART_HandleTypeDef huart1;
/* USER CODE END EV */
/******************************************************************************/
-/* Cortex Processor Interruption and Exception Handlers */
+/* Cortex Processor Interruption and Exception Handlers */
/******************************************************************************/
/**
* @brief This function handles Non maskable interrupt.
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
index 53776984b..3d8986fa7 100644
--- 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
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "utilities_common.h"
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
index a58b95cad..e7049681d 100644
--- 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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/USB_Device/CDC_Standalone/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/USB_Device/CDC_Standalone/Core/Src/system_stm32wbxx.c
index f1d3f0db4..706ee9182 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/USB_Device/CDC_Standalone/Core/Src/system_stm32wbxx.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/USB_Device/CDC_Standalone/Core/Src/system_stm32wbxx.c
@@ -123,21 +123,12 @@
/*!< Uncomment the following line if you need to relocate your vector Table in
Internal SRAM. */
-#ifdef CORE_CM0PLUS
-/* #define VECT_TAB_SRAM */
-#define VECT_TAB_OFFSET 0x0U /*!< Vector Table base offset field.
- This value must be a multiple of 0x100. */
-
-#define VECT_TAB_BASE_ADDRESS SRAM2A_BASE /*!< Vector Table base address field.
- This value must be a multiple of 0x100. */
-#else
/* #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. */
-#endif
/**
* @}
*/
@@ -201,22 +192,12 @@
void SystemInit(void)
{
/* Configure the Vector Table location add offset address ------------------*/
-#ifdef CORE_CM0PLUS
-#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 CPU2 */
-#else
- /* program in FLASH */
- SCB->VTOR = VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
-#endif /* Program memory type */
-#else
#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
-#endif
/* FPU settings ------------------------------------------------------------*/
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
@@ -355,14 +336,8 @@ void SystemCoreClockUpdate(void)
}
/* Compute HCLK clock frequency --------------------------------------------*/
-#ifdef CORE_CM0PLUS
- /* Get HCLK2 prescaler */
- tmp = AHBPrescTable[((RCC->EXTCFGR & RCC_EXTCFGR_C2HPRE) >> RCC_EXTCFGR_C2HPRE_Pos)];
-
-#else
/* Get HCLK1 prescaler */
tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)];
-#endif
/* HCLK clock frequency */
SystemCoreClock = SystemCoreClock / tmp;
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/USB_Device/DFU_Standalone/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/USB_Device/DFU_Standalone/Core/Src/system_stm32wbxx.c
index f1d3f0db4..706ee9182 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/USB_Device/DFU_Standalone/Core/Src/system_stm32wbxx.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/USB_Device/DFU_Standalone/Core/Src/system_stm32wbxx.c
@@ -123,21 +123,12 @@
/*!< Uncomment the following line if you need to relocate your vector Table in
Internal SRAM. */
-#ifdef CORE_CM0PLUS
-/* #define VECT_TAB_SRAM */
-#define VECT_TAB_OFFSET 0x0U /*!< Vector Table base offset field.
- This value must be a multiple of 0x100. */
-
-#define VECT_TAB_BASE_ADDRESS SRAM2A_BASE /*!< Vector Table base address field.
- This value must be a multiple of 0x100. */
-#else
/* #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. */
-#endif
/**
* @}
*/
@@ -201,22 +192,12 @@
void SystemInit(void)
{
/* Configure the Vector Table location add offset address ------------------*/
-#ifdef CORE_CM0PLUS
-#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 CPU2 */
-#else
- /* program in FLASH */
- SCB->VTOR = VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
-#endif /* Program memory type */
-#else
#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
-#endif
/* FPU settings ------------------------------------------------------------*/
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
@@ -355,14 +336,8 @@ void SystemCoreClockUpdate(void)
}
/* Compute HCLK clock frequency --------------------------------------------*/
-#ifdef CORE_CM0PLUS
- /* Get HCLK2 prescaler */
- tmp = AHBPrescTable[((RCC->EXTCFGR & RCC_EXTCFGR_C2HPRE) >> RCC_EXTCFGR_C2HPRE_Pos)];
-
-#else
/* Get HCLK1 prescaler */
tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)];
-#endif
/* HCLK clock frequency */
SystemCoreClock = SystemCoreClock / tmp;
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/USB_Device/HID_Standalone/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/USB_Device/HID_Standalone/Core/Src/system_stm32wbxx.c
index f1d3f0db4..706ee9182 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/USB_Device/HID_Standalone/Core/Src/system_stm32wbxx.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/USB_Device/HID_Standalone/Core/Src/system_stm32wbxx.c
@@ -123,21 +123,12 @@
/*!< Uncomment the following line if you need to relocate your vector Table in
Internal SRAM. */
-#ifdef CORE_CM0PLUS
-/* #define VECT_TAB_SRAM */
-#define VECT_TAB_OFFSET 0x0U /*!< Vector Table base offset field.
- This value must be a multiple of 0x100. */
-
-#define VECT_TAB_BASE_ADDRESS SRAM2A_BASE /*!< Vector Table base address field.
- This value must be a multiple of 0x100. */
-#else
/* #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. */
-#endif
/**
* @}
*/
@@ -201,22 +192,12 @@
void SystemInit(void)
{
/* Configure the Vector Table location add offset address ------------------*/
-#ifdef CORE_CM0PLUS
-#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 CPU2 */
-#else
- /* program in FLASH */
- SCB->VTOR = VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
-#endif /* Program memory type */
-#else
#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
-#endif
/* FPU settings ------------------------------------------------------------*/
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
@@ -355,14 +336,8 @@ void SystemCoreClockUpdate(void)
}
/* Compute HCLK clock frequency --------------------------------------------*/
-#ifdef CORE_CM0PLUS
- /* Get HCLK2 prescaler */
- tmp = AHBPrescTable[((RCC->EXTCFGR & RCC_EXTCFGR_C2HPRE) >> RCC_EXTCFGR_C2HPRE_Pos)];
-
-#else
/* Get HCLK1 prescaler */
tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)];
-#endif
/* HCLK clock frequency */
SystemCoreClock = SystemCoreClock / tmp;
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/USB_Device/MSC_Standalone/Core/Src/system_stm32wbxx.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/USB_Device/MSC_Standalone/Core/Src/system_stm32wbxx.c
index f1d3f0db4..706ee9182 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/USB_Device/MSC_Standalone/Core/Src/system_stm32wbxx.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/USB_Device/MSC_Standalone/Core/Src/system_stm32wbxx.c
@@ -123,21 +123,12 @@
/*!< Uncomment the following line if you need to relocate your vector Table in
Internal SRAM. */
-#ifdef CORE_CM0PLUS
-/* #define VECT_TAB_SRAM */
-#define VECT_TAB_OFFSET 0x0U /*!< Vector Table base offset field.
- This value must be a multiple of 0x100. */
-
-#define VECT_TAB_BASE_ADDRESS SRAM2A_BASE /*!< Vector Table base address field.
- This value must be a multiple of 0x100. */
-#else
/* #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. */
-#endif
/**
* @}
*/
@@ -201,22 +192,12 @@
void SystemInit(void)
{
/* Configure the Vector Table location add offset address ------------------*/
-#ifdef CORE_CM0PLUS
-#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 CPU2 */
-#else
- /* program in FLASH */
- SCB->VTOR = VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
-#endif /* Program memory type */
-#else
#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
-#endif
/* FPU settings ------------------------------------------------------------*/
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
@@ -355,14 +336,8 @@ void SystemCoreClockUpdate(void)
}
/* Compute HCLK clock frequency --------------------------------------------*/
-#ifdef CORE_CM0PLUS
- /* Get HCLK2 prescaler */
- tmp = AHBPrescTable[((RCC->EXTCFGR & RCC_EXTCFGR_C2HPRE) >> RCC_EXTCFGR_C2HPRE_Pos)];
-
-#else
/* Get HCLK1 prescaler */
tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)];
-#endif
/* HCLK clock frequency */
SystemCoreClock = SystemCoreClock / tmp;
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Coord/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Coord/Core/Inc/app_common.h
index 200abb160..15efa6e2e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Coord/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Coord/Core/Inc/app_common.h
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Coord/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Coord/Core/Src/app_entry.c
index 39a998aff..75b934fcb 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Coord/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Coord/Core/Src/app_entry.c
@@ -87,6 +87,7 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,17 +97,21 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -228,7 +233,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Coord/EWARM/Zigbee_APS_Coord.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Coord/EWARM/Zigbee_APS_Coord.ewp
index 0f853d660..fd70c41ea 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Coord/EWARM/Zigbee_APS_Coord.ewp
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Coord/EWARM/Zigbee_APS_Coord.ewp
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Coord/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Coord/STM32_WPAN/App/app_zigbee.c
index 0c1aa0789..f3ff7e2b6 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Coord/STM32_WPAN/App/app_zigbee.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Coord/STM32_WPAN/App/app_zigbee.c
@@ -259,7 +259,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
/* Initialization Complete */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Coord/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Coord/STM32_WPAN/Target/hw_ipcc.c
index 56f220e4e..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Coord/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Coord/STM32_WPAN/Target/hw_ipcc.c
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Router/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Router/Core/Inc/app_common.h
index 200abb160..15efa6e2e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Router/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Router/Core/Inc/app_common.h
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Router/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Router/Core/Src/app_entry.c
index 6c5c86420..b50efa68a 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Router/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Router/Core/Src/app_entry.c
@@ -87,6 +87,7 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,17 +97,21 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -228,7 +233,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Router/EWARM/Zigbee_APS_Router.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Router/EWARM/Zigbee_APS_Router.ewp
index 1ab0b501b..4e9ac7d08 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Router/EWARM/Zigbee_APS_Router.ewp
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Router/EWARM/Zigbee_APS_Router.ewp
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Router/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Router/STM32_WPAN/App/app_zigbee.c
index a8901921f..8c285594b 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Router/STM32_WPAN/App/app_zigbee.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Router/STM32_WPAN/App/app_zigbee.c
@@ -290,7 +290,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
/* Initialization Complete */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Router/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Router/STM32_WPAN/Target/hw_ipcc.c
index 56f220e4e..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Router/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_APS_Router/STM32_WPAN/Target/hw_ipcc.c
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****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
index 200abb160..15efa6e2e 100644
--- 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
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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
index 6c5c86420..b50efa68a 100644
--- 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
@@ -87,6 +87,7 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,17 +97,21 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -228,7 +233,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
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
index a54afde87..1367bbf02 100644
--- 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
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
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
index 86eeb0bc5..093249c8f 100644
--- 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
@@ -294,7 +294,7 @@ static void APP_ZIGBEE_Commissioning_Client_SetNwkCfg_cmd(uint8_t config_num, st
/* NWK address attribute */
APP_DBG("Modifying NKK address.");
- RemoteWriteReq.attr[0].attrId = ZCL_COMMISSION_CLI_ATTR_SHORT_ADDR;
+ RemoteWriteReq.attr[0].attrId = ZCL_COMMISSION_SVR_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;
@@ -302,7 +302,7 @@ static void APP_ZIGBEE_Commissioning_Client_SetNwkCfg_cmd(uint8_t config_num, st
/* Extended PAN ID attribute */
APP_DBG("Modifying extended PAN ID.");
- RemoteWriteReq.attr[1].attrId = ZCL_COMMISSION_CLI_ATTR_EPID;
+ RemoteWriteReq.attr[1].attrId = ZCL_COMMISSION_SVR_ATTR_EPID;
RemoteWriteReq.attr[1].type = ZCL_DATATYPE_BITMAP_64BIT;
putle64((uint8_t*)&epid, params->extendedPanID);
RemoteWriteReq.attr[1].value = (uint8_t const*)&epid;
@@ -310,14 +310,14 @@ static void APP_ZIGBEE_Commissioning_Client_SetNwkCfg_cmd(uint8_t config_num, st
/* Stack profile attribute */
APP_DBG("Modifying stack profile.");
- RemoteWriteReq.attr[2].attrId = ZCL_COMMISSION_CLI_ATTR_STACKPROFILE;
+ RemoteWriteReq.attr[2].attrId = ZCL_COMMISSION_SVR_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].attrId = ZCL_COMMISSION_SVR_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;
@@ -325,28 +325,28 @@ static void APP_ZIGBEE_Commissioning_Client_SetNwkCfg_cmd(uint8_t config_num, st
/* Use Insecure Join attribute */
APP_DBG("Modifying insecure join.");
- RemoteWriteReq.attr[4].attrId = ZCL_COMMISSION_CLI_ATTR_USEINSECJOIN;
+ RemoteWriteReq.attr[4].attrId = ZCL_COMMISSION_SVR_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].attrId = ZCL_COMMISSION_SVR_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].attrId = ZCL_COMMISSION_SVR_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].attrId = ZCL_COMMISSION_SVR_ATTR_STARTUPCONTROL;
RemoteWriteReq.attr[7].type = ZCL_DATATYPE_ENUMERATION_8BIT;
RemoteWriteReq.attr[7].value = (uint8_t const*)&params->startupControl;
RemoteWriteReq.attr[7].length = 1;
@@ -373,7 +373,7 @@ static void APP_ZIGBEE_Commissioning_Client_SetNwkCfg_cmd(uint8_t config_num, st
/* Scan attemps attribute */
APP_DBG("Modifying scan attemps.");
- RemoteWriteReq.attr[0].attrId = ZCL_COMMISSION_CLI_ATTR_SCANATTEMPTS;
+ RemoteWriteReq.attr[0].attrId = ZCL_COMMISSION_SVR_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;
@@ -592,7 +592,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
zigbee_app_info.startupControl = ZbStartTypeJoin;
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
index 56f220e4e..e7049681d 100644
--- 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
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
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
index 200abb160..15efa6e2e 100644
--- 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
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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
index 6c5c86420..b50efa68a 100644
--- 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
@@ -87,6 +87,7 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,17 +97,21 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -228,7 +233,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
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
index 54a684090..17336b38e 100644
--- 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
@@ -354,7 +354,6 @@
<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>
@@ -363,8 +362,7 @@
<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$/../../../../../../Middlewares/ST/STM32_WPAN/zigbee/stack/include/mac</state>
<state>$PROJ_DIR$/../../../../../../Drivers/CMSIS/Include</state>
<state>$PROJ_DIR$/../../../../../../Utilities/sequencer</state>
<state>$PROJ_DIR$/../../../../../../Utilities/lpm/tiny_lpm</state>
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
index 823f23c51..09861c980 100644
--- 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
@@ -264,6 +264,7 @@ static enum ZclStatusCodeT APP_ZIGBEE_Commissioning_ResetStartup_cb(struct ZbZcl
/* reset the current network configuration */
memset(&currentConfig, 0, sizeof(currentConfig));
+ currentConfig.stackProfile = ZB_NWK_STACK_PROFILE_PRO;
status = ZbZclCommissionServerSetStartup(zigbee_app_info.commissioning_server, &currentConfig);
if(status !=ZCL_STATUS_SUCCESS){
APP_DBG("Error, ZbZclCommissionServerSetStartup failed.");
@@ -312,6 +313,7 @@ static void APP_ZIGBEE_Commissioning_Server_Init(void){
/* Init nwk configuration with NULL values */
memset(&config, 0, sizeof(config));
+ config.stackProfile = ZB_NWK_STACK_PROFILE_PRO;
status = ZbZclCommissionServerSetStartup(zigbee_app_info.commissioning_server, &config);
if (status != ZCL_STATUS_SUCCESS){
@@ -329,37 +331,37 @@ static enum ZclStatusCodeT ZbZclCommissionServerSetStartup(struct ZbZclClusterT
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);
+ /* ZCL_COMMISSION_SVR_ATTR_SHORT_ADDR */
+ status = ZbZclAttrIntegerWrite(clusterPtr, ZCL_COMMISSION_SVR_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);
+ /* ZCL_COMMISSION_SVR_ATTR_EPID */
+ status = ZbZclAttrIntegerWrite(clusterPtr, ZCL_COMMISSION_SVR_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);
+ /* ZCL_COMMISSION_SVR_ATTR_PANID */
+ status = ZbZclAttrIntegerWrite(clusterPtr, ZCL_COMMISSION_SVR_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));
+ /* ZCL_COMMISSION_SVR_ATTR_CHANNELMASK */
+ status = ZbZclAttrIntegerWrite(clusterPtr, ZCL_COMMISSION_SVR_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);
+ /* ZCL_COMMISSION_SVR_ATTR_STACKPROFILE */
+ status = ZbZclAttrIntegerWrite(clusterPtr, ZCL_COMMISSION_SVR_ATTR_STACKPROFILE, (uint8_t)config->stackProfile);
if (status != ZCL_STATUS_SUCCESS) {
return ZCL_STATUS_INCONSISTENT_STARTUP_STATE;
}
- /* ZCL_COMMISSION_CLI_ATTR_STARTUPCONTROL */
+ /* ZCL_COMMISSION_SVR_ATTR_STARTUPCONTROL */
switch (config->startupControl) {
case ZbStartTypePreconfigured:
case ZbStartTypeForm:
@@ -370,56 +372,56 @@ static enum ZclStatusCodeT ZbZclCommissionServerSetStartup(struct ZbZclClusterT
default:
return ZCL_STATUS_INCONSISTENT_STARTUP_STATE;
}
- status = ZbZclAttrIntegerWrite(clusterPtr, ZCL_COMMISSION_CLI_ATTR_STARTUPCONTROL, (enum ZbStartType)config->startupControl);
+ status = ZbZclAttrIntegerWrite(clusterPtr, ZCL_COMMISSION_SVR_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);
+ /* ZCL_COMMISSION_SVR_ATTR_TCADDR */
+ status = ZbZclAttrIntegerWrite(clusterPtr, ZCL_COMMISSION_SVR_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);
+ /* ZCL_COMMISSION_SVR_ATTR_NWKKEY */
+ status = ZbZclAttrWrite(clusterPtr, NULL, ZCL_COMMISSION_SVR_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);
+ /* ZCL_COMMISSION_SVR_ATTR_USEINSECJOIN */
+ status = ZbZclAttrIntegerWrite(clusterPtr, ZCL_COMMISSION_SVR_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);
+ /* ZCL_COMMISSION_SVR_ATTR_PRECONFLINKKEY */
+ status = ZbZclAttrWrite(clusterPtr, NULL, ZCL_COMMISSION_SVR_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);
+ /* ZCL_COMMISSION_SVR_ATTR_NWKKEYSEQNUM */
+ status = ZbZclAttrIntegerWrite(clusterPtr, ZCL_COMMISSION_SVR_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);
+ /* ZCL_COMMISSION_SVR_ATTR_NWKKEYTYPE */
+ status = ZbZclAttrIntegerWrite(clusterPtr, ZCL_COMMISSION_SVR_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);
+ /* ZCL_COMMISSION_SVR_ATTR_NWKMGRADDR */
+ status = ZbZclAttrIntegerWrite(clusterPtr, ZCL_COMMISSION_SVR_ATTR_NWKMGRADDR, (uint16_t)config->networkManagerAddress);
if (status != ZCL_STATUS_SUCCESS) {
return ZCL_STATUS_INCONSISTENT_STARTUP_STATE;
}
- /* ZCL_COMMISSION_CLI_ATTR_SCANATTEMPTS */
+ /* ZCL_COMMISSION_SVR_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);
+ status = ZbZclAttrIntegerWrite(clusterPtr, ZCL_COMMISSION_SVR_ATTR_SCANATTEMPTS, (uint8_t)scan_count);
if (status != ZCL_STATUS_SUCCESS) {
return ZCL_STATUS_INCONSISTENT_STARTUP_STATE;
}
@@ -488,7 +490,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
zigbee_app_info.startupControl = ZbStartTypeJoin;
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
index 56f220e4e..e7049681d 100644
--- 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
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/Core/Inc/app_common.h
index 200abb160..15efa6e2e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/Core/Inc/app_common.h
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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 c325483c3..1edfb47a0 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
@@ -87,6 +87,7 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,17 +97,21 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -228,7 +233,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/EWARM/Zigbee_DevTemp_Client_Router.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/EWARM/Zigbee_DevTemp_Client_Router.ewp
index 0e464305e..1f20ee949 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/EWARM/Zigbee_DevTemp_Client_Router.ewp
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/EWARM/Zigbee_DevTemp_Client_Router.ewp
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
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 05f1dcf9f..b1d274c88 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
@@ -144,7 +144,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
/* Initialization Complete */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/STM32_WPAN/Target/hw_ipcc.c
index 56f220e4e..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/STM32_WPAN/Target/hw_ipcc.c
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/readme.txt
index cf1b6646f..10e6bfcaf 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/readme.txt
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Client_Router/readme.txt
@@ -36,8 +36,8 @@ Each device acts as a client.
--------- ---------
| | ZbZclReadReq | |
- PushB=>|Client | -----------------------------------> |Server | <= PushB ---> Increase Temp +2C ->ZbZclAttrIntegerWrite
- | | | | <= PushB ---> Decrease Temp -2C ->ZbZclAttrIntegerWrite
+PushB (SW1)=>|Client | -----------------------------------> |Server | <= PushB (SW1) ---> Increase Temp +2C ->ZbZclAttrIntegerWrite
+ | | | | <= PushB (SW2) ---> Decrease Temp -2C ->ZbZclAttrIntegerWrite
| | | |
| | ZbZclReadRsp | |=>LED Green
Display <=| | <----------------------------------- | |=>LED Red
@@ -47,7 +47,7 @@ Each device acts as a client.
This application requires at minimum two STM32WB55xx nucleo boards, but you can use up four boards.
-This application requests having the stm32wb5x_zigbee_full_fw.bin binary flashed on the wireless coprocessor
+This application requests having the stm32wb5x_Zigbee_FFD_fw.binbinary flashed on the wireless coprocessor
and the correct binary flashed on the application processor.
Important note :
@@ -113,9 +113,9 @@ Zigbee
@par How to use it ?
-=> Loading of the stm32wb5x_zigbee_full_fw.bin binary
+=> Loading of the stm32wb5x_Zigbee_FFD_fw.binbinary
- This application requests having the stm32wb5x_zigbee_full_fw.bin binary flashed on the Wireless Coprocessor.
+ This application requests having the stm32wb5x_Zigbee_FFD_fw.binbinary 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.
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/Core/Inc/app_common.h
index 200abb160..15efa6e2e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/Core/Inc/app_common.h
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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 44701026b..d670a91e0 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
@@ -87,6 +87,7 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,17 +97,21 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -228,7 +233,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/EWARM/Zigbee_DevTemp_Server_Coord.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/EWARM/Zigbee_DevTemp_Server_Coord.ewp
index 0c43c5487..7488c2819 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/EWARM/Zigbee_DevTemp_Server_Coord.ewp
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/EWARM/Zigbee_DevTemp_Server_Coord.ewp
@@ -355,7 +355,6 @@
<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>
@@ -365,7 +364,6 @@
<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>
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 f93766060..2d20cfcaf 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
@@ -153,7 +153,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
/* Initialization Complete */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/STM32_WPAN/Target/hw_ipcc.c
index 56f220e4e..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/STM32_WPAN/Target/hw_ipcc.c
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/readme.txt
index 2c471a53a..9014414af 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/readme.txt
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_DevTemp_Server_Coord/readme.txt
@@ -36,18 +36,18 @@ Device act as a server.
--------- ---------
| | ZbZclReadReq | |
- PushB=>|Client | -----------------------------------> |Server | <= PushB ---> Increase Temp +2C ->ZbZclAttrIntegerWrite
- | | | | <= PushB ---> Decrease Temp -2C ->ZbZclAttrIntegerWrite
+PushB (SW1)=>|Client | -----------------------------------> |Server | <= PushB (SW1) ---> Increase Temp +2C ->ZbZclAttrIntegerWrite
+ | | | | <= PushB (SW2) ---> Decrease Temp -2C ->ZbZclAttrIntegerWrite
| | | |
| | ZbZclReadRsp | |=>LED Green
Display <=| | <----------------------------------- | |=>LED Red
- Temp | | | |=> Display attributes written
+ Temp info | | | |=> Display attributes written
-------- ---------
This application requires at minimum two STM32WB55xx nucleo boards, but you can use up four boards.
-This application requests having the stm32wb5x_zigbee_full_fw.bin binary flashed on the wireless coprocessor
+This application requests having the stm32wb5x_Zigbee_FFD_fw.binbinary flashed on the wireless coprocessor
and the correct binary flashed on the application processor.
Important note :
@@ -117,9 +117,9 @@ Zigbee
@par How to use it ?
-=> Loading of the stm32wb5x_zigbee_full_fw.bin binary
+=> Loading of the stm32wb5x_Zigbee_FFD_fw.binbinary
- This application requests having the stm32wb5x_zigbee_full_fw.bin binary flashed on the Wireless Coprocessor.
+ This application requests having the stm32wb5x_Zigbee_FFD_fw.binbinary 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.
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
index 200abb160..15efa6e2e 100644
--- 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
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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
index 20213cbe9..998032400 100644
--- 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
@@ -87,6 +87,7 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,17 +97,21 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -228,7 +233,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
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
index 501f6bcdf..72993ed62 100644
--- 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
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
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
index eb90bca1e..5bb278d4e 100644
--- 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
@@ -238,7 +238,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
/* Initialization Complete */
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
index 56f220e4e..e7049681d 100644
--- 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
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
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
index 200abb160..15efa6e2e 100644
--- 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
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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
index 39a998aff..75b934fcb 100644
--- 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
@@ -87,6 +87,7 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,17 +97,21 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -228,7 +233,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
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
index 5da5a7535..87f41cf8b 100644
--- 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
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
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
index 0944b4f5a..52653fa7b 100644
--- 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
@@ -205,7 +205,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
/* Initialization Complete */
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
index 56f220e4e..e7049681d 100644
--- 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
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
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
index 200abb160..15efa6e2e 100644
--- 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
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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
index 968aa040b..8b56617dc 100644
--- 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
@@ -87,6 +87,7 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,17 +97,21 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -228,7 +233,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
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
index b05f67923..a14cfceb0 100644
--- 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
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
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
index 6405d9c75..3deb3be36 100644
--- 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
@@ -41,8 +41,8 @@
/* DoorLock specific defines -------------------------------------------------*/
#define USER_ID 0x1
-#define USER_STATUS DOORLOCK_USER_STATUS_OCC_ENABLED
-#define USER_TYPE DOORLOCK_USER_TYPE_UNRESTRICTED
+#define USER_STATUS ZCL_DRLK_USER_STATUS_OCC_ENABLED
+#define USER_TYPE ZCL_DRLK_USER_TYPE_UNRESTRICTED
#define PIN_CODE "PASSWD"
/* external definition */
@@ -162,7 +162,7 @@ static void APP_ZIGBEE_DoorLock_Client_Init(void){
DoorLockSetPinReq.user_status = USER_STATUS;
DoorLockSetPinReq.user_type = USER_TYPE;
DoorLockSetPinReq.pin_len = sizeof(PIN_CODE);
- memset(DoorLockSetPinReq.pin, 0, DOORLOCK_MAX_PIN);
+ memset(DoorLockSetPinReq.pin, 0, ZCL_DRLK_MAX_PIN_LEN);
memcpy(DoorLockSetPinReq.pin, PIN_CODE, DoorLockSetPinReq.pin_len);
/* Send the request */
@@ -194,7 +194,7 @@ static void APP_ZIGBEE_DoorLock_Client_Send_Lock(void){
/* 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);
+ memset(ZbZclDoorLockLockDoorReq.pin, 0, ZCL_DRLK_MAX_PIN_LEN);
memcpy(ZbZclDoorLockLockDoorReq.pin, PIN_CODE, ZbZclDoorLockLockDoorReq.pin_len);
/* Send the request */
@@ -226,7 +226,7 @@ static void APP_ZIGBEE_DoorLock_Client_Send_Unlock(void){
/* 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);
+ memset(DoorLockUnlockDoorReq.pin, 0, ZCL_DRLK_MAX_PIN_LEN);
memcpy(DoorLockUnlockDoorReq.pin, PIN_CODE, DoorLockUnlockDoorReq.pin_len);
/* Send the request */
@@ -253,7 +253,7 @@ static void APP_ZIGBEE_DoorLock_Client_Send_UnlockWithWrongPIN(void){
/* 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);
+ memset(DoorLockUnlockDoorReq.pin, 0, ZCL_DRLK_MAX_PIN_LEN);
memcpy(DoorLockUnlockDoorReq.pin, 0, 1);
/* Send the request */
@@ -335,27 +335,27 @@ static void APP_ZIGBEE_DoorLock_Cmd_Rsp_Mgmt(struct ZbZclCommandRspT *zcl_rsp){
memcpy(&rsp_status, zcl_rsp->payload, sizeof(rsp_status));
switch(zcl_rsp->hdr.cmdId){
- case ZCL_DOORLOCK_SVR_LOCK_RSP:
+ case ZCL_DRLK_SVR_LOCK_RSP:
/* DoorLock lock cmd response */
- if (rsp_status != DOORLOCK_STATUS_SUCCESS) {
+ if (rsp_status != ZCL_DRLK_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:
+ case ZCL_DRLK_SVR_UNLOCK_RSP:
/* DoorLock unlock cmd response */
- if (rsp_status != DOORLOCK_STATUS_SUCCESS) {
+ if (rsp_status != ZCL_DRLK_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:
+ case ZCL_DRLK_SVR_SETPIN_RSP:
/* DoorLock set_pin cmd response */
- if (rsp_status != DOORLOCK_STATUS_SUCCESS) {
+ if (rsp_status != ZCL_DRLK_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");
@@ -436,7 +436,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
/* Initialization Complete */
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
index 56f220e4e..e7049681d 100644
--- 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
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
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
index 200abb160..15efa6e2e 100644
--- 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
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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
index 44701026b..d670a91e0 100644
--- 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
@@ -87,6 +87,7 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,17 +97,21 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -228,7 +233,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
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
index 729bec42a..f84be807e 100644
--- 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
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
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
index 99189c9ba..a17140b98 100644
--- 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
@@ -145,7 +145,7 @@ PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t ZigbeeNotifRequestBuffer[siz
/* Adding required optional attributes */
static const struct ZbZclAttrT optionalAttrList[] = {
{
- ZCL_DOORLOCK_ATTR_DOORSTATE, ZCL_DATATYPE_UNSIGNED_8BIT,
+ ZCL_DRLK_ATTR_DOORSTATE, ZCL_DATATYPE_UNSIGNED_8BIT,
ZCL_ATTR_FLAG_CB_NOTIFY, 0, APP_ZIGBEE_DoorLock_Server_Attr_cb, {0, 0}, {0, 0}
},
};
@@ -280,10 +280,10 @@ static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_AttrNotify_cb(struct ZbZcl
}
switch(attributeId){
- case ZCL_DOORLOCK_ATTR_DOORSTATE:
+ case ZCL_DRLK_ATTR_DOORSTATE:
/* getting the door state */
- currentDoorState = (uint8_t)ZbZclAttrIntegerRead(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_DOORSTATE, NULL, &status);
+ currentDoorState = (uint8_t)ZbZclAttrIntegerRead(zigbee_app_info.doorlock_server, ZCL_DRLK_ATTR_DOORSTATE, NULL, &status);
if (status != ZCL_STATUS_SUCCESS){
APP_DBG("Error reading local attribute.");
return ZCL_STATUS_FAILURE;
@@ -292,7 +292,7 @@ static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_AttrNotify_cb(struct ZbZcl
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);
+ alarmMask = (uint16_t)ZbZclAttrIntegerRead(zigbee_app_info.doorlock_server, ZCL_DRLK_ATTR_ALARM_MASK, NULL, &status);
if (status != ZCL_STATUS_SUCCESS){
APP_DBG("Error reading local attribute.");
return ZCL_STATUS_FAILURE;
@@ -307,7 +307,7 @@ static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_AttrNotify_cb(struct ZbZcl
}
/* setting door state to closed */
- status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_DOORSTATE, DOORLOCK_DOORSTATE_CLOSE);
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DRLK_ATTR_DOORSTATE, DOORLOCK_DOORSTATE_CLOSE);
if(status != ZCL_STATUS_SUCCESS){
APP_DBG("Error writting local attribute.");
assert(0);
@@ -331,14 +331,14 @@ static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_Lock_cb(struct ZbZclCluste
struct ZbZclAddrInfoT *srcInfo, void *arg)
{
enum ZclStatusCodeT status;
- struct ZbZclDoorLockLockDoorRspT rsp = {.status = DOORLOCK_STATUS_FAIL};
+ struct ZbZclDoorLockLockDoorRspT rsp = {.status = ZCL_DRLK_STATUS_FAIL};
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);
+ currentMode = (uint8_t)ZbZclAttrIntegerRead(zigbee_app_info.doorlock_server, ZCL_DRLK_ATTR_MODE, NULL, &status);
if (status != ZCL_STATUS_SUCCESS){
APP_DBG("Error reading local attribute.");
(void) ZbZclDoorLockServerSendLockRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
@@ -348,14 +348,14 @@ static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_Lock_cb(struct ZbZclCluste
APP_DBG("Lock requested.");
/* Read the lock state */
- res = ZbZclAttrIntegerRead(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_LOCKSTATE, NULL, &status);
+ res = ZbZclAttrIntegerRead(zigbee_app_info.doorlock_server, ZCL_DRLK_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){
+ if(res == ZCL_DRLK_LOCKSTATE_LOCKED){
/* Lock already locked */
APP_DBG("Already locked!\n");
(void) ZbZclDoorLockServerSendLockRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
@@ -367,7 +367,7 @@ static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_Lock_cb(struct ZbZclCluste
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);
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DRLK_ATTR_LOCKSTATE, ZCL_DRLK_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);
@@ -375,7 +375,7 @@ static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_Lock_cb(struct ZbZclCluste
}
APP_DBG("Door locked!");
- rsp.status = DOORLOCK_STATUS_SUCCESS;
+ rsp.status = ZCL_DRLK_STATUS_SUCCESS;
BSP_LED_On(LED_GREEN);
APP_DBG("LED_GREEN ON\n");
@@ -385,8 +385,8 @@ static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_Lock_cb(struct ZbZclCluste
}
/* Check pin length */
- if(cmd_req->pin_len>DOORLOCK_MAX_PIN
- || cmd_req->pin_len<DOORLOCK_MIN_PIN){
+ if(cmd_req->pin_len>ZCL_DRLK_MAX_PIN_LEN
+ || cmd_req->pin_len<ZCL_DRLK_MIN_PIN_LEN){
APP_DBG("Error: Wrong pin format.\n");
(void) ZbZclDoorLockServerSendLockRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
@@ -402,7 +402,7 @@ static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_Lock_cb(struct ZbZclCluste
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);
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DRLK_ATTR_LOCKSTATE, ZCL_DRLK_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);
@@ -410,7 +410,7 @@ static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_Lock_cb(struct ZbZclCluste
}
APP_DBG("Door locked!");
- rsp.status = DOORLOCK_STATUS_SUCCESS;
+ rsp.status = ZCL_DRLK_STATUS_SUCCESS;
BSP_LED_On(LED_GREEN);
APP_DBG("LED_GREEN ON\n");
@@ -434,7 +434,7 @@ static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_Unlock_cb(struct ZbZclClus
struct ZbZclAddrInfoT *srcInfo, void *arg)
{
enum ZclStatusCodeT status;
- struct ZbZclDoorLockUnlockDoorRspT rsp = {.status = DOORLOCK_STATUS_FAIL};
+ struct ZbZclDoorLockUnlockDoorRspT rsp = {.status = ZCL_DRLK_STATUS_FAIL};
struct doorlock_info_t* info = (struct doorlock_info_t*) arg;
long long res;
uint32_t autoRelockTime = 0;
@@ -442,7 +442,7 @@ static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_Unlock_cb(struct ZbZclClus
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);
+ currentMode = (uint8_t)ZbZclAttrIntegerRead(zigbee_app_info.doorlock_server, ZCL_DRLK_ATTR_MODE, NULL, &status);
if (status != ZCL_STATUS_SUCCESS){
APP_DBG("Error reading local attribute.");
(void) ZbZclDoorLockServerSendUnlockRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
@@ -452,14 +452,14 @@ static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_Unlock_cb(struct ZbZclClus
APP_DBG("Unlock requested.");
/* Read the lock state */
- res = ZbZclAttrIntegerRead(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_LOCKSTATE, NULL, &status);
+ res = ZbZclAttrIntegerRead(zigbee_app_info.doorlock_server, ZCL_DRLK_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){
+ if(res == ZCL_DRLK_LOCKSTATE_UNLOCKED){
/* Lock already unlocked */
APP_DBG("Already unlocked!\n");
(void) ZbZclDoorLockServerSendUnlockRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
@@ -471,7 +471,7 @@ static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_Unlock_cb(struct ZbZclClus
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);
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DRLK_ATTR_LOCKSTATE, ZCL_DRLK_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);
@@ -479,7 +479,7 @@ static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_Unlock_cb(struct ZbZclClus
}
APP_DBG("Door unlocked!");
- rsp.status = DOORLOCK_STATUS_SUCCESS;
+ rsp.status = ZCL_DRLK_STATUS_SUCCESS;
BSP_LED_Off(LED_GREEN);
APP_DBG("LED_GREEN OFF\n");
@@ -489,8 +489,8 @@ static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_Unlock_cb(struct ZbZclClus
}
/* Check pin length */
- if(cmd_req->pin_len>DOORLOCK_MAX_PIN
- || cmd_req->pin_len<DOORLOCK_MIN_PIN){
+ if(cmd_req->pin_len>ZCL_DRLK_MAX_PIN_LEN
+ || cmd_req->pin_len<ZCL_DRLK_MIN_PIN_LEN){
APP_DBG("Error: Wrong pin format.\n");
(void) ZbZclDoorLockServerSendUnlockRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
@@ -506,7 +506,7 @@ static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_Unlock_cb(struct ZbZclClus
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);
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DRLK_ATTR_LOCKSTATE, ZCL_DRLK_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);
@@ -514,7 +514,7 @@ static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_Unlock_cb(struct ZbZclClus
}
/* Read the auto relock time value */
- autoRelockTime = ZbZclAttrIntegerRead(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_AUTO_RELOCK, NULL, &status);
+ autoRelockTime = ZbZclAttrIntegerRead(zigbee_app_info.doorlock_server, ZCL_DRLK_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);
@@ -525,7 +525,7 @@ static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_Unlock_cb(struct ZbZclClus
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;
+ rsp.status = ZCL_DRLK_STATUS_SUCCESS;
BSP_LED_Off(LED_GREEN);
APP_DBG("LED_GREEN OFF\n");
@@ -545,14 +545,14 @@ static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_Unlock_cb(struct ZbZclClus
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_FAIL};
+ struct ZbZclDoorLockSetPinRspT rsp = {.status = ZCL_DRLK_STATUS_FAIL};
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;
+ rsp.status = ZCL_DRLK_STATUS_MEM_FULL;
(void) ZbZclDoorLockServerSendSetPinRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
}
@@ -563,8 +563,8 @@ static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_SetPin_cb(struct ZbZclClus
}
/* PIN length check */
- if(cmd_req->pin_len>DOORLOCK_MAX_PIN
- || cmd_req->pin_len<DOORLOCK_MIN_PIN){
+ if(cmd_req->pin_len>ZCL_DRLK_MAX_PIN_LEN
+ || cmd_req->pin_len<ZCL_DRLK_MIN_PIN_LEN){
APP_DBG("Error: Wrong pin format.\n");
(void) ZbZclDoorLockServerSendSetPinRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
@@ -588,7 +588,7 @@ static enum ZclStatusCodeT APP_ZIGBEE_DoorLock_Server_SetPin_cb(struct ZbZclClus
/* 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;
+ rsp.status = ZCL_DRLK_STATUS_SUCCESS;
(void) ZbZclDoorLockServerSendSetPinRsp(clusterPtr, srcInfo, &rsp, NULL, NULL);
return ZCL_STATUS_SUCCESS_NO_DEFAULT_RESPONSE;
}
@@ -614,7 +614,7 @@ static void APP_ZIGBEE_DoorLock_Server_PassageMode(void){
uint8_t currentMode = 0;
/* Get current operating mode */
- currentMode = (uint8_t)ZbZclAttrIntegerRead(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_MODE, NULL, &status);
+ currentMode = (uint8_t)ZbZclAttrIntegerRead(zigbee_app_info.doorlock_server, ZCL_DRLK_ATTR_MODE, NULL, &status);
if (status != ZCL_STATUS_SUCCESS){
APP_DBG("Error reading local attribute.");
return;
@@ -625,7 +625,7 @@ static void APP_ZIGBEE_DoorLock_Server_PassageMode(void){
}
/* Get available operating modes */
- supportedModes = (uint16_t)ZbZclAttrIntegerRead(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_SUPPORTED_MODES, NULL, &status);
+ supportedModes = (uint16_t)ZbZclAttrIntegerRead(zigbee_app_info.doorlock_server, ZCL_DRLK_ATTR_SUPPORTED_MODES, NULL, &status);
if (status != ZCL_STATUS_SUCCESS){
APP_DBG("Error reading local attribute.");
return;
@@ -638,7 +638,7 @@ static void APP_ZIGBEE_DoorLock_Server_PassageMode(void){
}
/* Activate passage mode */
- status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_MODE, DOORLOCK_PASSAGE_MODE);
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DRLK_ATTR_MODE, DOORLOCK_PASSAGE_MODE);
if(status != ZCL_STATUS_SUCCESS){
APP_DBG("Error writting local attribute: cannot set operating mode.");
}
@@ -670,7 +670,7 @@ 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);
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DRLK_ATTR_MODE, DOORLOCK_NORMAL_MODE);
if(status != ZCL_STATUS_SUCCESS){
APP_DBG("Error writting local attribute: cannot set operating mode.");
}
@@ -701,7 +701,7 @@ static void APP_ZIGBEE_DoorLock_Server_AutoRelockTime(void){
APP_DBG("Auto Relock Time reached.");
/* Lock the door */
- status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_LOCKSTATE, DOORLOCK_LOCKSTATE_LOCKED);
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DRLK_ATTR_LOCKSTATE, ZCL_DRLK_LOCKSTATE_LOCKED);
if(status != ZCL_STATUS_SUCCESS){
APP_DBG("Error writting local attribute: cannot set lock state to 'unlocked'.\n");
return;
@@ -824,21 +824,21 @@ static void APP_ZIGBEE_DoorLock_Server_Init(void){
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);
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DRLK_ATTR_LOCKSTATE, ZCL_DRLK_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);
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DRLK_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,
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DRLK_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.");
@@ -846,21 +846,21 @@ static void APP_ZIGBEE_DoorLock_Server_Init(void){
}
/* Setting up operating mode attribute */
- status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_MODE, DOORLOCK_NORMAL_MODE);
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DRLK_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);
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DRLK_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);
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DRLK_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);
@@ -939,7 +939,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
/* Initialization Complete */
@@ -1194,7 +1194,7 @@ static void APP_ZIGBEE_SW1_Process(void){
}
/* Door state is forced opened */
- status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DOORLOCK_ATTR_DOORSTATE, DOORLOCK_DOORSTATE_ERROR_FORCED_OPEN);
+ status = ZbZclAttrIntegerWrite(zigbee_app_info.doorlock_server, ZCL_DRLK_ATTR_DOORSTATE, DOORLOCK_DOORSTATE_ERROR_FORCED_OPEN);
if(status != ZCL_STATUS_SUCCESS){
APP_DBG("Error writting local attribute.");
assert(0);
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
index 56f220e4e..e7049681d 100644
--- 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
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
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
index 200abb160..15efa6e2e 100644
--- 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
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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
index 20213cbe9..998032400 100644
--- 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
@@ -87,6 +87,7 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,17 +97,21 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -228,7 +233,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
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
index 19a023394..a1438bfae 100644
--- 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
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
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
index a69986f79..ec7d22f01 100644
--- 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
@@ -333,7 +333,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
/* Initialization Complete */
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
index 56f220e4e..e7049681d 100644
--- 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
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
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
index 200abb160..15efa6e2e 100644
--- 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
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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
index 39a998aff..75b934fcb 100644
--- 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
@@ -87,6 +87,7 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,17 +97,21 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -228,7 +233,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
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
index 4d147bcdd..3567d1ce3 100644
--- 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
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
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
index 74ea1db25..bb176cbe6 100644
--- 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
@@ -285,7 +285,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
/* Initialization Complete */
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
index 56f220e4e..e7049681d 100644
--- 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
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Client_Router/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Client_Router/Core/Inc/app_common.h
index 200abb160..15efa6e2e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Client_Router/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Client_Router/Core/Inc/app_common.h
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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 44701026b..d670a91e0 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
@@ -87,6 +87,7 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,17 +97,21 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -228,7 +233,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Client_Router/EWARM/Zigbee_MeterId_Client_Router.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Client_Router/EWARM/Zigbee_MeterId_Client_Router.ewp
index 4fb692e53..5e863a073 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Client_Router/EWARM/Zigbee_MeterId_Client_Router.ewp
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Client_Router/EWARM/Zigbee_MeterId_Client_Router.ewp
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
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 27b96ce8d..c148287a6 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
@@ -264,7 +264,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
/* Initialization Complete */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Client_Router/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Client_Router/STM32_WPAN/Target/hw_ipcc.c
index 56f220e4e..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Client_Router/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Client_Router/STM32_WPAN/Target/hw_ipcc.c
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Server_Coord/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Server_Coord/Core/Inc/app_common.h
index 200abb160..15efa6e2e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Server_Coord/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Server_Coord/Core/Inc/app_common.h
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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 fe64207bf..af9caa480 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
@@ -87,6 +87,7 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,17 +97,21 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -228,7 +233,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Server_Coord/EWARM/Zigbee_MeterId_Server_Coord.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Server_Coord/EWARM/Zigbee_MeterId_Server_Coord.ewp
index 22038395e..046731f2c 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Server_Coord/EWARM/Zigbee_MeterId_Server_Coord.ewp
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Server_Coord/EWARM/Zigbee_MeterId_Server_Coord.ewp
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
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 7a39e85ed..d1f0a6b74 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
@@ -197,7 +197,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
/* Initialization Complete */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Server_Coord/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Server_Coord/STM32_WPAN/Target/hw_ipcc.c
index 56f220e4e..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Server_Coord/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_MeterId_Server_Coord/STM32_WPAN/Target/hw_ipcc.c
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Client_Router/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Client_Router/Core/Inc/app_common.h
index 200abb160..15efa6e2e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Client_Router/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Client_Router/Core/Inc/app_common.h
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Client_Router/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Client_Router/Core/Src/app_entry.c
index 4ec6f72f9..572ee4f60 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Client_Router/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Client_Router/Core/Src/app_entry.c
@@ -87,6 +87,7 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,17 +97,21 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -228,7 +233,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
@@ -260,12 +265,9 @@ static void APPE_SysUserEvtRx( void * pPayload )
*/
static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
{
- switch (ErrorCode) // TODO
- {
- case ERR_THREAD_LLD_FATAL_ERROR:
- APP_DBG("** ERR_ZIGBEE : LLD_FATAL_ERROR \n");
- break;
- case ERR_THREAD_UNKNOWN_CMD:
+ switch (ErrorCode)
+ {
+ 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_OTA_Client_Router/EWARM/Zigbee_OTA_Client_Router.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Client_Router/EWARM/Zigbee_OTA_Client_Router.ewp
index 7d4fd6c03..1501830d1 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Client_Router/EWARM/Zigbee_OTA_Client_Router.ewp
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Client_Router/EWARM/Zigbee_OTA_Client_Router.ewp
@@ -354,7 +354,6 @@
<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>
@@ -365,9 +364,8 @@
<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/sequencer</state>
<state>$PROJ_DIR$/../../../../../../Utilities/lpm/tiny_lpm</state>
</option>
<option>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Client_Router/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Client_Router/STM32_WPAN/App/app_zigbee.c
index 945a1a890..0e85d64dc 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Client_Router/STM32_WPAN/App/app_zigbee.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Client_Router/STM32_WPAN/App/app_zigbee.c
@@ -936,7 +936,7 @@ static bool APP_ZIGBEE_NVM_Read(void)
{
uint16_t num_words = 0;
bool status = true;
- int ee_status;
+ int ee_status = 0;
HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_PGSERR | FLASH_FLAG_WRPERR | FLASH_FLAG_OPTVERR);
@@ -993,7 +993,7 @@ static bool APP_ZIGBEE_NVM_Read(void)
*/
static bool APP_ZIGBEE_NVM_Write(void)
{
- int ee_status;
+ int ee_status = 0;
uint16_t num_words;
uint16_t local_current_size;
@@ -1184,7 +1184,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
/* STEP 1 - TRY to START FROM PERSISTENCE */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Client_Router/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Client_Router/STM32_WPAN/Target/hw_ipcc.c
index 56f220e4e..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Client_Router/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Client_Router/STM32_WPAN/Target/hw_ipcc.c
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Client_Router/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Client_Router/readme.txt
index d448b85aa..bdc0f9ef1 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Client_Router/readme.txt
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Client_Router/readme.txt
@@ -192,7 +192,7 @@ To setup the application :
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_OTA_Server_Coord application (Device2 in the above diagram).
+ the device running Zigbee_OTA_Server_Coord application (Device1 in the above diagram).
Wait for the Blue LED (LED1) ON.
b) Start the second board. This board is configured as Zigbee router and will be attached to the network created
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Server_Coord/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Server_Coord/Core/Inc/app_common.h
index 200abb160..15efa6e2e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Server_Coord/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Server_Coord/Core/Inc/app_common.h
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Server_Coord/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Server_Coord/Core/Src/app_entry.c
index decb9d9f1..3fcf4db5e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Server_Coord/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Server_Coord/Core/Src/app_entry.c
@@ -87,6 +87,7 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,17 +97,21 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -228,7 +233,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
@@ -260,12 +265,9 @@ static void APPE_SysUserEvtRx( void * pPayload )
*/
static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
{
- switch (ErrorCode) // TODO
- {
- case ERR_THREAD_LLD_FATAL_ERROR:
- APP_DBG("** ERR_ZIGBEE : LLD_FATAL_ERROR \n");
- break;
- case ERR_THREAD_UNKNOWN_CMD:
+ switch (ErrorCode)
+ {
+ 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_OTA_Server_Coord/EWARM/Zigbee_OTA_Server_Coord.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Server_Coord/EWARM/Zigbee_OTA_Server_Coord.ewp
index 40ba6008d..7bb7d9a06 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Server_Coord/EWARM/Zigbee_OTA_Server_Coord.ewp
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Server_Coord/EWARM/Zigbee_OTA_Server_Coord.ewp
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Server_Coord/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Server_Coord/STM32_WPAN/App/app_zigbee.c
index 63cfa6d43..7fdc46830 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Server_Coord/STM32_WPAN/App/app_zigbee.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Server_Coord/STM32_WPAN/App/app_zigbee.c
@@ -801,7 +801,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
/* Initialization Complete */
@@ -1074,7 +1074,7 @@ static void APP_ZIGBEE_SW1_Process(void)
APP_DBG("[OTA] M4 application firmware upgrade available.\n");
/* Update OTA server context file type */
- OTA_server_info.ctx.file_type = IMAGE_TYPE_FW_APP;
+ OTA_server_info.ctx.file_type = (enum APP_ZIGBEE_OtaFileTypeDef_t) IMAGE_TYPE_FW_APP;
OTA_server_info.ctx.base_address = FUOTA_APP_FW_BINARY_ADDRESS;
OTA_server_info.ctx.magic_keyword = FUOTA_MAGIC_KEYWORD_APP;
OTA_server_info.ctx.file_version = FILE_VERSION_FW_APP;
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Server_Coord/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Server_Coord/STM32_WPAN/Target/hw_ipcc.c
index 56f220e4e..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Server_Coord/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Server_Coord/STM32_WPAN/Target/hw_ipcc.c
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Server_Coord/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Server_Coord/readme.txt
index dc499a20e..ee9f6a132 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Server_Coord/readme.txt
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OTA_Server_Coord/readme.txt
@@ -192,7 +192,7 @@ To setup the application :
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_OTA_Server_Coord application (Device2 in the above diagram).
+ the device running Zigbee_OTA_Server_Coord application (Device1 in the above diagram).
Wait for the Blue LED (LED1) ON.
b) Start the second board. This board is configured as Zigbee router and will be attached to the network created
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Distrib/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Distrib/Core/Inc/app_common.h
index 200abb160..15efa6e2e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Distrib/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Distrib/Core/Inc/app_common.h
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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 c325483c3..1edfb47a0 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
@@ -87,6 +87,7 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,17 +97,21 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -228,7 +233,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Distrib/EWARM/Zigbee_OnOff_Client_Distrib.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Distrib/EWARM/Zigbee_OnOff_Client_Distrib.ewp
index 4256d6b6e..db142aa6f 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Distrib/EWARM/Zigbee_OnOff_Client_Distrib.ewp
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Distrib/EWARM/Zigbee_OnOff_Client_Distrib.ewp
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
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 1f53e35df..e003eff44 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
@@ -140,7 +140,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
zigbee_app_info.startupControl = ZbStartTypeJoin;
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Distrib/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Distrib/STM32_WPAN/Target/hw_ipcc.c
index 56f220e4e..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Distrib/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Distrib/STM32_WPAN/Target/hw_ipcc.c
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/app_common.h
index 200abb160..cf8a5baa6 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/app_common.h
@@ -1,9 +1,10 @@
+/* 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.
@@ -16,7 +17,7 @@
*
******************************************************************************
*/
-
+/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef APP_COMMON_H
#define APP_COMMON_H
@@ -65,9 +66,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/app_conf.h
index dbc4506b6..413966a92 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/app_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/app_conf.h
@@ -1,9 +1,9 @@
+/* USER CODE BEGIN Header */
/**
******************************************************************************
* File Name : app_conf.h
* Description : Application configuration file for STM32WPAN Middleware.
- *
- ******************************************************************************
+ ******************************************************************************
* @attention
*
* <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
@@ -16,6 +16,7 @@
*
******************************************************************************
*/
+/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef APP_CONF_H
@@ -50,9 +51,7 @@
* 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.
+ * With the current wireless firmware implementation, this parameter shall be kept to 255
*
*/
#define CFG_TL_MOST_EVENT_PAYLOAD_SIZE 255 /**< Set to 255 with the memory manager and the mailbox */
@@ -65,9 +64,9 @@
/**
* Select UART interfaces
*/
-#define CFG_DEBUG_TRACE_UART hw_uart1
-#define CFG_CONSOLE_MENU
-#define CFG_CLI_UART hw_lpuart1
+#define CFG_DEBUG_TRACE_UART hw_uart1
+#define CFG_CONSOLE_MENU
+#define CFG_CLI_UART hw_lpuart1
/******************************************************************************
* USB interface
******************************************************************************/
@@ -172,7 +171,7 @@
typedef enum
{
- CFG_TIM_PROC_ID_ISR,
+ CFG_TIM_PROC_ID_ISR,
} CFG_TimProcID_t;
/******************************************************************************
@@ -273,29 +272,33 @@ typedef enum
/******************************************************************************
* Scheduler
******************************************************************************/
-/**
- * This is the list of task id required by the application
- * Each Id shall be in the range 0..31
- */
+ /**
+ * This is the list of task id required by the application
+ * Each Id shall be in the range 0..31
+ */
-typedef enum {
+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_BUTTON_SW1,
+ CFG_TASK_SYSTEM_HCI_ASYNCH_EVT,
#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 */
+ /* USER CODE BEGIN CFG_IdleTask_Id_t */
+ CFG_TASK_BUTTON_SW1,
+ /* 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)
#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_TASK */
+
+/* USER CODE END DEFINE_TASK */
/**
* This is the list of priority required by the application
@@ -308,25 +311,26 @@ typedef enum
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,
+ /**
+ * 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,
+ /* USER CODE BEGIN CFG_IdleEvt_Id_t */
+
+ /* 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)
#define EVENT_ZIGBEE_STARTUP_ENDED (1U << CFG_EVT_ZIGBEE_STARTUP_ENDED)
+/* USER CODE BEGIN DEFINE_EVENT */
-/******************************************************************************
- * Configure Log level for Application
- ******************************************************************************/
-#define APPLI_CONFIG_LOG_LEVEL LOG_LEVEL_INFO
-#define APPLI_PRINT_FILE_FUNC_LINE 0
+/* USER CODE END DEFINE_EVENT */
/******************************************************************************
* LOW POWER
@@ -335,8 +339,12 @@ typedef enum {
* 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 {
+typedef enum
+{
CFG_LPM_APP,
+ /* USER CODE BEGIN CFG_LPM_Id_t */
+
+ /* USER CODE END CFG_LPM_Id_t */
} CFG_LPM_Id_t;
/******************************************************************************
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/hw_conf.h
index d5f531b16..1e501ebda 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/hw_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/hw_conf.h
@@ -23,9 +23,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/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/stm32wbxx_hal_conf.h
index dd0b63d0f..573cacb53 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/stm32wbxx_hal_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/stm32wbxx_hal_conf.h
@@ -6,11 +6,11 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * <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
+ * 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
*
@@ -32,13 +32,14 @@
/**
* @brief This is the list of modules to be used in the HAL driver
*/
-#define HAL_MODULE_ENABLED
+#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 */
@@ -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
@@ -93,7 +95,7 @@
* 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)
+#if !defined (HSE_VALUE)
#define HSE_VALUE 32000000U /*!< Value of the External oscillator in Hz */
#endif /* HSE_VALUE */
@@ -121,7 +123,7 @@
/**
* @brief Internal Low Speed oscillator (LSI1) value.
*/
-#if !defined (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
@@ -129,7 +131,7 @@
/**
* @brief Internal Low Speed oscillator (LSI2) value.
*/
-#if !defined (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
@@ -150,14 +152,14 @@
#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
+ * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source
* frequency.
*/
#if !defined (EXTERNAL_SAI1_CLOCK_VALUE)
@@ -170,11 +172,11 @@
/* ########################### 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 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
@@ -226,7 +228,7 @@
#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 */
@@ -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 */
@@ -286,7 +292,7 @@
#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 */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/stm_logging.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/stm_logging.h
index 6cb80639f..9271f4eea 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/stm_logging.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/stm_logging.h
@@ -19,41 +19,40 @@
#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 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__); \
+#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 */
+typedef enum
+{
+ APPLI_LOG_REGION_GENERAL = 1U, /* General */
+ APPLI_LOG_REGION_ZIGBEE_API = 2U, /* Zigbee API */
} appliLogRegion_t;
typedef uint8_t appliLogLevel_t;
void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char *aFormat, ...);
-#endif /* STM_LOGGING_H_ */
+#endif /* STM_LOGGING_H_ */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/utilities_conf.h
index 1da072f2d..d0169780c 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/utilities_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/utilities_conf.h
@@ -58,7 +58,7 @@ extern "C" {
#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
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 c325483c3..a48125803 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
@@ -1,8 +1,9 @@
+/* USER CODE BEGIN Header */
/**
******************************************************************************
* File Name : app_entry.c
- * Description : Entry application source file for STM32WPAN Middleware.
- ******************************************************************************
+ * Description : Entry application source file for STM32WPAN Middleware
+ ******************************************************************************
* @attention
*
* <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
@@ -15,6 +16,7 @@
*
******************************************************************************
*/
+/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
@@ -31,29 +33,55 @@
#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 -----------------------------------------------------------*/
-#define POOL_SIZE (CFG_TL_EVT_QUEUE_LENGTH * 4U * DIVC((sizeof(TL_PacketHeader_t) + TL_EVENT_FRAME_SIZE), 4U))
+/* 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 __write(int handle, const unsigned char *buf, size_t bufSize);
+#if(CFG_DEBUG_TRACE != 0)
+size_t DbgTraceWrite(int handle, const unsigned char * buf, size_t bufSize);
+#endif
+
+/* 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);
+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);
@@ -83,10 +111,11 @@ EXTI_HandleTypeDef exti_handle;
/* Functions Definition ------------------------------------------------------*/
void APPE_Init( void )
{
- SystemPower_Config(); /**< Configure the system Power Mode */
+ SystemPower_Config(); /**< Configure the system Power Mode */
- HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+ HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,16 +125,22 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
- * This system event is received with APPE_SysUserEvtRx()
- */
+ /**
+ * 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 */
- return;
+/* USER CODE END APPE_Init_2 */
+ return;
}
+/* USER CODE BEGIN FD */
+
+/* USER CODE END FD */
/*************************************************************
*
@@ -210,11 +245,10 @@ static void appe_Tl_Init( void )
return;
}
-
-static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
+static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
{
- UNUSED(status);
- return;
+ UNUSED(status);
+ return;
}
/**
@@ -228,7 +262,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
@@ -260,26 +294,26 @@ static void APPE_SysUserEvtRx( void * pPayload )
*/
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;
+ 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();
+ /* Traces channel initialization */
+ TL_TRACES_Init( );
- APP_ZIGBEE_Init();
- UTIL_LPM_SetOffMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
- return;
+ APP_ZIGBEE_Init();
+ UTIL_LPM_SetOffMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
+ return;
}
/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
@@ -313,6 +347,8 @@ static void Button_Init( void )
return;
}
+/* USER CODE END FD_LOCAL_FUNCTIONS */
+
/*************************************************************
*
* WRAP FUNCTIONS
@@ -336,25 +372,26 @@ void UTIL_SEQ_Idle( void )
*/
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;
- }
+ 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)
@@ -398,9 +435,10 @@ void TL_TRACES_EvtReceived( TL_EvtPacket_t * hcievt )
#if(CFG_DEBUG_TRACE != 0)
void DbgOutputInit( void )
{
- MX_USART1_UART_Init();
-
+#ifdef CFG_DEBUG_TRACE_UART
+ MX_USART1_UART_Init();
return;
+#endif
}
/**
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/main.c
index ac2d505be..a72e3ecdb 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/main.c
@@ -1,3 +1,4 @@
+/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
@@ -34,26 +35,49 @@
*
*
******************************************************************************
- */
-
+ */
+/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "app_entry.h"
+#include "app_common.h"
/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
#include "dbg_trace.h"
#include "hw_conf.h"
#include "otp.h"
#include "stm32_seq.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);
@@ -62,6 +86,7 @@ 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);
@@ -70,40 +95,64 @@ 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)
{
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
- HAL_Init();
+ /* USER CODE BEGIN 1 */
- Reset_Device();
- Config_HSE();
+ /* USER CODE END 1 */
- /* Configure the system clock */
- SystemClock_Config();
+ /* MCU Configuration--------------------------------------------------------*/
- PeriphClock_Config();
- Init_Exti(); /**< Configure the system Power Mode */
+ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
+ HAL_Init();
- /* Initialize all configured peripherals */
- MX_GPIO_Init();
- MX_DMA_Init();
- MX_RF_Init();
- MX_RTC_Init();
+ /* USER CODE BEGIN Init */
+
+ Reset_Device();
+ Config_HSE();
+
+ /* USER CODE END Init */
- /* Init the full application */
- APPE_Init();
+ /* Configure the system clock */
+ SystemClock_Config();
- /* Infinite loop */
+ /* USER CODE BEGIN SysInit */
+ PeriphClock_Config();
+ Init_Exti(); /**< Configure the system Power Mode */
+ /* USER CODE END SysInit */
- while (1) {
- UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+ /* 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 */
}
/**
@@ -116,8 +165,9 @@ void SystemClock_Config(void)
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
- /** Configure LSE Drive Capability
+ /** Configure LSE Drive Capability
*/
+ HAL_PWR_EnableBkUpAccess();
__HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
/** Configure the main internal regulator output voltage
*/
@@ -162,12 +212,14 @@ void SystemClock_Config(void)
PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE;
- PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE1;
-
+ PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE0;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
{
Error_Handler();
}
+ /* USER CODE BEGIN Smps */
+
+ /* USER CODE END Smps */
}
/**
@@ -178,29 +230,43 @@ void SystemClock_Config(void)
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();
- }
+ /* 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 */
}
@@ -212,29 +278,43 @@ void MX_LPUART1_UART_Init(void)
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();
- }
+ /* 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 */
}
@@ -246,6 +326,17 @@ void MX_USART1_UART_Init(void)
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 */
+
}
/**
@@ -256,8 +347,14 @@ static void MX_RF_Init(void)
static void MX_RTC_Init(void)
{
+ /* USER CODE BEGIN RTC_Init 0 */
- /** Initialize RTC Only
+ /* 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;
@@ -266,6 +363,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();
@@ -493,13 +591,18 @@ void HAL_Delay(uint32_t Delay)
}
}
+/* 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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/stm32_lpm_if.c
index 01d478092..ba034f27e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/stm32_lpm_if.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/stm32_lpm_if.c
@@ -17,8 +17,8 @@
******************************************************************************
*/
/* USER CODE END Header */
-
-/* Includes ------------------------------------------------------------------*/
+
+/* Includes ------------------------------------------------------------------*/
#include "stm32_lpm_if.h"
#include "stm32_lpm.h"
#include "app_conf.h"
@@ -27,14 +27,14 @@
/* USER CODE END include */
/* Exported variables --------------------------------------------------------*/
-const struct UTIL_LPM_Driver_s UTIL_PowerDriver =
+const struct UTIL_LPM_Driver_s UTIL_PowerDriver =
{
PWR_EnterSleepMode,
PWR_ExitSleepMode,
-
+
PWR_EnterStopMode,
- PWR_ExitStopMode,
-
+ PWR_ExitStopMode,
+
PWR_EnterOffMode,
PWR_ExitOffMode,
};
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/stm32wbxx_hal_msp.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/stm32wbxx_hal_msp.c
index bce4b8fb6..0b544f840 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/stm32wbxx_hal_msp.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/stm32wbxx_hal_msp.c
@@ -297,6 +297,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 */
MODIFY_REG(RTC->CR, RTC_CR_WUCKSEL, CFG_RTC_WUCKSEL_DIVIDER);
@@ -320,6 +321,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/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/stm32wbxx_it.c
index d4c0fcf5d..1034a7996 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/stm32wbxx_it.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/stm32wbxx_it.c
@@ -57,15 +57,10 @@
/* 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 */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/stm_logging.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/stm_logging.c
index 1bbd1a8ea..83c6a3f35 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/stm_logging.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Src/stm_logging.c
@@ -55,8 +55,6 @@
#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.
@@ -67,27 +65,23 @@
*
* @returns String with a log level color value.
*/
-static inline uint16_t
-logRegion(char *aLogString, uint16_t aMaxSize,
- appliLogRegion_t aLogRegion)
+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);
-}
+ char logRegionString[30U];
+
+ switch (aLogRegion)
+ {
+ case APPLI_LOG_REGION_GENERAL:
+ strcpy(logRegionString, "[M4 APPLICATION]");
+ break;
+ default:
+ strcpy(logRegionString, "[M4]");
+ break;
+ }
+ return snprintf(aLogString, aMaxSize, "%s ", logRegionString);
+}
#endif /* CFG_DEBUG_TRACE */
#if (LOG_RTT_COLOR_ENABLE == 1U)
@@ -184,15 +178,15 @@ void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, cons
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);
+ /* 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)
{
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/EWARM/Zigbee_OnOff_Client_Router.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/EWARM/Zigbee_OnOff_Client_Router.ewp
index aa4f1bc87..f5f7b1a96 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/EWARM/Zigbee_OnOff_Client_Router.ewp
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/EWARM/Zigbee_OnOff_Client_Router.ewp
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
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 b5464b771..a2c656864 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
@@ -1,20 +1,22 @@
+/* USER CODE BEGIN Header */
/**
******************************************************************************
- * File Name : App/app_zigbee.c
- * Description : Zigbee Application.
- ******************************************************************************
- * @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 Name : App/app_zigbee.c
+ * Description : Zigbee Application.
+ ******************************************************************************
+ * @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"
@@ -29,26 +31,42 @@
#include "zigbee_types.h"
#include "stm32_seq.h"
+/* Private includes -----------------------------------------------------------*/
#include <assert.h>
#include "zcl/zcl.h"
#include "zcl/zcl.onoff.h"
-#include "zcl/zcl.identify.h"
+
+/* USER CODE BEGIN Includes */
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN PTD */
+/* USER CODE END PTD */
/* Private defines -----------------------------------------------------------*/
#define APP_ZIGBEE_STARTUP_FAIL_DELAY 500U
-#define SW1_ENDPOINT 17
+#define CHANNEL 13
+
+#define SW1_ENDPOINT 17
+
+/* USER CODE BEGIN PD */
#define SW1_GROUP_ADDR 0x0001
-#define CHANNEL 13
+/* USER CODE END PD */
-/* external definition */
+/* Private macros ------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+/* USER CODE END PM */
+
+/* External definition -------------------------------------------------------*/
enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+/* USER CODE BEGIN ED */
+/* USER CODE END ED */
+
/* 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_NwkForm(void);
-static void APP_ZIGBEE_ConfigGroupAddr(void);
static void APP_ZIGBEE_TraceError(const char *pMess, uint32_t ErrCode);
static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void);
@@ -57,7 +75,12 @@ static void Wait_Getting_Ack_From_M0(void);
static void Receive_Ack_From_M0(void);
static void Receive_Notification_From_M0(void);
-/* Private variables -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+static void APP_ZIGBEE_SW1_Process(void);
+static void APP_ZIGBEE_ConfigGroupAddr(void);
+/* USER CODE END PFP */
+
+/* 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;
@@ -77,12 +100,19 @@ struct zigbee_app_info {
uint32_t join_delay;
bool init_after_join;
- struct ZbZclClusterT *onoff_client_1;
+ struct ZbZclClusterT *onOff_client_1;
};
static struct zigbee_app_info zigbee_app_info;
+/* USER CODE BEGIN PV */
+/* USER CODE END PV */
/* Functions Definition ------------------------------------------------------*/
+/**
+ * @brief Zigbee application initialization
+ * @param None
+ * @retval None
+ */
void APP_ZIGBEE_Init(void)
{
SHCI_CmdStatus_t ZigbeeInitStatus;
@@ -100,14 +130,17 @@ void APP_ZIGBEE_Init(void)
/* 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);
+ /* USER CODE BEGIN APP_ZIGBEE_INIT */
/* Task associated with push button SW1 */
UTIL_SEQ_RegTask(1U << CFG_TASK_BUTTON_SW1, UTIL_SEQ_RFU, APP_ZIGBEE_SW1_Process);
+ /* USER CODE END APP_ZIGBEE_INIT */
/* Start the Zigbee on the CPU2 side */
ZigbeeInitStatus = SHCI_C2_ZIGBEE_Init();
@@ -119,7 +152,6 @@ void APP_ZIGBEE_Init(void)
} /* APP_ZIGBEE_Init */
-
/**
* @brief Initialize Zigbee stack layers
* @param None
@@ -135,41 +167,51 @@ static void APP_ZIGBEE_StackLayersInit(void)
/* Create the endpoint and cluster(s) */
APP_ZIGBEE_ConfigEndpoints();
+ /* USER CODE BEGIN APP_ZIGBEE_StackLayersInit */
BSP_LED_Off(LED_RED);
BSP_LED_Off(LED_GREEN);
BSP_LED_Off(LED_BLUE);
+ /* USER CODE END APP_ZIGBEE_StackLayersInit */
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 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;
+ /* 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_ONOFF_SWITCH;
/* Endpoint: SW1_ENDPOINT */
+ req.profileId = ZCL_PROFILE_HOME_AUTOMATION;
+ req.deviceId = ZCL_DEVICE_ONOFF_SWITCH;
req.endpoint = SW1_ENDPOINT;
ZbZclAddEndpoint(zigbee_app_info.zb, &req, &conf);
assert(conf.status == ZB_STATUS_SUCCESS);
- /* OnOff 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);
+ /* OnOff 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);
-}
+ /* USER CODE BEGIN CONFIG_ENDPOINT */
+ /* USER CODE END CONFIG_ENDPOINT */
+} /* APP_ZIGBEE_ConfigEndpoints */
/**
* @brief Handle Zigbee network forming and joining
@@ -183,36 +225,38 @@ static void APP_ZIGBEE_NwkForm(void)
struct ZbStartupT config;
enum ZbStatusCodeT status;
- /* Configure Zigbee Logging (only need to do this once, but this is a good place to put it) */
+ /* Configure Zigbee Logging */
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_ROUTER");
- zigbee_app_info.startupControl = ZbStartTypeJoin;
config.startupControl = zigbee_app_info.startupControl;
/* Using the default HA preconfigured Link Key */
- memcpy(config.security.preconfiguredLinkKey, sec_key_ha, ZB_SEC_KEYSIZE);
+ 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*/
+ 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. */
+ /* Using ZbStartupWait (blocking) */
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) {
+ /* USER CODE BEGIN 0 */
zigbee_app_info.join_delay = 0U;
zigbee_app_info.init_after_join = true;
BSP_LED_On(LED_BLUE);
}
else
{
+ /* USER CODE END 0 */
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;
}
@@ -223,6 +267,8 @@ static void APP_ZIGBEE_NwkForm(void)
{
UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, CFG_SCH_PRIO_0);
}
+
+ /* USER CODE BEGIN NW_FORM */
else
{
zigbee_app_info.init_after_join = false;
@@ -234,24 +280,8 @@ static void APP_ZIGBEE_NwkForm(void)
uint32_t bcast_timeout = 3;
ZbNwkSet(zigbee_app_info.zb, ZB_NWK_NIB_ID_NetworkBroadcastDeliveryTime, &bcast_timeout, sizeof(bcast_timeout));
}
-}
-
-/**
- * @brief Set group addressing mode
- * @param None
- * @retval None
- */
-static void APP_ZIGBEE_ConfigGroupAddr(void)
-{
- ZbApsmeAddGroupReqT req;
- ZbApsmeAddGroupConfT conf;
-
- memset(&req, 0, sizeof(req));
- req.endpt = SW1_ENDPOINT;
- req.groupAddr = SW1_GROUP_ADDR;
- ZbApsmeAddGroupReq(zigbee_app_info.zb, &req, &conf);
-
-} /* APP_ZIGBEE_ConfigGroupAddr */
+ /* USER CODE END NW_FORM */
+} /* APP_ZIGBEE_NwkForm */
/*************************************************************
* ZbStartupWait Blocking Call
@@ -315,8 +345,7 @@ void APP_ZIGBEE_Error(uint32_t ErrId, uint32_t ErrCode)
*************************************************************/
/**
- * @brief Warn the user that an error has occurred.In this case,
- * the LEDs on the Board will start blinking.
+ * @brief Warn the user that an error has occurred.
*
* @param pMess : Message associated to the error.
* @param ErrCode: Error code associated to the module (Zigbee or other module if any)
@@ -325,6 +354,7 @@ void APP_ZIGBEE_Error(uint32_t ErrId, uint32_t ErrCode)
static void APP_ZIGBEE_TraceError(const char *pMess, uint32_t ErrCode)
{
APP_DBG("**** Fatal error = %s (Err = %d)", pMess, ErrCode);
+ /* USER CODE BEGIN TRACE_ERROR */
while (1U == 1U) {
BSP_LED_Toggle(LED1);
HAL_Delay(500U);
@@ -333,6 +363,8 @@ static void APP_ZIGBEE_TraceError(const char *pMess, uint32_t ErrCode)
BSP_LED_Toggle(LED3);
HAL_Delay(500U);
}
+ /* USER CODE END TRACE_ERROR */
+
} /* APP_ZIGBEE_TraceError */
/**
@@ -371,34 +403,6 @@ static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void)
}
} /* APP_ZIGBEE_CheckWirelessFirmwareInfo */
-static void APP_ZIGBEE_SW1_Process()
-{
- struct ZbApsAddrT dst;
- uint64_t epid = 0U;
-
- if(zigbee_app_info.zb == NULL){
- return;
- }
-
- /* Check if the router joined the network */
- if (ZbNwkGet(zigbee_app_info.zb, ZB_NWK_NIB_ID_ExtendedPanId, &epid, sizeof(epid)) != ZB_STATUS_SUCCESS) {
- return;
- }
- if (epid == 0U) {
- return;
- }
-
- memset(&dst, 0, sizeof(dst));
- dst.mode = ZB_APSDE_ADDRMODE_GROUP;
- dst.endpoint = SW1_ENDPOINT;
- dst.nwkAddr = SW1_GROUP_ADDR;
-
- APP_DBG("SW1 PUSHED (SENDING TOGGLE TO GROUP 0x0001)");
- if (ZbZclOnOffClientToggleReq(zigbee_app_info.onoff_client_1, &dst, NULL, NULL) != ZCL_STATUS_SUCCESS) {
- APP_DBG("Error, ZbZclOnOffClientToggleReq failed (SW1_ENDPOINT)");
- }
-}
-
/*************************************************************
*
* WRAP FUNCTIONS
@@ -587,5 +591,54 @@ void APP_ZIGBEE_ProcessRequestM0ToM4(void)
CptReceiveRequestFromM0 = 0;
}
}
+/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
+
+/**
+ * @brief Set group addressing mode
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_ConfigGroupAddr(void)
+{
+ ZbApsmeAddGroupReqT req;
+ ZbApsmeAddGroupConfT conf;
+
+ memset(&req, 0, sizeof(req));
+ req.endpt = SW1_ENDPOINT;
+ req.groupAddr = SW1_GROUP_ADDR;
+ ZbApsmeAddGroupReq(zigbee_app_info.zb, &req, &conf);
+
+} /* APP_ZIGBEE_ConfigGroupAddr */
+
+static void APP_ZIGBEE_SW1_Process()
+{
+ struct ZbApsAddrT dst;
+ uint64_t epid = 0U;
+
+ if(zigbee_app_info.zb == NULL){
+ return;
+ }
+
+ /* Check if the router joined the network */
+ if (ZbNwkGet(zigbee_app_info.zb, ZB_NWK_NIB_ID_ExtendedPanId, &epid, sizeof(epid)) != ZB_STATUS_SUCCESS) {
+ return;
+ }
+ if (epid == 0U) {
+ return;
+ }
+
+ memset(&dst, 0, sizeof(dst));
+ dst.mode = ZB_APSDE_ADDRMODE_GROUP;
+ dst.endpoint = SW1_ENDPOINT;
+ dst.nwkAddr = SW1_GROUP_ADDR;
+
+ APP_DBG("SW1 PUSHED (SENDING TOGGLE TO GROUP 0x0001)");
+ if (ZbZclOnOffClientToggleReq(zigbee_app_info.onOff_client_1, &dst, NULL, NULL) != ZCL_STATUS_SUCCESS) {
+ APP_DBG("Error, ZbZclOnOffClientToggleReq failed (SW1_ENDPOINT)");
+ }
+}
+
+/* USER CODE END FD_LOCAL_FUNCTIONS */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/STM32_WPAN/App/app_zigbee.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/STM32_WPAN/App/app_zigbee.h
index 11fc8c399..7cfd8d187 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/STM32_WPAN/App/app_zigbee.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/STM32_WPAN/App/app_zigbee.h
@@ -16,6 +16,7 @@
*
******************************************************************************
*/
+/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef APP_ZIGBEE_H
#define APP_ZIGBEE_H
@@ -29,20 +30,47 @@ extern "C" {
#include "tl.h"
#include "tl_zigbee_hci.h"
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
/* Exported types ------------------------------------------------------------*/
+/* Application errors */
+/*------------------------------------*/
+
/*
- * List of all errors tracked by the Thread application
+ * List of all errors tracked by the Zigbee 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
+typedef enum
+{
+ ERR_REC_MULTI_MSG_FROM_M0,
+ ERR_ZIGBE_CMD_TO_M0,
+/* USER CODE BEGIN ERROR_APPLI_ENUM */
+
+/* USER CODE END ERROR_APPLI_ENUM */
+ ERR_ZIGBEE_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_ZIGBEE_Init(void);
@@ -52,7 +80,9 @@ void APP_ZIGBEE_ProcessNotifyM0ToM4(void);
void APP_ZIGBEE_ProcessRequestM0ToM4(void);
void APP_ZIGBEE_TL_INIT(void);
void Pre_ZigbeeCmdProcessing(void);
+/* USER CODE BEGIN EF */
+/* USER CODE END EF */
#ifdef __cplusplus
} /* extern "C" */
#endif
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/STM32_WPAN/Target/hw_ipcc.c
index 56f220e4e..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router/STM32_WPAN/Target/hw_ipcc.c
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router_Ota/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router_Ota/Core/Inc/app_common.h
index 200abb160..15efa6e2e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router_Ota/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router_Ota/Core/Inc/app_common.h
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router_Ota/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router_Ota/Core/Src/app_entry.c
index e87f4c52f..d4bccec3c 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router_Ota/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router_Ota/Core/Src/app_entry.c
@@ -87,6 +87,7 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,17 +97,21 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -228,7 +233,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router_Ota/EWARM/Zigbee_OnOff_Client_Router_Ota.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router_Ota/EWARM/Zigbee_OnOff_Client_Router_Ota.ewp
index 098a4d3c4..2f0304202 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router_Ota/EWARM/Zigbee_OnOff_Client_Router_Ota.ewp
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router_Ota/EWARM/Zigbee_OnOff_Client_Router_Ota.ewp
@@ -354,7 +354,6 @@
<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>
@@ -365,7 +364,6 @@
<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>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router_Ota/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router_Ota/STM32_WPAN/App/app_zigbee.c
index 644b8c8b0..7763b5d23 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router_Ota/STM32_WPAN/App/app_zigbee.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router_Ota/STM32_WPAN/App/app_zigbee.c
@@ -145,6 +145,7 @@ void APP_ZIGBEE_Init(void)
SHCI_CmdStatus_t ZigbeeInitStatus;
APP_DBG("APP_ZIGBEE_Init");
+ APP_DBG("New M4 OTA firmware successfully running.");
/* Check the compatibility with the Coprocessor Wireless Firmware loaded */
APP_ZIGBEE_CheckWirelessFirmwareInfo();
@@ -207,7 +208,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
zigbee_app_info.startupControl = ZbStartTypeJoin;
@@ -654,7 +655,7 @@ static bool APP_ZIGBEE_NVM_Read(void)
{
uint16_t num_words = 0;
bool status = true;
- int ee_status;
+ int ee_status = 0;
HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_PGSERR | FLASH_FLAG_WRPERR | FLASH_FLAG_OPTVERR);
@@ -711,7 +712,7 @@ static bool APP_ZIGBEE_NVM_Read(void)
*/
static bool APP_ZIGBEE_NVM_Write(void)
{
- int ee_status;
+ int ee_status = 0;
uint16_t num_words;
uint16_t local_current_size;
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router_Ota/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router_Ota/STM32_WPAN/Target/hw_ipcc.c
index 56f220e4e..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router_Ota/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_Router_Ota/STM32_WPAN/Target/hw_ipcc.c
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_SED/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_SED/Core/Inc/app_common.h
index 200abb160..15efa6e2e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_SED/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_SED/Core/Inc/app_common.h
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_SED/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_SED/Core/Src/app_entry.c
index b83625dc4..b24602844 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_SED/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_SED/Core/Src/app_entry.c
@@ -65,6 +65,19 @@ extern void MX_USART1_UART_Init(void);
/* 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 ------------------------------------------------------*/
@@ -74,25 +87,31 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
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(1U << CFG_LPM_APP, UTIL_LPM_DISABLE);
+ UTIL_LPM_SetOffMode(1 << CFG_LPM_APP, UTIL_LPM_DISABLE);
Led_Init();
Button_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+ RxUART_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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -224,7 +243,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
@@ -438,5 +457,62 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
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_OnOff_Client_SED/EWARM/Zigbee_OnOff_Client_SED.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_SED/EWARM/Zigbee_OnOff_Client_SED.ewp
index 91f38a101..1fd42c81c 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_SED/EWARM/Zigbee_OnOff_Client_SED.ewp
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_SED/EWARM/Zigbee_OnOff_Client_SED.ewp
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_SED/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_SED/STM32_WPAN/App/app_zigbee.c
index 5a70158f0..3a96877af 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_SED/STM32_WPAN/App/app_zigbee.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_SED/STM32_WPAN/App/app_zigbee.c
@@ -188,7 +188,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
zigbee_app_info.startupControl = ZbStartTypeJoin;
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_SED/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_SED/STM32_WPAN/Target/hw_ipcc.c
index 56f220e4e..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_SED/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Client_SED/STM32_WPAN/Target/hw_ipcc.c
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Coord_NVM/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Coord_NVM/Core/Inc/app_common.h
index 200abb160..15efa6e2e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Coord_NVM/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Coord_NVM/Core/Inc/app_common.h
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Coord_NVM/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Coord_NVM/Core/Src/app_entry.c
index 42043aec9..b50efa68a 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Coord_NVM/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Coord_NVM/Core/Src/app_entry.c
@@ -87,6 +87,7 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,17 +97,21 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -228,7 +233,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
@@ -260,12 +265,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_Coord_NVM/EWARM/Zigbee_OnOff_Coord_NVM.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Coord_NVM/EWARM/Zigbee_OnOff_Coord_NVM.ewp
index c6d6b9c71..9c34a1f72 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Coord_NVM/EWARM/Zigbee_OnOff_Coord_NVM.ewp
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Coord_NVM/EWARM/Zigbee_OnOff_Coord_NVM.ewp
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Coord_NVM/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Coord_NVM/STM32_WPAN/App/app_zigbee.c
index a75c16de1..a6eca8287 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Coord_NVM/STM32_WPAN/App/app_zigbee.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Coord_NVM/STM32_WPAN/App/app_zigbee.c
@@ -148,7 +148,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
zigbee_app_info.startupControl = ZbStartTypeJoin;
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Coord_NVM/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Coord_NVM/STM32_WPAN/Target/hw_ipcc.c
index 56f220e4e..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Coord_NVM/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Coord_NVM/STM32_WPAN/Target/hw_ipcc.c
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Coord_NVM/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Coord_NVM/readme.txt
index 57c7a9887..c1ad4f6d7 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Coord_NVM/readme.txt
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Coord_NVM/readme.txt
@@ -26,7 +26,7 @@ How to use OnOff cluster with persistent data 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 OnOff cluster. Once the Zigbee mesh
network is created, the user can send requests from the client to the server through the push button
-in order to make the LED togglingaand with a restart from peristence of remote device.
+in order to make the LED toggling and with a restart from persistence of remote device.
For this application it is requested to have:
@@ -36,7 +36,7 @@ For this application it is requested to have:
- 1 or more STM32WB55xx board loaded with:
- wireless coprocessor : stm32wb5x_Zigbee_FFD_fw.bin
- - application : Zigbee_OnOff_Router_Persistent_Data
+ - application : Zigbee_OnOff_Router_NVM
Device 1 Device 2
@@ -57,7 +57,7 @@ To setup the application :
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_OnOff_Coord_Persistent_Data application (Device2 in the above diagram).
+ the device running Zigbee_OnOff_Coord_NVM application (Device2 in the above diagram).
Wait for the Blue LED (LED1) ON.
Start the second board. This board is configured as Zigbee router with persistence and will attached to the network created
@@ -66,20 +66,20 @@ To setup the application :
b) At this stage the second board tries to start from persistence this leads to two choices:
- - Peristence Data read from NVM are valid -> the router takes back is role in the network and restore the on/off cluster
+ - Persistent Data read from NVM are valid -> the router takes back is role in the network and restore the on/off cluster
attribute saved in NVM (LED3 on or off). GREEN LED2 is ON indicating a restart form persistence.
- - No persitence data found or wrong data,a fresh start is perfomed, the Zigbee network is automatically created
+ - No Persistent data found or wrong data, a fresh start is performed, the Zigbee network is automatically created
and BLUE LED (LED1) is ON on all devices.
It is now possible to send OnOff Cluster commands from the client to the server in multicast mode
by pressing on the SW1 push button.
- You must see the LED3 toggling on the server side. (this for all devices). Persistence Data are updated in NVM.Stack and cluster
+ You must see the LED3 toggling on the server side. (this for all devices). Persistence Data are updated in NVM. Stack and cluster
attribute (LED3 state).
- c) If the user power cycle the Device 1, Peristence Data are read back and cluster attribute (LED3 state) restored.
- The device start from peristence and GREEN LED LED2 is on.
+ c) If the user power cycle the Device 1, Persistent Data are read back and cluster attribute (LED3 state) restored.
+ The device start from Persistent and GREEN LED LED2 is on.
Pushing SW1 on any boards toggle LED3.
d) Push Button SW2 is used to delete NVM (fresh start will be done on next start up ,reproduce a))
@@ -142,4 +142,4 @@ Zigbee
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_OnOff_Router_NVM/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Router_NVM/Core/Inc/app_common.h
index 200abb160..15efa6e2e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Router_NVM/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Router_NVM/Core/Inc/app_common.h
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Router_NVM/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Router_NVM/Core/Src/app_entry.c
index a0f0ca79c..4533af8ba 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Router_NVM/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Router_NVM/Core/Src/app_entry.c
@@ -87,6 +87,7 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,17 +97,21 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -228,7 +233,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
@@ -260,12 +265,9 @@ static void APPE_SysUserEvtRx( void * pPayload )
*/
static void APPE_SysEvtError( SCHI_SystemErrCode_t ErrorCode)
{
- switch (ErrorCode) // TODO
- {
- case ERR_THREAD_LLD_FATAL_ERROR:
- APP_DBG("** ERR_ZIGBEE : LLD_FATAL_ERROR \n");
- break;
- case ERR_THREAD_UNKNOWN_CMD:
+ switch (ErrorCode)
+ {
+ 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_Router_NVM/EWARM/Zigbee_OnOff_Router_NVM.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Router_NVM/EWARM/Zigbee_OnOff_Router_NVM.ewp
index 519ecea46..a61b9c4dc 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Router_NVM/EWARM/Zigbee_OnOff_Router_NVM.ewp
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Router_NVM/EWARM/Zigbee_OnOff_Router_NVM.ewp
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Router_NVM/STM32_WPAN/App/app_zigbee.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Router_NVM/STM32_WPAN/App/app_zigbee.c
index c3b311d41..f4c0796a1 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Router_NVM/STM32_WPAN/App/app_zigbee.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Router_NVM/STM32_WPAN/App/app_zigbee.c
@@ -209,7 +209,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
zigbee_app_info.startupControl = ZbStartTypeJoin;
@@ -680,7 +680,7 @@ static bool APP_ZIGBEE_NVM_Read(void)
{
uint16_t num_words = 0;
bool status = true;
- int ee_status;
+ int ee_status = 0;
HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_PGSERR | FLASH_FLAG_WRPERR | FLASH_FLAG_OPTVERR);
@@ -737,7 +737,7 @@ static bool APP_ZIGBEE_NVM_Read(void)
*/
static bool APP_ZIGBEE_NVM_Write(void)
{
- int ee_status;
+ int ee_status = 0;
uint16_t num_words;
uint16_t local_current_size;
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Router_NVM/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Router_NVM/STM32_WPAN/Target/hw_ipcc.c
index 56f220e4e..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Router_NVM/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Router_NVM/STM32_WPAN/Target/hw_ipcc.c
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Router_NVM/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Router_NVM/readme.txt
index 36ea42de6..041f0c0a4 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Router_NVM/readme.txt
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Router_NVM/readme.txt
@@ -32,7 +32,7 @@ For this application it is requested to have:
- 1 STM32WB55xx board loaded with:
- wireless coprocessor : stm32wb5x_Zigbee_FFD_fw.bin
- - application : Zigbee_OnOff_Coord_Persistent_Data
+ - application : Zigbee_OnOff_Coord_NVM
- 1 or more STM32WB55xx board loaded with:
- wireless coprocessor : stm32wb5x_Zigbee_FFD_fw.bin
@@ -57,7 +57,7 @@ To setup the application :
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_OnOff_Coord_Persistent_Data application (Device2 in the above diagram).
+ the device running Zigbee_OnOff_Coord_NVM application (Device2 in the above diagram).
Wait for the Blue LED (LED1) ON.
Start the second board. This board is configured as Zigbee router with persistence and will attached to the network created
@@ -66,20 +66,20 @@ To setup the application :
b) At this stage the second board tries to start from persistence this leads to two choices:
- - Peristence Data read from NVM are valid -> the router takes back is role in the network and restore the on/off cluster
+ - Persistent Data read from NVM are valid -> the router takes back is role in the network and restore the on/off cluster
attribute saved in NVM (LED3 on or off). GREEN LED2 is ON indicating a restart form persistence.
- - No persitence data found or wrong data,a fresh start is perfomed, the Zigbee network is automatically created
+ - No Persistent data found or wrong data,a fresh start is performed, the Zigbee network is automatically created
and BLUE LED (LED1) is ON on all devices.
It is now possible to send OnOff Cluster commands from the client to the server in multicast mode
by pressing on the SW1 push button.
- You must see the LED3 toggling on the server side. (this for all devices). Persistence Data are updated in NVM.Stack and cluster
+ You must see the LED3 toggling on the server side. (this for all devices). Persistence Data are updated in NVM. Stack and cluster
attribute (LED3 state).
- c) If the user power cycle the Device 1, Peristence Data are read back and cluster attribute (LED3 state) restored.
- The device start from peristence and GREEN LED LED2 is on.
+ c) If the user power cycle the Device 1, Persistent Data are read back and cluster attribute (LED3 state) restored.
+ The device start from persistence and GREEN LED LED2 is on.
Pushing SW1 on any boards toggle LED3.
d) Push Button SW2 is used to delete NVM (fresh start will be done on next start up ,reproduce a))
@@ -142,4 +142,4 @@ Zigbee
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_OnOff_Server_Coord/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/app_common.h
index 200abb160..cf8a5baa6 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/app_common.h
@@ -1,9 +1,10 @@
+/* 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.
@@ -16,7 +17,7 @@
*
******************************************************************************
*/
-
+/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef APP_COMMON_H
#define APP_COMMON_H
@@ -65,9 +66,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/app_conf.h
index aed6bdcf5..036a65dca 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/app_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/app_conf.h
@@ -1,9 +1,9 @@
+/* USER CODE BEGIN Header */
/**
******************************************************************************
* File Name : app_conf.h
* Description : Application configuration file for STM32WPAN Middleware.
- *
- ******************************************************************************
+ ******************************************************************************
* @attention
*
* <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
@@ -16,6 +16,7 @@
*
******************************************************************************
*/
+/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef APP_CONF_H
@@ -50,9 +51,7 @@
* 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.
+ * With the current wireless firmware implementation, this parameter shall be kept to 255
*
*/
#define CFG_TL_MOST_EVENT_PAYLOAD_SIZE 255 /**< Set to 255 with the memory manager and the mailbox */
@@ -65,9 +64,9 @@
/**
* Select UART interfaces
*/
-#define CFG_DEBUG_TRACE_UART hw_uart1
-#define CFG_CONSOLE_MENU
-#define CFG_CLI_UART hw_lpuart1
+#define CFG_DEBUG_TRACE_UART hw_uart1
+#define CFG_CONSOLE_MENU
+#define CFG_CLI_UART hw_lpuart1
/******************************************************************************
* USB interface
******************************************************************************/
@@ -172,7 +171,7 @@
typedef enum
{
- CFG_TIM_PROC_ID_ISR,
+ CFG_TIM_PROC_ID_ISR,
} CFG_TimProcID_t;
/******************************************************************************
@@ -273,28 +272,33 @@ typedef enum
/******************************************************************************
* Scheduler
******************************************************************************/
-/**
- * This is the list of task id required by the application
- * Each Id shall be in the range 0..31
- */
+ /**
+ * This is the list of task id required by the application
+ * Each Id shall be in the range 0..31
+ */
-typedef enum {
+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_SYSTEM_HCI_ASYNCH_EVT,
#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 */
+ /* USER CODE BEGIN CFG_IdleTask_Id_t */
+
+ /* 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)
#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_TASK */
+
+/* USER CODE END DEFINE_TASK */
/**
* This is the list of priority required by the application
@@ -307,25 +311,26 @@ typedef enum
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,
+ /**
+ * 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,
+ /* USER CODE BEGIN CFG_IdleEvt_Id_t */
+
+ /* 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)
#define EVENT_ZIGBEE_STARTUP_ENDED (1U << CFG_EVT_ZIGBEE_STARTUP_ENDED)
+/* USER CODE BEGIN DEFINE_EVENT */
-/******************************************************************************
- * Configure Log level for Application
- ******************************************************************************/
-#define APPLI_CONFIG_LOG_LEVEL LOG_LEVEL_INFO
-#define APPLI_PRINT_FILE_FUNC_LINE 0
+/* USER CODE END DEFINE_EVENT */
/******************************************************************************
* LOW POWER
@@ -334,8 +339,12 @@ typedef enum {
* 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 {
+typedef enum
+{
CFG_LPM_APP,
+ /* USER CODE BEGIN CFG_LPM_Id_t */
+
+ /* USER CODE END CFG_LPM_Id_t */
} CFG_LPM_Id_t;
/******************************************************************************
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/hw_conf.h
index d5f531b16..1e501ebda 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/hw_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/hw_conf.h
@@ -23,9 +23,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/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/stm32wbxx_hal_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/stm32wbxx_hal_conf.h
index dd0b63d0f..573cacb53 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/stm32wbxx_hal_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/stm32wbxx_hal_conf.h
@@ -6,11 +6,11 @@
******************************************************************************
* @attention
*
- * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+ * <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
+ * 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
*
@@ -32,13 +32,14 @@
/**
* @brief This is the list of modules to be used in the HAL driver
*/
-#define HAL_MODULE_ENABLED
+#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 */
@@ -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
@@ -93,7 +95,7 @@
* 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)
+#if !defined (HSE_VALUE)
#define HSE_VALUE 32000000U /*!< Value of the External oscillator in Hz */
#endif /* HSE_VALUE */
@@ -121,7 +123,7 @@
/**
* @brief Internal Low Speed oscillator (LSI1) value.
*/
-#if !defined (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
@@ -129,7 +131,7 @@
/**
* @brief Internal Low Speed oscillator (LSI2) value.
*/
-#if !defined (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
@@ -150,14 +152,14 @@
#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
+ * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source
* frequency.
*/
#if !defined (EXTERNAL_SAI1_CLOCK_VALUE)
@@ -170,11 +172,11 @@
/* ########################### 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 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
@@ -226,7 +228,7 @@
#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 */
@@ -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 */
@@ -286,7 +292,7 @@
#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 */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/stm_logging.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/stm_logging.h
index 6cb80639f..9271f4eea 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/stm_logging.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/stm_logging.h
@@ -19,41 +19,40 @@
#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 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__); \
+#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 */
+typedef enum
+{
+ APPLI_LOG_REGION_GENERAL = 1U, /* General */
+ APPLI_LOG_REGION_ZIGBEE_API = 2U, /* Zigbee API */
} appliLogRegion_t;
typedef uint8_t appliLogLevel_t;
void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, const char *aFormat, ...);
-#endif /* STM_LOGGING_H_ */
+#endif /* STM_LOGGING_H_ */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/utilities_conf.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/utilities_conf.h
index 1da072f2d..d0169780c 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/utilities_conf.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/utilities_conf.h
@@ -58,7 +58,7 @@ extern "C" {
#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
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 39a998aff..be57c6f21 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
@@ -1,8 +1,9 @@
+/* USER CODE BEGIN Header */
/**
******************************************************************************
* File Name : app_entry.c
- * Description : Entry application source file for STM32WPAN Middleware.
- ******************************************************************************
+ * Description : Entry application source file for STM32WPAN Middleware
+ ******************************************************************************
* @attention
*
* <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
@@ -15,6 +16,7 @@
*
******************************************************************************
*/
+/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
@@ -31,29 +33,55 @@
#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 -----------------------------------------------------------*/
-#define POOL_SIZE (CFG_TL_EVT_QUEUE_LENGTH * 4U * DIVC((sizeof(TL_PacketHeader_t) + TL_EVENT_FRAME_SIZE), 4U))
+/* 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 __write(int handle, const unsigned char *buf, size_t bufSize);
+#if(CFG_DEBUG_TRACE != 0)
+size_t DbgTraceWrite(int handle, const unsigned char * buf, size_t bufSize);
+#endif
+
+/* 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);
+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);
@@ -83,10 +111,11 @@ EXTI_HandleTypeDef exti_handle;
/* Functions Definition ------------------------------------------------------*/
void APPE_Init( void )
{
- SystemPower_Config(); /**< Configure the system Power Mode */
+ SystemPower_Config(); /**< Configure the system Power Mode */
- HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+ HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,16 +125,22 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
- * This system event is received with APPE_SysUserEvtRx()
- */
+ /**
+ * 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 */
- return;
+/* USER CODE END APPE_Init_2 */
+ return;
}
+/* USER CODE BEGIN FD */
+
+/* USER CODE END FD */
/*************************************************************
*
@@ -210,11 +245,10 @@ static void appe_Tl_Init( void )
return;
}
-
-static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
+static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
{
- UNUSED(status);
- return;
+ UNUSED(status);
+ return;
}
/**
@@ -228,7 +262,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
@@ -260,26 +294,26 @@ static void APPE_SysUserEvtRx( void * pPayload )
*/
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;
+ 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();
+ /* Traces channel initialization */
+ TL_TRACES_Init( );
- APP_ZIGBEE_Init();
- UTIL_LPM_SetOffMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
- return;
+ APP_ZIGBEE_Init();
+ UTIL_LPM_SetOffMode(1U << CFG_LPM_APP, UTIL_LPM_ENABLE);
+ return;
}
/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
@@ -313,6 +347,8 @@ static void Button_Init( void )
return;
}
+/* USER CODE END FD_LOCAL_FUNCTIONS */
+
/*************************************************************
*
* WRAP FUNCTIONS
@@ -336,25 +372,26 @@ void UTIL_SEQ_Idle( void )
*/
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;
- }
+ 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)
@@ -398,9 +435,10 @@ void TL_TRACES_EvtReceived( TL_EvtPacket_t * hcievt )
#if(CFG_DEBUG_TRACE != 0)
void DbgOutputInit( void )
{
- MX_USART1_UART_Init();
-
+#ifdef CFG_DEBUG_TRACE_UART
+ MX_USART1_UART_Init();
return;
+#endif
}
/**
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/main.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/main.c
index ac2d505be..a72e3ecdb 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/main.c
@@ -1,3 +1,4 @@
+/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
@@ -34,26 +35,49 @@
*
*
******************************************************************************
- */
-
+ */
+/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "app_entry.h"
+#include "app_common.h"
/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
#include "dbg_trace.h"
#include "hw_conf.h"
#include "otp.h"
#include "stm32_seq.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);
@@ -62,6 +86,7 @@ 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);
@@ -70,40 +95,64 @@ 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)
{
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
- HAL_Init();
+ /* USER CODE BEGIN 1 */
- Reset_Device();
- Config_HSE();
+ /* USER CODE END 1 */
- /* Configure the system clock */
- SystemClock_Config();
+ /* MCU Configuration--------------------------------------------------------*/
- PeriphClock_Config();
- Init_Exti(); /**< Configure the system Power Mode */
+ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
+ HAL_Init();
- /* Initialize all configured peripherals */
- MX_GPIO_Init();
- MX_DMA_Init();
- MX_RF_Init();
- MX_RTC_Init();
+ /* USER CODE BEGIN Init */
+
+ Reset_Device();
+ Config_HSE();
+
+ /* USER CODE END Init */
- /* Init the full application */
- APPE_Init();
+ /* Configure the system clock */
+ SystemClock_Config();
- /* Infinite loop */
+ /* USER CODE BEGIN SysInit */
+ PeriphClock_Config();
+ Init_Exti(); /**< Configure the system Power Mode */
+ /* USER CODE END SysInit */
- while (1) {
- UTIL_SEQ_Run( UTIL_SEQ_DEFAULT );
+ /* 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 */
}
/**
@@ -116,8 +165,9 @@ void SystemClock_Config(void)
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
- /** Configure LSE Drive Capability
+ /** Configure LSE Drive Capability
*/
+ HAL_PWR_EnableBkUpAccess();
__HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
/** Configure the main internal regulator output voltage
*/
@@ -162,12 +212,14 @@ void SystemClock_Config(void)
PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
PeriphClkInitStruct.RFWakeUpClockSelection = RCC_RFWKPCLKSOURCE_LSE;
PeriphClkInitStruct.SmpsClockSelection = RCC_SMPSCLKSOURCE_HSE;
- PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE1;
-
+ PeriphClkInitStruct.SmpsDivSelection = RCC_SMPSCLKDIV_RANGE0;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
{
Error_Handler();
}
+ /* USER CODE BEGIN Smps */
+
+ /* USER CODE END Smps */
}
/**
@@ -178,29 +230,43 @@ void SystemClock_Config(void)
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();
- }
+ /* 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 */
}
@@ -212,29 +278,43 @@ void MX_LPUART1_UART_Init(void)
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();
- }
+ /* 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 */
}
@@ -246,6 +326,17 @@ void MX_USART1_UART_Init(void)
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 */
+
}
/**
@@ -256,8 +347,14 @@ static void MX_RF_Init(void)
static void MX_RTC_Init(void)
{
+ /* USER CODE BEGIN RTC_Init 0 */
- /** Initialize RTC Only
+ /* 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;
@@ -266,6 +363,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();
@@ -493,13 +591,18 @@ void HAL_Delay(uint32_t Delay)
}
}
+/* 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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/stm32_lpm_if.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/stm32_lpm_if.c
index 01d478092..ba034f27e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/stm32_lpm_if.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/stm32_lpm_if.c
@@ -17,8 +17,8 @@
******************************************************************************
*/
/* USER CODE END Header */
-
-/* Includes ------------------------------------------------------------------*/
+
+/* Includes ------------------------------------------------------------------*/
#include "stm32_lpm_if.h"
#include "stm32_lpm.h"
#include "app_conf.h"
@@ -27,14 +27,14 @@
/* USER CODE END include */
/* Exported variables --------------------------------------------------------*/
-const struct UTIL_LPM_Driver_s UTIL_PowerDriver =
+const struct UTIL_LPM_Driver_s UTIL_PowerDriver =
{
PWR_EnterSleepMode,
PWR_ExitSleepMode,
-
+
PWR_EnterStopMode,
- PWR_ExitStopMode,
-
+ PWR_ExitStopMode,
+
PWR_EnterOffMode,
PWR_ExitOffMode,
};
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/stm32wbxx_hal_msp.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/stm32wbxx_hal_msp.c
index bce4b8fb6..0b544f840 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/stm32wbxx_hal_msp.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/stm32wbxx_hal_msp.c
@@ -297,6 +297,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 */
MODIFY_REG(RTC->CR, RTC_CR_WUCKSEL, CFG_RTC_WUCKSEL_DIVIDER);
@@ -320,6 +321,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/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/stm32wbxx_it.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/stm32wbxx_it.c
index d4c0fcf5d..1034a7996 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/stm32wbxx_it.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/stm32wbxx_it.c
@@ -57,15 +57,10 @@
/* 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 */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/stm_logging.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/stm_logging.c
index 1bbd1a8ea..83c6a3f35 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/stm_logging.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Src/stm_logging.c
@@ -55,8 +55,6 @@
#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.
@@ -67,27 +65,23 @@
*
* @returns String with a log level color value.
*/
-static inline uint16_t
-logRegion(char *aLogString, uint16_t aMaxSize,
- appliLogRegion_t aLogRegion)
+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);
-}
+ char logRegionString[30U];
+
+ switch (aLogRegion)
+ {
+ case APPLI_LOG_REGION_GENERAL:
+ strcpy(logRegionString, "[M4 APPLICATION]");
+ break;
+ default:
+ strcpy(logRegionString, "[M4]");
+ break;
+ }
+ return snprintf(aLogString, aMaxSize, "%s ", logRegionString);
+}
#endif /* CFG_DEBUG_TRACE */
#if (LOG_RTT_COLOR_ENABLE == 1U)
@@ -184,15 +178,15 @@ void logApplication(appliLogLevel_t aLogLevel, appliLogRegion_t aLogRegion, cons
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);
+ /* 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)
{
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/EWARM/Zigbee_OnOff_Server_Coord.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/EWARM/Zigbee_OnOff_Server_Coord.ewp
index d59a5599d..5d0661e8a 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/EWARM/Zigbee_OnOff_Server_Coord.ewp
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/EWARM/Zigbee_OnOff_Server_Coord.ewp
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
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 8be1398fb..f70797893 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
@@ -1,20 +1,22 @@
+/* USER CODE BEGIN Header */
/**
******************************************************************************
- * File Name : App/app_zigbee.c
- * Description : Zigbee Application.
- ******************************************************************************
- * @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 Name : App/app_zigbee.c
+ * Description : Zigbee Application.
+ ******************************************************************************
+ * @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"
@@ -29,25 +31,42 @@
#include "zigbee_types.h"
#include "stm32_seq.h"
+/* Private includes -----------------------------------------------------------*/
#include <assert.h>
#include "zcl/zcl.h"
#include "zcl/zcl.onoff.h"
-#include "zcl/zcl.identify.h"
+
+/* USER CODE BEGIN Includes */
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN PTD */
+/* USER CODE END PTD */
/* Private defines -----------------------------------------------------------*/
#define APP_ZIGBEE_STARTUP_FAIL_DELAY 500U
-#define SW1_ENDPOINT 17
+#define CHANNEL 13
+
+#define SW1_ENDPOINT 17
+
+/* USER CODE BEGIN PD */
#define SW1_GROUP_ADDR 0x0001
-#define CHANNEL 13
+/* USER CODE END PD */
-/* external definition */
+/* Private macros ------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+/* USER CODE END PM */
+
+/* External definition -------------------------------------------------------*/
enum ZbStatusCodeT ZbStartupWait(struct ZigBeeT *zb, struct ZbStartupT *config);
+/* USER CODE BEGIN ED */
+/* USER CODE END ED */
+
/* 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_ConfigGroupAddr(void);
static void APP_ZIGBEE_TraceError(const char *pMess, uint32_t ErrCode);
static void APP_ZIGBEE_CheckWirelessFirmwareInfo(void);
@@ -56,7 +75,11 @@ static void Wait_Getting_Ack_From_M0(void);
static void Receive_Ack_From_M0(void);
static void Receive_Notification_From_M0(void);
-/* Private variables -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+static void APP_ZIGBEE_ConfigGroupAddr(void);
+/* USER CODE END PFP */
+
+/* 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;
@@ -76,18 +99,85 @@ struct zigbee_app_info {
uint32_t join_delay;
bool init_after_join;
- struct ZbZclClusterT *onoff_server_1;
+ struct ZbZclClusterT *onOff_server_1;
};
static struct zigbee_app_info zigbee_app_info;
-static enum ZclStatusCodeT onoff_server_off(struct ZbZclClusterT *clusterPtr,
- struct ZbZclAddrInfoT *srcInfo, void *arg);
-static enum ZclStatusCodeT onoff_server_on(struct ZbZclClusterT *clusterPtr,
- struct ZbZclAddrInfoT *srcInfo, void *arg);
-static enum ZclStatusCodeT onoff_server_toggle(struct ZbZclClusterT *clusterPtr,
- struct ZbZclAddrInfoT *srcInfo, void *arg);
+/* OnOff server 1 custom callbacks */
+static enum ZclStatusCodeT onOff_server_1_off(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *srcInfo, void *arg);
+static enum ZclStatusCodeT onOff_server_1_on(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *srcInfo, void *arg);
+static enum ZclStatusCodeT onOff_server_1_toggle(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *srcInfo, void *arg);
+
+static struct ZbZclOnOffServerCallbacksT OnOffServerCallbacks_1 = {
+ .off = onOff_server_1_off,
+ .on = onOff_server_1_on,
+ .toggle = onOff_server_1_toggle,
+};
+
+/* USER CODE BEGIN PV */
+/* USER CODE END PV */
/* Functions Definition ------------------------------------------------------*/
+/* OnOff server off 1 command callback */
+static enum ZclStatusCodeT onOff_server_1_off(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *srcInfo, void *arg){
+ /* USER CODE BEGIN 0 OnOff server 1 off 1 */
+ uint8_t endpoint;
+
+ endpoint = ZbZclClusterGetEndpoint(clusterPtr);
+ if (endpoint == SW1_ENDPOINT) {
+ APP_DBG("LED_RED OFF");
+ BSP_LED_Off(LED_RED);
+ (void)ZbZclAttrIntegerWrite(clusterPtr, ZCL_ONOFF_ATTR_ONOFF, 0);
+ }
+ else {
+ /* Unknown endpoint */
+ return ZCL_STATUS_FAILURE;
+ }
+ return ZCL_STATUS_SUCCESS;
+ /* USER CODE END 0 OnOff server 1 off 1 */
+}
+
+/* OnOff server on 1 command callback */
+static enum ZclStatusCodeT onOff_server_1_on(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *srcInfo, void *arg){
+ /* USER CODE BEGIN 1 OnOff server 1 on 1 */
+ uint8_t endpoint;
+
+ endpoint = ZbZclClusterGetEndpoint(clusterPtr);
+ if (endpoint == SW1_ENDPOINT) {
+ APP_DBG("LED_RED ON");
+ BSP_LED_On(LED_RED);
+ (void)ZbZclAttrIntegerWrite(clusterPtr, ZCL_ONOFF_ATTR_ONOFF, 1);
+ }
+ else {
+ /* Unknown endpoint */
+ return ZCL_STATUS_FAILURE;
+ }
+ return ZCL_STATUS_SUCCESS;
+ /* USER CODE END 1 OnOff server 1 on 1 */
+}
+
+/* OnOff server toggle 1 command callback */
+static enum ZclStatusCodeT onOff_server_1_toggle(struct ZbZclClusterT *clusterPtr, struct ZbZclAddrInfoT *srcInfo, void *arg){
+ /* USER CODE BEGIN 2 OnOff server 1 toggle 1 */
+ uint8_t attrVal;
+
+ if (ZbZclAttrRead(clusterPtr, ZCL_ONOFF_ATTR_ONOFF, NULL,
+ &attrVal, sizeof(attrVal), false) != ZCL_STATUS_SUCCESS) {
+ return ZCL_STATUS_FAILURE;
+ }
+ if (attrVal != 0) {
+ return onOff_server_1_off(clusterPtr, srcInfo, arg);
+ }
+ else {
+ return onOff_server_1_on(clusterPtr, srcInfo, arg);
+ }
+ /* USER CODE END 2 OnOff server 1 toggle 1 */
+}
+/**
+ * @brief Zigbee application initialization
+ * @param None
+ * @retval None
+ */
void APP_ZIGBEE_Init(void)
{
SHCI_CmdStatus_t ZigbeeInitStatus;
@@ -112,6 +202,9 @@ void APP_ZIGBEE_Init(void)
/* Task associated with network creation process */
UTIL_SEQ_RegTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, UTIL_SEQ_RFU, APP_ZIGBEE_NwkForm);
+ /* USER CODE BEGIN APP_ZIGBEE_INIT */
+ /* USER CODE END APP_ZIGBEE_INIT */
+
/* Start the Zigbee on the CPU2 side */
ZigbeeInitStatus = SHCI_C2_ZIGBEE_Init();
/* Prevent unused argument(s) compilation warning */
@@ -137,48 +230,51 @@ static void APP_ZIGBEE_StackLayersInit(void)
/* Create the endpoint and cluster(s) */
APP_ZIGBEE_ConfigEndpoints();
+ /* USER CODE BEGIN APP_ZIGBEE_StackLayersInit */
BSP_LED_Off(LED_RED);
BSP_LED_Off(LED_GREEN);
BSP_LED_Off(LED_BLUE);
+ /* USER CODE END APP_ZIGBEE_StackLayersInit */
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
- zigbee_app_info.startupControl = ZbStartTypeJoin;
+ zigbee_app_info.startupControl = ZbStartTypeForm;
/* 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;
- struct ZbZclOnOffServerCallbacksT onoff_callbacks;
memset(&req, 0, sizeof(req));
- req.profileId = ZCL_PROFILE_HOME_AUTOMATION;
- req.deviceId = ZCL_DEVICE_ONOFF_SWITCH;
-
- memset(&onoff_callbacks, 0, sizeof(onoff_callbacks));
- onoff_callbacks.off = onoff_server_off;
- onoff_callbacks.on = onoff_server_on;
- onoff_callbacks.toggle = onoff_server_toggle;
/* Endpoint: SW1_ENDPOINT */
+ req.profileId = ZCL_PROFILE_HOME_AUTOMATION;
+ req.deviceId = ZCL_DEVICE_ONOFF_SWITCH;
req.endpoint = SW1_ENDPOINT;
ZbZclAddEndpoint(zigbee_app_info.zb, &req, &conf);
assert(conf.status == ZB_STATUS_SUCCESS);
- /* OnOff Server */
- zigbee_app_info.onoff_server_1 = ZbZclOnOffServerAlloc(zigbee_app_info.zb, SW1_ENDPOINT, &onoff_callbacks, NULL);
- assert(zigbee_app_info.onoff_server_1 != NULL);
- ZbZclClusterEndpointRegister(zigbee_app_info.onoff_server_1);
+ /* OnOff server */
+ zigbee_app_info.onOff_server_1 = ZbZclOnOffServerAlloc(zigbee_app_info.zb, SW1_ENDPOINT, &OnOffServerCallbacks_1, NULL);
+ assert(zigbee_app_info.onOff_server_1 != NULL);
+ ZbZclClusterEndpointRegister(zigbee_app_info.onOff_server_1);
-} /* config_endpoints */
+ /* USER CODE BEGIN CONFIG_ENDPOINT */
+ /* USER CODE END CONFIG_ENDPOINT */
+} /* APP_ZIGBEE_ConfigEndpoints */
/**
* @brief Handle Zigbee network forming and joining
@@ -192,15 +288,15 @@ static void APP_ZIGBEE_NwkForm(void)
struct ZbStartupT config;
enum ZbStatusCodeT status;
- /* Configure Zigbee Logging (only need to do this once, but this is a good place to put it) */
+ /* Configure Zigbee Logging */
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;
+ APP_DBG("Network config : APP_STARTUP_CENTRALIZED_COORDINATOR");
+ config.startupControl = zigbee_app_info.startupControl;
/* Using the default HA preconfigured Link Key */
memcpy(config.security.preconfiguredLinkKey, sec_key_ha, ZB_SEC_KEYSIZE);
@@ -209,21 +305,22 @@ static void APP_ZIGBEE_NwkForm(void)
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. */
+ /* Using ZbStartupWait (blocking) */
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) {
+ /* USER CODE BEGIN 3 */
zigbee_app_info.join_delay = 0U;
zigbee_app_info.init_after_join = true;
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);
+ /* USER CODE END 3 */
+ 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;
}
}
@@ -233,6 +330,8 @@ static void APP_ZIGBEE_NwkForm(void)
{
UTIL_SEQ_SetTask(1U << CFG_TASK_ZIGBEE_NETWORK_FORM, CFG_SCH_PRIO_0);
}
+
+ /* USER CODE BEGIN NW_FORM */
else
{
zigbee_app_info.init_after_join = false;
@@ -244,79 +343,8 @@ static void APP_ZIGBEE_NwkForm(void)
uint32_t bcast_timeout = 3;
ZbNwkSet(zigbee_app_info.zb, ZB_NWK_NIB_ID_NetworkBroadcastDeliveryTime, &bcast_timeout, sizeof(bcast_timeout));
}
-}
-
-/**
- * @brief Set group addressing mode
- * @param None
- * @retval None
- */
-static void APP_ZIGBEE_ConfigGroupAddr(void)
-{
- ZbApsmeAddGroupReqT req;
- ZbApsmeAddGroupConfT conf;
-
- memset(&req, 0, sizeof(req));
- req.endpt = SW1_ENDPOINT;
- req.groupAddr = SW1_GROUP_ADDR;
- ZbApsmeAddGroupReq(zigbee_app_info.zb, &req, &conf);
-
-} /* APP_ZIGBEE_ConfigGroupAddr */
-
-/* Functions Definition ------------------------------------------------------*/
-
-static enum ZclStatusCodeT onoff_server_off(struct ZbZclClusterT *clusterPtr,
- struct ZbZclAddrInfoT *srcInfo, void *arg)
-{
- uint8_t endpoint;
-
- endpoint = ZbZclClusterGetEndpoint(clusterPtr);
- if (endpoint == SW1_ENDPOINT) {
- APP_DBG("LED_RED OFF");
- BSP_LED_Off(LED_RED);
- (void)ZbZclAttrIntegerWrite(clusterPtr, ZCL_ONOFF_ATTR_ONOFF, 0);
- }
- else {
- /* Unknown endpoint */
- return ZCL_STATUS_FAILURE;
- }
- return ZCL_STATUS_SUCCESS;
-}
-
-static enum ZclStatusCodeT onoff_server_on(struct ZbZclClusterT *clusterPtr,
- struct ZbZclAddrInfoT *srcInfo, void *arg)
-{
- uint8_t endpoint;
-
- endpoint = ZbZclClusterGetEndpoint(clusterPtr);
- if (endpoint == SW1_ENDPOINT) {
- APP_DBG("LED_RED ON");
- BSP_LED_On(LED_RED);
- (void)ZbZclAttrIntegerWrite(clusterPtr, ZCL_ONOFF_ATTR_ONOFF, 1);
- }
- else {
- /* Unknown endpoint */
- return ZCL_STATUS_FAILURE;
- }
- return ZCL_STATUS_SUCCESS;
-}
-
-static enum ZclStatusCodeT onoff_server_toggle(struct ZbZclClusterT *clusterPtr,
- struct ZbZclAddrInfoT *srcInfo, void *arg)
-{
- uint8_t attrVal;
-
- if (ZbZclAttrRead(clusterPtr, ZCL_ONOFF_ATTR_ONOFF, NULL,
- &attrVal, sizeof(attrVal), false) != ZCL_STATUS_SUCCESS) {
- return ZCL_STATUS_FAILURE;
- }
- if (attrVal != 0) {
- return onoff_server_off(clusterPtr, srcInfo, arg);
- }
- else {
- return onoff_server_on(clusterPtr, srcInfo, arg);
- }
-}
+ /* USER CODE END NW_FORM */
+} /* APP_ZIGBEE_NwkForm */
/*************************************************************
* ZbStartupWait Blocking Call
@@ -380,8 +408,7 @@ void APP_ZIGBEE_Error(uint32_t ErrId, uint32_t ErrCode)
*************************************************************/
/**
- * @brief Warn the user that an error has occurred.In this case,
- * the LEDs on the Board will start blinking.
+ * @brief Warn the user that an error has occurred.
*
* @param pMess : Message associated to the error.
* @param ErrCode: Error code associated to the module (Zigbee or other module if any)
@@ -390,6 +417,7 @@ void APP_ZIGBEE_Error(uint32_t ErrId, uint32_t ErrCode)
static void APP_ZIGBEE_TraceError(const char *pMess, uint32_t ErrCode)
{
APP_DBG("**** Fatal error = %s (Err = %d)", pMess, ErrCode);
+ /* USER CODE BEGIN TRACE_ERROR */
while (1U == 1U) {
BSP_LED_Toggle(LED1);
HAL_Delay(500U);
@@ -398,6 +426,8 @@ static void APP_ZIGBEE_TraceError(const char *pMess, uint32_t ErrCode)
BSP_LED_Toggle(LED3);
HAL_Delay(500U);
}
+ /* USER CODE END TRACE_ERROR */
+
} /* APP_ZIGBEE_TraceError */
/**
@@ -624,5 +654,26 @@ void APP_ZIGBEE_ProcessRequestM0ToM4(void)
CptReceiveRequestFromM0 = 0;
}
}
+/* USER CODE BEGIN FD_LOCAL_FUNCTIONS */
+
+/**
+ * @brief Set group addressing mode
+ * @param None
+ * @retval None
+ */
+static void APP_ZIGBEE_ConfigGroupAddr(void)
+{
+ ZbApsmeAddGroupReqT req;
+ ZbApsmeAddGroupConfT conf;
+
+ memset(&req, 0, sizeof(req));
+ req.endpt = SW1_ENDPOINT;
+ req.groupAddr = SW1_GROUP_ADDR;
+ ZbApsmeAddGroupReq(zigbee_app_info.zb, &req, &conf);
+
+} /* APP_ZIGBEE_ConfigGroupAddr */
+
+/* USER CODE END FD_LOCAL_FUNCTIONS */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/STM32_WPAN/App/app_zigbee.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/STM32_WPAN/App/app_zigbee.h
index 11fc8c399..7cfd8d187 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/STM32_WPAN/App/app_zigbee.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/STM32_WPAN/App/app_zigbee.h
@@ -16,6 +16,7 @@
*
******************************************************************************
*/
+/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef APP_ZIGBEE_H
#define APP_ZIGBEE_H
@@ -29,20 +30,47 @@ extern "C" {
#include "tl.h"
#include "tl_zigbee_hci.h"
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
/* Exported types ------------------------------------------------------------*/
+/* Application errors */
+/*------------------------------------*/
+
/*
- * List of all errors tracked by the Thread application
+ * List of all errors tracked by the Zigbee 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
+typedef enum
+{
+ ERR_REC_MULTI_MSG_FROM_M0,
+ ERR_ZIGBE_CMD_TO_M0,
+/* USER CODE BEGIN ERROR_APPLI_ENUM */
+
+/* USER CODE END ERROR_APPLI_ENUM */
+ ERR_ZIGBEE_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_ZIGBEE_Init(void);
@@ -52,7 +80,9 @@ void APP_ZIGBEE_ProcessNotifyM0ToM4(void);
void APP_ZIGBEE_ProcessRequestM0ToM4(void);
void APP_ZIGBEE_TL_INIT(void);
void Pre_ZigbeeCmdProcessing(void);
+/* USER CODE BEGIN EF */
+/* USER CODE END EF */
#ifdef __cplusplus
} /* extern "C" */
#endif
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/STM32_WPAN/Target/hw_ipcc.c
index 56f220e4e..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Coord/STM32_WPAN/Target/hw_ipcc.c
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Distrib/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Distrib/Core/Inc/app_common.h
index 200abb160..15efa6e2e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Distrib/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Distrib/Core/Inc/app_common.h
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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 39a998aff..75b934fcb 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
@@ -87,6 +87,7 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,17 +97,21 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -228,7 +233,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Distrib/EWARM/Zigbee_OnOff_Server_Distrib.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Distrib/EWARM/Zigbee_OnOff_Server_Distrib.ewp
index ae984f4b7..06ea07583 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Distrib/EWARM/Zigbee_OnOff_Server_Distrib.ewp
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Distrib/EWARM/Zigbee_OnOff_Server_Distrib.ewp
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
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 43efd6da3..2a7b025d2 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
@@ -142,7 +142,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
zigbee_app_info.startupControl = ZbStartTypeJoin;
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Distrib/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Distrib/STM32_WPAN/Target/hw_ipcc.c
index 56f220e4e..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Distrib/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_OnOff_Server_Distrib/STM32_WPAN/Target/hw_ipcc.c
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
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
index 200abb160..15efa6e2e 100644
--- 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
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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
index 6c5c86420..b50efa68a 100644
--- 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
@@ -87,6 +87,7 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,17 +97,21 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -228,7 +233,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
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
index 000ec44c3..a5d8340ec 100644
--- 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
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
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
index b5636a177..2909c87b8 100644
--- 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
@@ -402,7 +402,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
/* Initialization Complete */
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
index 56f220e4e..e7049681d 100644
--- 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
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (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
index cb12307f9..21cd390de 100644
--- 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
@@ -99,7 +99,7 @@ To setup the application :
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).
+ the device running Zigbee_PollControl_Client_Coord application (Device 1 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.
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
index 200abb160..15efa6e2e 100644
--- 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
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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
index 6c5c86420..b50efa68a 100644
--- 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
@@ -87,6 +87,7 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,17 +97,21 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -228,7 +233,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
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
index cea612521..3e13642c2 100644
--- 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
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
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
index 6d612a066..6286d040f 100644
--- 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
@@ -323,7 +323,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
/* Initialization Complete */
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
index 56f220e4e..e7049681d 100644
--- 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
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (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
index 8e262c42e..c990247b3 100644
--- 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
@@ -99,7 +99,7 @@ To setup the application :
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).
+ the device running Zigbee_PollControl_Client_Coord application (Device 1 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.
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/Core/Inc/app_common.h
index 200abb160..15efa6e2e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/Core/Inc/app_common.h
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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 fe64207bf..af9caa480 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
@@ -87,6 +87,7 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,17 +97,21 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -228,7 +233,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/EWARM/Zigbee_PowerProfile_Client_Coord.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/EWARM/Zigbee_PowerProfile_Client_Coord.ewp
index b94b7ffbc..e802d3e74 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/EWARM/Zigbee_PowerProfile_Client_Coord.ewp
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/EWARM/Zigbee_PowerProfile_Client_Coord.ewp
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
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 76da11f3f..74fd6ebbc 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
@@ -240,7 +240,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
/* Initialization Complete */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/STM32_WPAN/Target/hw_ipcc.c
index 56f220e4e..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/STM32_WPAN/Target/hw_ipcc.c
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/readme.txt
index 652c18a3b..1c6ec5067 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/readme.txt
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Client_Coord/readme.txt
@@ -160,7 +160,7 @@ To setup the application :
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).
+ the device running Zigbee_PowerProfile_Client_Coord application (Device 1 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.
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/Core/Inc/app_common.h
index 200abb160..15efa6e2e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/Core/Inc/app_common.h
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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 c325483c3..1edfb47a0 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
@@ -87,6 +87,7 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,17 +97,21 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -228,7 +233,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/EWARM/Zigbee_PowerProfile_Server_Router.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/EWARM/Zigbee_PowerProfile_Server_Router.ewp
index a8038cbea..cb791d500 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/EWARM/Zigbee_PowerProfile_Server_Router.ewp
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/EWARM/Zigbee_PowerProfile_Server_Router.ewp
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
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 d53e3eba0..842c23875 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
@@ -505,7 +505,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
/* Initialization Complete */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/STM32_WPAN/Target/hw_ipcc.c
index 56f220e4e..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/STM32_WPAN/Target/hw_ipcc.c
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/readme.txt
index b0fe49945..28a76455a 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/readme.txt
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/readme.txt
@@ -160,7 +160,7 @@ To setup the application :
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).
+ the device running Zigbee_PowerProfile_Client_Coord application (Device 1 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.
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/Core/Inc/app_common.h
index 200abb160..15efa6e2e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/Core/Inc/app_common.h
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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 c325483c3..1edfb47a0 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
@@ -87,6 +87,7 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,17 +97,21 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -228,7 +233,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/EWARM/Zigbee_PressMeas_Client_Router.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/EWARM/Zigbee_PressMeas_Client_Router.ewp
index 03f86a791..3120a77cd 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/EWARM/Zigbee_PressMeas_Client_Router.ewp
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/EWARM/Zigbee_PressMeas_Client_Router.ewp
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
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 9b9ab393f..f79643fda 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
@@ -145,7 +145,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
/* Initialization Complete */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/STM32_WPAN/Target/hw_ipcc.c
index 56f220e4e..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/STM32_WPAN/Target/hw_ipcc.c
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/readme.txt
index 8ad0fd061..a14d684f3 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/readme.txt
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Client_Router/readme.txt
@@ -22,10 +22,10 @@
@par Application Description
-How to use PressMeas cluster on a Centralized Zigbee network with device acting as router.
+How to use Pressure Measurement cluster on a Centralized Zigbee network with device acting as router.
The purpose of this application is to show how to create a centralized Zigbee network, and how to communicate
-from one node to another one using the PressMeas cluster. Once the Zigbee mesh network is created, the
+from one node to another one using the Pressure Measurement cluster. Once the Zigbee mesh network is created, the
user can send requests to the server boards through the push buttons in order to have current pressure,
min pressure that can be measured and max pressure that can be measured.
@@ -36,11 +36,11 @@ On this application, the Server send periodically reports back to the Client wit
--------- ---------
| | ZbZclReadReq | |
- PushB=>|Client | -----------------------------------> |Server | <= PushB ---> Increase Pressure ->ZbZclAttrIntegerWrite
- | | | | <= PushB ---> Decrease Pressure ->ZbZclAttrIntegerWrite
+ PushB=>|Client | -----------------------------------> |Server | <= PushB (SW1) --> Increase Pressure ->ZbZclAttrIntegerWrite
+ | | | | <= PushB (SW2) --> Decrease Pressure ->ZbZclAttrIntegerWrite
| | | |
- | | ZbZclReadRsp | |=>LED Green
- Display <=| | <----------------------------------- | |=>LED Red
+ | | ZbZclReadRsp | |=>LED Green (Pressure below max value)
+ Display <=| | <----------------------------------- | |=>LED Red (Max pressure reached)
Pressure | | | |=> Display attributes written
info | | | |
| | | |
@@ -52,7 +52,7 @@ On this application, the Server send periodically reports back to the Client wit
This application requires at minimum two STM32WB55xx nucleo boards, but you can use up four boards.
-This application requests having the stm32wb5x_zigbee_full_fw.bin binary flashed on the wireless coprocessor
+This application requests having the stm32wb5x_Zigbee_FFD_fw.binbinary flashed on the wireless coprocessor
and the correct binary flashed on the application processor.
Important note :
@@ -71,9 +71,13 @@ To run the application :
b) Wait for a few seconds (around 5 sec), in order to let the zigbee mesh network being created.
- c) At this stage, a Zigbee network is automatically created and it is possible to request Pressure Measurement Cluster attributes
- value in unicast mode by pressing on the SW1 push button.
- Client traces the current pressure, the min and max pressure experienced values .
+ c) At this stage, a Zigbee network is automatically created and an initial pressure is set and GREEN LED is ON.
+ pressing on the SW1 push button increase the pressure by 2C.
+ pressing on the SW2 push button decrease the pressure by 2C.
+
+ Once pressure is above a limit, GREEN LED is OFF and RED LED is ON.
+ If pressure is set back under the limit GREEN LED is ON and RED LED is OFF.
+ Server traces the current pressure, the min and max pressure experienced values written.
---------- -----------
@@ -118,9 +122,9 @@ Zigbee
@par How to use it ?
-=> Loading of the stm32wb5x_zigbee_full_fw.bin binary
+=> Loading of the stm32wb5x_Zigbee_FFD_fw.binbinary
- This application requests having the stm32wb5x_zigbee_full_fw.bin binary flashed on the Wireless Coprocessor.
+ This application requests having the stm32wb5x_Zigbee_FFD_fw.binbinary 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.
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/Core/Inc/app_common.h
index 200abb160..15efa6e2e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/Core/Inc/app_common.h
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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 44701026b..d670a91e0 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
@@ -87,6 +87,7 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,17 +97,21 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -228,7 +233,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/EWARM/Zigbee_PressMeas_Server_Coord.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/EWARM/Zigbee_PressMeas_Server_Coord.ewp
index 8cc9a5f63..ef38a8a8d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/EWARM/Zigbee_PressMeas_Server_Coord.ewp
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/EWARM/Zigbee_PressMeas_Server_Coord.ewp
@@ -355,7 +355,6 @@
<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>
@@ -365,7 +364,6 @@
<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>
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 40aadd895..315770b19 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
@@ -163,7 +163,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
/* Initialization Complete */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/STM32_WPAN/Target/hw_ipcc.c
index 56f220e4e..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/STM32_WPAN/Target/hw_ipcc.c
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/readme.txt
index 183097217..cd8b38bb1 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/readme.txt
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_PressMeas_Server_Coord/readme.txt
@@ -38,11 +38,11 @@ On this application, the Server send periodically reports back to the Client wit
--------- ---------
| | ZbZclReadReq | |
- PushB=>|Client | -----------------------------------> |Server | <= PushB ---> Increase Pressure ->ZbZclAttrIntegerWrite
- | | | | <= PushB ---> Decrease Pressure ->ZbZclAttrIntegerWrite
+ PushB=>|Client | -----------------------------------> |Server | <= PushB (SW1) --> Increase Pressure ->ZbZclAttrIntegerWrite
+ | | | | <= PushB (SW2) --> Decrease Pressure ->ZbZclAttrIntegerWrite
| | | |
- | | ZbZclReadRsp | |=>LED Green
- Display <=| | <----------------------------------- | |=>LED Red
+ | | ZbZclReadRsp | |=>LED Green (Pressure below max value)
+ Display <=| | <----------------------------------- | |=>LED Red (Max pressure reached)
Pressure | | | |=> Display attributes written
info | | | |
| | | |
@@ -54,7 +54,7 @@ On this application, the Server send periodically reports back to the Client wit
This application requires at minimum two STM32WB55xx nucleo boards, but you can use up four boards.
-This application requests having the stm32wb5x_zigbee_full_fw.bin binary flashed on the wireless coprocessor
+This application requests having the stm32wb5x_Zigbee_FFD_fw.binbinary flashed on the wireless coprocessor
and the correct binary flashed on the application processor.
Important note :
@@ -124,9 +124,9 @@ Zigbee
@par How to use it ?
-=> Loading of the stm32wb5x_zigbee_full_fw.bin binary
+=> Loading of the stm32wb5x_Zigbee_FFD_fw.binbinary
- This application requests having the stm32wb5x_zigbee_full_fw.bin binary flashed on the Wireless Coprocessor.
+ This application requests having the stm32wb5x_Zigbee_FFD_fw.binbinary 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.
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/Core/Inc/app_common.h
index 200abb160..15efa6e2e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/Core/Inc/app_common.h
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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 fe64207bf..af9caa480 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
@@ -87,6 +87,7 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,17 +97,21 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -228,7 +233,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/EWARM/Zigbee_SE_Msg_Client_Coord.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/EWARM/Zigbee_SE_Msg_Client_Coord.ewp
index 345a3ef9b..320d36e44 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/EWARM/Zigbee_SE_Msg_Client_Coord.ewp
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/EWARM/Zigbee_SE_Msg_Client_Coord.ewp
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
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 047db022c..915566504 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
@@ -208,7 +208,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
/* Initialization Complete */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/STM32_WPAN/Target/hw_ipcc.c
index 11ddfab23..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/STM32_WPAN/Target/hw_ipcc.c
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -361,54 +574,52 @@ void HW_IPCC_ZIGBEE_SendM4RequestToM0( 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;
}
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/readme.txt
index cbb3182ad..4e50664a8 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/readme.txt
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Client_Coord/readme.txt
@@ -46,7 +46,7 @@ Press SW2 on server => Send "Good Bye"
This application requires two STM32WB55xx nucleo boards.
-This application requests having the stm32wb5x_zigbee_full_fw.bin binary flashed on the wireless coprocessor
+This application requests having the stm32wb5x_Zigbee_FFD_fw.binbinary flashed on the wireless coprocessor
and the correct binary flashed on the application processor.
Important note :
@@ -104,9 +104,9 @@ Zigbee
@par How to use it ?
-=> Loading of the stm32wb5x_zigbee_full_fw.bin binary
+=> Loading of the stm32wb5x_Zigbee_FFD_fw.binbinary
- This application requests having the stm32wb5x_zigbee_full_fw.bin binary flashed on the Wireless Coprocessor.
+ This application requests having the stm32wb5x_Zigbee_FFD_fw.binbinary 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.
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/Core/Inc/app_common.h
index 200abb160..15efa6e2e 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/Core/Inc/app_common.h
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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 e1ffdc8ca..f052c8d9a 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
@@ -87,6 +87,7 @@ void APPE_Init( void )
HW_TS_Init(hw_ts_InitMode_Full, &hrtc); /**< Initialize the TimerServer */
+/* USER CODE BEGIN APPE_Init_1 */
Init_Debug();
/**
* The Standby mode should not be entered before the initialization is over
@@ -96,17 +97,21 @@ void APPE_Init( void )
Led_Init();
Button_Init();
RxUART_Init();
- appe_Tl_Init(); /* Initialize all transport layers */
+/* 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 Zigbee Stack
+ * 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;
}
+
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -228,7 +233,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/EWARM/Zigbee_SE_Msg_Server_Router.ewp b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/EWARM/Zigbee_SE_Msg_Server_Router.ewp
index a224809f4..fc7fec499 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/EWARM/Zigbee_SE_Msg_Server_Router.ewp
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/EWARM/Zigbee_SE_Msg_Server_Router.ewp
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
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 2c531417a..e9a1f9a72 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
@@ -290,7 +290,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
/* Initialization Complete */
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/STM32_WPAN/Target/hw_ipcc.c
index 56f220e4e..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/STM32_WPAN/Target/hw_ipcc.c
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/readme.txt b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/readme.txt
index 35c5e7c8b..94d26a4a8 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/readme.txt
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/Zigbee/Zigbee_SE_Msg_Server_Router/readme.txt
@@ -46,7 +46,7 @@ Press SW2 on server => Send "Good Bye"
This application requires two STM32WB55xx nucleo boards.
-This application requests having the stm32wb5x_zigbee_full_fw.bin binary flashed on the wireless coprocessor
+This application requests having the stm32wb5x_Zigbee_FFD_fw.binbinary flashed on the wireless coprocessor
and the correct binary flashed on the application processor.
Important note :
@@ -104,9 +104,9 @@ Zigbee
@par How to use it ?
-=> Loading of the stm32wb5x_zigbee_full_fw.bin binary
+=> Loading of the stm32wb5x_Zigbee_FFD_fw.binbinary
- This application requests having the stm32wb5x_zigbee_full_fw.bin binary flashed on the Wireless Coprocessor.
+ This application requests having the stm32wb5x_Zigbee_FFD_fw.binbinary 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.
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Release_Notes.html b/Projects/P-NUCLEO-WB55.Nucleo/Release_Notes.html
index 46a6c6948..8434b6a24 100644
--- a/Projects/P-NUCLEO-WB55.Nucleo/Release_Notes.html
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Release_Notes.html
@@ -50,9 +50,29 @@
<div class="col-sm-12 col-lg-8">
<h1 id="update-history">Update History</h1>
<div class="collapse">
-<input type="checkbox" id="collapse-section8" checked aria-hidden="true"> <label for="collapse-section8" aria-hidden="true">V1.8.0 / 19-June-2020</label>
+<input type="checkbox" id="collapse-section9" checked aria-hidden="true"> <label for="collapse-section9" aria-hidden="true">V1.9.0 / 24-September-2020</label>
<div>
<h2 id="main-changes">Main Changes</h2>
+<h3 id="introduce-blethread-and-blezigbee-dynamic-concurrent-mode-the-support-of-lld-ble-and-phy_802.15.4-cli-application">Introduce BLE/Thread and BLE/Zigbee dynamic concurrent mode, the support of LLD BLE and PHY_802.15.4 CLI application</h3>
+<ul>
+<li>Update Thread, BLE, BLE Mesh, LLD BLE, MAC 802.15.4and zigbee application.</li>
+<li>Introduce following applications:
+<ul>
+<li>Applications/BLE_Thread/Ble_Thread_Dyn_SED</li>
+<li>Applications/BLE_Zigbee/BLE_Zigbee_Dyn</li>
+<li>Applications/BLE_Zigbee/BLE_Zigbee_Dyn_NVM</li>
+<li>Applications/BLE_Zigbee/BLE_Zigbee_Dyn_SED</li>
+<li>Applications/LLD_BLE/LLD_BLE_Pressbutton</li>
+<li>Applications/LLD_BLE/LLD_BLE_Proximity</li>
+<li>Applications/Phy_802_15_4/Phy_802_15_4_Cli</li>
+</ul></li>
+</ul>
+</div>
+</div>
+<div class="collapse">
+<input type="checkbox" id="collapse-section8" aria-hidden="true"> <label for="collapse-section8" aria-hidden="true">V1.8.0 / 19-June-2020</label>
+<div>
+<h2 id="main-changes-1">Main Changes</h2>
<h3 id="replace-sw4stm32-by-stm32cubeide-projects-files-for-all-examples-and-application">Replace SW4STM32 by STM32CubeIDE projects files for all examples and application</h3>
<ul>
<li>Add new application ā€œBLE_customā€ to demonstrate how to create a BLE_Custom application using STM32CubeMX 6.0.0</li>
@@ -63,7 +83,7 @@
<div class="collapse">
<input type="checkbox" id="collapse-section7" aria-hidden="true"> <label for="collapse-section7" aria-hidden="true">V1.6.0 / 26-March-2020</label>
<div>
-<h2 id="main-changes-1">Main Changes</h2>
+<h2 id="main-changes-2">Main Changes</h2>
<h3 id="ble">BLE</h3>
<ul>
<li><strong>Add BLE Mesh split of BLE_MeshLightingDemo project in</strong>:
@@ -112,7 +132,7 @@
<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-2">Main Changes</h2>
+<h2 id="main-changes-3">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>
@@ -147,7 +167,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-3">Main Changes</h2>
+<h2 id="main-changes-4">Main Changes</h2>
<h3 id="maintenance">Maintenance</h3>
<ul>
<li>Add SW4STM32 and MDK-ARM IDE files for:
@@ -161,7 +181,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-4">Main Changes</h2>
+<h2 id="main-changes-5">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>
@@ -191,7 +211,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-5">Main Changes</h2>
+<h2 id="main-changes-6">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>
@@ -206,7 +226,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-6">Main Changes</h2>
+<h2 id="main-changes-7">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>
@@ -229,7 +249,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-7">Main Changes</h2>
+<h2 id="main-changes-8">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/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/Core/Inc/app_common.h
index 9dbfbba05..7e66ee35a 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/Core/Inc/app_common.h
@@ -67,9 +67,13 @@ extern "C"
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/Core/Inc/app_conf.h
index 1f0efa115..0329d252b 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/Core/Inc/app_conf.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/Core/Inc/app_conf.h
@@ -51,7 +51,7 @@
*/
#define CFG_BONDING_MODE (1)
#define CFG_FIXED_PIN (111111)
-#define CFG_USED_FIXED_PIN (0)
+#define CFG_USED_FIXED_PIN (1)
#define CFG_ENCRYPTION_KEY_SIZE_MAX (16)
#define CFG_ENCRYPTION_KEY_SIZE_MIN (8)
@@ -74,6 +74,28 @@
#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_NOT_SUPPORTED
+
+/**
+ * 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)
/**
* Define PHY
@@ -114,7 +136,7 @@
* Maximum number of simultaneous connections that the device will support.
* Valid values are from 1 to 8
*/
-#define CFG_BLE_NUM_LINK 8
+#define CFG_BLE_NUM_LINK 2
/**
* Maximum number of Services that can be stored in the GATT database.
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/Core/Inc/hw_conf.h
index b26c6c72d..68f197ed3 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/Core/Inc/hw_conf.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/Core/Inc/hw_conf.h
@@ -1,36 +1,39 @@
+/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file hw_conf.h
* @author MCD Application Team
* @brief Configuration of hardware interface
- ******************************************************************************
- * @attention
- *
+ ******************************************************************************
+ * @attention
+ *
* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under Ultimate Liberty license
- * SLA0044, the "License"; You may not use this file except in compliance with
- * the License. You may obtain a copy of the License at:
- * www.st.com/SLA0044
- *
- ******************************************************************************
- */
-
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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
+#ifndef HW_CONF_H
+#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
* 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.
+* Once the Semaphore has been released, there shall be at least 1us before it can be taken again. This is required
+* to give the opportunity to CPU2 to take it.
* 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()
@@ -69,7 +72,6 @@
/* Index of the semaphore used to access the RNG */
#define CFG_HW_RNG_SEMID 0
-
/******************************************************************************
* HW TIMER SERVER
*****************************************************************************/
@@ -84,7 +86,7 @@
* wakeup timer.
* This setting is the preemptpriority part of the NVIC.
*/
-#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+#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
@@ -92,7 +94,7 @@
* 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 CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
/**
* Define a critical section in the Timer server
@@ -108,32 +110,32 @@
* 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
+#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
- */
+ * 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_LPUART1_ENABLED 0
+#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 0
#define CFG_HW_USART1_ENABLED 0
#define CFG_HW_USART1_DMA_TX_SUPPORTED 0
@@ -242,6 +244,6 @@
#define CFG_HW_USART1_TX_DMA_IRQn DMA2_Channel4_IRQn
#define CFG_HW_USART1_DMA_TX_IRQHandler DMA2_Channel4_IRQHandler
-#endif /*__HW_CONF_H */
+#endif /*HW_CONF_H */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/Core/Inc/main.h
index bbe71a4da..d104dcb7e 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/Core/Inc/main.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/Core/Inc/main.h
@@ -32,6 +32,7 @@ extern RTC_HandleTypeDef hrtc; /**< RTC handler declaration */
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
+void Error_Handler(void);
#endif /* __MAIN_H */
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/Core/Src/app_entry.c
index 0c9ffa37f..1c0413ece 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/Core/Src/app_entry.c
@@ -188,7 +188,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/Core/Src/main.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/Core/Src/main.c
index 1754a019a..08116e0e5 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/Core/Src/main.c
@@ -38,6 +38,7 @@
/* Includes ------------------------------------------------------------------*/
+#include "main.h"
#include "app_common.h"
#include "app_entry.h"
@@ -317,4 +318,12 @@ void HAL_Delay(uint32_t Delay)
}
}
+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 */
+}
+
/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/STM32_WPAN/App/app_ble.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/STM32_WPAN/App/app_ble.c
index bd751342e..b42e89f26 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/STM32_WPAN/App/app_ble.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_HeartRate/STM32_WPAN/App/app_ble.c
@@ -19,6 +19,8 @@
/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
#include "app_common.h"
#include "dbg_trace.h"
@@ -59,18 +61,6 @@ typedef struct _tSecurityParams
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
@@ -285,8 +275,11 @@ void APP_BLE_Init( void )
/**
* Starts the BLE Stack on CPU2
*/
- SHCI_C2_BLE_Init( &ble_init_cmd_packet );
-
+ if (SHCI_C2_BLE_Init( &ble_init_cmd_packet ) != SHCI_Success)
+ {
+ Error_Handler();
+ }
+
/**
* Initialization of HCI & GATT & GAP layer
*/
@@ -478,7 +471,6 @@ static void Ble_Tl_Init( void )
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];
@@ -612,26 +604,21 @@ static void Ble_Hci_Gap_Gatt_Init(void){
* 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;
- }
+ 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;
aci_gap_set_authentication_requirement(BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode,
BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode,
- 0,
- 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
);
/**
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 a58b95cad..e7049681d 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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_MeshLightingLPN/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_common.h
index 9dbfbba05..7e66ee35a 100644
--- 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
@@ -67,9 +67,13 @@ extern "C"
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_conf.h
index 5556ff3f9..83cde13ea 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_conf.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Inc/app_conf.h
@@ -72,8 +72,30 @@
#define CFG_MITM_PROTECTION_NOT_REQUIRED (0x00)
#define CFG_MITM_PROTECTION_REQUIRED (0x01)
-#define CFG_MITM_PROTECTION CFG_MITM_PROTECTION_REQUIRED
+#define CFG_MITM_PROTECTION CFG_MITM_PROTECTION_NOT_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_NOT_SUPPORTED
+
+/**
+ * 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)
/**
* Define PHY
@@ -140,7 +162,7 @@
* Maximum number of simultaneous connections that the device will support.
* Valid values are from 1 to 8
*/
-#define CFG_BLE_NUM_LINK 8
+#define CFG_BLE_NUM_LINK 2
/**
* Maximum number of Services that can be stored in the GATT database.
@@ -494,7 +516,7 @@ typedef enum
typedef enum
{
CFG_FIRST_TASK_ID_WITH_NO_HCICMD = CFG_LAST_TASK_ID_WITH_HCICMD - 1, /**< Shall be FIRST in the list */
-
+ CFG_TASK_SW1_BUTTON_PUSHED_ID,
CFG_TASK_SYSTEM_HCI_ASYNCH_EVT_ID,
CFG_TASK_VCP_SEND_DATA_ID,
@@ -509,8 +531,6 @@ typedef enum
typedef enum
{
CFG_SCH_PRIO_0,
- CFG_SCH_PRIO_1,
-
CFG_PRIO_NBR,
} CFG_SCH_Prio_Id_t;
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
index 1e2d7a616..b703e7393 100644
--- 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
@@ -1,36 +1,39 @@
+/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file hw_conf.h
* @author MCD Application Team
* @brief Configuration of hardware interface
- ******************************************************************************
- * @attention
- *
+ ******************************************************************************
+ * @attention
+ *
* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under Ultimate Liberty license
- * SLA0044, the "License"; You may not use this file except in compliance with
- * the License. You may obtain a copy of the License at:
- * www.st.com/SLA0044
- *
- ******************************************************************************
- */
-
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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
+#ifndef HW_CONF_H
+#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
* 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.
+* Once the Semaphore has been released, there shall be at least 1us before it can be taken again. This is required
+* to give the opportunity to CPU2 to take it.
* 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()
@@ -69,7 +72,6 @@
/* Index of the semaphore used to access the RNG */
#define CFG_HW_RNG_SEMID 0
-
/******************************************************************************
* HW TIMER SERVER
*****************************************************************************/
@@ -84,7 +86,7 @@
* wakeup timer.
* This setting is the preemptpriority part of the NVIC.
*/
-#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+#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
@@ -92,7 +94,7 @@
* 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 CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
/**
* Define a critical section in the Timer server
@@ -108,35 +110,35 @@
* 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
+#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
- */
+ * 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_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
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
/**
* LPUART1
@@ -242,6 +244,6 @@
#define CFG_HW_USART1_TX_DMA_IRQn DMA2_Channel4_IRQn
#define CFG_HW_USART1_DMA_TX_IRQHandler DMA2_Channel4_IRQHandler
-#endif /*__HW_CONF_H */
+#endif /*HW_CONF_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
index 3de57ae3e..7d6b87d0e 100644
--- 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
@@ -30,6 +30,8 @@
/* Exported variables --------------------------------------------------------*/
extern RTC_HandleTypeDef hrtc; /**< RTC handler declaration */
+/* Exported functions prototypes ---------------------------------------------*/
+void Error_Handler(void);
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/app_entry.c
index 74b095d04..4f2ed29d6 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/Core/Src/app_entry.c
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "main.h"
@@ -84,7 +85,6 @@ 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 */
@@ -232,7 +232,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
@@ -370,6 +370,7 @@ void HAL_GPIO_EXTI_Callback( uint16_t GPIO_Pin )
}
break;
+
default:
break;
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
index 34c013a8e..95537ac98 100644
--- 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
@@ -327,11 +327,10 @@ void SystemClock_Config(void)
/** Configure LSE Drive Capability
*/
__HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
- /** Configure the main internal regulator output voltage
+ /** Configure the main internal regulator output voltage
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
- /** Initializes the RCC Oscillators according to the specified parameters
- * in the RCC_OscInitTypeDef structure.
+ /** Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
|RCC_OSCILLATORTYPE_LSE;
@@ -344,7 +343,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
@@ -364,7 +363,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Initializes the peripherals clocks
+ /** Initializes the peripherals clocks
*/
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
|RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/EWARM/BLE_MeshLightingLPN.ewp b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/EWARM/BLE_MeshLightingLPN.ewp
index 9e4196aa2..3ddb4f353 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/EWARM/BLE_MeshLightingLPN.ewp
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/EWARM/BLE_MeshLightingLPN.ewp
@@ -836,7 +836,6 @@
<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>
@@ -1123,6 +1122,9 @@
<name>$PROJ_DIR$\..\STM32_WPAN\app\appli_sensor.c</name>
</file>
<file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\appli_sensors_client.c</name>
+ </file>
+ <file>
<name>$PROJ_DIR$\..\STM32_WPAN\app\appli_vendor.c</name>
</file>
<file>
@@ -1287,6 +1289,9 @@
<name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\sensors.c</name>
</file>
<file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\sensors_client.c</name>
+ </file>
+ <file>
<name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\svc\Src\svc_ctl.c</name>
</file>
<file>
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
index 7671db812..289c1ef3c 100644
--- 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
@@ -455,6 +455,42 @@
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>23</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>24</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>25</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\STM32_WPAN\app\appli_sensors_client.c</PathWithFileName>
+ <FilenameWithoutPath>appli_sensors_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
</Group>
<Group>
@@ -465,7 +501,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>4</GroupNumber>
- <FileNumber>23</FileNumber>
+ <FileNumber>26</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -485,7 +521,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>5</GroupNumber>
- <FileNumber>24</FileNumber>
+ <FileNumber>27</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -505,7 +541,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>6</GroupNumber>
- <FileNumber>25</FileNumber>
+ <FileNumber>28</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -525,7 +561,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>7</GroupNumber>
- <FileNumber>26</FileNumber>
+ <FileNumber>29</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -545,7 +581,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>27</FileNumber>
+ <FileNumber>30</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -557,7 +593,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>28</FileNumber>
+ <FileNumber>31</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -569,7 +605,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>29</FileNumber>
+ <FileNumber>32</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -581,7 +617,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>30</FileNumber>
+ <FileNumber>33</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -593,7 +629,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>31</FileNumber>
+ <FileNumber>34</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -605,7 +641,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>32</FileNumber>
+ <FileNumber>35</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -617,7 +653,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>33</FileNumber>
+ <FileNumber>36</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -629,7 +665,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>34</FileNumber>
+ <FileNumber>37</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -641,7 +677,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>35</FileNumber>
+ <FileNumber>38</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -653,7 +689,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>36</FileNumber>
+ <FileNumber>39</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -665,7 +701,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>37</FileNumber>
+ <FileNumber>40</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -677,7 +713,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>38</FileNumber>
+ <FileNumber>41</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -689,7 +725,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>39</FileNumber>
+ <FileNumber>42</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -701,7 +737,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>40</FileNumber>
+ <FileNumber>43</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -713,7 +749,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>41</FileNumber>
+ <FileNumber>44</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -725,7 +761,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>42</FileNumber>
+ <FileNumber>45</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -737,7 +773,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>43</FileNumber>
+ <FileNumber>46</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -749,7 +785,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>44</FileNumber>
+ <FileNumber>47</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -761,7 +797,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>45</FileNumber>
+ <FileNumber>48</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -773,7 +809,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>46</FileNumber>
+ <FileNumber>49</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -785,7 +821,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>47</FileNumber>
+ <FileNumber>50</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -805,7 +841,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>48</FileNumber>
+ <FileNumber>51</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -817,7 +853,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>49</FileNumber>
+ <FileNumber>52</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -829,7 +865,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>50</FileNumber>
+ <FileNumber>53</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -841,7 +877,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>51</FileNumber>
+ <FileNumber>54</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -855,13 +891,13 @@
<Group>
<GroupName>Middlewares/STM32_WPAN/ble/blesvc</GroupName>
- <tvExp>0</tvExp>
+ <tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>52</FileNumber>
+ <FileNumber>55</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -873,7 +909,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>53</FileNumber>
+ <FileNumber>56</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -885,7 +921,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>54</FileNumber>
+ <FileNumber>57</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -897,7 +933,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>55</FileNumber>
+ <FileNumber>58</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -909,7 +945,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>56</FileNumber>
+ <FileNumber>59</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -921,7 +957,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>57</FileNumber>
+ <FileNumber>60</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -933,7 +969,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>58</FileNumber>
+ <FileNumber>61</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -945,7 +981,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>59</FileNumber>
+ <FileNumber>62</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -957,7 +993,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>60</FileNumber>
+ <FileNumber>63</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -969,7 +1005,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>61</FileNumber>
+ <FileNumber>64</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -979,6 +1015,42 @@
<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\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>66</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>67</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\sensors_client.c</PathWithFileName>
+ <FilenameWithoutPath>sensors_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
</Group>
<Group>
@@ -989,7 +1061,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>11</GroupNumber>
- <FileNumber>62</FileNumber>
+ <FileNumber>68</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1001,7 +1073,7 @@
</File>
<File>
<GroupNumber>11</GroupNumber>
- <FileNumber>63</FileNumber>
+ <FileNumber>69</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1013,7 +1085,7 @@
</File>
<File>
<GroupNumber>11</GroupNumber>
- <FileNumber>64</FileNumber>
+ <FileNumber>70</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1025,7 +1097,7 @@
</File>
<File>
<GroupNumber>11</GroupNumber>
- <FileNumber>65</FileNumber>
+ <FileNumber>71</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1037,7 +1109,7 @@
</File>
<File>
<GroupNumber>11</GroupNumber>
- <FileNumber>66</FileNumber>
+ <FileNumber>72</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1049,7 +1121,7 @@
</File>
<File>
<GroupNumber>11</GroupNumber>
- <FileNumber>67</FileNumber>
+ <FileNumber>73</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1069,7 +1141,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>12</GroupNumber>
- <FileNumber>68</FileNumber>
+ <FileNumber>74</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1089,7 +1161,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>69</FileNumber>
+ <FileNumber>75</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1101,7 +1173,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>70</FileNumber>
+ <FileNumber>76</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1113,7 +1185,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>71</FileNumber>
+ <FileNumber>77</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1125,7 +1197,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>72</FileNumber>
+ <FileNumber>78</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1137,7 +1209,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>73</FileNumber>
+ <FileNumber>79</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1157,7 +1229,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>14</GroupNumber>
- <FileNumber>74</FileNumber>
+ <FileNumber>80</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1169,7 +1241,7 @@
</File>
<File>
<GroupNumber>14</GroupNumber>
- <FileNumber>75</FileNumber>
+ <FileNumber>81</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1181,7 +1253,7 @@
</File>
<File>
<GroupNumber>14</GroupNumber>
- <FileNumber>76</FileNumber>
+ <FileNumber>82</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1201,7 +1273,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>15</GroupNumber>
- <FileNumber>77</FileNumber>
+ <FileNumber>83</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1213,7 +1285,7 @@
</File>
<File>
<GroupNumber>15</GroupNumber>
- <FileNumber>78</FileNumber>
+ <FileNumber>84</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1225,7 +1297,7 @@
</File>
<File>
<GroupNumber>15</GroupNumber>
- <FileNumber>79</FileNumber>
+ <FileNumber>85</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1237,7 +1309,7 @@
</File>
<File>
<GroupNumber>15</GroupNumber>
- <FileNumber>80</FileNumber>
+ <FileNumber>86</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1249,7 +1321,7 @@
</File>
<File>
<GroupNumber>15</GroupNumber>
- <FileNumber>81</FileNumber>
+ <FileNumber>87</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1261,7 +1333,7 @@
</File>
<File>
<GroupNumber>15</GroupNumber>
- <FileNumber>82</FileNumber>
+ <FileNumber>88</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1281,7 +1353,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>16</GroupNumber>
- <FileNumber>83</FileNumber>
+ <FileNumber>89</FileNumber>
<FileType>4</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1294,26 +1366,6 @@
</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>
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/BLE_MeshLightingDemoLPN.uvprojx b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/BLE_MeshLightingDemoLPN.uvprojx
index 31198e6bd..381fe348b 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/BLE_MeshLightingDemoLPN.uvprojx
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/MDK-ARM/BLE_MeshLightingDemoLPN.uvprojx
@@ -502,6 +502,21 @@
<FileType>1</FileType>
<FilePath>../STM32_WPAN/app/PWM_handlers.c</FilePath>
</File>
+ <File>
+ <FileName>appli_generic_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\STM32_WPAN\app\appli_generic_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>appli_light_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\STM32_WPAN\app\appli_light_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>appli_sensors_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\STM32_WPAN\app\appli_sensors_client.c</FilePath>
+ </File>
</Files>
</Group>
<Group>
@@ -732,6 +747,21 @@
<FileType>1</FileType>
<FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/vendor.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>
+ </File>
+ <File>
+ <FileName>light_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\light_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>sensors_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\sensors_client.c</FilePath>
+ </File>
</Files>
</Group>
<Group>
@@ -875,16 +905,6 @@
</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>
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32CubeIDE/.cproject b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32CubeIDE/.cproject
index 853d60107..3b26c21ce 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32CubeIDE/.cproject
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32CubeIDE/.cproject
@@ -82,11 +82,9 @@
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script.883668273" name="Linker Script (-T)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" useByScannerDiscovery="false" value="${workspace_loc:/${ProjName}/STM32WB55CGUX_FLASH.ld}" valueType="string"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.directories.254985958" name="Library search path (-L)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.directories" 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 IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.libraries.940031718" name="Libraries (-l)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.libraries" useByScannerDiscovery="false" valueType="libs">
<listOptionValue builtIn="false" value=":libBle_Mesh_CM4_GCC.a"/>
- <listOptionValue builtIn="false" value=":STM32CryptographicV3.1.3_CM4_GCC.a"/>
</option>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input.209447702" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input">
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
@@ -126,26 +124,26 @@
<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="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.463963397" name="Release" parent="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release">
<folderInfo id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.463963397." name="/" resourcePath="">
<toolChain id="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.release.257001219" name="MCU ARM GCC" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.release">
- <option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.type.876981216" name="Internal Toolchain Type" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.type" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.version.401523952" name="Internal Toolchain Version" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.version" value="7-2018-q2-update" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.1090365644" name="Mcu" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu" value="STM32WB55CGUx" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.1793793569" name="CpuId" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid" value="0" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.1407857250" name="CpuCoreId" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid" value="0" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.1608890310" name="Floating-point unit" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.value.fpv4-sp-d16" valueType="enumerated"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.1382596519" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.softfp" valueType="enumerated"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.1254195606" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" value="genericBoard" valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.345436122" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.3 || Release || false || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32 || STM32WB55CGUx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../../Core/Inc | ../../../../../../../Utilities/lpm/tiny_lpm | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci | ../../../../../../../Utilities/sequencer | ../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include | ../../../../../../../Middlewares/ST/STM32_USB_Device_Library/Core/Inc | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl | ../../STM32_WPAN/app | ../../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Inc | ../../../../../../../Middlewares/ST/STM32_WPAN/ble/core | ../../../../../../../Middlewares/ST/STM32_WPAN | ../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template | ../../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc | ../../../../../../../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc | ../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc | ../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto | ../../../../../../../Drivers/BSP/P-NUCLEO-WB55.USBDongle | ../../../../../../../Middlewares/ST/STM32_WPAN/utilities | ../../../../../../../Middlewares/ST/STM32_WPAN/ble | ../../../../../../../Drivers/CMSIS/Include || || || USE_HAL_DRIVER | STM32 | USE_STM32WBXX_USB_DONGLE | TRACE_ENABLE_NO_FUNCTION | SERVER | CORE_CM4 | ENABLE_USART | STM32WB55xx || || || || ../../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_IAR.a | ../../../../../../../Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_IARv8.a || ${workspace_loc:/${ProjName}/STM32WB55CGUX_FLASH.ld} || true || NonSecure || Size || || " valueType="string"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.converthex.304852134" name="Convert to Intel Hex file (-O ihex)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.converthex" value="true" valueType="boolean"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.convertbinary.1784645667" name="Convert to binary file (-O binary)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.convertbinary" value="false" valueType="boolean"/>
+ <option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.type.876981216" name="Internal Toolchain Type" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.type" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.version.401523952" name="Internal Toolchain Version" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.version" useByScannerDiscovery="false" value="7-2018-q2-update" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.1090365644" name="Mcu" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu" useByScannerDiscovery="false" value="STM32WB55CGUx" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.1793793569" name="CpuId" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid" useByScannerDiscovery="false" value="0" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.1407857250" name="CpuCoreId" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid" useByScannerDiscovery="false" value="0" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.1608890310" name="Floating-point unit" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.value.fpv4-sp-d16" valueType="enumerated"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.1382596519" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.softfp" valueType="enumerated"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.1254195606" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="genericBoard" valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.345436122" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.3 || Release || false || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32 || STM32WB55CGUx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../../Core/Inc | ../../../../../../../Utilities/lpm/tiny_lpm | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/shci | ../../../../../../../Utilities/sequencer | ../../../../../../../Drivers/CMSIS/Device/ST/STM32WBxx/Include | ../../../../../../../Middlewares/ST/STM32_USB_Device_Library/Core/Inc | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/vcp | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread | ../../../../../../../Middlewares/ST/STM32_WPAN/interface/patterns/ble_thread/tl | ../../STM32_WPAN/app | ../../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Inc | ../../../../../../../Middlewares/ST/STM32_WPAN/ble/core | ../../../../../../../Middlewares/ST/STM32_WPAN | ../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/template | ../../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Inc | ../../../../../../../Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc | ../../../../../../../Drivers/STM32WBxx_HAL_Driver/Inc | ../../../../../../../Middlewares/ST/STM32_WPAN/ble/core/auto | ../../../../../../../Drivers/BSP/P-NUCLEO-WB55.USBDongle | ../../../../../../../Middlewares/ST/STM32_WPAN/utilities | ../../../../../../../Middlewares/ST/STM32_WPAN/ble | ../../../../../../../Drivers/CMSIS/Include || || || USE_HAL_DRIVER | STM32 | USE_STM32WBXX_USB_DONGLE | TRACE_ENABLE_NO_FUNCTION | SERVER | CORE_CM4 | ENABLE_USART | STM32WB55xx || || || || ../../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/Library/libBle_Mesh_CM4_IAR.a | ../../../../../../../Middlewares/ST/STM32_WPAN/ble/cryptographic/Lib/STM32CryptographicV3.1.3_CM4_IARv8.a || ${workspace_loc:/${ProjName}/STM32WB55CGUX_FLASH.ld} || true || NonSecure || Size || || " valueType="string"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.converthex.304852134" name="Convert to Intel Hex file (-O ihex)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.converthex" useByScannerDiscovery="false" value="true" valueType="boolean"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.convertbinary.1784645667" name="Convert to binary file (-O binary)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.convertbinary" useByScannerDiscovery="false" value="false" valueType="boolean"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.228726006" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/>
<builder buildPath="${workspace_loc:/BLE_MeshLightingLPN}/Release" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.667091728" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.952594224" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler">
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.1899231996" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.value.g0" valueType="enumerated"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.1899231996" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.value.g0" valueType="enumerated"/>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input.940235762" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input"/>
</tool>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.879179272" name="MCU GCC Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler">
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.1498440401" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.value.g0" valueType="enumerated"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.875513093" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.value.os" valueType="enumerated"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.875513093" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.value.o3" valueType="enumerated"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols.1353057634" name="Define symbols (-D)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols" useByScannerDiscovery="false" valueType="definedSymbols">
<listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
<listOptionValue builtIn="false" value="STM32"/>
@@ -187,14 +185,12 @@
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.1708440738" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.value.os" valueType="enumerated"/>
</tool>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.1191629002" name="MCU GCC Linker" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker">
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script.176786187" name="Linker Script (-T)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" value="${workspace_loc:/${ProjName}/STM32WB55CGUX_FLASH.ld}" valueType="string"/>
- <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.directories.461730334" name="Library search path (-L)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.directories" valueType="libPaths">
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script.176786187" name="Linker Script (-T)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" useByScannerDiscovery="false" value="${workspace_loc:/${ProjName}/STM32WB55CGUX_FLASH.ld}" valueType="string"/>
+ <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.directories.461730334" name="Library search path (-L)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.directories" 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 IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.libraries.1692046447" name="Libraries (-l)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.libraries" useByScannerDiscovery="false" valueType="libs">
<listOptionValue builtIn="false" value=":libBle_Mesh_CM4_GCC.a"/>
- <listOptionValue builtIn="false" value=":STM32CryptographicV3.1.3_CM4_GCC.a"/>
</option>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input.2127007223" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input">
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32CubeIDE/.project b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32CubeIDE/.project
index 841c88839..13cc1f4d5 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32CubeIDE/.project
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32CubeIDE/.project
@@ -232,11 +232,21 @@
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/app/appli_generic.c</locationURI>
</link>
<link>
+ <name>Application/STM32_WPAN/app/appli_generic_client.c</name>
+ <type>1</type>
+ <locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/app/appli_generic_client.c</locationURI>
+ </link>
+ <link>
<name>Application/STM32_WPAN/app/appli_light.c</name>
<type>1</type>
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/app/appli_light.c</locationURI>
</link>
<link>
+ <name>Application/STM32_WPAN/app/appli_light_client.c</name>
+ <type>1</type>
+ <locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/app/appli_light_client.c</locationURI>
+ </link>
+ <link>
<name>Application/STM32_WPAN/app/appli_light_lc.c</name>
<type>1</type>
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/app/appli_light_lc.c</locationURI>
@@ -257,6 +267,11 @@
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/app/appli_sensor.c</locationURI>
</link>
<link>
+ <name>Application/STM32_WPAN/app/appli_sensors_client.c</name>
+ <type>1</type>
+ <locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/app/appli_sensors_client.c</locationURI>
+ </link>
+ <link>
<name>Application/STM32_WPAN/app/appli_vendor.c</name>
<type>1</type>
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/app/appli_vendor.c</locationURI>
@@ -322,11 +337,21 @@
<locationURI>$%7BPARENT-6-PROJECT_LOC%7D/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic.c</locationURI>
</link>
<link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/generic_client.c</name>
+ <type>1</type>
+ <locationURI>$%7BPARENT-6-PROJECT_LOC%7D/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic_client.c</locationURI>
+ </link>
+ <link>
<name>Middlewares/STM32_WPAN/ble/blesvc/light.c</name>
<type>1</type>
<locationURI>$%7BPARENT-6-PROJECT_LOC%7D/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light.c</locationURI>
</link>
<link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/light_client.c</name>
+ <type>1</type>
+ <locationURI>$%7BPARENT-6-PROJECT_LOC%7D/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_client.c</locationURI>
+ </link>
+ <link>
<name>Middlewares/STM32_WPAN/ble/blesvc/light_lc.c</name>
<type>1</type>
<locationURI>$%7BPARENT-6-PROJECT_LOC%7D/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_lc.c</locationURI>
@@ -347,6 +372,11 @@
<locationURI>$%7BPARENT-6-PROJECT_LOC%7D/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors.c</locationURI>
</link>
<link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/sensors_client.c</name>
+ <type>1</type>
+ <locationURI>$%7BPARENT-6-PROJECT_LOC%7D/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors_client.c</locationURI>
+ </link>
+ <link>
<name>Middlewares/STM32_WPAN/ble/blesvc/svc_ctl.c</name>
<type>1</type>
<locationURI>$%7BPARENT-6-PROJECT_LOC%7D/Middlewares/ST/STM32_WPAN/ble/svc/Src/svc_ctl.c</locationURI>
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
index 2550466f7..b7b64a82d 100644
--- 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
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
@@ -35,7 +36,7 @@
#include "types.h"
#include "ble_mesh.h"
-#include "appli_mesh.h"
+//#include "appli_mesh.h"
#include "mesh_cfg.h"
/* Private includes ----------------------------------------------------------*/
@@ -296,7 +297,10 @@ void APP_BLE_Init( void )
/**
* Starts the BLE Stack on CPU2
*/
- SHCI_C2_BLE_Init( &ble_init_cmd_packet );
+ if (SHCI_C2_BLE_Init( &ble_init_cmd_packet ) != SHCI_Success)
+ {
+ Error_Handler();
+ }
/**
* Initialization of HCI & GATT & GAP layer
@@ -329,6 +333,7 @@ void APP_BLE_Init( void )
SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
{
+/* callback of mesh Library to receive all GAP/GATT events*/
HCI_Event_CB(pckt);
#if (LOW_POWER_FEATURE == 1)
@@ -479,12 +484,11 @@ static void Ble_Hci_Gap_Gatt_Init(void){
* 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;
+ 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;
@@ -492,13 +496,13 @@ static void Ble_Hci_Gap_Gatt_Init(void){
aci_gap_set_authentication_requirement(BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode,
BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode,
- 0,
- 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
);
/**
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
index 578a6f4bf..3b7fce7a2 100644
--- 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
@@ -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
@@ -24,6 +24,7 @@
#include "appli_generic.h"
#include "appli_light.h"
#include "common.h"
+#include "mesh_cfg.h"
#include "mesh_cfg_usr.h"
#include "appli_nvm.h"
#include "config_client.h"
@@ -58,6 +59,10 @@
#define NUM_VENDOR_MODELS_TO_PUBLISH 0
#define NUM_VENDOR_MODELS_TO_BIND_APP 0
+/******************************************************************************/
+#if defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER)
+/******************************************************************************/
+
const MOBLEUINT8 aConfigAppKeyDefault[19]=
{ /* NetKeyIndexAndAppKeyIndex : 3B
Index of the NetKey and index of the AppKey*/
@@ -88,51 +93,6 @@ 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,
@@ -618,7 +578,7 @@ const MODEL_CONFIG_CLIENT_OpcodeTableParam_t ConfigClient_MessageOpcodes_Table[]
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
+ /* { OPCODE_HEALTH_PERIOD_STATUS 0x8037 */
@@ -732,6 +692,8 @@ 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 ---------------------------------------------------------*/
/**
@@ -1478,10 +1440,10 @@ MOBLE_RESULT AppliConfigClient_SelfPublicationSetDefault (void)
MOBLEUINT8 elementIndex;
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
- for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ for (elementIndex=0; elementIndex < APPLICATION_NUMBER_OF_ELEMENTS; elementIndex++ )
{
/*Checking for SIG Models*/
- for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
+ for (MOBLEUINT8 index=0; index < APPLICATION_SIG_MODELS_MAX_COUNT; index++)
{
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1492,6 +1454,14 @@ MOBLE_RESULT AppliConfigClient_SelfPublicationSetDefault (void)
{
break;
}
+ else if (MODEL_IS_FOUNDATION_MODEL(modelIdentifier))
+ {
+ /* If Model is Foundation Model, then it doesnt need to be
+ added for Publishing */
+
+ /* Do NOTHING, let the next Model be picked */
+ }
+
else
{
ConfigClient_PublicationSet(elementAddress,
@@ -1507,7 +1477,7 @@ MOBLE_RESULT AppliConfigClient_SelfPublicationSetDefault (void)
}
/*Checking for VENDOR Models*/
- for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
+ for (MOBLEUINT8 index=0; index < APPLICATION_VENDOR_MODELS_MAX_COUNT; index++)
{
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1551,10 +1521,10 @@ MOBLE_RESULT AppliConfigClient_SelfSubscriptionSetDefault (void)
MOBLEUINT16 address = DEFAULT_GROUP_ADDR;
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
- for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ for (elementIndex=0; elementIndex < APPLICATION_NUMBER_OF_ELEMENTS; elementIndex++ )
{
/*Checking for SIG Models*/
- for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
+ for (MOBLEUINT8 index=0; index < APPLICATION_SIG_MODELS_MAX_COUNT; index++)
{
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1566,6 +1536,13 @@ MOBLE_RESULT AppliConfigClient_SelfSubscriptionSetDefault (void)
{
break;
}
+ else if (MODEL_IS_FOUNDATION_MODEL(modelIdentifier))
+ {
+ /* If Model is Foundation Model, then it doesnt need to be
+ Subscribed */
+
+ /* Do NOTHING, let the next Model be picked */
+ }
else
{
ConfigClient_SubscriptionAdd (elementAddress, address, modelIdentifier);
@@ -1573,7 +1550,7 @@ MOBLE_RESULT AppliConfigClient_SelfSubscriptionSetDefault (void)
}
/*Checking for Vendor Models*/
- for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
+ for (MOBLEUINT8 index=0; index < APPLICATION_VENDOR_MODELS_MAX_COUNT; index++)
{
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1610,10 +1587,10 @@ MOBLE_RESULT Appli_ConfigClient_SelfDefaultAppKeyBind (void)
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
appKeyIndex = DEFAULT_APPKEY_INDEX;
- for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ for (elementIndex=0; elementIndex < APPLICATION_NUMBER_OF_ELEMENTS; elementIndex++ )
{
/*Checking for SIG Models*/
- for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
+ for (MOBLEUINT8 index=0; index < APPLICATION_SIG_MODELS_MAX_COUNT; index++)
{
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1624,6 +1601,13 @@ MOBLE_RESULT Appli_ConfigClient_SelfDefaultAppKeyBind (void)
{
break;
}
+ else if (MODEL_IS_FOUNDATION_MODEL(modelIdentifier))
+ {
+ /* If Model is Foundation Model, then it doesnt need to be binded
+ with AppKey */
+
+ /* Do NOTHING, let the next Model be picked */
+ }
else
{
ConfigClient_ModelAppBind (elementAddress, appKeyIndex, modelIdentifier);
@@ -1631,7 +1615,7 @@ MOBLE_RESULT Appli_ConfigClient_SelfDefaultAppKeyBind (void)
}
/*Checking for VENDOR Models*/
- for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
+ for (MOBLEUINT8 index=0; index < APPLICATION_VENDOR_MODELS_MAX_COUNT; index++)
{
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1741,7 +1725,6 @@ MOBLEUINT16 GetSIGModelToBindApp(MOBLEUINT8 elementIndex,
MOBLEUINT8 numberOfModels)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
MOBLEUINT16 model_id;
MOBLEUINT8 index;
MOBLEUINT8 idxSIG = *pModelIndex;
@@ -1762,9 +1745,7 @@ MOBLEUINT16 GetSIGModelToBindApp(MOBLEUINT8 elementIndex,
*pModelIndex = index;
return model_id;
-#else
- return aSigModelsToBind[idxSIG][elementIdx] ;
-#endif
+
}
@@ -1777,11 +1758,7 @@ MOBLEUINT16 GetSIGModelToBindApp(MOBLEUINT8 elementIndex,
*/
MOBLEUINT32 GetVendorModelToBindApp(MOBLEUINT8 elementIndex, MOBLEUINT8 indexModels)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].aVendorModels[indexModels];
-#else
- return VENDORMODEL_STMICRO_ID1 ;
-#endif
}
/**
@@ -1792,11 +1769,7 @@ MOBLEUINT32 GetVendorModelToBindApp(MOBLEUINT8 elementIndex, MOBLEUINT8 indexMod
*/
MOBLEUINT8 GetCountSIGModelToBindApp(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumSIGmodels;
-#else
- return sizeof(aSigModelsToBind)/sizeof(MOBLEUINT16);
-#endif
}
@@ -1807,11 +1780,7 @@ MOBLEUINT8 GetCountSIGModelToBindApp(MOBLEUINT8 elementIndex)
*/
MOBLEUINT8 GetCountVendorModelToBindApp(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumVendorModels;
-#else
- return NUM_VENDOR_MODELS_TO_BIND_APP;
-#endif
}
@@ -1827,13 +1796,9 @@ MOBLEUINT16 GetSIGModelToPublish(MOBLEUINT8 elementIndex,
MOBLEUINT8 numberOfModels)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return GetSIGModelToBindApp(elementIndex,
pModelIndex,
numberOfModels);
-#else
- return aPublishModels[idxSIG] ;
-#endif
}
@@ -1845,11 +1810,7 @@ MOBLEUINT16 GetSIGModelToPublish(MOBLEUINT8 elementIndex,
*/
MOBLEUINT32 GetVendorModelToPublish(MOBLEUINT8 elementIndex, MOBLEUINT8 idxSIG)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].aVendorModels[idxSIG];
-#else
- return VENDORMODEL_STMICRO_ID1 ;
-#endif
}
@@ -1860,11 +1821,7 @@ MOBLEUINT32 GetVendorModelToPublish(MOBLEUINT8 elementIndex, MOBLEUINT8 idxSIG)
*/
MOBLEUINT8 GetCountSIGModelToPublish(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumSIGmodels;
-#else
- return sizeof(aPublishModels)/sizeof(MOBLEUINT16);
-#endif
}
@@ -1875,11 +1832,7 @@ MOBLEUINT8 GetCountSIGModelToPublish(MOBLEUINT8 elementIndex)
*/
MOBLEUINT8 GetCountVendorModelToPublish(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumVendorModels;
-#else
- return NUM_VENDOR_MODELS_TO_PUBLISH;
-#endif
}
@@ -1894,13 +1847,9 @@ MOBLEUINT16 GetSIGModelToSubscribe(MOBLEUINT8 elementIndex,
MOBLEUINT8 *pModelIndex,
MOBLEUINT8 numberOfModels)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return GetSIGModelToBindApp(elementIndex,
pModelIndex,
numberOfModels);
-#else
- return aSubscribeModels[idxSIG] ;
-#endif
}
@@ -1914,11 +1863,7 @@ MOBLEUINT16 GetSIGModelToSubscribe(MOBLEUINT8 elementIndex,
MOBLEUINT32 GetVendorModelToSubscribe(MOBLEUINT8 elementIndex,
MOBLEUINT8 idxSIG)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].aVendorModels[idxSIG];
-#else
- return VENDORMODEL_STMICRO_ID1 ;
-#endif
}
@@ -1929,11 +1874,7 @@ MOBLEUINT32 GetVendorModelToSubscribe(MOBLEUINT8 elementIndex,
*/
MOBLEUINT8 GetCountSIGModelToSubscribe(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumSIGmodels;
-#else
- return sizeof(aSubscribeModels)/sizeof(MOBLEUINT16);
-#endif
}
@@ -1945,11 +1886,7 @@ MOBLEUINT8 GetCountSIGModelToSubscribe(MOBLEUINT8 elementIndex)
*/
MOBLEUINT8 GetCountVendorModelToSubscribe(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumVendorModels;
-#else
- return NUM_VENDOR_MODELS_TO_SUBSCRIBE;
-#endif
}
@@ -1965,6 +1902,9 @@ MOBLEUINT8 AppliConfigClient_SendMessageDefault(MOBLEUINT8 elementIdx)
return NUM_VENDOR_MODELS_TO_SUBSCRIBE;
}
+/******************************************************************************/
+#endif /* defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER) */
+/******************************************************************************/
/**
* @}
@@ -1974,5 +1914,5 @@ MOBLEUINT8 AppliConfigClient_SendMessageDefault(MOBLEUINT8 elementIdx)
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 34169448c..b380cf636 100644
--- 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
@@ -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
@@ -26,7 +26,7 @@
#include "generic.h"
#include "mesh_cfg.h"
#include "config_client.h"
-
+#include "mesh_cfg_usr.h"
/* Exported macro ------------------------------------------------------------*/
#define MAX_CONFIG_PARAM_SIZE 22
@@ -35,6 +35,9 @@
/* Exported variables ------------------------------------------------------- */
/* Application Variable-------------------------------------------------------*/
/* Exported Functions Prototypes ---------------------------------------------*/
+
+#if defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER)
+
MOBLE_RESULT Appli_ConfigClient_Init(void);
MOBLE_RESULT Appli_ConfigClient_Process(void);
MOBLE_RESULT Appli_ConfigClient_ConfigureNode(void);
@@ -82,8 +85,9 @@ MOBLEUINT8 GetCountSIGModelToPublish(MOBLEUINT8 elementIdx);
MOBLEUINT8 GetCountVendorModelToPublish(MOBLEUINT8 elementIdx);
+#endif /*defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER) */
#endif /* __APPLI_CONFIG_CLIENT_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 0ecaea465..c5d21b225 100644
--- 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
@@ -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
@@ -50,16 +50,21 @@ 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;
+
+Appli_Generic_OnOffSet AppliOnOffSet[APPLICATION_NUMBER_OF_ELEMENTS];
+Appli_Generic_LevelSet AppliLevelSet[APPLICATION_NUMBER_OF_ELEMENTS];
+Appli_Generic_PowerOnOffSet AppliPowerOnSet[APPLICATION_NUMBER_OF_ELEMENTS];
+Appli_Generic_DefaultTransitionSet AppliDefaultTransitionSet[APPLICATION_NUMBER_OF_ELEMENTS];
/* 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);
+MOBLE_RESULT Appli_Generic_LevelDelta_Set(Generic_LevelStatus_t* pdeltalevelParam,
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_LevelMove_Set(Generic_LevelStatus_t* pdeltaMoveParam,
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
/* Private functions ---------------------------------------------------------*/
/******************************************************************************/
@@ -71,43 +76,57 @@ MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t* pdeltalevelParam,
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t* pGeneric_OnOffParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- AppliOnOffSet.Present_OnOff = pGeneric_OnOffParam->Present_OnOff_State;
- AppliOnOffSet.Present_OnOffValue = pGeneric_OnOffParam->Present_OnOff_Value;
-
+ /*User need to modify the parameters as per the number of elements per node*/
+ AppliOnOffSet[elementIndex].Present_OnOff = pGeneric_OnOffParam->Present_OnOff_State;
+ AppliOnOffSet[elementIndex].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.
- */
+ /* 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;
+ Appli_LightPwmValue.IntensityValue = AppliOnOffSet[elementIndex].Present_OnOffValue;
Light_UpdateLedValue(LOAD_STATE ,Appli_LightPwmValue);
- if(AppliOnOffSet.Present_OnOff == APPLI_LED_ON)
+
+ #if 0 /* EME */
+ if(AppliOnOffSet[elementIndex].Present_OnOff == APPLI_LED_ON)
{
- AppliOnOffSet.TargetValue = PWM_TIME_PERIOD;
+ AppliOnOffSet[elementIndex].TargetValue = PWM_TIME_PERIOD;
}
else
{
- AppliOnOffSet.TargetValue = APPLI_LED_OFF;
+ AppliOnOffSet[elementIndex].TargetValue = APPLI_LED_OFF;
}
+ #else
+ AppliOnOffSet[elementIndex].TargetValue = pGeneric_OnOffParam->Target_OnOff;
+ #endif /* EME */
- if(AppliOnOffSet.Present_OnOffValue > 16000)
- {
- BSP_LED_On(LED_BLUE);
- }
- else
+ if(AppliOnOffSet[elementIndex].Present_OnOffValue == AppliOnOffSet[elementIndex].TargetValue)
{
- BSP_LED_Off(LED_BLUE);
+ if(AppliOnOffSet[elementIndex].Present_OnOffValue > 0)
+ {
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+ }
}
}
else
{
- if((AppliOnOffSet.Present_OnOff == APPLI_LED_ON) && (OptionalValid == NO_TRANSITION))
+ if((AppliOnOffSet[elementIndex].Present_OnOff == APPLI_LED_ON) && (OptionalValid == NO_TRANSITION))
{
Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
@@ -120,18 +139,15 @@ MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t* pGeneric_OnOffParam,
BSP_LED_Off(LED_BLUE);
}
}
+
+ TRACE_M(TF_GENERIC,"Generic_OnOff_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8202%02hx!\n\r",AppliOnOffSet[elementIndex].Present_OnOff);
- TRACE_M(TF_SERIAL_CTRL,"#8202%02hx!\n\r",AppliOnOffSet.Present_OnOff);
+ NvmStatePowerFlag_Set(GENERIC_ON_OFF_NVM_FLAG, elementIndex);
- /* set the flag value for NVM store */
- RestoreFlag = GENERIC_ON_OFF_NVM_FLAG;
-
- AppliNvm_SaveMessageParam();
-
return MOBLE_RESULT_SUCCESS;
}
-
/******************************************************************************/
#endif /* #ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF */
/******************************************************************************/
@@ -142,15 +158,20 @@ MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t* pGeneric_OnOffParam,
* when Generic OnOff message is received
* @param pOnOff_status: Pointer to the parameters received for message
* @param plength: length of the data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUINT32 plength)
+MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
MOBLEUINT8 i;
- TRACE_M(TF_GENERIC,"Appli_Generic_OnOff_Status callback received \r\n");
+ TRACE_M(TF_GENERIC,"Generic_OnOff_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8204!\r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8204! \n\r");
for(i = 0; i < plength; i++)
{
if(i == 0)
@@ -164,6 +185,7 @@ MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUI
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_GENERIC_MODEL_SERVER_LEVEL
/******************************************************************************/
@@ -173,21 +195,26 @@ MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUI
* when Generic Level message is received
* @param plevelParam: Pointer to the parameters message
* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t* plevelParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid,MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
MOBLEUINT16 duty;
static MOBLEUINT16 previousIntensity = 0;
- AppliLevelSet.Present_Level16= plevelParam->Present_Level16;
- if(AppliLevelSet.Present_Level16 <= 0)
+ AppliLevelSet[elementIndex].Present_Level16= plevelParam->Present_Level16;
+ if(AppliLevelSet[elementIndex].Present_Level16 <= 0)
{
- AppliLevelSet.Present_Level16 = 0;
+ AppliLevelSet[elementIndex].Present_Level16 = 0;
}
- IntensityValue = AppliLevelSet.Present_Level16;
+ IntensityValue = AppliLevelSet[elementIndex].Present_Level16;
if(((IntensityValue > previousIntensity) && (IntensityValue <PWM_TIME_PERIOD)) ||
IntensityValue == INTENSITY_LEVEL_ZERO)
@@ -200,49 +227,42 @@ MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t* plevelParam,
}
previousIntensity = IntensityValue;
- if(AppliLevelSet.Present_Level16 < 0x00)
+ if(AppliLevelSet[elementIndex].Present_Level16 < 0x00)
{
- AppliLevelSet.Present_Level16 = 0;
+ AppliLevelSet[elementIndex].Present_Level16 = 0;
}
- duty = PwmValueMapping(AppliLevelSet.Present_Level16 , 0x7FFF ,0x0000);
+ duty = PwmValueMapping(AppliLevelSet[elementIndex].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);
- }
+ TRACE_M(TF_GENERIC,"Generic_Level_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8206!\r\n");
+ NvmStatePowerFlag_Set(GENERIC_LEVEL_NVM_FLAG, elementIndex);
+
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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t* pdeltalevelParam,
- MOBLEUINT8 OptionalValid)
+MOBLE_RESULT Appli_Generic_LevelDelta_Set(Generic_LevelStatus_t* pdeltalevelParam,
+ MOBLEUINT8 OptionalValid,MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-
- AppliLevelSet.Present_Level16 = pdeltalevelParam->Present_Level16;
+ AppliLevelSet[elementIndex].Present_Level16 = pdeltalevelParam->Present_Level16;
/* For demo, if Level is more than 50, switch ON the LED */
- if (AppliLevelSet.Present_Level16 >= 50)
+ if (AppliLevelSet[elementIndex].Present_Level16 >= 50)
{
Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
@@ -253,32 +273,43 @@ MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t* pdeltalevelParam,
Light_UpdateLedValue(RESET_STATE , Appli_LightPwmValue);
BSP_LED_Off(LED_BLUE);
}
- TRACE_M(TF_SERIAL_CTRL,"#8206!\n\r");
+
+ TRACE_M(TF_GENERIC,"Generic_LevelDelta_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8209!\r\n");
+
return MOBLE_RESULT_SUCCESS;
}
/**
-* @brief Appli_Generic_Move_Set: This function is callback for Application
+* @brief Appli_Generic_LevelMove_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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
- MOBLEUINT8 OptionalValid)
+MOBLE_RESULT Appli_Generic_LevelMove_Set(Generic_LevelStatus_t* pdeltaMoveParam,
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- AppliLevelSet.Last_delta_level = pdeltaMoveParam->Last_delta_level;
- AppliLevelSet.Last_Level_TID = pdeltaMoveParam->Last_Level_TID;
- AppliLevelSet.Last_Present_Level16 = pdeltaMoveParam->Last_Present_Level16;
- AppliLevelSet.Present_Level16 = pdeltaMoveParam->Present_Level16;
- AppliLevelSet.RemainingTime = pdeltaMoveParam->RemainingTime;
- AppliLevelSet.Target_Level16 = pdeltaMoveParam->Target_Level16;
+// if(OptionalValid == 1)
+// {
+ AppliLevelSet[elementIndex].Last_delta_level = pdeltaMoveParam->Last_delta_level;
+ AppliLevelSet[elementIndex].Last_Level_TID = pdeltaMoveParam->Last_Level_TID;
+ AppliLevelSet[elementIndex].Last_Present_Level16 = pdeltaMoveParam->Last_Present_Level16;
+ AppliLevelSet[elementIndex].Present_Level16 = pdeltaMoveParam->Present_Level16;
+ AppliLevelSet[elementIndex].RemainingTime = pdeltaMoveParam->RemainingTime;
+ AppliLevelSet[elementIndex].Target_Level16 = pdeltaMoveParam->Target_Level16;
+// }
- TRACE_M(TF_SERIAL_CTRL,"#8206!\n\r");
-
- return MOBLE_RESULT_SUCCESS;
+ TRACE_M(TF_GENERIC,"Generic_LevelMove_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#820B! \r\n");
+ return MOBLE_RESULT_SUCCESS;
}
@@ -291,39 +322,45 @@ MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
* when Generic Level Move message is received
* @param plevel_status: Pointer to the parameters message
* @param plength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Generic_Level_Status(MOBLEUINT8 const *plevel_status,
- MOBLEUINT32 plength)
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT8 i;
MOBLEUINT8 level = 0;
-#endif
-
- TRACE_M(TF_GENERIC,"Generic_Level_Status callback received \r\n");
+#endif
- TRACE_M(TF_SERIAL_CTRL,"#8208! \n\r");
+ TRACE_M(TF_GENERIC,"Generic_Level_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8208! \r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < plength; i++)
{
if((i == 0) || (i == 2))
level = plevel_status[i];
else if(i == 1)
- TRACE_M(TF_GENERIC,"Present Level value: %d\n\r",
+ TRACE_M(TF_SERIAL_CTRL,"Present Level value: %d\n\r",
(plevel_status[i]<<8)|level);
else if(i == 3)
- TRACE_M(TF_GENERIC,"Target Level value: %d\n\r",
+ TRACE_M(TF_SERIAL_CTRL,"Target Level value: %d\n\r",
(plevel_status[i]<<8)|level);
else if(i == 4)
- TRACE_M(TF_GENERIC,"Remaining Time value: %d\n\r", plevel_status[i]);
+ TRACE_M(TF_SERIAL_CTRL,"Remaining Time value: %d\n\r", plevel_status[i]);
}
-#endif
+#endif
+
return MOBLE_RESULT_SUCCESS;
}
-
+
/******************************************************************************/
#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF
/******************************************************************************/
@@ -333,17 +370,26 @@ MOBLE_RESULT Appli_Generic_Level_Status(MOBLEUINT8 const *plevel_status,
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Generic_PowerOnOff_Set(Generic_PowerOnOffParam_t* pPowerOnOffParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- AppliPowerOnSet.PowerOnState = pPowerOnOffParam->PowerOnOffState;
-
- TRACE_M(TF_SERIAL_CTRL,"#8213!\n\r");
+ AppliPowerOnSet[elementIndex].PowerOnState = pPowerOnOffParam->PowerOnOffState;
+
+ TRACE_M(TF_GENERIC,"Generic_PowerOnOff_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8213!\r\n");
- /* set the flag value for NVM store */
- //RestoreFlag = GENERIC_ON_OFF_NVM_FLAG;
+ if(AppliPowerOnSet[elementIndex].PowerOnState == GENERIC_POWER_ON_STATE)
+ {
+ /* set the flag value for NVM store */
+ RestoreFlag = GENERIC_ON_OFF_NVM_FLAG;
+ }
AppliNvm_SaveMessageParam();
@@ -359,17 +405,20 @@ MOBLE_RESULT Appli_Generic_PowerOnOff_Set(Generic_PowerOnOffParam_t* pPowerOnOff
* when Generic Power on off set message is received
* @param powerOnOff_status: Pointer to the parameters message
* @param plength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status ,
- MOBLEUINT32 plength)
+MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status,\
+ MOBLEUINT32 plength, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
MOBLEUINT8 i;
- TRACE_M(TF_GENERIC,"Generic_PowerOnOff_Status callback received \r\n");
+ TRACE_M(TF_GENERIC,"Generic_PowerOnOff_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8212!\r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8212! \n\r");
-
for(i = 0; i < plength; i++)
{
if(i == 0)
@@ -390,37 +439,43 @@ MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Set(Generic_DefaultTransitionParam_t* pDefaultTimeParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- AppliDefaultTransitionSet.DefaultTransitionTime = pDefaultTimeParam->DefaultTransitionTime;
+ AppliDefaultTransitionSet[elementIndex].DefaultTransitionTime = pDefaultTimeParam->DefaultTransitionTime;
+ TRACE_M(TF_GENERIC,"Generic_DefaultTransitionTime_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#820E!\r\n");
return MOBLE_RESULT_SUCCESS;
}
-
/******************************************************************************/
#endif /* ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME */
/******************************************************************************/
-
/**
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status ,
- MOBLEUINT32 plength)
+MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status , MOBLEUINT32 plength,MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_GENERIC,"Generic_DefaultTransitionTime_Status callback received \r\n");
-
- TRACE_M(TF_SERIAL_CTRL,"#8210! \n\r");
+ TRACE_M(TF_GENERIC,"Generic_DefaultTransitionTime_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8210!\r\n");
return MOBLE_RESULT_SUCCESS;
}
@@ -431,83 +486,99 @@ MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTrans
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_GetOnOffStatus(MOBLEUINT8* pOnOff_Status)
+MOBLE_RESULT Appli_Generic_GetOnOffStatus(MOBLEUINT8* pOnOff_Status,MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- *pOnOff_Status = AppliOnOffSet.Present_OnOff;
- TRACE_M(TF_SERIAL_CTRL,"Generic Get OnOff Status: Status %d!\n\r",
- AppliOnOffSet.Present_OnOff);
-
+ *pOnOff_Status = AppliOnOffSet[elementIndex].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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_GetOnOffValue(MOBLEUINT8* pOnOff_Value)
+MOBLE_RESULT Appli_Generic_GetOnOffValue(MOBLEUINT8* pOnOff_Value, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- *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);
+ *pOnOff_Value = AppliOnOffSet[elementIndex].Present_OnOffValue;
+ *(pOnOff_Value+1) = AppliOnOffSet[elementIndex].Present_OnOffValue >> 8;
+ *(pOnOff_Value+2) = AppliOnOffSet[elementIndex].TargetValue;
+ *(pOnOff_Value+3) = AppliOnOffSet[elementIndex].TargetValue >> 8;
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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_GetLevelStatus(MOBLEUINT8* pLevel_Status)
+MOBLE_RESULT Appli_Generic_GetLevelStatus(MOBLEUINT8* pLevel_Status, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- *pLevel_Status = AppliLevelSet.Present_Level16;
- *(pLevel_Status+1) = AppliLevelSet.Present_Level16 >> 8;
- *(pLevel_Status+2) = AppliLevelSet.Target_Level16;
- *(pLevel_Status+3) = AppliLevelSet.Target_Level16 >> 8;
-// TRACE_M(TF_SERIAL_CTRL,"Generic Get Level Status: Value %d!\n\r",
-// *pLevel_Status);
+ *pLevel_Status = AppliLevelSet[elementIndex].Present_Level16;
+ *(pLevel_Status+1) = AppliLevelSet[elementIndex].Present_Level16 >> 8;
+ *(pLevel_Status+2) = AppliLevelSet[elementIndex].Target_Level16;
+ *(pLevel_Status+3) = AppliLevelSet[elementIndex].Target_Level16 >> 8;
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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_GetPowerOnOffStatus(MOBLEUINT8* pPower_Status)
+MOBLE_RESULT Appli_Generic_GetPowerOnOffStatus(MOBLEUINT8* pPower_Status, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- *pPower_Status = AppliPowerOnSet.PowerOnState;
- TRACE_M(TF_SERIAL_CTRL,"Generic Get OnOff Status: Status %d!\n\r",
- AppliPowerOnSet.PowerOnState);
+
+ *pPower_Status = AppliPowerOnSet[elementIndex].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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_Status)
+MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_Status,MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- *pTransition_Status = AppliDefaultTransitionSet.DefaultTransitionTime;
- TRACE_M(TF_SERIAL_CTRL,"Get Default Transition Status: Status %d!\n\r",
- AppliDefaultTransitionSet.DefaultTransitionTime);
+
+ *pTransition_Status = AppliDefaultTransitionSet[elementIndex].DefaultTransitionTime;
return MOBLE_RESULT_SUCCESS;
}
+
/**
* @}
*/
@@ -516,5 +587,5 @@ MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_St
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 992baad9b..370769608 100644
--- 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
@@ -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
@@ -86,35 +86,72 @@ typedef struct
/* Exported Functions Prototypes ---------------------------------------------*/
-MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t*, MOBLEUINT8);
+MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t*,
+ MOBLEUINT8,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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 );
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t*,
+ MOBLEUINT8,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t*,
+ MOBLEUINT8,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
- MOBLEUINT8 OptionalValid);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_Level_Status(MOBLEUINT8 const *plevel_status,
- MOBLEUINT32 plength);
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_PowerOnOff_Set(Generic_PowerOnOffParam_t* pPowerOnOffParam,
- MOBLEUINT8 OptionalValid);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status ,
- MOBLEUINT32 plength);
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Set(Generic_DefaultTransitionParam_t* pDefaultTimeParam,
- MOBLEUINT8 OptionalValid);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status ,
- MOBLEUINT32 plength);
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
-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_GetOnOffStatus(MOBLEUINT8* pOnOff_Status,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_GetOnOffValue(MOBLEUINT8* pOnOff_Value,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_GetLevelStatus(MOBLEUINT8* pLevel_Status,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_GetPowerOnOffStatus(MOBLEUINT8* pLevel_Status,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Generic_Restore_PowerOn_Value(MOBLEUINT8 restoreValue,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_Status,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status,
- MOBLEUINT32 plength);
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
#endif /* __APPLI_GENERIC_H */
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index aecd5575e..317071a1c 100644
--- 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
@@ -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
@@ -41,58 +41,166 @@
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
-
-MOBLEUINT8 Led_Value;
/* Private function prototypes -----------------------------------------------*/
-MOBLE_RESULT Appli_GenericClient_OnOff_Set(void);
-/* Private functions ---------------------------------------------------------*/
+
+/* Private functions ---------------------------------------------------------*/
/**
-* @brief Appli_Generic_OnOff_Set: This function is callback for Application
-* when Generic OnOff message is called
-* @param void
+* @brief Appli_GenericClient_API: This function is a Wrapper to call Generic Client API depending on opcode received in input
+* @param elementIndex: Index of the element
+* @param msg_opcode: opcode of the desired API
+* @param msg_params: buffer containing the desired API parameters
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_GenericClient_OnOff_Set(void)
+MOBLE_RESULT Appli_GenericClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8 *msg_params)
{
- 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;
-}
-
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+ switch(msg_opcode){
/******************************************************************************/
-#ifdef ENABLE_GENERIC_MODEL_CLIENT_LEVEL
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_ONOFF
/******************************************************************************/
-
-/**
-* @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));
+ case GENERIC_ON_OFF_GET:
+ {
+ result = GenericClient_OnOff_Get(elementIndex);
+ break;
+ }
+ case GENERIC_ON_OFF_SET_ACK:
+ {
+ result = GenericClient_OnOff_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_OnOffParam_t) );
+ break;
+ }
+ case GENERIC_ON_OFF_SET_UNACK:
+ {
+ result = GenericClient_OnOff_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_OnOffParam_t) );
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_GENERIC_MODEL_CLIENT_ONOFF */
+/******************************************************************************/
- return MOBLE_RESULT_SUCCESS;
-}
+/******************************************************************************/
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_LEVEL
+/******************************************************************************/
+ case GENERIC_LEVEL_GET:
+ {
+ result = GenericClient_Level_Get(elementIndex);
+ break;
+ }
+ case GENERIC_LEVEL_SET_ACK:
+ {
+ result = GenericClient_Level_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_LevelParam_t));
+ break;
+ }
+ case GENERIC_LEVEL_SET_UNACK:
+ {
+ result = GenericClient_Level_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_LevelParam_t));
+ break;
+ }
+ case GENERIC_DELTA_SET:
+ {
+
+ result = GenericClient_Delta_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_DeltaLevelParam_t));
+ break;
+ }
+ case GENERIC_DELTA_SET_UNACK:
+ {
+ result = GenericClient_Delta_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_DeltaLevelParam_t));
+ break;
+ }
+ case GENERIC_MOVE_SET:
+ {
+ result = GenericClient_Move_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_LevelMoveParam_t));
+ break;
+ }
+ case GENERIC_MOVE_SET_UNACK:
+ {
+ result = GenericClient_Move_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_LevelMoveParam_t));
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_GENERIC_MODEL_CLIENT_LEVEL */
+/******************************************************************************/
/******************************************************************************/
-#endif /* #ifdef ENABLE_GENERIC_MODEL_CLIENT_LEVEL */
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_POWER_ONOFF
/******************************************************************************/
+ case GENERIC_POWER_ON_OFF_GET:
+ {
+ GenericClient_PowerOnOff_Get(elementIndex);
+ break;
+ }
+ case GENERIC_POWER_ON_OFF_SET:
+ {
+ result = GenericClient_PowerOnOff_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_PowerOnOffParam_t));
+ break;
+ }
+ case GENERIC_POWER_ON_OFF_SET_UNACK:
+ {
+ result = GenericClient_PowerOnOff_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_PowerOnOffParam_t));
+ break;
+ }
+
+/******************************************************************************/
+#endif /* #ifdef ENABLE_GENERIC_MODEL_CLIENT_POWER_ONOFF */
+/******************************************************************************/
+
+/******************************************************************************/
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_DEFAULT_TRANSITION_TIME
+/******************************************************************************/
+ case GENERIC_DEFAULT_TRANSITION_TIME_GET:
+ {
+ result = GenericClient_DefaultTransitionTime_Get(elementIndex);
+ break;
+ }
+
+ case GENERIC_DEFAULT_TRANSITION_TIME_SET:
+ {
+ result = GenericClient_DefaultTransitionTime_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_DefaultTransitionParam_t));
+ break;
+ }
+
+ case GENERIC_DEFAULT_TRANSITION_TIME_SET_UNACK:
+ {
+ result = GenericClient_DefaultTransitionTime_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_DefaultTransitionParam_t));
+ break;
+ }
+
+/******************************************************************************/
+#endif /* #ifdef ENABLE_GENERIC_MODEL_CLIENT_DEFAULT_TRANSITION_TIME */
+/******************************************************************************/
+
+ default:
+ {
+ TRACE_M(TF_GENERIC, "OpCode value invalid %d \r\n", msg_opcode);
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+ return result;
+}
/**
* @}
@@ -102,5 +210,5 @@ MOBLE_RESULT Appli_GenericClient_Level_Set_Unack(void)
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 742fd1e68..c56fd5a9e 100644
--- 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
@@ -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
@@ -32,12 +32,12 @@
/* 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);
+MOBLE_RESULT Appli_GenericClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8 *msg_params);
+
#endif /* __APPLI_GENERIC_CLIENT_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 66a517838..19face0da 100644
--- 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
@@ -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
@@ -41,7 +41,9 @@
* @{
*/
-MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState);
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
@@ -55,9 +57,8 @@ 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;
+Appli_Light_lightnessSet ApplilightnessSet[APPLICATION_NUMBER_OF_ELEMENTS] = {{1,0,0,0,0,0}};
+Appli_Light_lightnessLinearSet ApplilightnessLinearSet[APPLICATION_NUMBER_OF_ELEMENTS];
/******************************************************************************/
#endif /* #ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS */
@@ -70,10 +71,9 @@ 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;
+ Appli_Light_CtlSet AppliCtlSet[APPLICATION_NUMBER_OF_ELEMENTS];
+ Appli_Light_CtlTemperatureRangeSet AppliCtlTemperatureRangeSet[APPLICATION_NUMBER_OF_ELEMENTS];
+ Appli_Light_CtlDefaultSet AppliCtlDefaultSet[APPLICATION_NUMBER_OF_ELEMENTS];
/******************************************************************************/
#endif /* #ifdef ENABLE_LIGHT_MODEL_SERVER_CTL */
@@ -83,14 +83,11 @@ Appli_Light_CtlDefaultSet AppliCtlDefaultSet;
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;
+ Appli_Light_HslSet AppliHslSet[APPLICATION_NUMBER_OF_ELEMENTS];
+ Appli_Light_HslDefaultSet Appli_HslDefaultSet[APPLICATION_NUMBER_OF_ELEMENTS] = {{0x7FFF,0x7FFF,0x7FFF}};
+ Appli_Light_RGBSet Appli_RGBParam[APPLICATION_NUMBER_OF_ELEMENTS];
+ Appli_Light_HslRangeSet AppliHslRangeSet[APPLICATION_NUMBER_OF_ELEMENTS];
/*******************************************************************************/
#endif /*End of the LIGHTING HSL MODEL variables */
@@ -117,22 +114,28 @@ extern MOBLEUINT16 IntensityValue;
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_LightnessParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
MOBLEUINT16 duty;
static MOBLEUINT16 previousIntensity = 0;
- TRACE_M(TF_SERIAL_CTRL,"#824C!\n\r");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#824C!\r\n");
- ApplilightnessSet.PresentState16 = pLight_LightnessParam->LightnessPresentValue16;
- ApplilightnessSet.LastLightness16 = pLight_LightnessParam->LightnessLastStatus;
+ ApplilightnessSet[elementIndex].PresentState16 = pLight_LightnessParam->LightnessPresentValue16;
+ ApplilightnessSet[elementIndex].LastLightness16 = pLight_LightnessParam->LightnessLastStatus;
if(pLight_LightnessParam->LightnessPresentValue16 != 0x00)
{
- ApplilightnessSet.LastLightness16 = pLight_LightnessParam->LightnessPresentValue16;
+ ApplilightnessSet[elementIndex].LastLightness16 = pLight_LightnessParam->LightnessPresentValue16;
}
if(((IntensityValue > previousIntensity) && (IntensityValue <PWM_TIME_PERIOD)) ||
@@ -146,6 +149,7 @@ MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_Lightness
}
previousIntensity = IntensityValue;
+#if 0
/* For demo, if Level is more than 100, switch ON the LED */
if(pLight_LightnessParam->LightnessPresentValue16 >= 0x8000)
{
@@ -155,16 +159,17 @@ MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_Lightness
{
BSP_LED_Off(LED_BLUE);
}
- TRACE_M(TF_SERIAL_CTRL,"#8206%04hx!\n\r",ApplilightnessSet.PresentState16);
+#endif
+
+ TRACE_M(TF_SERIAL_CTRL,"#8206%04hx!\n\r",
+ ApplilightnessSet[elementIndex].PresentState16);
- duty = PwmValueMapping(ApplilightnessSet.PresentState16 , 0xfFFF ,0);
+ duty = PwmValueMapping(ApplilightnessSet[elementIndex].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();
+ NvmStatePowerFlag_Set(LIGHT_LIGHTNESS_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
@@ -181,18 +186,18 @@ MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_Lightness
* @param pLength: length of data
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
- MOBLEUINT16 value = 0;
+ MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_Lightness_Status callback received \r\n");
-
- TRACE_M(TF_SERIAL_CTRL,"#824E! \n\r");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#824E!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2))
@@ -201,28 +206,33 @@ MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, M
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present Lightness: %d \r\n",
- value << 8 | pLightness_status[i]);
+ TRACE_M(TF_LIGHT,"Present Lightness: 0x%x (%d)\r\n",
+ value | pLightness_status[i] << 8,
+ value | pLightness_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Target Lightness: %d \r\n",
- value << 8 | pLightness_status[i]);
+ TRACE_M(TF_LIGHT,"Target Lightness: 0x%x (%d)\r\n",
+ value | pLightness_status[i] << 8,
+ value | pLightness_status[i] << 8);
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\r\n",
+ pLightness_status[i],
pLightness_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#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
@@ -231,11 +241,13 @@ MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, M
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Lightness_Linear_Set(Light_LightnessStatus_t* pLight_LightnessLinearParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- ApplilightnessLinearSet.PresentState16 = pLight_LightnessLinearParam->LinearPresentValue16;
+ ApplilightnessLinearSet[elementIndex].PresentState16 = pLight_LightnessLinearParam->LinearPresentValue16;
- TRACE_M(TF_SERIAL_CTRL,"#8250!\n\r");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Linear_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8250!\r\n");
return MOBLE_RESULT_SUCCESS;
}
@@ -248,20 +260,25 @@ MOBLE_RESULT Appli_Light_Lightness_Linear_Set(Light_LightnessStatus_t* pLight_Li
* @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 dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @param pLength: length of data
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_Lightness_Linear_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8252! \n\r");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Linear_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8252!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2))
@@ -270,24 +287,29 @@ MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLin
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present Lightness: %d \r\n",
- value << 8 | pLightnessLinear_status[i]);
+ TRACE_M(TF_LIGHT,"Present Lightness: 0x%x (%d)\r\n",
+ value | pLightnessLinear_status[i] << 8,
+ value | pLightnessLinear_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Target Lightness: %d \r\n",
- value << 8 | pLightnessLinear_status[i]);
+ TRACE_M(TF_LIGHT,"Target Lightness: 0x%x (%d)\r\n",
+ value | pLightnessLinear_status[i] << 8,
+ value | pLightnessLinear_status[i] << 8);
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\r\n",
+ pLightnessLinear_status[i],
pLightnessLinear_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP
/******************************************************************************/
@@ -297,11 +319,17 @@ MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLin
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pLight_LightnessDefaultParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
+#if 0
if(pLight_LightnessDefaultParam->LightnessDefaultStatus > 0)
{
BSP_LED_On(LED_BLUE);
@@ -310,14 +338,16 @@ MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pL
{
BSP_LED_Off(LED_BLUE);
}
- ApplilightnessSet.LightnessDefault = pLight_LightnessDefaultParam->LightnessDefaultStatus;
+#endif
+
+ ApplilightnessSet[elementIndex].LightnessDefault =
+ pLight_LightnessDefaultParam->LightnessDefaultStatus;
+
+ TRACE_M(TF_LIGHT,"Light_Lightness_Default_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8259! \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8259!\n\r");
-
/* set the flag value for NVM store */
- RestoreFlag = LIGHT_LIGHTNESS_NVM_FLAG;
-
- AppliNvm_SaveMessageParam();
+ NvmStatePowerFlag_Set(LIGHT_LIGHTNESS_NVM_FLAG,elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -331,19 +361,25 @@ MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pL
* when Light Lightness Default status message is received
* @param pLightnessDefault_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDefault_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDefault_status, MOBLEUINT32 pLength
+ , MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
- MOBLEUINT16 value = 0;
- #endif
- TRACE_M(TF_LIGHT,"Light_Lightness_Default_Status callback received \r\n");
+ MOBLEUINT16 value;
+#endif
- TRACE_M(TF_SERIAL_CTRL,"#8256! \n\r");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Default_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8256!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if(i == 0)
@@ -352,14 +388,61 @@ MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDe
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Lightness: %d \r\n",
- value << 8 | pLightnessDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Lightness Default: 0x%x (%d)\r\n",
+ value | pLightnessDefault_status[i] << 8,
+ value | pLightnessDefault_status[i] << 8);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
+/**
+* @brief Appli_Light_Lightness_Last_Status: This function is callback for Application
+* when Light Lightness Last status message is received
+* @param pLightnessDefault_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Lightness_Last_Status(MOBLEUINT8 const *pLightnessLast_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+#if ( CFG_DEBUG_TRACE != 0 )
+ MOBLEUINT32 i;
+ MOBLEUINT16 value;
+#endif
+
+ TRACE_M(TF_LIGHT,"Light_Lightness_Last_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8256!\r\n");
+
+#if ( CFG_DEBUG_TRACE != 0 )
+ for(i = 0; i < pLength; i++)
+ {
+ if(i == 0)
+ {
+ value = pLightnessLast_status[i];
+ }
+ else if(i == 1)
+ {
+ TRACE_M(TF_LIGHT,"Lightness Last: 0x%x (%d)\r\n",
+ value | pLightnessLast_status[i] << 8,
+ value | pLightnessLast_status[i] << 8);
+ }
+ }
+#endif
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP
/******************************************************************************/
@@ -369,16 +452,22 @@ MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDe
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Lightness_Range_Set(Light_LightnessRangeParam_t* pLight_LightnessRangeParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- ApplilightnessSet.StatusCode = pLight_LightnessRangeParam->StatusCode;
- ApplilightnessSet.RangeMin = pLight_LightnessRangeParam->MinRangeStatus;
- ApplilightnessSet.RangeMax = pLight_LightnessRangeParam->MaxRangeStatus;
+ ApplilightnessSet[elementIndex].StatusCode = pLight_LightnessRangeParam->StatusCode;
+ ApplilightnessSet[elementIndex].RangeMin = pLight_LightnessRangeParam->MinRangeStatus;
+ ApplilightnessSet[elementIndex].RangeMax = pLight_LightnessRangeParam->MaxRangeStatus;
- TRACE_M(TF_SERIAL_CTRL,"#825B! \n\r");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Range_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#825B!\r\n");
return MOBLE_RESULT_SUCCESS;
}
@@ -392,45 +481,56 @@ MOBLE_RESULT Appli_Light_Lightness_Range_Set(Light_LightnessRangeParam_t* pLight
* when Light Lightness range ststus message is received
* @param pLightnessRange_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status, MOBLEUINT32 pLength
+ , MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
- MOBLEUINT16 value = 0;
+ MOBLEUINT16 value;
#endif
- TRACE_M(TF_LIGHT,"Light_Lightness_Range_Status callback received \r\n");
-
- TRACE_M(TF_SERIAL_CTRL,"#8258! \n\r");
-#ifdef CFG_DEBUG_TRACE
+ TRACE_M(TF_LIGHT,"Light_Lightness_Range_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8258!\r\n");
+
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if(i == 0)
{
- TRACE_M(TF_LIGHT,"Status Code: %d \r\n",
- value << 8 | pLightnessRange_status[i]);
+ TRACE_M(TF_LIGHT,"Status Code: 0x%x (%d)\r\n",
+ pLightnessRange_status[i],
+ pLightnessRange_status[i]);
}
else if((i == 1) || (i == 3))
{
value = pLightnessRange_status[i];
}
- else if(i == 1)
+ else if(i == 2)
{
- TRACE_M(TF_LIGHT,"Range Min: %d \r\n",
- value << 8 | pLightnessRange_status[i]);
+ TRACE_M(TF_LIGHT,"Range Min: 0x%x (%d)\r\n",
+ value | pLightnessRange_status[i] << 8,
+ value | pLightnessRange_status[i] << 8);
}
- else if(i == 3)
+ else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Range Max: %d \r\n",
- value << 8 | pLightnessRange_status[i]);
+ TRACE_M(TF_LIGHT,"Range Max: 0x%x (%d)\r\n",
+ value | pLightnessRange_status[i] << 8,
+ value | pLightnessRange_status[i] << 8);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL
/******************************************************************************/
@@ -440,22 +540,34 @@ MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRang
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Ctl_Set(Light_CtlStatus_t* pLight_CtlParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
float colourRatio;
float brightRatio;
- TRACE_M(TF_SERIAL_CTRL,"#825E! \n\r");
+ TRACE_M(TF_LIGHT,"Appli_Light_Ctl_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#825E!\r\n");
+
+ AppliCtlSet[elementIndex].PresentLightness16 = pLight_CtlParam->PresentCtlLightness16;
+ AppliCtlSet[elementIndex].PresentTemperature16 = pLight_CtlParam->PresentCtlTemperature16;
+ AppliCtlSet[elementIndex].PresentCtlDelta16 = pLight_CtlParam->PresentCtlDelta16;
- 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);
+ /* Save target parameters if transition is available */
+ AppliCtlSet[elementIndex].TargetLightness16 = pLight_CtlParam->TargetCtlLightness16;
+ AppliCtlSet[elementIndex].TargetTemperature16 = pLight_CtlParam->TargetCtlTemperature16;
+ AppliCtlSet[elementIndex].TargetCtlDelta16 = pLight_CtlParam->TargetCtlDeltaUv16;
- brightRatio = Ratio_CalculateValue(AppliCtlSet.PresentLightness16 ,0XFFFF ,0);
+ colourRatio = Ratio_CalculateValue(AppliCtlSet[elementIndex].PresentTemperature16 ,MAX_CTL_TEMP_RANGE ,MIN_CTL_TEMP_RANGE);
+
+ brightRatio = Ratio_CalculateValue(AppliCtlSet[elementIndex].PresentLightness16 ,0XFFFF ,0);
Appli_LightPwmValue.PwmCoolValue = PWM_CoolValue(colourRatio , brightRatio);
Appli_LightPwmValue.PwmWarmValue = PWM_WarmValue(colourRatio , brightRatio);
@@ -464,15 +576,8 @@ MOBLE_RESULT Appli_Light_Ctl_Set(Light_CtlStatus_t* pLight_CtlParam,
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();
+ NvmStatePowerFlag_Set(LIGHT_CTL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -488,18 +593,18 @@ MOBLE_RESULT Appli_Light_Ctl_Set(Light_CtlStatus_t* pLight_CtlParam,
* @param pLength: length of data
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status,
- MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
- MOBLEUINT16 value = 0;
+ MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_Ctl_Status callback received \r\n");
-
- TRACE_M(TF_SERIAL_CTRL,"#8260! \n\r");
+
+ TRACE_M(TF_LIGHT,"Light_Ctl_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8260!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2) || (i == 4) || (i == 6))
@@ -508,34 +613,41 @@ MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status,
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present CTL Lightness: %d \r\n",
- value << 8 | pLightCtl_status[i]);
+ TRACE_M(TF_LIGHT,"Present CTL Lightness: 0x%x (%d)\r\n",
+ value | pLightCtl_status[i] << 8,
+ value | pLightCtl_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Present CTL Temperature: %d \r\n",
- value << 8 | pLightCtl_status[i]);
+ TRACE_M(TF_LIGHT,"Present CTL Temperature: 0x%x (%d)\r\n",
+ value | pLightCtl_status[i] << 8,
+ value | pLightCtl_status[i] << 8);
}
else if(i == 5)
{
- TRACE_M(TF_LIGHT,"Target CTL Lightness: %d \r\n",
- value << 8 | pLightCtl_status[i]);
+ TRACE_M(TF_LIGHT,"Target CTL Lightness: 0x%x (%d)\r\n",
+ value | pLightCtl_status[i] << 8,
+ value | pLightCtl_status[i] << 8);
}
else if(i == 7)
{
- TRACE_M(TF_LIGHT,"Target CTL Temperature: %d \r\n",
- value << 8 | pLightCtl_status[i]);
+ TRACE_M(TF_LIGHT,"Target CTL Temperature: 0x%x (%d)\r\n",
+ value | pLightCtl_status[i] << 8,
+ value | pLightCtl_status[i] << 8);
}
else if(i == 8)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time:0x%x (%d)\r\n",
+ pLightCtl_status[i],
pLightCtl_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE
/******************************************************************************/
@@ -545,21 +657,32 @@ MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status,
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_CtlTemperature_Set(Light_CtlStatus_t* pLight_CtltempParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
float colourRatio;
float brightRatio;
- TRACE_M(TF_SERIAL_CTRL,"#8264!\n\r");
- AppliCtlSet.PresentTemperature16 = pLight_CtltempParam->PresentCtlTemperature16;
- AppliCtlSet.PresentCtlDelta16 = pLight_CtltempParam->PresentCtlDelta16;
+ TRACE_M(TF_LIGHT,"Appli_Light_CtlTemperature_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8264!\r\n");
- colourRatio = Ratio_CalculateValue(AppliCtlSet.PresentTemperature16 ,MAX_CTL_TEMP_RANGE ,MIN_CTL_TEMP_RANGE);
+ AppliCtlSet[elementIndex].PresentTemperature16 = pLight_CtltempParam->PresentCtlTemperature16;
+ AppliCtlSet[elementIndex].PresentCtlDelta16 = pLight_CtltempParam->PresentCtlDelta16;
- brightRatio = Ratio_CalculateValue(AppliCtlSet.PresentLightness16 ,0XFFFF ,0);
+ /* Made a copy of target in case of transition values change */
+ AppliCtlSet[elementIndex].TargetTemperature16 = pLight_CtltempParam->TargetCtlTemperature16;
+ AppliCtlSet[elementIndex].TargetCtlDelta16 = pLight_CtltempParam->TargetCtlDeltaUv16;
+
+ colourRatio = Ratio_CalculateValue(AppliCtlSet[elementIndex].PresentTemperature16 ,MAX_CTL_TEMP_RANGE ,MIN_CTL_TEMP_RANGE);
+
+ brightRatio = Ratio_CalculateValue(AppliCtlSet[elementIndex].PresentLightness16 ,0XFFFF ,0);
Appli_LightPwmValue.PwmCoolValue = PWM_CoolValue(colourRatio , brightRatio);
Appli_LightPwmValue.PwmWarmValue = PWM_WarmValue(colourRatio , brightRatio);
@@ -568,9 +691,7 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Set(Light_CtlStatus_t* pLight_CtltempPar
Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
/* set the flag value for NVM store */
- RestoreFlag = LIGHT_CTL_NVM_FLAG;
-
- AppliNvm_SaveMessageParam();
+ NvmStatePowerFlag_Set(LIGHT_CTL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -584,19 +705,25 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Set(Light_CtlStatus_t* pLight_CtltempPar
* when Light CTL temperature status message is received
* @param pLightCtlTemp_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status, MOBLEUINT32 pLength
+ , MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
- MOBLEUINT16 value = 0;
+ MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_CtlTemperature_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8266! \n\r");
+ TRACE_M(TF_LIGHT,"Light_CtlTemperature_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8266!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2) || (i == 4) || (i == 6))
@@ -605,35 +732,42 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_s
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present CTL Temperature: %d \r\n",
- value << 8 | pLightCtlTemp_status[i]);
+ TRACE_M(TF_LIGHT,"Present CTL Temperature: 0x%x (%d)\r\n",
+ value | pLightCtlTemp_status[i] << 8,
+ value | pLightCtlTemp_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Present CTL Delta UV: %d \r\n",
- value << 8 | pLightCtlTemp_status[i]);
+ TRACE_M(TF_LIGHT,"Present CTL Delta UV: 0x%x (%d)\r\n",
+ value | pLightCtlTemp_status[i] << 8,
+ value | pLightCtlTemp_status[i] << 8);
}
else if(i == 5)
{
- TRACE_M(TF_LIGHT,"Target CTL Temperature: %d \r\n",
- value << 8 | pLightCtlTemp_status[i]);
+ TRACE_M(TF_LIGHT,"Target CTL Temperature: 0x%x (%d)\r\n",
+ value | pLightCtlTemp_status[i] << 8,
+ value | pLightCtlTemp_status[i] << 8);
}
else if(i == 7)
{
- TRACE_M(TF_LIGHT,"Target CTL Delta UV: %d \r\n",
- value << 8 | pLightCtlTemp_status[i]);
+ TRACE_M(TF_LIGHT,"Target CTL Delta UV: 0x%x (%d)\r\n",
+ value | pLightCtlTemp_status[i] << 8,
+ value | pLightCtlTemp_status[i] << 8);
}
else if(i == 8)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\r\n",
+ pLightCtlTemp_status[i],
pLightCtlTemp_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP
/******************************************************************************/
@@ -643,16 +777,22 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_s
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_CtlTemperature_Range_Set(Light_CtlTemperatureRangeParam_t* pLight_CtlTempRangeParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- AppliCtlTemperatureRangeSet.RangeMin = pLight_CtlTempRangeParam->MinRangeStatus;
- AppliCtlTemperatureRangeSet.RangeMax = pLight_CtlTempRangeParam->MaxRangeStatus;
- AppliCtlTemperatureRangeSet.StatusCode = pLight_CtlTempRangeParam->StatusCode;
+ AppliCtlTemperatureRangeSet[elementIndex].RangeMin = pLight_CtlTempRangeParam->MinRangeStatus;
+ AppliCtlTemperatureRangeSet[elementIndex].RangeMax = pLight_CtlTempRangeParam->MaxRangeStatus;
+ AppliCtlTemperatureRangeSet[elementIndex].StatusCode = pLight_CtlTempRangeParam->StatusCode;
- TRACE_M(TF_SERIAL_CTRL,"#826B!\n\r");
+ TRACE_M(TF_LIGHT,"Light_CtlTemperature_Range_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#826B!\r\n");
return MOBLE_RESULT_SUCCESS;
}
@@ -667,28 +807,34 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Range_Set(Light_CtlTemperatureRangeParam
* when Light CTL temperature range status message is received
* @param pCtlTempRange_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
- MOBLEUINT16 value = 0;
+ MOBLEUINT16 value;
#endif
- TRACE_M(TF_LIGHT,"Light_CtlTemperature_Range_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8263! \n\r");
+ TRACE_M(TF_LIGHT,"Light_CtlTemperature_Range_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8263!\r\n");
- RestoreFlag = LIGHT_CTL_NVM_FLAG;
+ RestoreFlag = LIGHT_CTL_NVM_FLAG;
AppliNvm_SaveMessageParam();
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if(i == 0)
{
- TRACE_M(TF_LIGHT,"Status Code: %d \r\n",
+ TRACE_M(TF_LIGHT,"Status Code: 0x%x (%d)\r\n",
+ pCtlTempRange_status[i],
pCtlTempRange_status[i]);
}
else if((i == 1) || (i == 3))
@@ -697,19 +843,23 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempR
}
else if(i == 2)
{
- TRACE_M(TF_LIGHT,"Range Min: %d \r\n",
- value << 8 | pCtlTempRange_status[i]);
+ TRACE_M(TF_LIGHT,"Range Min: 0x%x (%d)\r\n",
+ value | pCtlTempRange_status[i] << 8,
+ value | pCtlTempRange_status[i] << 8 );
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Range Max: %d \r\n",
- value << 8 | pCtlTempRange_status[i]);
+ TRACE_M(TF_LIGHT,"Range Max: 0x%x (%d)\r\n",
+ value | pCtlTempRange_status[i] << 8,
+ value | pCtlTempRange_status[i] << 8 );
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP
/******************************************************************************/
@@ -719,16 +869,22 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempR
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_CtlDefault_Set(Light_CtlDefaultParam_t* pLight_CtlDefaultParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- AppliCtlDefaultSet.CtlDefaultLightness16 = pLight_CtlDefaultParam->CtlDefaultLightness16;
- AppliCtlDefaultSet.CtlDefaultTemperature16 = pLight_CtlDefaultParam->CtlDefaultTemperature16;
- AppliCtlDefaultSet.CtlDefaultDeltaUv = pLight_CtlDefaultParam->CtlDefaultDeltaUv;
+ AppliCtlDefaultSet[elementIndex].CtlDefaultLightness16 = pLight_CtlDefaultParam->CtlDefaultLightness16;
+ AppliCtlDefaultSet[elementIndex].CtlDefaultTemperature16 = pLight_CtlDefaultParam->CtlDefaultTemperature16;
+ AppliCtlDefaultSet[elementIndex].CtlDefaultDeltaUv = pLight_CtlDefaultParam->CtlDefaultDeltaUv;
- TRACE_M(TF_SERIAL_CTRL,"#8269!\n\r");
+ TRACE_M(TF_LIGHT,"Light_CtlDefault_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8269!\r\n");
return MOBLE_RESULT_SUCCESS;
}
@@ -742,19 +898,24 @@ MOBLE_RESULT Appli_Light_CtlDefault_Set(Light_CtlDefaultParam_t* pLight_CtlDefau
* when Light CTL Default status message is received
* @param pCtlDefault_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
- MOBLEUINT16 value = 0;
+ MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_Ctl_DefaultStatus callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8268! \n\r");
+ TRACE_M(TF_LIGHT,"Light_Ctl_DefaultStatus callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8268!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2) || (i == 4))
@@ -763,24 +924,29 @@ MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status,
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Lightness: %d \r\n",
- value << 8 | pCtlDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Lightness: 0x%x (%d)\n\r",
+ value | pCtlDefault_status[i] << 8,
+ value | pCtlDefault_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Temperature: %d \r\n",
- value << 8 | pCtlDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Temperature: 0x%x (%d)\n\r",
+ value | pCtlDefault_status[i] << 8,
+ value | pCtlDefault_status[i] << 8);
}
else if(i == 5)
{
- TRACE_M(TF_LIGHT,"Delta UV: %d \r\n",
- value << 8 | pCtlDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Delta UV: 0x%x (%d)\n\r",
+ value | pCtlDefault_status[i] << 8,
+ value | pCtlDefault_status[i] << 8);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL
/******************************************************************************/
@@ -790,32 +956,41 @@ MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status,
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Hsl_Set(Light_HslStatus_t* pLight_HslParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_SERIAL_CTRL,"#8276!\n\r");
+ TRACE_M(TF_LIGHT,"Appli_Light_Hsl_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8276!\r\n");
- AppliHslSet.HslLightness16 = pLight_HslParam->PresentHslLightness16;
- AppliHslSet.HslHueLightness16 = pLight_HslParam->PresentHslHueLightness16;
- AppliHslSet.HslSaturation16 = pLight_HslParam->PresentHslSaturation16;
+ AppliHslSet[elementIndex].HslLightness16 = pLight_HslParam->PresentHslLightness16;
+ AppliHslSet[elementIndex].HslHueLightness16 = pLight_HslParam->PresentHslHueLightness16;
+ AppliHslSet[elementIndex].HslSaturation16 = pLight_HslParam->PresentHslSaturation16;
+ /* Save target parameters if transition is available */
+ AppliHslSet[elementIndex].TargetHslLightness16 = pLight_HslParam->TargetHslLightness16;
+ AppliHslSet[elementIndex].TargetHslHueLightness16 = pLight_HslParam->TargetHslHueLightness16;
+ AppliHslSet[elementIndex].TargetHslSaturation16 = pLight_HslParam->TargetHslSaturation16;
+
/* Function to convert HSL values in RGB values */
- HSL2RGB_Conversion();
+ HSL2RGB_Conversion(elementIndex);
- 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);
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam[elementIndex].Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam[elementIndex].Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam[elementIndex].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();
+ NvmStatePowerFlag_Set(LIGHT_HSL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -829,19 +1004,24 @@ MOBLE_RESULT Appli_Light_Hsl_Set(Light_HslStatus_t* pLight_HslParam,
* when Light HSL status message is received
* @param pHsl_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_Hsl_Status callback received \r\n");
-
- TRACE_M(TF_SERIAL_CTRL,"#8278! \n\r");
+
+ TRACE_M(TF_LIGHT,"Light_Hsl_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8278!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2) || (i == 4))
@@ -850,29 +1030,35 @@ MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 p
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"HSL Lightness: %d \r\n",
- value << 8 | pHsl_status[i]);
+ TRACE_M(TF_LIGHT,"HSL Lightness: 0x%x (%d)\n\r",
+ value | pHsl_status[i] << 8,
+ value | pHsl_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"HSL Hue: %d \r\n",
- value << 8 | pHsl_status[i]);
+ TRACE_M(TF_LIGHT,"HSL Hue: 0x%x (%d)\n\r",
+ value | pHsl_status[i] << 8,
+ value | pHsl_status[i] << 8);
}
else if(i == 5)
{
- TRACE_M(TF_LIGHT,"HSL Saturation: %d \r\n",
- value << 8 | pHsl_status[i]);
+ TRACE_M(TF_LIGHT,"HSL Saturation: 0x%x (%d)\n\r",
+ value | pHsl_status[i] << 8,
+ value | pHsl_status[i] << 8);
}
else if(i == 6)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\n\r",
+ pHsl_status[i],
pHsl_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_HUE
/******************************************************************************/
@@ -882,28 +1068,32 @@ MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 p
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_HslHue_Set(Light_HslStatus_t* pLight_HslHueParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_SERIAL_CTRL,"#826F! \n\r");
+ TRACE_M(TF_LIGHT,"Light_HslHue_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#826F!\r\n");
- AppliHslSet.HslHueLightness16 = pLight_HslHueParam->PresentHslHueLightness16;
+ AppliHslSet[elementIndex].HslHueLightness16 = pLight_HslHueParam->PresentHslHueLightness16;
- HSL2RGB_Conversion();
+ HSL2RGB_Conversion(elementIndex);
- 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);
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam[elementIndex].Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam[elementIndex].Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam[elementIndex].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();
+ NvmStatePowerFlag_Set(LIGHT_HSL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
@@ -918,19 +1108,24 @@ MOBLE_RESULT Appli_Light_HslHue_Set(Light_HslStatus_t* pLight_HslHueParam,
* when Light HSL HUE status message is received
* @param pHslHue_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
- MOBLEUINT16 value = 0;
+ MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_HslHue_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8271! \n\r");
+ TRACE_M(TF_LIGHT,"Light_HslHue_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8271!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2))
@@ -939,24 +1134,29 @@ MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUI
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present Hue: %d \r\n",
- value << 8 | pHslHue_status[i]);
+ TRACE_M(TF_LIGHT,"Present Hue: 0x%x (%d)\n\r",
+ value | pHslHue_status[i] << 8,
+ value | pHslHue_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Target Hue: %d \r\n",
- value << 8 | pHslHue_status[i]);
+ TRACE_M(TF_LIGHT,"Target Hue: 0x%x (%d)\n\r",
+ value | pHslHue_status[i] << 8,
+ value | pHslHue_status[i] << 8);
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\n\r",
+ pHslHue_status[i],
pHslHue_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION
/******************************************************************************/
@@ -966,28 +1166,32 @@ MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUI
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_HslSaturation_Set(Light_HslStatus_t* pLight_HslSaturationParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_SERIAL_CTRL,"#8273! \n\r");
+ TRACE_M(TF_LIGHT,"Appli_Light_HslSaturation_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8273!\r\n");
- AppliHslSet.HslSaturation16 = pLight_HslSaturationParam->PresentHslSaturation16;
+ AppliHslSet[elementIndex].HslSaturation16 = pLight_HslSaturationParam->PresentHslSaturation16;
- HSL2RGB_Conversion();
+ HSL2RGB_Conversion(elementIndex);
- 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);
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam[elementIndex].Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam[elementIndex].Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam[elementIndex].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();
+ NvmStatePowerFlag_Set(LIGHT_HSL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -1001,19 +1205,24 @@ MOBLE_RESULT Appli_Light_HslSaturation_Set(Light_HslStatus_t* pLight_HslSaturati
* when Light HSL Saturation status message is received
* @param pHslSaturation_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
- MOBLEUINT16 value = 0;
+ MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_HslSaturation_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8275! \n\r");
-
-#ifdef CFG_DEBUG_TRACE
+ TRACE_M(TF_LIGHT,"Light_HslSaturation_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8275!\r\n");
+
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2))
@@ -1022,24 +1231,29 @@ MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_s
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present Saturation: %d \r\n",
- value << 8 | pHslSaturation_status[i]);
+ TRACE_M(TF_LIGHT,"Present Saturation: 0x%x (%d)\n\r",
+ value | pHslSaturation_status[i] << 8,
+ value | pHslSaturation_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Target Saturation: %d \r\n",
- value << 8 | pHslSaturation_status[i]);
+ TRACE_M(TF_LIGHT,"Target Saturation: 0x%x (%d)\n\r",
+ value | pHslSaturation_status[i] << 8,
+ value | pHslSaturation_status[i] << 8);
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\n\r",
+ pHslSaturation_status[i],
pHslSaturation_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP
/******************************************************************************/
@@ -1049,34 +1263,38 @@ MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_s
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_HslDefault_Set(Light_HslStatus_t* pLight_HslDefaultParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_SERIAL_CTRL,"#827F! \n\r");
+ TRACE_M(TF_LIGHT,"Appli_Light_HslDefault_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#827F!\r\n");
- Appli_HslDefaultSet.HslDefaultLightness16 = pLight_HslDefaultParam->PresentHslLightness16;
- Appli_HslDefaultSet.HslDefaultHueLightness16 = pLight_HslDefaultParam->PresentHslHueLightness16;
- Appli_HslDefaultSet.HslDefaultSaturation16 = pLight_HslDefaultParam->PresentHslSaturation16;
+ Appli_HslDefaultSet[elementIndex].HslDefaultLightness16 = pLight_HslDefaultParam->PresentHslLightness16;
+ Appli_HslDefaultSet[elementIndex].HslDefaultHueLightness16 = pLight_HslDefaultParam->PresentHslHueLightness16;
+ Appli_HslDefaultSet[elementIndex].HslDefaultSaturation16 = pLight_HslDefaultParam->PresentHslSaturation16;
- AppliHslSet.HslLightness16 = Appli_HslDefaultSet.HslDefaultLightness16;
- AppliHslSet.HslHueLightness16 = Appli_HslDefaultSet.HslDefaultHueLightness16;
- AppliHslSet.HslSaturation16 = Appli_HslDefaultSet.HslDefaultSaturation16;
+ AppliHslSet[elementIndex].HslLightness16 = Appli_HslDefaultSet[elementIndex].HslDefaultLightness16;
+ AppliHslSet[elementIndex].HslHueLightness16 = Appli_HslDefaultSet[elementIndex].HslDefaultHueLightness16;
+ AppliHslSet[elementIndex].HslSaturation16 = Appli_HslDefaultSet[elementIndex].HslDefaultSaturation16;
- HSL2RGB_Conversion();
+ HSL2RGB_Conversion(elementIndex);
- 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);
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam[elementIndex].Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam[elementIndex].Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam[elementIndex].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();
+ NvmStatePowerFlag_Set(LIGHT_HSL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -1092,17 +1310,18 @@ MOBLE_RESULT Appli_Light_HslDefault_Set(Light_HslStatus_t* pLight_HslDefaultPara
* @param pLength: length of data
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
- MOBLEUINT16 value = 0;
+ MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_HslDefault_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#827C! \n\r");
-
-#ifdef CFG_DEBUG_TRACE
+ TRACE_M(TF_LIGHT,"Light_HslDefault_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#827C!\r\n");
+
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2) || (i == 4))
@@ -1111,24 +1330,29 @@ MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status,
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Lightness: %d \r\n",
- value << 8 | pHslDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Lightness: 0x%x (%d)\n\r",
+ value | pHslDefault_status[i] << 8,
+ value | pHslDefault_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Hue: %d \r\n",
- value << 8 | pHslDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Hue: 0x%x (%d)\n\r",
+ value | pHslDefault_status[i] << 8,
+ value | pHslDefault_status[i] << 8);
}
- else if(i == 4)
+ else if(i == 5)
{
- TRACE_M(TF_LIGHT,"Saturation: %d \r\n",
- value << 8 | pHslDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Saturation: 0x%x (%d)\n\r",
+ value | pHslDefault_status[i] << 8,
+ value | pHslDefault_status[i] << 8);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP
/******************************************************************************/
@@ -1141,14 +1365,16 @@ MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status,
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_HslRange_Set(Light_HslRangeParam_t* pLight_HslRangeParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_SERIAL_CTRL,"#8281! \n\r");
+ TRACE_M(TF_LIGHT,"Light_HslRange_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8281!\r\n");
- AppliHslRangeSet.HslHueMinRange16 = pLight_HslRangeParam->HslHueMinRange16;
- AppliHslRangeSet.HslHueMaxRange16 = pLight_HslRangeParam->HslHueMaxRange16;
- AppliHslRangeSet.HslMinSaturation16 = pLight_HslRangeParam->HslMinSaturation16;
- AppliHslRangeSet.HslMaxSaturation16 = pLight_HslRangeParam->HslMaxSaturation16;
+ AppliHslRangeSet[elementIndex].HslHueMinRange16 = pLight_HslRangeParam->HslHueMinRange16;
+ AppliHslRangeSet[elementIndex].HslHueMaxRange16 = pLight_HslRangeParam->HslHueMaxRange16;
+ AppliHslRangeSet[elementIndex].HslMinSaturation16 = pLight_HslRangeParam->HslMinSaturation16;
+ AppliHslRangeSet[elementIndex].HslMaxSaturation16 = pLight_HslRangeParam->HslMaxSaturation16;
return MOBLE_RESULT_SUCCESS;
}
@@ -1162,24 +1388,31 @@ MOBLE_RESULT Appli_Light_HslRange_Set(Light_HslRangeParam_t* pLight_HslRangePara
* when Light HSL range status message is received
* @param pHslRange_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
- MOBLEUINT16 value = 0;
+ MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_HslRange_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#827E! \n\r");
+ TRACE_M(TF_LIGHT,"Light_HslRange_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#827E!\r\n");
+
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if(i == 0)
{
- TRACE_M(TF_LIGHT,"Status Code: %d \r\n",
+ TRACE_M(TF_LIGHT,"Status Code: 0x%x (%d)\n\r",
+ pHslRange_status[i],
pHslRange_status[i]);
}
else if((i == 1) || (i == 3) || (i == 5) || (i == 7))
@@ -1188,30 +1421,36 @@ MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status, MOB
}
else if(i == 2)
{
- TRACE_M(TF_LIGHT,"Hue Range Min: %d \r\n",
- value << 8 | pHslRange_status[i]);
+ TRACE_M(TF_LIGHT,"Hue Range Min: 0x%x (%d)\n\r",
+ value | pHslRange_status[i] << 8,
+ value | pHslRange_status[i] << 8);
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Hue Range Max: %d \r\n",
- value << 8 | pHslRange_status[i]);
+ TRACE_M(TF_LIGHT,"Hue Range Max: 0x%x (%d)\n\r",
+ value | pHslRange_status[i] << 8,
+ value | pHslRange_status[i] << 8);
}
else if(i == 6)
{
- TRACE_M(TF_LIGHT,"Saturation Range Min: %d \r\n",
- value << 8 | pHslRange_status[i]);
+ TRACE_M(TF_LIGHT,"Saturation Range Min: 0x%x (%d)\n\r",
+ value | pHslRange_status[i] << 8,
+ value | pHslRange_status[i] << 8);
}
else if(i == 8)
{
- TRACE_M(TF_LIGHT,"Saturation Range Max: %d \r\n",
- value << 8 | pHslRange_status[i]);
+ TRACE_M(TF_LIGHT,"Saturation Range Max: 0x%x (%d)\n\r",
+ value | pHslRange_status[i] << 8,
+ value | pHslRange_status[i] << 8);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/*******************************************************************************
Following Functions are used for the LIGHTING Lightness MODEL
*******************************************************************************/
@@ -1224,14 +1463,19 @@ Following Functions are used for the LIGHTING Lightness MODEL
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState)
+MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(lLightnessState) = ApplilightnessSet.PresentState16;
- *(lLightnessState+1) = ApplilightnessSet.PresentState16 >> 8;
- *(lLightnessState+2) = ApplilightnessSet.LastLightness16 ;
- *(lLightnessState+3) = ApplilightnessSet.LastLightness16 >> 8;
+ *(lLightnessState) = ApplilightnessSet[elementIndex].PresentState16;
+ *(lLightnessState+1) = ApplilightnessSet[elementIndex].PresentState16 >> 8;
+ *(lLightnessState+2) = ApplilightnessSet[elementIndex].LastLightness16 ;
+ *(lLightnessState+3) = ApplilightnessSet[elementIndex].LastLightness16 >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1241,17 +1485,19 @@ MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState)
+MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lLightnessState) = ApplilightnessLinearSet[elementIndex].PresentState16;
+ *(lLightnessState+1) = ApplilightnessLinearSet[elementIndex].PresentState16 >> 8;
+ *(lLightnessState+2) = ApplilightnessSet[elementIndex].LastLightness16 ;
+ *(lLightnessState+3) = ApplilightnessSet[elementIndex].LastLightness16 >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1261,14 +1507,17 @@ MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState)
+MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(lDefaultState) = ApplilightnessSet.LightnessDefault;
- *(lDefaultState+1) = ApplilightnessSet.LightnessDefault >> 8;
- TRACE_M(TF_SERIAL_CTRL,"Get Lighness Default Status: %d\n\r",
- ApplilightnessSet.LightnessDefault);
+ *(lDefaultState) = ApplilightnessSet[elementIndex].LightnessDefault;
+ *(lDefaultState+1) = ApplilightnessSet[elementIndex].LightnessDefault >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1280,13 +1529,11 @@ MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState)
* @param lLastState: Pointer to the status message
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState)
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(lLastState) = ApplilightnessSet.LastLightness16;
- *(lLastState+1) = ApplilightnessSet.LastLightness16 >> 8;
-
- TRACE_M(TF_SERIAL_CTRL,"Get Lighness Last Status: status: %d \n\r",
- ApplilightnessSet.LastLightness16);
+ *(lLastState) = ApplilightnessSet[elementIndex].LastLightness16;
+ *(lLastState+1) = ApplilightnessSet[elementIndex].LastLightness16 >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1295,19 +1542,20 @@ MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetLightnessRangeStatus(MOBLEUINT8* lRangeState)
+MOBLE_RESULT Appli_Light_GetLightnessRangeStatus(MOBLEUINT8* lRangeState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lRangeState) = ApplilightnessSet[elementIndex].StatusCode;
+ *(lRangeState+1) = ApplilightnessSet[elementIndex].RangeMin;
+ *(lRangeState+2) = ApplilightnessSet[elementIndex].RangeMin >> 8;
+ *(lRangeState+3) = ApplilightnessSet[elementIndex].RangeMax;
+ *(lRangeState+4) = ApplilightnessSet[elementIndex].RangeMax >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1328,40 +1576,67 @@ Following Functions are used for the LIGHTING CTL MODEL
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetCtlLightStatus(MOBLEUINT8* lCtlLightState)
+MOBLE_RESULT Appli_Light_GetCtlLightStatus(MOBLEUINT8* lCtlLightState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lCtlLightState) = AppliCtlSet[elementIndex].PresentLightness16;
+ *(lCtlLightState+1) = AppliCtlSet[elementIndex].PresentLightness16 >> 8;
+ *(lCtlLightState+2) = AppliCtlSet[elementIndex].PresentTemperature16;
+ *(lCtlLightState+3) = AppliCtlSet[elementIndex].PresentTemperature16 >>8;
+ *(lCtlLightState+4) = AppliCtlSet[elementIndex].PresentCtlDelta16;
+ *(lCtlLightState+5) = AppliCtlSet[elementIndex].PresentCtlDelta16 >>8;
return MOBLE_RESULT_SUCCESS;
}
/**
+* @brief Appli_Light_GetCtlTargetStatus: This function is callback for Application
+* to get the application values in middleware used for target state.
+* @param lCtlLightState: Pointer to the status message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetCtlTargetStatus(MOBLEUINT8* lCtlLightState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ *(lCtlLightState) = AppliCtlSet[elementIndex].TargetLightness16;
+ *(lCtlLightState+1) = AppliCtlSet[elementIndex].TargetLightness16 >> 8;
+ *(lCtlLightState+2) = AppliCtlSet[elementIndex].TargetTemperature16;
+ *(lCtlLightState+3) = AppliCtlSet[elementIndex].TargetTemperature16 >>8;
+ *(lCtlLightState+4) = AppliCtlSet[elementIndex].TargetCtlDelta16;
+ *(lCtlLightState+5) = AppliCtlSet[elementIndex].TargetCtlDelta16 >>8;
+
+ 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState)
+MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lCtlTempState) = AppliCtlSet[elementIndex].PresentTemperature16;
+ *(lCtlTempState+1) = AppliCtlSet[elementIndex].PresentTemperature16 >> 8;
+ *(lCtlTempState+2) = AppliCtlSet[elementIndex].PresentCtlDelta16;
+ *(lCtlTempState+3) = AppliCtlSet[elementIndex].PresentCtlDelta16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1371,19 +1646,20 @@ MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange)
+MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lCtlTempRange) = AppliCtlTemperatureRangeSet[elementIndex].StatusCode;
+ *(lCtlTempRange+1) = AppliCtlTemperatureRangeSet[elementIndex].RangeMin;
+ *(lCtlTempRange+2) = AppliCtlTemperatureRangeSet[elementIndex].RangeMin >> 8;
+ *(lCtlTempRange+3) = AppliCtlTemperatureRangeSet[elementIndex].RangeMax;
+ *(lCtlTempRange+4) = AppliCtlTemperatureRangeSet[elementIndex].RangeMax >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1393,20 +1669,21 @@ MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetCtlDefaultStatus(MOBLEUINT8* lCtlDefaultState)
+MOBLE_RESULT Appli_Light_GetCtlDefaultStatus(MOBLEUINT8* lCtlDefaultState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lCtlDefaultState) = AppliCtlDefaultSet[elementIndex].CtlDefaultLightness16;
+ *(lCtlDefaultState+1) = AppliCtlDefaultSet[elementIndex].CtlDefaultLightness16 >> 8;
+ *(lCtlDefaultState+2) = AppliCtlDefaultSet[elementIndex].CtlDefaultTemperature16;
+ *(lCtlDefaultState+3) = AppliCtlDefaultSet[elementIndex].CtlDefaultTemperature16 >>8;
+ *(lCtlDefaultState+4) = AppliCtlDefaultSet[elementIndex].CtlDefaultDeltaUv;
+ *(lCtlDefaultState+5) = AppliCtlDefaultSet[elementIndex].CtlDefaultDeltaUv >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1427,36 +1704,65 @@ Following Functions are used for the LIGHTING HSL MODEL
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslStatus(MOBLEUINT8* lHslState)
+MOBLE_RESULT Appli_Light_GetHslStatus(MOBLEUINT8* lHslState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lHslState) = AppliHslSet[elementIndex].HslLightness16;
+ *(lHslState+1) = AppliHslSet[elementIndex].HslLightness16 >> 8;
+ *(lHslState+2) = AppliHslSet[elementIndex].HslHueLightness16;
+ *(lHslState+3) = AppliHslSet[elementIndex].HslHueLightness16 >>8;
+ *(lHslState+4) = AppliHslSet[elementIndex].HslSaturation16;
+ *(lHslState+5) = AppliHslSet[elementIndex].HslSaturation16 >>8;
return MOBLE_RESULT_SUCCESS;
}
+
+/**
+* @brief Appli_Light_GetHslTargetStatus: This function is callback for Application
+* to get the application values in middleware used for target state.
+* @param lHslState: Pointer to the status message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetHslTargetStatus(MOBLEUINT8* lHslState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ *(lHslState) = AppliHslSet[elementIndex].TargetHslLightness16;
+ *(lHslState+1) = AppliHslSet[elementIndex].TargetHslLightness16 >> 8;
+ *(lHslState+2) = AppliHslSet[elementIndex].TargetHslHueLightness16;
+ *(lHslState+3) = AppliHslSet[elementIndex].TargetHslHueLightness16 >>8;
+ *(lHslState+4) = AppliHslSet[elementIndex].TargetHslSaturation16;
+ *(lHslState+5) = AppliHslSet[elementIndex].TargetHslSaturation16 >>8;
+
+ 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState)
+MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(lHslHueState) = AppliHslSet.HslHueLightness16;
- *(lHslHueState+1) = AppliHslSet.HslHueLightness16 >>8;
- TRACE_M(TF_SERIAL_CTRL,"Get Hsl Hue Status: %d\n\r",
- AppliHslSet.HslHueLightness16);
+ *(lHslHueState) = AppliHslSet[elementIndex].HslHueLightness16;
+ *(lHslHueState+1) = AppliHslSet[elementIndex].HslHueLightness16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1466,14 +1772,17 @@ MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState)
+MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(lHslSaturationState) = AppliHslSet.HslSaturation16;
- *(lHslSaturationState+1) = AppliHslSet.HslSaturation16 >>8;
- TRACE_M(TF_SERIAL_CTRL,"Get Hsl Saturation Status: %d\n\r",
- AppliHslSet.HslSaturation16);
+ *(lHslSaturationState) = AppliHslSet[elementIndex].HslSaturation16;
+ *(lHslSaturationState+1) = AppliHslSet[elementIndex].HslSaturation16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1482,16 +1791,21 @@ MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState)
+MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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;
+ *(lHslDefaultState) = Appli_HslDefaultSet[elementIndex].HslDefaultLightness16;
+ *(lHslDefaultState+1) = Appli_HslDefaultSet[elementIndex].HslDefaultLightness16 >> 8;
+ *(lHslDefaultState+2) = Appli_HslDefaultSet[elementIndex].HslDefaultHueLightness16;
+ *(lHslDefaultState+3) = Appli_HslDefaultSet[elementIndex].HslDefaultHueLightness16 >>8;
+ *(lHslDefaultState+4) = Appli_HslDefaultSet[elementIndex].HslDefaultSaturation16;
+ *(lHslDefaultState+5) = Appli_HslDefaultSet[elementIndex].HslDefaultSaturation16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1500,19 +1814,20 @@ MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange)
+MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lHslSatRange) = AppliHslRangeSet[elementIndex].StatusCode;
+ *(lHslSatRange+1) = AppliHslRangeSet[elementIndex].HslMinSaturation16;
+ *(lHslSatRange+2) = AppliHslRangeSet[elementIndex].HslMinSaturation16 >> 8;
+ *(lHslSatRange+3) = AppliHslRangeSet[elementIndex].HslMaxSaturation16;
+ *(lHslSatRange+4) = AppliHslRangeSet[elementIndex].HslMaxSaturation16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1521,19 +1836,20 @@ MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslHueRange(MOBLEUINT8* lHslHueRange)
+MOBLE_RESULT Appli_Light_GetHslHueRange(MOBLEUINT8* lHslHueRange, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lHslHueRange) = AppliHslRangeSet[elementIndex].StatusCode;
+ *(lHslHueRange+1) = AppliHslRangeSet[elementIndex].HslHueMinRange16;
+ *(lHslHueRange+2) = AppliHslRangeSet[elementIndex].HslHueMinRange16 >> 8;
+ *(lHslHueRange+3) = AppliHslRangeSet[elementIndex].HslHueMaxRange16;
+ *(lHslHueRange+4) = AppliHslRangeSet[elementIndex].HslHueMaxRange16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1563,21 +1879,24 @@ void Appli_Light_PwmInit()
* @param value1: This value corresponds to red led.
* @param value2: This value corresponds to green led .
* @param value3: This value corresponds to blue led .
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval void
*/
-void RgbF_Create(MOBLEUINT16 value1, MOBLEUINT16 value2, MOBLEUINT16 value3)
+void RgbF_Create(MOBLEUINT16 value1, MOBLEUINT16 value2, MOBLEUINT16 value3, MOBLEUINT8 elementIndex)
{
- Appli_RGBParam.Red_Value = (MOBLEUINT16)(65535 * value1/1000);
- Appli_RGBParam.Green_Value = (MOBLEUINT16)(65535 * value2/1000);
- Appli_RGBParam.Blue_Value = (MOBLEUINT16)(65535 * value3/1000);
+ Appli_RGBParam[elementIndex].Red_Value = (MOBLEUINT16)(65535 * value1/1000);
+ Appli_RGBParam[elementIndex].Green_Value = (MOBLEUINT16)(65535 * value2/1000);
+ Appli_RGBParam[elementIndex].Blue_Value = (MOBLEUINT16)(65535 * value3/1000);
}
/**
* @brief Function to convert the HSL values in RGB values.
-* @param void
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval void
*/
-void HSL2RGB_Conversion(void)
+void HSL2RGB_Conversion(MOBLEUINT8 elementIndex)
{
MOBLEUINT16 hueValue;
@@ -1587,24 +1906,24 @@ void HSL2RGB_Conversion(void)
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)
+ if(AppliHslSet[elementIndex].HslSaturation16 == 0)
{
- Appli_RGBParam.Red_Value = AppliHslSet.HslLightness16 ;
- Appli_RGBParam.Green_Value = AppliHslSet.HslLightness16 ;
- Appli_RGBParam.Blue_Value = AppliHslSet.HslLightness16 ;
+ Appli_RGBParam[elementIndex].Red_Value = AppliHslSet[elementIndex].HslLightness16 ;
+ Appli_RGBParam[elementIndex].Green_Value = AppliHslSet[elementIndex].HslLightness16 ;
+ Appli_RGBParam[elementIndex].Blue_Value = AppliHslSet[elementIndex].HslLightness16 ;
}
- else if((AppliHslSet.HslLightness16 == 0xFFFF) || (AppliHslSet.HslLightness16 == 0x00))
+ else if((AppliHslSet[elementIndex].HslLightness16 == 0xFFFF) || (AppliHslSet[elementIndex].HslLightness16 == 0x00))
{
- Appli_RGBParam.Red_Value = AppliHslSet.HslLightness16 ;
- Appli_RGBParam.Green_Value = AppliHslSet.HslLightness16 ;
- Appli_RGBParam.Blue_Value = AppliHslSet.HslLightness16 ;
+ Appli_RGBParam[elementIndex].Red_Value = AppliHslSet[elementIndex].HslLightness16 ;
+ Appli_RGBParam[elementIndex].Green_Value = AppliHslSet[elementIndex].HslLightness16 ;
+ Appli_RGBParam[elementIndex].Blue_Value = AppliHslSet[elementIndex].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;
+ hueValue = (MOBLEUINT16)(360 * (float)AppliHslSet[elementIndex].HslHueLightness16/65535);
+ lightnessvalue = (float)AppliHslSet[elementIndex].HslLightness16/65535;
+ saturationValue = (float)AppliHslSet[elementIndex].HslSaturation16/65535;
/* Formula to get the values used for RGB conversion */
cValue = (MOBLEUINT16)(((1- fabs(2 * lightnessvalue-1))*saturationValue) * 1000);
@@ -1614,33 +1933,33 @@ void HSL2RGB_Conversion(void)
/* Conditons applied for the different angle of hue value */
if (hueValue > 0 && hueValue < (HUE_UPPER_LIMIT / 6))
{
- RgbF_Create(cValue + mValue, xValue + mValue, mValue);
+ RgbF_Create(cValue + mValue, xValue + mValue, mValue, elementIndex);
}
else if (hueValue >= (HUE_UPPER_LIMIT / 6) && hueValue < (HUE_UPPER_LIMIT / 3))
{
- RgbF_Create(xValue + mValue, cValue + mValue, mValue);
+ RgbF_Create(xValue + mValue, cValue + mValue, mValue, elementIndex);
}
else if (hueValue >= (HUE_UPPER_LIMIT / 3) && hueValue < (HUE_UPPER_LIMIT / 2))
{
- RgbF_Create(mValue, cValue + mValue, xValue + mValue);
+ RgbF_Create(mValue, cValue + mValue, xValue + mValue, elementIndex);
}
else if (hueValue >= (HUE_UPPER_LIMIT / 2)
&& hueValue < (2 * HUE_UPPER_LIMIT / 3))
{
- RgbF_Create(mValue, xValue + mValue, cValue + mValue);
+ RgbF_Create(mValue, xValue + mValue, cValue + mValue, elementIndex);
}
else if (hueValue >= (2 * HUE_UPPER_LIMIT / 3)
&& hueValue < (5 * HUE_UPPER_LIMIT / 6))
{
- RgbF_Create(xValue + mValue, mValue, cValue + mValue);
+ RgbF_Create(xValue + mValue, mValue, cValue + mValue, elementIndex);
}
else if ((hueValue >= (5 * HUE_UPPER_LIMIT / 6) && hueValue <= HUE_UPPER_LIMIT) || (hueValue == 0))
{
- RgbF_Create(cValue + mValue, mValue, xValue + mValue);
+ RgbF_Create(cValue + mValue, mValue, xValue + mValue, elementIndex);
}
else
{
- RgbF_Create(mValue, mValue, mValue);
+ RgbF_Create(mValue, mValue, mValue, elementIndex);
}
}
}
@@ -1778,5 +2097,5 @@ void Light_UpdateLedValue(MOBLEUINT8 state ,Appli_LightPwmValue_t light_state)
/**
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index aaa600146..c5bb76ec0 100644
--- 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
@@ -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
@@ -54,6 +54,9 @@ typedef struct
MOBLEUINT16 PresentLightness16;
MOBLEUINT16 PresentTemperature16;
MOBLEINT16 PresentCtlDelta16;
+ MOBLEUINT16 TargetLightness16;
+ MOBLEUINT16 TargetTemperature16;
+ MOBLEINT16 TargetCtlDelta16;
}Appli_Light_CtlSet;
/* Light Ctl Temperature Range Set */
@@ -78,6 +81,9 @@ typedef struct
MOBLEUINT16 HslLightness16;
MOBLEUINT16 HslHueLightness16;
MOBLEUINT16 HslSaturation16;
+ MOBLEUINT16 TargetHslLightness16;
+ MOBLEUINT16 TargetHslHueLightness16;
+ MOBLEUINT16 TargetHslSaturation16;
}Appli_Light_HslSet;
/* Light Hsl Hue set */
@@ -117,80 +123,225 @@ typedef struct
/* Exported Functions Prototypes ---------------------------------------------*/
-MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t*, MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t*,
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
-MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, MOBLEUINT32 pLength);
+MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
-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_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pLight_LightnessDefaultParam,
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Lightness_Last_Status(MOBLEUINT8 const *pLightnessDefault_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessLast_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Lightness_Last_Set(Light_LightnessStatus_t* pLight_LightnessParam,
+ MOBLEUINT8 elementIndex);
+
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetLightnessRangeStatus(MOBLEUINT8* lRangeState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetCtlLightStatus(MOBLEUINT8* lCtlLightState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetCtlTargetStatus(MOBLEUINT8* lCtlLightState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetCtlDefaultStatus(MOBLEUINT8* lCtlDefaultState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslStatus(MOBLEUINT8* lHslState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslTargetStatus(MOBLEUINT8* lHslState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslHueRange(MOBLEUINT8* lHslHueRange,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
void Appli_Light_PwmInit(void);
-void HSL2RGB_Conversion(void);
+void HSL2RGB_Conversion(MOBLEUINT8 elementIndex);
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);
+void RgbF_Create(MOBLEUINT16 value1,
+ MOBLEUINT16 value2,
+ MOBLEUINT16 value3,
+ MOBLEUINT8 elementIndex);
+void Light_UpdateLedValue(MOBLEUINT8 state,
+ Appli_LightPwmValue_t light_state);
+
+/******************************************************************************/
#endif /* __APPLI_LIGHT_H */
+/******************************************************************************/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index d7982080a..8556233b3 100644
--- 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
@@ -6,7 +6,8 @@
******************************************************************************
* @attention
*
-* <h2><center>&copy; COPYRIGHT(c) 20120 STMicroelectronics</center></h2>
+* <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
@@ -21,6 +22,7 @@
#include "types.h"
#include "appli_generic.h"
#include "appli_light.h"
+#include "appli_light_lc.h"
#include "common.h"
#include "mesh_cfg_usr.h"
#include "appli_nvm.h"
@@ -46,26 +48,392 @@
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
+* @brief Appli_LightClient_API: This function is a Wrapper to call Light Client API depending on opcode received in input
+* @param elementIndex: Index of the element
+* @param msg_opcode: opcode of the desired API
+* @param msg_params: buffer containing the desired API parameters
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_LightClient_Lightness_Set(void)
+MOBLE_RESULT Appli_LightClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8 *msg_params)
{
- MOBLE_ADDRESS elementAddr = 0;
- MOBLEUINT8 pLightnessParam[3];
-
- Appli_IntensityControlPublishing(pLightnessParam);
- LightClient_Lightness_Set_Unack(elementAddr,
- (_Light_LightnessParam*) pLightnessParam,
- sizeof(pLightnessParam) );
-
- return MOBLE_RESULT_SUCCESS;
-}
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+
+ switch(msg_opcode){
+/******************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS
+/******************************************************************************/
+ case LIGHT_LIGHTNESS_GET:
+ {
+ result = LightClient_Lightness_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LIGHTNESS_SET:
+ {
+ result = LightClient_Lightness_Set_Ack(elementIndex,
+ msg_params,
+ (sizeof(Light_LightnessParam_t)-2)); //Remove the size of Linear Lightness params
+ break;
+ }
+ case LIGHT_LIGHTNESS_SET_UNACK:
+ {
+ result = LightClient_Lightness_Set_Unack(elementIndex,
+ msg_params,
+ (sizeof(Light_LightnessParam_t)-2)); //Remove the size of Linear Lightness params
+ break;
+ }
+
+ case LIGHT_LIGHTNESS_LINEAR_GET:
+ {
+ result = LightClient_Lightness_Linear_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LIGHTNESS_LINEAR_SET:
+ {
+ result = LightClient_Lightness_Linear_Set_Ack(elementIndex,
+ msg_params,
+ (sizeof(Light_LightnessParam_t)-2)); //Remove the size of Lightness params
+ break;
+ }
+ case LIGHT_LIGHTNESS_LINEAR_SET_UNACK:
+ {
+ result = LightClient_Lightness_Linear_Set_Unack(elementIndex,
+ msg_params,
+ (sizeof(Light_LightnessParam_t)-2)); //Remove the size of Lightness params
+ break;
+ }
+
+ case LIGHT_LIGHTNESS_DEFAULT_GET:
+ {
+ result = LightClient_Lightness_Default_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LIGHTNESS_DEFAULT_SET:
+ {
+ result = LightClient_Lightness_Default_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_LightnessDefaultParam_t));
+ break;
+ }
+ case LIGHT_LIGHTNESS_DEFAULT_SET_UNACK:
+ {
+ result = LightClient_Lightness_Default_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_LightnessDefaultParam_t));
+ break;
+ }
+
+
+ case LIGHT_LIGHTNESS_RANGE_GET:
+ {
+ result = LightClient_Lightness_Range_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LIGHTNESS_RANGE_SET:
+ {
+ result = LightClient_Lightness_Range_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_LightnessRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+ case LIGHT_LIGHTNESS_RANGE_SET_UNACK:
+ {
+ result = LightClient_Lightness_Range_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_LightnessRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+
+
+/******************************************************************************/
+#endif /* #ifdef ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS */
+/******************************************************************************/
+
+/******************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_CTL
+/******************************************************************************/
+ case LIGHT_CTL_GET:
+ {
+ result = LightClient_Ctl_Get(elementIndex);
+ break;
+ }
+ case LIGHT_CTL_SET:
+ {
+ result = LightClient_Ctl_Set_Ack(elementIndex,
+ msg_params,
+ (sizeof(Light_CtlParam_t)-4) ); //Remove the size of Last_Lightness and Last_Temperature
+ break;
+ }
+ case LIGHT_CTL_SET_UNACK:
+ {
+ result = LightClient_Ctl_Set_Unack(elementIndex,
+ msg_params,
+ (sizeof(Light_CtlParam_t)-4) ); //Remove the size of Last_Lightness and Last_Temperature
+ break;
+ }
+
+ case LIGHT_CTL_TEMPERATURE_GET:
+ {
+ result = LightClient_Ctl_Temperature_Get(elementIndex);
+ break;
+ }
+ case LIGHT_CTL_TEMPERATURE_SET:
+ {
+ result = LightClient_Ctl_Temperature_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlTemperatureParam_t));
+ break;
+ }
+ case LIGHT_CTL_TEMPERATURE_SET_UNACK:
+ {
+ result = LightClient_Ctl_Temperature_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlTemperatureParam_t));
+ break;
+ }
+
+ case LIGHT_CTL_TEMPERATURE_RANGE_GET:
+ {
+ result = LightClient_Ctl_Temperature_Range_Get(elementIndex);
+ break;
+ }
+ case LIGHT_CTL_TEMPERATURE_RANGE_SET:
+ {
+ result = LightClient_Ctl_Temperature_Range_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlTemperatureRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+ case LIGHT_CTL_TEMPERATURE_RANGE_SET_UNACK:
+ {
+ result = LightClient_Ctl_Temperature_Range_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlTemperatureRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+
+ case LIGHT_CTL_DEFAULT_GET:
+ {
+ result = LightClient_Ctl_Default_Get(elementIndex);
+ break;
+ }
+ case LIGHT_CTL_DEFAULT_SET:
+ {
+ result = LightClient_Ctl_Default_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlDefaultParam_t));
+ break;
+ }
+ case LIGHT_CTL_DEFAULT_SET_UNACK:
+ {
+ result = LightClient_Ctl_Default_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlDefaultParam_t));
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_LIGHT_MODEL_CLIENT_CTL */
+/******************************************************************************/
+/******************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_HSL
+/******************************************************************************/
+ case LIGHT_HSL_GET:
+ {
+ result = LightClient_Hsl_Get(elementIndex);
+ break;
+ }
+ case LIGHT_HSL_SET:
+ {
+ result = LightClient_Hsl_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_HslParam_t) );
+ break;
+ }
+ case LIGHT_HSL_SET_UNACK:
+ {
+ result = LightClient_Hsl_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_HslParam_t) );
+ break;
+ }
+
+ case LIGHT_HSL_DEFAULT_GET:
+ {
+ result = LightClient_Hsl_Default_Get(elementIndex);
+ break;
+ }
+ case LIGHT_HSL_DEFAULT_SET:
+ {
+ result = LightClient_Hsl_Default_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_HslDefault_t) );
+ break;
+ }
+ case LIGHT_HSL_DEFAULT_SET_UNACK:
+ {
+ result = LightClient_Hsl_Default_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_HslDefault_t) );
+ break;
+ }
+
+ case LIGHT_HSL_RANGE_GET:
+ {
+ result = LightClient_Hsl_Range_Get(elementIndex);
+ break;
+ }
+ case LIGHT_HSL_RANGE_SET:
+ {
+ result = LightClient_Hsl_Range_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_HslRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+ case LIGHT_HSL_RANGE_SET_UNACK:
+ {
+ result = LightClient_Hsl_Range_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_HslRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+
+ case LIGHT_HSL_HUE_GET:
+ {
+ result = LightClient_Hsl_Hue_Get(elementIndex);
+ break;
+ }
+ case LIGHT_HSL_HUE_SET:
+ {
+ result = LightClient_Hsl_Hue_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_HslHueParam_t));
+ break;
+ }
+ case LIGHT_HSL_HUE_SET_UNACK:
+ {
+ result = LightClient_Hsl_Hue_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_HslHueParam_t));
+ break;
+ }
+
+ case LIGHT_HSL_SATURATION_GET:
+ {
+ result = LightClient_Hsl_Saturation_Get(elementIndex);
+ break;
+ }
+ case LIGHT_HSL_SATURATION_SET:
+ {
+ result = LightClient_Hsl_Saturation_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_HslSaturationParam_t));
+ break;
+ }
+ case LIGHT_HSL_SATURATION_SET_UNACK:
+ {
+ result = LightClient_Hsl_Saturation_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_HslSaturationParam_t));
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_LIGHT_MODEL_CLIENT_HSL */
+/******************************************************************************/
+
+/******************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_LC
+/******************************************************************************/
+ case LIGHT_LC_MODE_GET:
+ {
+ result = LightClient_LC_Mode_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LC_MODE_SET:
+ {
+ result = LightClient_LC_Mode_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_ModeParam_t));
+ break;
+ }
+ case LIGHT_LC_MODE_SET_UNACK:
+ {
+ result = LightClient_LC_Mode_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_ModeParam_t));
+ break;
+ }
+ case LIGHT_LC_OM_GET:
+ {
+ result = LightClient_LC_OM_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LC_OM_SET:
+ {
+ result = LightClient_LC_OM_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_OccupancyModeParam_t));
+ break;
+ }
+ case LIGHT_LC_OM_SET_UNACK:
+ {
+ result = LightClient_LC_OM_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_OccupancyModeParam_t));
+ break;
+ }
+ case LIGHT_LC_ON_OFF_GET:
+ {
+ result = LightClient_LC_OnOff_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LC_ON_OFF_SET:
+ {
+ result = LightClient_LC_OnOff_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_OnOffParam_t));
+ break;
+ }
+ case LIGHT_LC_ON_OFF_SET_UNACK:
+ {
+ result = LightClient_LC_OnOff_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_OnOffParam_t));
+ break;
+ }
+
+ case LIGHT_LC_PROPERTY_GET:
+ {
+ result = LightClient_LC_Property_Get(elementIndex, msg_params);
+ break;
+ }
+ case LIGHT_LC_PROPERTY_SET:
+ {
+ //TODO: Set dynamic data size depending on Property DATA LENTGH: length = 2 + PropertyDataLength
+ result = LightClient_LC_Property_Set_Ack(elementIndex,
+ msg_params,
+ 5);
+ break;
+ }
+ case LIGHT_LC_PROPERTY_SET_UNACK:
+ {
+ //TODO: Set dynamic data size depending on Property DATA LENTGH: length = 2 + PropertyDataLength
+ result = LightClient_LC_Property_Set_Unack(elementIndex,
+ msg_params,
+ 5);
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_LIGHT_MODEL_CLIENT_LC */
+/******************************************************************************/
+ default:
+ {
+ TRACE_M(TF_LIGHT, "OpCode value invalid %d \r\n", msg_opcode);
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+ return result;
+}
/**
* @}
@@ -75,5 +443,5 @@ MOBLE_RESULT Appli_LightClient_Lightness_Set(void)
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index a9e0fa708..ba977f2c8 100644
--- 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
@@ -31,10 +31,10 @@
/* Exported variables ------------------------------------------------------- */
/* Application Variable-------------------------------------------------------*/
/* Exported Functions Prototypes ---------------------------------------------*/
-MOBLE_RESULT Appli_LightClient_Lightness_Set(void);
+MOBLE_RESULT Appli_LightClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8* msg_params);
#endif /* __APPLI_LIGHT_CLIENT_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index a7d123c91..953e880bd 100644
--- 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
@@ -39,138 +39,407 @@
/* Private macro -------------------------------------------------------------*/
/* Private variable ----------------------------------------------------------*/
-Appli_LightLC_Set_t Appli_LightLC_set;
-Appli_Light_LC_PropertySet_t Appli_LightLC_PropertySet;
+__attribute__((aligned(4)))const light_lc_cb_t AppliLightLc_cb =
+{
+ Appli_LightLCs_ModeGet,
+ Appli_LightLCs_ModeSet,
+ Appli_LightLCs_ModeSetUnack,
+ Appli_LightLCs_ModeStatus,
+ Appli_LightLCs_OmGet,
+ Appli_LightLCs_OmSet,
+ Appli_LightLCs_OmSetUnack,
+ Appli_LightLCs_OmStatus,
+ Appli_LightLCs_OnOffGet,
+ Appli_LightLCs_OnOffSet,
+ Appli_LightLCs_OnOffSetUnack,
+ Appli_LightLCs_OnOffStatus,
+ Appli_LightLCs_PropertyGet,
+ Appli_LightLCs_PropertySet,
+ Appli_LightLCs_PropertySetUnack,
+ Appli_LightLCs_PropertyStatus
+};
-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
+ * @brief Callback corresponding to LightLCs_ModeGet_cb
+ * @param Message parameters
+ * @retval None
*/
-MOBLE_RESULT Appli_LightLC_Mode_Set(Light_LC_Param_t* pLight_LC_Param,
- MOBLEUINT8 OptionalValid)
+void Appli_LightLCs_ModeGet(MODEL_MessageHeader_t *pmsgParam)
{
- 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;
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
}
+
/**
-* @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
+ * @brief Callback corresponding to LightLCs_ModeSet_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
*/
-MOBLE_RESULT Appli_LightLC_OM_Set(Light_LC_Param_t* pLight_LC_Param,
- MOBLEUINT8 OptionalValid)
+void Appli_LightLCs_ModeSet(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
{
- 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;
-}
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
+
/**
-* @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
+ * @brief Callback corresponding to LightLCs_ModeSetUnack_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
*/
-MOBLE_RESULT Appli_LightLC_OnOff_Set(Light_LC_Param_t* pLight_LC_Param,
- MOBLEUINT8 OptionalValid)
+void Appli_LightLCs_ModeSetUnack(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
{
- 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;
-}
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
+
/**
-* @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)
+ * @brief Callback corresponding to LightLCs_ModeSatus_cb
+ * @param Message parameters
+ * @retval None
+*/
+void Appli_LightLCs_ModeStatus(MOBLEUINT8 const* pLightLCMode_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+ TRACE_M(TF_LIGHT_LC,"LightLCs_ModeStatus callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8294!\r\n");
+
+ for(i = 0; i < plength; i++)
+ {
+ if(i == 0)
+ TRACE_M(TF_SERIAL_CTRL,"Light LC Mode value: %d\n\r",
+ pLightLCMode_status[i]);
+ }
+}
+
+
+/**
+ * @brief Callback corresponding to LightLCs_OmGet_cb
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_OmGet(MODEL_MessageHeader_t *pmsgParam)
{
- /* 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.
- */
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
- return AmbientLuxLevel;
+
+/**
+ * @brief Callback corresponding to LightLCs_OmSet_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_OmSet(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
+{
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
}
+
/**
-* @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)
+ * @brief Callback corresponding to LightLCs_OmSetUnack_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_OmSetUnack(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
{
- MOBLEUINT16 luxLevel = 0;
- /* User can write their code for the calculation */
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
+
+/**
+ * @brief Callback corresponding to LightLCs_OmStatus_cb
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_OmStatus(MOBLEUINT8 const* pLightLCOccupancyMode_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+ TRACE_M(TF_LIGHT_LC,"LightLCs_OmStatus callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8298!\r\n");
- return luxLevel;
+ for(i = 0; i < plength; i++)
+ {
+ if(i == 0)
+ TRACE_M(TF_SERIAL_CTRL,"Light LC OM value: %d\n\r",
+ pLightLCOccupancyMode_status[i]);
+ }
+}
+
+
+/**
+ * @brief Callback corresponding to LightLCs_OnOffGet_cb
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_OnOffGet(MODEL_MessageHeader_t *pmsgParam)
+{
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
}
+
/**
-* @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
+ * @brief Callback corresponding to LightLC_OnOffSet_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
*/
-MOBLE_RESULT Appli_LightLC_Get_ModeStatus(MOBLEUINT8* plcModeState)
+void Appli_LightLCs_OnOffSet(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
{
- *(plcModeState) = Appli_LightLC_set.LC_mode;
- TRACE_M(TF_SERIAL_CTRL,"Get Mode Status: %d\n\r",
- Appli_LightLC_set.LC_mode);
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
- return MOBLE_RESULT_SUCCESS;
+
+/**
+ * @brief Callback corresponding to LightLCs_OnOffSetUnack_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+*/
+void Appli_LightLCs_OnOffSetUnack(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
+{
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
}
+
/**
-* @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
+ * @brief Callback corresponding to LightLCs_OnOffStatus_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
*/
-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);
+void Appli_LightLCs_OnOffStatus(MOBLEUINT8 const* pLightLCOnOff_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+ TRACE_M(TF_LIGHT_LC,"LightLCs_OnOffStatus callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#829C!\r\n");
- return MOBLE_RESULT_SUCCESS;
+ for(i = 0; i < plength; i++)
+ {
+ if(i == 0)
+ TRACE_M(TF_SERIAL_CTRL,"Light LC OnOff status: %d\n\r",
+ pLightLCOnOff_status[i]);
+ }
+}
+
+
+/**
+ * @brief Callback corresponding to LightLCs_PropertyGet_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+*/
+void Appli_LightLCs_PropertyGet(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
+{
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
}
+
+/**
+ * @brief Callback corresponding to LightLCs_PropertySet_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_PropertySet(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
+{
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
+
+
+/**
+ * @brief Callback corresponding to LightLCs_PropertySetUnack_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_PropertySetUnack(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
+ {
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+ }
+
+
/**
-* @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
+ * @brief Callback corresponding to LightLCs_PropertyStatus_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
*/
-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);
+void Appli_LightLCs_PropertyStatus(MOBLEUINT8 const* pLightLCProperty_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+ TRACE_M(TF_LIGHT_LC,"LightLCs_PropertyStatus callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#64!\r\n");
- return MOBLE_RESULT_SUCCESS;
-}
+ for(i = 0; i < plength; i++)
+ {
+ if(i == 0)
+ TRACE_M(TF_SERIAL_CTRL,"Light LC Property status: %d\n\r",
+ pLightLCProperty_status[i]);
+ }
+}
+
+
+/**
+ * @brief
+ * @param
+ * @retval
+ */
+__weak MOBLE_RESULT Appli_Light_LCs_Init(void)
+ {
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+ MOBLEUINT8 lcsElementIndex = 0;
+
+ /* Extract element index of LC server */
+ result = ExtractLcServerElementIndex(&lcsElementIndex,
+#ifdef APPLICATION_NUMBER_OF_ELEMENTS
+ APPLICATION_NUMBER_OF_ELEMENTS,
+#else
+ 0,
+#endif
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+ ENABLE_LIGHT_MODEL_SERVER_LC,
+ ENABLE_LIGHT_MODEL_SERVER_LC_SETUP,
+#else
+ 0,
+ 0,
+#endif
+#ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF
+ ENABLE_GENERIC_MODEL_SERVER_ONOFF,
+#else
+ 0,
+#endif
+#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF
+ ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF,
+#else
+ 0,
+#endif
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
+ ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS);
+#else
+ 0);
+#endif
+
+ if(MOBLE_SUCCEEDED(result))
+ {
+ result = Light_LCs_Init(&BufferLcServer, lcsElementIndex, &AppliLightLc_cb, SIZE_OF_LC_SERVER_T);
+ }
+
+ if(MOBLE_FAILED(result))
+ {
+ TRACE_M(TF_LIGHT_LC, "Light LC Server init failed\r\n");
+ }
+
+ return result;
+}
+
+
+/**
+ * @brief
+ * @param
+ * @retval
+ */
+__weak MOBLE_RESULT Appli_Light_LC_SensorPropertyUpdate(MOBLEUINT8 elementIndex,
+ MOBLEUINT16 propertyId,
+ MOBLEUINT32 value)
+{
+ return Light_LC_SensorPropertyUpdate(elementIndex,
+ propertyId,
+ value);
+}
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+/**
+ * @brief Handling of serial inputs to LC model
+ * @param serial string
+ * @param serial string size
+ * @retval void
+ */
+void Appli_Light_LC_SerialCmd(char *rcvdStringBuff, uint16_t rcvdStringSize)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_INVALIDARG;
+
+ if (!strncmp(rcvdStringBuff+6, "TR0", 3))
+ {
+ if (rcvdStringSize == 9)
+ {
+ /* call to function corresponding MMDL/SR/LLC/BV-03-C */
+ result = Light_LC_SetTransitionTimeZero(1);
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ BLEMesh_PrintStringCb("Invalid size of string\r\n");
+ }
+ }
+ else if (!strncmp(rcvdStringBuff+6, "OCCUPANCY", 9)) /* occupancy detect */
+ {
+ if (rcvdStringSize == 15)
+ {
+ /* occupancy detected for element index 0 */
+ Appli_Light_LC_SensorPropertyUpdate(0,
+ PRESENCE_DETECTED_PID,
+ 1);
+ result = MOBLE_RESULT_SUCCESS;
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ BLEMesh_PrintStringCb("Invalid size of string\r\n");
+ }
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ /* Check the result of command processing */
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ BLEMesh_PrintStringCb("Success\r\n");
+ }
+ else if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ BLEMesh_PrintStringCb("Fail Out of memory\r\n");
+ }
+ else if(result == MOBLE_RESULT_INVALIDARG)
+ {
+ BLEMesh_PrintStringCb("Fail Invalid Argument\r\n");
+ }
+ else
+ {
+ BLEMesh_PrintStringCb("Fail\r\n");
+ }
+}
+#endif
/**
@@ -181,5 +450,5 @@ MOBLE_RESULT Appli_LightLC_Get_OnOffStatus(MOBLEUINT8* plcOnOffState)
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index e9893c5e8..7691992ed 100644
--- 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
@@ -25,43 +25,55 @@
#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);
+void Appli_LightLCs_ModeGet(MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_ModeSet(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_ModeSetUnack(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_ModeStatus(MOBLEUINT8 const* pLightLCMode_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_LightLCs_OmGet(MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OmSet(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OmSetUnack(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OmStatus(MOBLEUINT8 const* pLightLCOccupancyMode_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_LightLCs_OnOffGet(MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OnOffSet(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OnOffSetUnack(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OnOffStatus(MOBLEUINT8 const* pLightLCOnOff_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_LightLCs_PropertyGet(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_PropertySet(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_PropertySetUnack(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_PropertyStatus(MOBLEUINT8 const* pLightLCOccupancyMode_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Light_LCs_Init(void);
+MOBLE_RESULT Appli_Light_LC_SensorPropertyUpdate(MOBLEUINT8 elementIndex,
+ MOBLEUINT16 propertyId,
+ MOBLEUINT32 value);
+void Appli_Light_LC_SerialCmd(char *rcvdStringBuff,
+ uint16_t rcvdStringSize);
#endif /* __APPLI_LIGHT_LC_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index bec2dd222..e4b7c3590 100644
--- 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
@@ -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
@@ -20,15 +20,18 @@
#include "ble_common.h"
#include "app_conf.h"
#include "hal_common.h"
+#include "ble_mesh.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 "light.h"
+#include "light_lc.h"
+#include "sensors.h"
#include "common.h"
#include "serial_if.h"
#include "appli_nvm.h"
@@ -36,9 +39,16 @@
#include "appli_config_client.h"
#include "appli_generic_client.h"
#include "appli_light_client.h"
+#if ((ENABLE_SENSOR_MODEL_SERVER != 0)||(ENABLE_SENSOR_MODEL_CLIENT != 0))
+#include "appli_sensor.h"
+#include "appli_sensors_client.h"
+#endif
#include "stm32_seq.h"
+#if (( CFG_LPM_SUPPORTED == 0) && (ENABLE_PWM_SUPPORT == 1))
#include "PWM_config.h"
+#include "PWM_handlers.h"
+#endif
#include "mesh_cfg_usr.h"
/** @addtogroup ST_BLE_Mesh
@@ -90,6 +100,7 @@
/* Private variables ---------------------------------------------------------*/
+
enum ButtonState
{
BS_OFF,
@@ -100,12 +111,13 @@ enum ButtonState
enum ButtonState buttonState = BS_OFF;
tClockTime tBounce = 0;
+/*Will be an array aligned with number of elements*/
MOBLEUINT8 Appli_LedState = 0;
MOBLEUINT16 IntensityValue = INTENSITY_LEVEL_ZERO;
MOBLEUINT8 IntensityFlag = FALSE;
MOBLEUINT8 ProxyFlag = 0;
MOBLEUINT8 ProvisionFlag = 0;
-
+MOBLEUINT8 UnprovisionInProgress = 0;
#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
static MOBLEUINT8 PrvngInProcess = 0;
@@ -123,7 +135,7 @@ 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,
+const MOBLEUINT8 StaticOobBuff[SIZE_STATIC_OOB] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
#else
const MOBLEUINT8 StaticOobBuff[] = {0};
@@ -182,6 +194,8 @@ volatile uint8_t BleProcessInit = 0;
MOBLEUINT8 lowPowerNodeApiTimer_Id;
#endif
+MOBLEUINT8 pPropertyId[4];
+
/********************* Application configuration **************************/
#if defined(__GNUC__) || defined(__IAR_SYSTEMS_ICC__) || defined(__CC_ARM)
MOBLEUINT8 bdaddr[8];
@@ -198,7 +212,7 @@ const void *prvsnr_data;
#endif /* __GNUC__ || defined(__IAR_SYSTEMS_ICC__) || defined(__CC_ARM) */
/* Private function prototypes -----------------------------------------------*/
-//static void Appli_LongButtonPress(void);
+static void Appli_LongButtonPress(void);
static void Appli_ShortButtonPress(void);
#if USER_OUTPUT_OOB_APPLI_PROCESS
void Appli_OobAuthenticationProcess(void);
@@ -208,6 +222,9 @@ void Appli_LowPowerProcess(void);
#if (APPLI_OPTIM == 1)
static void AppliMeshTask(void);
#endif
+void Appli_GetPublicationParamsCb(model_publicationparams_t* pPubParameters);
+WEAK_FUNCTION (void SerialPrvn_ProvisioningStatusUpdateCb(uint8_t flagPrvningInProcess,
+ MOBLEUINT16 nodeAddress));
/* Private functions ---------------------------------------------------------*/
@@ -222,7 +239,7 @@ static void Appli_ShortButtonPress(void)
BLEMesh_ModelsCommand();
}
-#if 0
+
/**
* @brief Function calls when a button is pressed for Long duration
* @param void
@@ -230,9 +247,137 @@ static void Appli_ShortButtonPress(void)
*/
static void Appli_LongButtonPress(void)
{
- /* User Implementation */
-}
+ /** GENERIC ONOFF **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API ONOFF GET ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_ON_OFF_GET, NULL);
+
+ /** GENERIC LEVEL **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API LEVEL GET ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_LEVEL_GET, NULL);
+
+ /** GENERIC POWER ONOFF **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API POWER ON OFF GET ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_POWER_ON_OFF_GET, NULL);
+
+ /** GENERIC TRANSITION TIME **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API DEFAULT TRANSITION TIME GET ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_DEFAULT_TRANSITION_TIME_GET, NULL);
+
+ /** LIGHT LIGHTNESS **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_GET, NULL);
+
+ /** LIGHT LIGHTNESS LINEAR **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS LINEAR GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_LINEAR_GET, NULL);
+
+ /** LIGHT LIGHTNESS DEFAULT **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS DEFAULT GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_DEFAULT_GET, NULL);
+
+ /** LIGHT LIGHTNESS RANGE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS RANGE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_RANGE_GET, NULL);
+
+ /** LIGHT LIGHTNESS CTL **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_GET, NULL);
+
+ /** LIGHT LIGHTNESS CTL TEMPERATURE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_GET, NULL);
+
+ /** LIGHT LIGHTNESS CTL TEMPERATURE RANGE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE RANGE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_RANGE_GET, NULL);
+
+ /** LIGHT LIGHTNESS CTL DEFAULT **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL DEFAULT GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_DEFAULT_GET, NULL);
+
+ /** LIGHT LIGHTNESS HSL **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_GET, NULL);
+
+ /** LIGHT LIGHTNESS HSL DEFAULT **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL DEFAULT GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_DEFAULT_GET, NULL);
+
+ /** LIGHT LIGHTNESS HSL RANGE**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL RANGE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_RANGE_GET, NULL);
+
+ /** LIGHT LIGHTNESS HSL HUE**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL HUE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_HUE_GET, NULL);
+
+ /** LIGHT LIGHTNESS HSL SATURATION**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL SATURATION GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_SATURATION_GET, NULL);
+
+ /** LIGHT LC MODE**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC MODE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_MODE_GET, NULL);
+
+ /** LIGHT LC OM**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC OM GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_OM_GET, NULL);
+
+ /** LIGHT LC ON OFF**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC ON OFF GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_ON_OFF_GET, NULL);
+
+ /** LIGHT LC PROPERTY **/
+ //LIGHT_CONTROL_LUX_LEVEL_ON_ID : 0x202B
+ pPropertyId[0]= 0x2B; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pPropertyId[1]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC PROPERTY GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_PROPERTY_GET, pPropertyId);
+
+#if 1 /* Sensor APIs */
+ //PRESENT_AMBIENT_TEMPERATURE_PID : 0x004F
+ pPropertyId[0]= 0x4F; // Property ID byte 0 : Property ID for the sensor
+ pPropertyId[1]= 0x00; // Property ID byte 1 : Property ID for the sensor
+
+ /** SENSOR DESCRIPTOR**/
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR DESCRIPTOR GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_DESCRIPTOR_GET, pPropertyId);
+
+ /** SENSOR CADENCE**/
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR CADENCE GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_CADENCE_GET, pPropertyId);
+
+ /** SENSOR SETTINGS **/
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR SETTINGS GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_SETTINGS_GET, pPropertyId);
+
+ /** SENSOR SETTING **/
+ pPropertyId[2]= 0xAD; // Sensor Setting Property ID byte 0 : Property ID for the sensor setting
+ pPropertyId[3]= 0x00; // Sensor Setting Property ID byte 1 : Property ID for the sensor setting
+
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR SETTING GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_SETTING_GET, pPropertyId);
+
+ /** SENSOR GET **/
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_GET, pPropertyId);
+
+ /** SENSOR COLUMN **/
+// pPropertyId[2]= 0x01; // Raw Value X byte 0 : Raw value identifying a column
+// pPropertyId[3]= 0x00; // Raw Value X byte 1 : Raw value identifying a column
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR COLUMN GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_COLUMN_GET, pPropertyId);
+
+ /** SENSOR SERIES **/
+// pPropertyId[2]= 0x01; // Raw Value X1 byte 0 : Raw value identifying a starting column.
+// pPropertyId[3]= 0x02; // Raw Value X2 byte 0 : Raw value identifying an ending column.
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR SERIES GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_SERIES_GET, pPropertyId);
#endif
+
+ IntensityPublish();
+
+}
/**
* @brief Updates the button status
@@ -250,7 +395,7 @@ static void Appli_UpdateButtonState(int isPressed)
if((t1 - t0) > LONG_PRESS_THRESHOLD)
{
- IntensityPublish();
+ Appli_LongButtonPress();
}
else if((t1 - t0) > BOUNCE_THRESHOLD)
{
@@ -269,6 +414,25 @@ static void Mesh_Task()
BLEMesh_Process();
BLEMesh_ModelsProcess(); /* Models Processing */
+ if((UnprovisionInProgress > 0) &&
+ (!LL_FLASH_IsActiveFlag_OperationSuspended()))
+ {
+ UnprovisionInProgress = 0;
+ AppliNvm_ClearModelState();
+ PalNvmErase(NVM_BASE, 0);
+ PalNvmErase(NVM_BASE, 0x1000);
+ PalNvmErase(APP_NVM_BASE, 0);
+ PalNvmErase(PRVN_NVM_BASE_OFFSET, 0);
+ TRACE_M(TF_PROVISION,"NVM erased\r\n");
+ BLEMesh_Unprovision();
+ AppliNvm_ClearModelState();
+ TRACE_M(TF_PROVISION,"Device is unprovisioned by application \r\n");
+
+ BLEMesh_Process();
+
+ NVIC_SystemReset();
+ }
+
#if (APPLI_OPTIM == 0)
/* Set the task in the scheduler for the next execution */
#if (LOW_POWER_FEATURE == 0)
@@ -501,10 +665,10 @@ void Appli_BleUnprovisionedIdentifyCb(MOBLEUINT8 data)
*/
MOBLEUINT8 Appli_BleSetNumberOfElementsCb(void)
{
- if(NumberOfElements > MAX_NUMB_ELEMENTS)
+ if(NumberOfElements > BLEMesh_GetNumberOfElements())
{
- TRACE_M(TF_MISC,"In version 1.11.00x one Element per node is supported!\r\n");
- return MAX_NUMB_ELEMENTS;
+ TRACE_M(TF_MISC, "Number of Elements enabled in application exceeding from Library Capability!\r\n");
+ return BLEMesh_GetNumberOfElements();
}
else if(NumberOfElements == 0)
@@ -515,7 +679,7 @@ MOBLEUINT8 Appli_BleSetNumberOfElementsCb(void)
else
{
- return NumberOfElements;
+ return NumberOfElements;
}
}
@@ -593,6 +757,8 @@ MOBLEUINT8* Appli_BleInputOOBAuthCb(MOBLEUINT8 size)
while(1)
{
Serial_InterfaceProcess();
+ /* Enable Mesh process working in while loop */
+ BTLE_StackTick();
/* Check if input is completed or timeout */
if((inputOOBDataReady != 0x00) | (inputTimer > INPUT_OOB_TIMEOUT))
{
@@ -715,7 +881,7 @@ void Appli_Unprovision(void)
if(!ProxyFlag)
{
/* No GATT connection */
- BLEMesh_Unprovision();
+ BLEMesh_StopAdvScan();
PalNvmErase(NVM_BASE, 0);
PalNvmErase(NVM_BASE, 0x1000);
@@ -723,6 +889,7 @@ void Appli_Unprovision(void)
PalNvmErase(PRVN_NVM_BASE_OFFSET, 0);
TRACE_M(TF_PROVISION,"NVM erased\r\n");
+ BLEMesh_Unprovision();
AppliNvm_ClearModelState();
TRACE_M(TF_PROVISION,"Device is unprovisioned by application \r\n");
@@ -861,11 +1028,13 @@ SleepModes App_SleepMode_Check(SleepModes sleepMode)
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();
+ BLEMesh_StopAdvScan();
+ UnprovisionInProgress = 1; /* Wait release on FLASH PESD bit */
}
/**
@@ -981,7 +1150,7 @@ void BLEMesh_ConfigurationCallback(void)
/* Call API LPN_API_TIMER_INTERVAL after LPN provisioning */
if(LPN_scan_enabled == MOBLE_FALSE)
{
- HW_TS_Start(lowPowerNodeApiTimer_Id, LPN_API_TIMER_INTERVAL);
+ HW_TS_Start(lowPowerNodeApiTimer_Id, LPN_API_TIMER_INTERVAL);
LPN_scan_enabled = MOBLE_TRUE;
}
#endif
@@ -1233,28 +1402,19 @@ void BLEMesh_CustomBeaconReceivedCallback(const MOBLEUINT8* bdAddr,
if (result == MOBLE_RESULT_SUCCESS)
{
- if ((length-1) < data[0])
+ if (data[1] == CUSTOM_BEACON_AD_TYPE)
{
- result = MOBLE_RESULT_FAIL;
- TRACE_M(TF_BEACON, "Length field does not match with message length \r\n");
- }
- }
+ TRACE_M(TF_BEACON, "Message length(%d), rssi(%d) \r\n", length, rssi);
- if (result == MOBLE_RESULT_SUCCESS)
+ if (TF_BEACON == 1)
{
- MOBLEUINT8 adType = data[1];
- MOBLEUINT8 i;
-
- if (adType == CUSTOM_BEACON_AD_TYPE)
+ TRACE_I(TF_BEACON, "Data: ");
+ for (MOBLEUINT8 count=0; count<length; count++)
{
- 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]);
+ TRACE_I(TF_BEACON, "%.2x ", data[count]);
+ }
+ TRACE_I(TF_BEACON, " \r\n");
}
- else
- {
- /* Discard, Ad type mismatch */
}
}
}
@@ -1367,12 +1527,22 @@ void IntensityPublish(void)
{
#ifdef LIGHT_CLIENT_MODEL_PUBLISH
- Appli_LightClient_Lightness_Set();
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS
+ MOBLEUINT8 elementIndex = 0;
+ MOBLEUINT8 pLightnessParam[3];
+ Appli_IntensityControlPublishing(pLightnessParam);
+ Appli_LightClient_API(elementIndex, LIGHT_LIGHTNESS_SET, pLightnessParam);
#endif
+#else
#ifdef GENERIC_CLIENT_MODEL_PUBLISH
- Appli_GenericClient_Level_Set_Unack();
+ MOBLEUINT8 elementIndex = 0;
+ MOBLEUINT8 pGeneric_LevelParam[3];
+
+ Appli_IntensityControlPublishing(pGeneric_LevelParam);
+ Appli_GenericClient_API(elementIndex, GENERIC_LEVEL_SET_ACK, pGeneric_LevelParam);
#endif
+#endif
}
/**
@@ -1387,7 +1557,6 @@ void Appli_Process(void)
AppliNvm_Process();
#endif
- Appli_LowPowerProcess();
#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
if(PrvngInProcess)
{
@@ -1445,6 +1614,17 @@ static void AppliMeshSW1Task(void)
return;
}
+#if (ENABLE_SENSOR_MODEL_SERVER != 0)
+static void AppliMeshSW3Task(void)
+{
+ Sensor_UpdatePublishState(0, 1);
+
+ Appli_Sensor_Update(0, 1);
+
+ return;
+}
+#endif
+
#if (LOW_POWER_FEATURE == 1)
static void LowPowerNodeApiApp(void)
{
@@ -1497,7 +1677,7 @@ void Appli_Init(MOBLEUINT8 *flag)
{
#if 0
#ifdef ENABLE_UNPROVISIONING_BY_POWER_ONOFF_CYCLE
- /* Hardware Factory Restore implementation */
+/* Hardware Factory Restore implementation */
AppliNvm_FactorySettingReset();
#endif
#endif
@@ -1524,6 +1704,18 @@ void Appli_Init(MOBLEUINT8 *flag)
__HAL_RCC_TIM1_CLK_ENABLE();
__HAL_RCC_TIM2_CLK_ENABLE();
PWM_Init();
+#ifdef USER_BOARD_1LED
+ Modify_PWM(SINGLE_LED, 1);
+#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, 1);
+ Modify_PWM(GREEN_LED, 1);
+ Modify_PWM(BLUE_LED, 1);
+#endif
#endif
UTIL_SEQ_RegTask( 1<< CFG_TASK_MESH_SW1_REQ_ID, UTIL_SEQ_RFU, AppliMeshSW1Task );
@@ -1542,6 +1734,31 @@ void Appli_Init(MOBLEUINT8 *flag)
#endif
}
+/*****************************Config Model Callbacks***************************/
+/**
+* @brief Callback from Config Model to receive the Publication Parameters
+* @param Structure Pointer having parameters - modelID, elementAddress,
+* Publish Address, PublishPeriod, PublishTTL, Credential Flag,
+* Publish AppKeyIndex, Retransmit Count & Restransmit Interval Steps
+* @retval none
+*/
+void Appli_GetPublicationParamsCb(model_publicationparams_t* pPubParameters)
+{
+ if(pPubParameters->modelID == SENSOR_SERVER_MODEL_ID)
+ {
+ Sensor_ModelPublishSet(pPubParameters);
+ }
+}
+
+
+/************************************ Weak linking ***********************************
+If implemented in application, linker would replace weak linking in library */
+WEAK_FUNCTION (void SerialPrvn_ProvisioningStatusUpdateCb(uint8_t flagPrvningInProcess, MOBLEUINT16 nodeAddress))
+{
+
+}
+
+
/**
* @}
*/
@@ -1549,4 +1766,4 @@ void Appli_Init(MOBLEUINT8 *flag)
/**
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index ad831f2cd..e37bf2ffa 100644
--- 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
@@ -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
@@ -114,13 +114,15 @@ 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);
+void Appli_GetPublicationParamsCb(model_publicationparams_t*);
+MOBLE_RESULT BLEMesh_ScanDevices(neighbor_params_t *unprovDeviceArray, MOBLEUINT8 *noOfUnprovDevices);
+MOBLE_RESULT BLEMesh_ProvisionDevice(neighbor_params_t *unprovDeviceArray, MOBLEUINT16 index);
#endif /* __APPLI_MESH_H */
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_nvm.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_nvm.c
index f91464c4c..a96a27bc5 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_nvm.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_nvm.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
@@ -77,6 +77,8 @@ extern const void* appNvmBase;
#define FLASH_EMPTY_SIGNATURE 0xFFFFFFFF
+#define RADIO_OFF_DELAY 1000
+
/* Private variables ---------------------------------------------------------*/
typedef struct
@@ -88,6 +90,7 @@ typedef struct
/* ALIGN(4) */
__attribute__((aligned(4))) APPLI_NVM_REQS AppliNvm_Reqs;
+MOBLEUINT16 StopRadioInProgress;
MOBLE_RESULT AppliNvm_EraseRestoreResvNvm(void);
MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
@@ -95,7 +98,8 @@ MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
MOBLEUINT32 totalSubPage,
MOBLEUINT32 nvmBaseOffset);
MOBLE_RESULT AppliNvm_MarkSubpageInvalid(void);
-MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size);
+MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset,
+ void const *buf, MOBLEUINT32 size);
#if 0
/**
@@ -133,7 +137,9 @@ MOBLE_RESULT AppliNvm_FlashErase(uint16_t PageNumber)
* @param Data: word to write
* @retval MOBLE_RESULT_SUCCESS on success
*/
-MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size)
+MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset,
+ void const *buf,
+ MOBLEUINT32 size)
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
@@ -159,14 +165,17 @@ MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUIN
}
else
{
- result = PalNvmWrite(APP_NVM_BASE, offset, buf, size);
+ result = PalNvmWrite(APP_NVM_BASE,
+ offset,
+ buf,
+ size);
}
return result;
}
-/**
+/**
* @brief Mark first valid subpage as invalid.
* @param void
* @retval MOBLE_RESULT_SUCCESS on success
@@ -296,8 +305,8 @@ MOBLE_RESULT AppliNvm_FactorySettingReset(void)
/* Load model data copy from nvm */
memcpy((void*)AppliNvm_Reqs.modelData,
- (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(currSubPageIdx) + APP_NVM_GENERIC_MODEL_OFFSET),
- APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE);
+ (void*)(APP_NVM_SUBPAGE_OFFSET(currSubPageIdx)+APP_NVM_GENERIC_MODEL_OFFSET),
+ APP_NVM_MODELDATA_PER_ELEMENT_SIZE);
result = AppliNvm_MarkSubpageInvalid();
@@ -341,7 +350,8 @@ MOBLE_RESULT AppliNvm_FactorySettingReset(void)
* @param model state buff size
* @retval MOBLE_RESULT_SUCCESS on success
*/
-MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state, uint8_t size)
+MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state,
+ uint16_t size)
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS; /* if save model state not defined, return MOBLE_RESULT_FAIL */
@@ -354,7 +364,9 @@ MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state, uint8_t size)
}
else
{
- memcpy(AppliNvm_Reqs.modelData, state, size);
+ memcpy(AppliNvm_Reqs.modelData,
+ state,
+ size);
AppliNvm_Reqs.writeReq = MOBLE_TRUE;
AppliNvm_Reqs.erasePageReq = MOBLE_FALSE;
@@ -379,13 +391,13 @@ MOBLE_RESULT AppliNvm_ClearModelState(void)
#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};
+ MOBLEUINT8 clearBuff[APP_NVM_MODELDATA_PER_ELEMENT_SIZE] = {0};
MOBLEUINT32 valid = 0;
result = AppliNvm_FindFirstEmptyPage(&subPageIdx,
APP_NVM_SUBPAGE_SIZE,
APP_NVM_MAX_SUBPAGE,
- (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
if (MOBLE_FAILED(result))
{
@@ -434,7 +446,8 @@ MOBLE_RESULT AppliNvm_ClearModelState(void)
* @param model state buff size
* @retval MOBLE_RESULT_SUCCESS on success
*/
-MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint8_t* size)
+MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[],
+ uint16_t* size)
{
#if (SAVE_MODEL_STATE_NVM == 1)
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
@@ -463,8 +476,10 @@ MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint8_t* size)
memcpy((void*)AppliNvm_Reqs.modelData,
(void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(currSubPageIdx-1) + APP_NVM_GENERIC_MODEL_OFFSET),
APP_NVM_GENERIC_MODEL_SIZE + APP_NVM_LIGHT_MODEL_SIZE);
- memcpy((void*)state, (void*)(AppliNvm_Reqs.modelData), APP_NVM_MODEL_SIZE);
- *size = APP_NVM_MODEL_SIZE;
+ memcpy((void*)state,
+ (void*)(AppliNvm_Reqs.modelData),
+ APP_NVM_MODEL_SIZE);
+ *size = APP_NVM_MODEL_SIZE;
}
}
return result;
@@ -487,41 +502,47 @@ void AppliNvm_Process(void)
uint8_t reserveAreaCopy[APP_NVM_RESERVED_SIZE];
/* Erase if required */
- if (AppliNvm_Reqs.erasePageReq == MOBLE_TRUE)
+ if ((AppliNvm_Reqs.erasePageReq == MOBLE_TRUE) &&
+ (!LL_FLASH_IsActiveFlag_OperationSuspended()))
{
- /* save reserve flash area */
- memcpy((void*)reserveAreaCopy, (void*)APP_NVM_BASE, APP_NVM_RESERVED_SIZE);
-
- result = PalNvmErase(APP_NVM_BASE, 0);
-
- if(result == MOBLE_RESULT_OUTOFMEMORY)
+ if(StopRadioInProgress == 0)
{
- AppliNvm_Reqs.erasePageReq = MOBLE_TRUE;
+ /* save reserve flash area */
+ memcpy((void*)reserveAreaCopy,
+ (void*)APP_NVM_BASE,
+ APP_NVM_RESERVED_SIZE);
+
+ TRACE_M(TF_PROVISION,"Erase flash page\r\n");
+ result = PalNvmErase(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);
+ 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;
+ }
+ 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);
+ 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;
+ result = AppliNvm_FlashProgram(0,
+ (uint32_t*)&reserveAreaCopy,
+ APP_NVM_RESERVED_SIZE);
+ BLEMesh_ResumeAdvScan();
}
}
+ else
+ StopRadioInProgress--;
}
- if (AppliNvm_Reqs.erasePageReq == MOBLE_FALSE
- && AppliNvm_Reqs.writeReq == MOBLE_TRUE)
+ if (AppliNvm_Reqs.erasePageReq == MOBLE_FALSE &&
+ AppliNvm_Reqs.writeReq == MOBLE_TRUE)
{
result = AppliNvm_FindFirstEmptyPage(&subPageIdx,
APP_NVM_SUBPAGE_SIZE,
@@ -530,11 +551,14 @@ void AppliNvm_Process(void)
if(result == MOBLE_RESULT_OUTOFMEMORY)
{
+ BLEMesh_SuspendAdvScan();
+ StopRadioInProgress = RADIO_OFF_DELAY;
+
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;
+ result = MOBLE_RESULT_SUCCESS;
}
else
{
@@ -637,6 +661,85 @@ MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
return result;
}
+#if 0
+MOBLE_RESULT AppliNVM_Save_FlashTesting(MOBLEUINT8 *buffer,
+ MOBLEUINT16 buffer_size)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+ uint8_t reserveAreaCopy[APP_NVM_RESERVED_SIZE];
+ MOBLEINT16 subPageIdx;
+
+ for(MOBLEUINT8 count = 0;count <= buffer_size;count++)
+ {
+ buffer[count] = count;
+ }
+
+ /* save reserve flash area */
+ memcpy((void*)reserveAreaCopy,
+ (void*)APP_NVM_BASE,
+ APP_NVM_RESERVED_SIZE);
+
+ result = AppliNvm_FlashErase((uint16_t)((APP_NVM_BASE - RESET_MANAGER_FLASH_BASE_ADDRESS) / PAGE_SIZE));
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ /* restore reserve area */
+// FLASH_ProgramWordBurst(APP_NVM_BASE, (uint32_t*)reserveAreaCopy);
+ result = AppliNvm_FlashProgram(0,
+ (uint32_t*)&reserveAreaCopy,
+ APP_NVM_RESERVED_SIZE);
+ }
+
+ result = AppliNvm_FindFirstEmptyPage(&subPageIdx,
+ APP_NVM_SUBPAGE_SIZE,
+ APP_NVM_MAX_SUBPAGE,
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
+
+ if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ TRACE_M(TF_PROVISION, "Flash sub page is full, preparing new subpage\r\n");
+ }
+ else
+ {
+ result = AppliNvm_FlashProgram(APP_NVM_SUBPAGE_OFFSET(subPageIdx)+APP_NVM_GENERIC_MODEL_OFFSET,
+ buffer,
+ buffer_size);
+ }
+ return result;
+}
+
+MOBLE_RESULT AppliNVM_Retrieve_FlashTesting(MOBLEUINT8 *buffer,
+ MOBLEUINT16 buffer_size)
+{
+ MOBLEINT16 currSubPageIdx;
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+
+ result = AppliNvm_FindFirstEmptyPage(&currSubPageIdx,
+ APP_NVM_SUBPAGE_SIZE,
+ APP_NVM_MAX_SUBPAGE,
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
+
+ if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ TRACE_M(TF_PROVISION," Can not find the empty page for testing flash \r\n");
+ }
+ else
+ {
+ memcpy((void*)buffer,
+ (void*)(APP_NVM_SUBPAGE_OFFSET(currSubPageIdx)+APP_NVM_GENERIC_MODEL_OFFSET),
+ buffer_size);
+
+ result = AppliNvm_MarkSubpageInvalid();
+
+ if (MOBLE_FAILED(result))
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+
+ return result;
+}
+#endif
/**
* @}
@@ -645,4 +748,4 @@ MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
/**
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 34667f26c..65fd789d7 100644
--- 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
@@ -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
@@ -55,9 +55,9 @@ typedef struct
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_SaveModelState(uint8_t* state, uint16_t size);
MOBLE_RESULT AppliNvm_ClearModelState(void);
-MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint8_t* size);
+MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint16_t* size);
void AppliNvm_Process(void);
void AppliNvm_SaveMessageParam (void);
MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
@@ -85,8 +85,13 @@ void AppliPrvnNvm_SaveProvisionerDevKey(MOBLEUINT8 *data ,
void AppliPrvnNvm_SaveKeys (MOBLEUINT8 status);
+MOBLE_RESULT AppliNVM_Save_FlashTesting(MOBLEUINT8 *buffer,
+ MOBLEUINT16 buffer_size);
+MOBLE_RESULT AppliNVM_Retrieve_FlashTesting(MOBLEUINT8 *buffer,
+ MOBLEUINT16 buffer_size);
+
#endif /* __APPLI_NVM_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 7c164b49e..c6bed93c0 100644
--- 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
@@ -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
@@ -21,9 +21,10 @@
#include "hal_common.h"
#include "types.h"
+#include "sensor_cfg_usr.h"
#include "sensors.h"
-#include "light_lc.h"
#include "appli_sensor.h"
+#include "appli_light_lc.h"
#include "mesh_cfg.h"
//#include "LPS25HB.h"
#include "string.h"
@@ -38,13 +39,49 @@
* @{
*/
-/* Private typedef -----------------------------------------------------------*/
-/* Private define ------------------------------------------------------------*/
+MOBLE_RESULT Appli_Sensor_ValueSet(MOBLEUINT8 sensorOffset,
+ MOBLEUINT32 value);
+
+/* Private variables ---------------------------------------------------------*/
+
+/* ALIGN(4) */
+__attribute__((aligned(4)))const sensor_server_init_params_t SensorServerInitParams = SENSOR_SERVER_INIT_PARAMS;
+
+/* ALIGN(4) */
+__attribute__((aligned(4)))const sensor_server_cb_t AppliSensor_cb =
+{
+ /* Sensor Model callbacks */
+ Appli_Sensor_CadenceGet,
+ Appli_Sensor_CadenceSet,
+ Appli_Sensor_CadenceSetUnack,
+ Appli_Sensor_SettingsGet,
+ Appli_Sensor_SettingGet,
+ Appli_Sensor_SettingSet,
+ Appli_Sensor_SettingSetUnack,
+ Appli_Sensor_DescriptorGet,
+ Appli_Sensor_Get,
+ Appli_Sensor_ColumnGet,
+ Appli_Sensor_SeriesGet,
+ Appli_Sensor_ReadDescriptor,
+ Appli_Sensor_ReadValue,
+ Appli_Sensor_ReadColumn,
+ Appli_Sensor_ReadSeries,
+ Appli_Sensor_IsFastCadence,
+ Appli_Sensor_IsStatusTrigger,
+ Appli_Sensor_Descriptor_Status,
+ Appli_Sensor_Cadence_Status,
+ Appli_Sensor_Settings_Status,
+ Appli_Sensor_Setting_Status,
+ Appli_Sensor_Status,
+ Appli_Sensor_Column_Status,
+ Appli_Sensor_Series_Status
+};
+
#if 0
/**
-* @brief PRESSURE init structure definition
-*/
-PRESSURE_InitTypeDef InitStructure =
+ * @brief Pressure sensor init
+ */
+__attribute__((aligned(4)))const PRESSURE_InitTypeDef Lps25InitParams =
{
LPS25HB_ODR_1Hz,
LPS25HB_BDU_READ,
@@ -55,44 +92,19 @@ PRESSURE_InitTypeDef InitStructure =
};
#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[3];
-
-/* By Default value used for cadence set for testing. */
-Sensor_CadenceSet_t Sensor_CadenceSet[NUMBER_OF_SENSOR];
-
-/*
-{
- {0x0071 , 0x2 , 2 , 2 ,2 ,1 ,0X05 , 0x64},
- {0x2A6D , 0x2 , 1 , 1 , 1, 1, 0X258 , 0x3ED},
- {0X2A7F ,0x2,1,1,1,0,0x10, 0x20}
-};*/
-
-
-#endif
-
-MODEL_Property_IDTableParam_t Property_ID_Table[NUMBER_OF_SENSOR] =
-{
- {TEMPERATURE_PID},
- {PRESSURE_PID},
- {TIME_OF_FLIGHT_PID}
-};
+/**
+ * @brief Variables for people
+ */
+MOBLEUINT8 AppliSensorReadFromSensor = 0; /* Used for PTS testing */
+MOBLEUINT8 PresentTemperatureValue = 0;
+MOBLEUINT8 PreviousTemperatureValue = 0;
MOBLEUINT8 Occupancy_Flag = MOBLE_FALSE;
extern MOBLEUINT8 NumberOfElements;
extern MOBLEUINT8 ProvisionFlag;
MOBLEUINT8 Sensor_Setting_Access = 0x01 ;
+MOBLEUINT32 PresentPeopleCount = 0;
+MOBLEUINT32 PreviousPeopleCount = 0;
-
-
-/* Temperature and Pressure init structure*/
-#if 0
- PRESSURE_DrvTypeDef* xLPS25HBDrv = &LPS25HBDrv;
-#endif
-
-/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/******************************************************************************/
@@ -101,792 +113,909 @@ MOBLEUINT8 Sensor_Setting_Access = 0x01 ;
/**
-* @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
+ * @brief Callback corresponding to Sensor_CadenceGet_cb
+ * @param Cadence parameters
+* @retval None
*/
-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 if( property_ID == (MOBLEUINT16) TIME_OF_FLIGHT_PID)
- {
- Sensor_CadenceSet[2].Property_ID = pCadence_param->Property_ID;
- Sensor_CadenceSet[2].FastCadenceDevisor = pCadence_param->FastCadenceDevisor ;
- Sensor_CadenceSet[2].StatusTriggerType = pCadence_param->StatusTriggerType ;
- Sensor_CadenceSet[2].triggerDeltaDown = pCadence_param->triggerDeltaDown;
- Sensor_CadenceSet[2].triggerDeltaUp = pCadence_param->triggerDeltaUp;
- Sensor_CadenceSet[2].StatusMinInterval = pCadence_param->StatusMinInterval;
- Sensor_CadenceSet[2].FastCadenceLow = pCadence_param->FastCadenceLow;
- Sensor_CadenceSet[2].FastCadenceHigh = pCadence_param->FastCadenceHigh;
- }
-
- return MOBLE_RESULT_SUCCESS;
+void Appli_Sensor_CadenceGet(sensor_CadenceCbParam_t* pCadenceParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pCadenceParam->property_ID, elementIndex, peerAddr, dstPeer);
}
+
/**
-* @brief Appli_Sensor_Cadence_Get: This function is callback for Application
-* when sensor cadence Set message is received
-* @param pCadence_get: 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
+ * @brief Callback corresponding to Sensor_CadenceSet_cb
+ * @param Cadence parameters
+* @retval None
*/
-
-MOBLE_RESULT Appli_Sensor_Cadence_Get(MOBLEUINT8* sensor_DataCadence,
- MOBLEUINT16 property_ID, MOBLEUINT32 length)
+void Appli_Sensor_CadenceSet(sensor_CadenceCbParam_t* pCadenceParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
- return MOBLE_RESULT_SUCCESS;
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pCadenceParam->property_ID, elementIndex, peerAddr, dstPeer);
}
-/**
-* @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,MOBLEUINT16 prop_ID)
-{
-
- for(int i=0;i< NUMBER_OF_SENSOR;i++)
- {
- if(prop_ID == Property_ID_Table[i].Property_ID)
- {
- Appli_Sensor_SettingSet[i].Property_ID = pSensor_SettingParam->Property_ID;
-
- Appli_Sensor_SettingSet[i].Sensor_Setting_ID = pSensor_SettingParam->Sensor_Setting_ID;
- Appli_Sensor_SettingSet[i].Sensor_Setting_Access = Sensor_Setting_Access;
- Appli_Sensor_SettingSet[i].Sensor_Setting_Value = pSensor_SettingParam->Sensor_Setting_Value;
- }
- }
- return MOBLE_RESULT_SUCCESS;
+/**
+ * @brief Callback corresponding to Sensor_CadenceSetUnack_cb
+ * @param Cadence parameters
+* @retval None
+*/
+void Appli_Sensor_CadenceSetUnack(sensor_CadenceCbParam_t* pCadenceParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pCadenceParam->property_ID, elementIndex, peerAddr, dstPeer);
}
-
/**
-* @brief Appli_Sensor_Data_Status: This function is callback for Application
-* when Sensor Get message is received
-* @param sensor_Data: Pointer to buffer to be updated with parameters
-* @param pLength: Length of the parameters to be sent in response
-* @param prop_ID: Property Id of requested sensor (optional)
-* @param length: Received data length
-* @retval MOBLE_RESULT
+ * @brief Callback corresponding to Sensor_SettingsGet_cb
+ * @param Setting parameters
+* @retval None
*/
-MOBLE_RESULT Appli_Sensor_Data_Status(MOBLEUINT8* sensor_Data ,
- MOBLEUINT32* pLength,
- MOBLEUINT16 prop_ID ,
- MOBLEUINT32 length)
+void Appli_Sensor_SettingsGet(sensor_SettingsCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
- MOBLE_RESULT result = MOBLE_RESULT_FALSE;
- MOBLEUINT32 temperatureData = 0;
- MOBLEUINT32 pressureData = 0;
- MOBLEUINT8 data_Length = 0x03;
- MOBLEUINT32 distance = 0x000000C8; // 200 cm
- MOBLEUINT8 data_Length_UnknownID;
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pSettingParam->propertyId, elementIndex, peerAddr, dstPeer);
+}
-#if 0
- LPS25HB_GetTemperature((float*)&temperatureData);
-
- LPS25HB_GetPressure((float*)&pressureData);
-#endif
-
- result = Check_Property_ID(Property_ID_Table , prop_ID);
-
- if(result == MOBLE_RESULT_SUCCESS && length > 0)
- {
- if((prop_ID == TEMPERATURE_PID )) /* format A */
- {
- /*(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))
- {
- /* 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))
- {
- /* 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(length == 0)
- {
- /*(prop_Id_Temp & 0x07) << 5) | (Len <<1) Format A
- Property calculation is done like above line
+/**
+ * @brief Callback corresponding to Sensor_SettingGet_cb
+ * @param Setting parameters
+* @retval None
*/
- *(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);
+void Appli_Sensor_SettingGet(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pSettingParam->property_ID, elementIndex, peerAddr, dstPeer);
+}
- *pLength =20;
- }
- else
- {
-// *(sensor_Data+0) = (MOBLEUINT8)prop_ID ;
-// *(sensor_Data+1) = (MOBLEUINT8)(prop_ID >> 8);
-//
-// *pLength =2;
-
- data_Length_UnknownID = 0x0F;
- if(prop_ID < 0x0800)
- {
- *(sensor_Data) = ((prop_ID & 0x07) << 5) | (data_Length_UnknownID << 1) ;
- *(sensor_Data+1) = (prop_ID >> 3) & 0xFF;
-
- *pLength=2;
- }
- else
- {
- *(sensor_Data+0) = 0xFF; //((data_Length <<1) | 0x01) & 0x00;
- *(sensor_Data+1) = (MOBLEUINT8)prop_ID ;
- *(sensor_Data+2) = (MOBLEUINT8)(prop_ID >> 8);
+/**
+ * @brief Callback corresponding to Sensor_SettingSet_cb
+ * @param Setting parameters
+* @retval None
+*/
+void Appli_Sensor_SettingSet(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pSettingParam->property_ID, elementIndex, peerAddr, dstPeer);
+}
- *pLength = 3;
- }
- }
- //*plength=0;
- }
-
- 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 Callback corresponding to Sensor_SettingSetUnack_cb
+ * @param Setting parameters
+* @retval None
+*/
+void Appli_Sensor_SettingSetUnack(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pSettingParam->property_ID, elementIndex, peerAddr, dstPeer);
}
/**
-* @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
+ * @brief Callback corresponding to Sensor_DescriptorGet_cb
+ * @param Descriptor parameters
+* @retval None
*/
-MOBLE_RESULT Appli_Sensor_Descriptor_Status(MOBLEUINT8* sensor_Descriptor ,
- MOBLEUINT32* pLength,MOBLEUINT16 prop_ID ,
- MOBLEUINT32 length)
+void Appli_Sensor_DescriptorGet(MOBLEUINT8 prop_ID,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
- Appli_Sensor_DescriptorStatus_t Appli_Sensor_DescriptorStatus1[] =
+ if(length == 0)
{
- {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;
- MOBLE_RESULT result = MOBLE_RESULT_FALSE;
- result = Check_Property_ID(Property_ID_Table , prop_ID);
-
- if (result != MOBLE_RESULT_FALSE )
+ TRACE_M(TF_SENSOR, "Sensor Descriptor data for all sensors on element index %X peer addr %X, dst peer %X\r\n",
+ elementIndex, peerAddr, dstPeer);
+ }
+ else
{
- if(prop_ID == TEMPERATURE_PID)
- {
- 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;
- *pLength = 8;
- }
- else if(prop_ID == PRESSURE_PID)
- {
- tolerance = Appli_Sensor_DescriptorStatus1[1].NegativeTolerance;
- tolerance = (tolerance << 12 ) | Appli_Sensor_DescriptorStatus1[1].PositiveTolerance ;
-
- *(sensor_Descriptor) = Appli_Sensor_DescriptorStatus1[1].Prop_ID;
- *(sensor_Descriptor+1) = Appli_Sensor_DescriptorStatus1[1].Prop_ID >> 8;
- *(sensor_Descriptor+2) = tolerance;
- *(sensor_Descriptor+3) = tolerance >> 8;
- *(sensor_Descriptor+4) = tolerance >> 16;
- *(sensor_Descriptor+5) = Appli_Sensor_DescriptorStatus1[1].SamplingFunction;
- *(sensor_Descriptor+6) = Appli_Sensor_DescriptorStatus1[1].MeasurementPeriod;
- *(sensor_Descriptor+7) = Appli_Sensor_DescriptorStatus1[1].UpdateInterval;
- *pLength =8;
- }
- else if(prop_ID == TIME_OF_FLIGHT_PID)
- {
- tolerance = Appli_Sensor_DescriptorStatus1[2].NegativeTolerance;
- tolerance = (tolerance << 12 ) | Appli_Sensor_DescriptorStatus1[2].PositiveTolerance ;
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X, dst peer %X\r\n",
+ prop_ID, elementIndex, peerAddr, dstPeer);
+ }
+}
- *(sensor_Descriptor) = Appli_Sensor_DescriptorStatus1[2].Prop_ID;
- *(sensor_Descriptor+1) = Appli_Sensor_DescriptorStatus1[2].Prop_ID >> 8;
- *(sensor_Descriptor+2) = tolerance;
- *(sensor_Descriptor+3) = tolerance >> 8;
- *(sensor_Descriptor+4) = tolerance >> 16;
- *(sensor_Descriptor+5) = Appli_Sensor_DescriptorStatus1[2].SamplingFunction;
- *(sensor_Descriptor+6) = Appli_Sensor_DescriptorStatus1[2].MeasurementPeriod;
- *(sensor_Descriptor+7) = Appli_Sensor_DescriptorStatus1[2].UpdateInterval;
- *pLength =8;
- }
+/**
+ * @brief Callback corresponding to Sensor_Get_cb
+ * @param Get parameters
+* @retval None
+*/
+void Appli_Sensor_Get(MOBLEUINT16 prop_ID,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ if(length == 0)
+ {
+ TRACE_M(TF_SENSOR, "Sensor Data for all sensors on element index %X peer addr %X dst peer %X\r\n",
+ elementIndex, peerAddr, dstPeer);
}
- else
+ else
{
- if(length ==0 )
- {
- 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;
- }
- else if(prop_ID != 0x0000)
- {
- *(sensor_Descriptor) = prop_ID >> 8;
- *(sensor_Descriptor+1) = prop_ID;
- *pLength = 2;
- }
- else
- {
-
- }
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X \r\n",
+ prop_ID, elementIndex, peerAddr, dstPeer);
}
+}
+
- // }
- //else if(result == MOBLE_RESULT_FALSE && length >0)
- //{
- // *(sensor_Descriptor) = prop_ID >> 8;
- // *(sensor_Descriptor+1) = prop_ID;
- // *pLength = 2;
- //}
- //else
- //{
- //
- //}
- return MOBLE_RESULT_SUCCESS;
+/**
+ * @brief Callback corresponding to Sensor_ColumnGet_cb
+ * @param Column parameters
+* @retval None
+*/
+void Appli_Sensor_ColumnGet(sensor_ColumnCbParams_t* pColumnParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pColumnParam->propertyId, elementIndex, peerAddr, dstPeer);
}
-MOBLE_RESULT Appli_Sensor_Column_Status(MOBLEUINT8* sensor_Column , MOBLEUINT32* pLength,MOBLEUINT16 prop_ID , MOBLEUINT32 length)
+/**
+ * @brief Callback corresponding to Sensor_SeriesGet_cb
+ * @param Series parameters
+* @retval None
+*/
+void Appli_Sensor_SeriesGet(sensor_SeriesCbParams_t* pSeriesParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
+ TRACE_M(TF_SENSOR, "Property ID %X Raw Value X1 %d Raw Value X2 %d\r\n",
+ pSeriesParam->propertyId,
+ pSeriesParam->rawValueX1,
+ pSeriesParam->rawValueX2);
+}
+
+
+/**
+ * @brief Callback corresponding to Sensor_ReadDescriptor_cb
+ * Update SENSORX descriptor identified by sensorOffset
+ * Read from application to optimize RAM
+ * @param Sensor offset in sensor init structure
+ * @param descriptor parameters
+ * @retval Fail if sensor doesn't exist or property ID mismatch occurrs
+ * else Success
+ */
+MOBLE_RESULT Appli_Sensor_ReadDescriptor(MOBLEUINT8 sensorOffset,
+ sensor_DescriptorCbParams_t* pDescriptorParams)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ const sensor_init_params_t* pSensorInitParams = NULL;
- Sensor_Column_param_t Appli_Sensor_ColumnStatus[]=
- {
- {PRESSURE_PID,0xD9AF,0xDE03,0x0405},
- {TEMPERATURE_PID,0xacd2,0x3456,0x6537},
- {TIME_OF_FLIGHT_PID,0x8248,0xDE03,0x0405}
- };
-
- MOBLEUINT8 flag = 0;
-
- for(int i=0;i< NUMBER_OF_SENSOR ;i++)
+ if (sensorOffset < SensorServerInitParams.sensorsCount)
{
- if(prop_ID == Appli_Sensor_ColumnStatus[i].Property_ID)
+ pSensorInitParams = &(SensorServerInitParams.sensorInitParams[sensorOffset]);
+
+ if (pSensorInitParams->propertyId != pDescriptorParams->propertyId)
{
- flag = 1;
- *sensor_Column= Appli_Sensor_ColumnStatus[i].Property_ID;
- *(sensor_Column+1) = Appli_Sensor_ColumnStatus[i].Property_ID>>8;
-
- *(sensor_Column+2)=Appli_Sensor_ColumnStatus[i].RawValueX;
- *(sensor_Column+3)=Appli_Sensor_ColumnStatus[i].RawValueX;
-
-
- *(sensor_Column+4)=Appli_Sensor_ColumnStatus[i].RawValueWidth;
- *(sensor_Column+5)=Appli_Sensor_ColumnStatus[i].RawValueWidth;
-
- *(sensor_Column+6)=Appli_Sensor_ColumnStatus[i].RawValueY;
- *(sensor_Column+7)=Appli_Sensor_ColumnStatus[i].RawValueY;
- *pLength = 8;
- break;
+ result = MOBLE_RESULT_FAIL;
+ }
+ else
+ {
+ /* */
}
}
-
- if(flag == 0)
+ else
{
- *pLength =4;
+ result = MOBLE_RESULT_FAIL;
}
- return MOBLE_RESULT_SUCCESS;
+ if (pSensorInitParams != NULL &&
+ pDescriptorParams != NULL)
+ {
+ pDescriptorParams->positiveTolerance = pSensorInitParams->positiveTolerance;
+ pDescriptorParams->negativeTolerance = pSensorInitParams->negativeTolerance;
+ pDescriptorParams->samplingFunction = pSensorInitParams->samplingFunction;
+ pDescriptorParams->measurementPeriod = pSensorInitParams->measurementPeriod;
+ pDescriptorParams->updateInterval = pSensorInitParams->updateInterval;
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ return result;
}
-MOBLE_RESULT Appli_Sensor_Series_Status(MOBLEUINT8* sensor_Series , MOBLEUINT32* pLength,MOBLEUINT16 prop_ID , MOBLEUINT32 length)
+/**
+ * @brief Callback corresponding to Sensor_ReadValue_cb
+ * Read sensor value and update buffer
+ * data length <= 128
+ * PreviousTemperatureValue, PresentTemperatureValue to be updated
+ * everytime sensor value is changed and call to Sensor_UpdateCadence
+ * @param Sensor offset in sensor init structure
+ * @param Value parameters
+ * @retval Fail if sensor doesn't exist
+ * else Success
+ */
+MOBLE_RESULT Appli_Sensor_ReadValue(MOBLEUINT8 sensorOffset,
+ sensor_ValueCbParams_t* pValueParams)
{
- Sensor_Series_param_t Appli_Sensor_SeriesStatus[NUMBER_OF_SENSOR]=
- {
- {PRESSURE_PID,{{0xabcd,0x73ac,0xcdef},{0xacd2,0x2345,0x1234}}},
- {TEMPERATURE_PID,{{0x00C1,0x0071,0x00DE},{0x0003,0x0004,0x0005}}},
- {TIME_OF_FLIGHT_PID,{{0x4528,0xbad3,0xdc12},{0xacd2,0x2345,0x1234}}}
- };
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+// PRESSURE_StatusTypeDef tempStatus = PRESSURE_OK;
+ MOBLEINT16 temp = 0;
+ MOBLEINT8 temperature8 = 0;
+ float pressure = 0;
- for(int i=0;i<NUMBER_OF_SENSOR;i++)
+ /* sensor offset exist */
+ if (sensorOffset < SensorServerInitParams.sensorsCount)
{
- if( prop_ID == Appli_Sensor_SeriesStatus[i].Property_ID )
+ if (sensorOffset == 0) /* Present Ambient Temperature */
{
+ if(AppliSensorReadFromSensor == 0) /* Normal mode */
+ {
+ /* Temperature, Temperature8 format, M=1, d=0, b=-1 */
+// tempStatus = LPS25HB_I2C_ReadRawTemperature(&temp);
+// if (tempStatus == PRESSURE_OK)
+ {
+ TRACE_M(TF_SENSOR, "Temperature sensor raw value %d\r\n" , temp);
+
+ /* Convert temperature raw value to Temperature8 format */
+ temp = (temp/240) + 85;
+
+ if (temp < -64*2)
+ {
+ temp = -64*2;
+ }
+ else if (temp > 63.5*2)
+ {
+ temp = 63.5*2;
+ }
+
+ temperature8 = temp;
+
+ pValueParams->data[0] = (MOBLEUINT8)temperature8;
+
+ if (pValueParams->data[0] == 0xFF)
+ {
+ /* 0xFF is unknown but here it is -1
+ -1 is approximated to 0 */
+ pValueParams->data[0] = 0x00;
+ }
+
+ TRACE_M(TF_SENSOR, "Temperature8 raw value %d, actual value %f\r\n",
+ temperature8, (float)temperature8/2);
+ }
+#if 0
+ else /* error */
+ {
+ pValueParams->data[0] = 0xFF;
+ }
+#endif
+ }
+ else /* Value not to be read from sensor */
+ {
+ pValueParams->data[0] = PresentTemperatureValue;
+ }
+ }
+ else if (sensorOffset == 1) /* Pressure */
+ {
+// tempStatus = LPS25HB_GetPressure(&pressure);
+// if (tempStatus == PRESSURE_OK)
+ {
+ TRACE_M(TF_SENSOR, "Pressure sensor value %f mbar\r\n" , pressure);
- *sensor_Series= Appli_Sensor_SeriesStatus[i].Property_ID;
- *(sensor_Series+1) = Appli_Sensor_SeriesStatus[i].Property_ID>>8;
- for(int y=0 ;y < SENSOR_SERIES_VALUE ;y++)
+ memcpy(pValueParams->data, (void*)&pressure, 4);
+ }
+#if 0
+ else /* error */
{
- *(sensor_Series+2+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawValueX>>8;
- *(sensor_Series+3+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawValueX;
- *(sensor_Series+4+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawColumnWidth>>8;
- *(sensor_Series+5+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawColumnWidth;
- *(sensor_Series+6+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawValueY>>8;
- *(sensor_Series+7+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawValueY;
+ memset(pValueParams->data, 0, 4);
}
- *pLength = 2 + 6*SENSOR_SERIES_VALUE ;
- break;
+#endif
}
}
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
-return MOBLE_RESULT_SUCCESS ;
-
+ return result;
}
-
+
#endif
+
/**
-* @brief Sensor Process Function will continuously monitor the sensors.
-* Function used for the Publishing, data monitoring..
-* @param void
-* @retval void
+ * @brief Callback corresponding to Appli_Sensor_Cadence_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
*/
-void Sensor_Process(void)
+void Appli_Sensor_Cadence_Status(const MOBLEUINT8 *pCadence,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
+ MOBLEUINT8 i;
-#ifdef ENABLE_SENSOR_PUBLICATION
- float sensorValue[NUMBER_OF_SENSOR];
- if(ProvisionFlag == 1)
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Cadence_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_CADENCE_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
{
- Read_Sensor_Data(&sensorValue[0]);
- Sensor_Publication_Process(&sensorValue[0], &Property_ID_Table[0]);
+ TRACE_M(TF_SERIAL_CTRL,"Cadence value: %d\n\r", pCadence[i]);
}
-#endif
+}
+
+
+/**
+ * @brief Callback corresponding to Appli_Sensor_Settings_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
+*/
+void Appli_Sensor_Settings_Status(const MOBLEUINT8 *pSettings,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Settings_Status callback received \r\n");
- /* 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)
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_SETTINGS_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
{
- 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;
- }
- }
+ TRACE_M(TF_SERIAL_CTRL,"Settings value: %d\n\r", pSettings[i]);
+ }
}
-
+
+
/**
-* @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)
+ * @brief Callback corresponding to Appli_Sensor_Setting_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
+*/
+void Appli_Sensor_Setting_Status(const MOBLEUINT8 *pSetting,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
- MOBLEUINT8 occupancyData = 0x1;
- MOBLEUINT8 sensor_Data[5];
- MOBLE_ADDRESS srcAdd;
- MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 i;
- sensor_Data[1] = (MOBLEUINT8)(PRESENCE_DETECTED_PROPERTY << 8);
- sensor_Data[0] = (MOBLEUINT8)PRESENCE_DETECTED_PROPERTY;
- sensor_Data[2] = occupancyData;
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Setting_Status callback received \r\n");
- srcAdd = BLEMesh_GetAddress();
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_SETTING_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
+ {
+ TRACE_M(TF_SERIAL_CTRL,"Setting value: %d\n\r", pSetting[i]);
+ }
+}
+
+
+/**
+ * @brief Callback corresponding to Appli_Sensor_Descriptor_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
+*/
+void Appli_Sensor_Descriptor_Status(const MOBLEUINT8 *pDescriptor,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
- result = BLEMesh_SetRemotePublication(SENSOR_SERVER_MODEL_ID, srcAdd ,
- SENSOR_STATUS ,
- sensor_Data,3,
- MOBLE_FALSE, MOBLE_FALSE);
-
- if(result)
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Descriptor_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_DESCRIPTOR_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
{
- TRACE_M(TF_LIGHT_LC,"Publication Error \r\n");
+ TRACE_M(TF_SERIAL_CTRL,"Descriptor value: %d\n\r", pDescriptor[i]);
}
-
}
-
-#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
+ * @brief Callback corresponding to Appli_Sensor_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
*/
-void Read_Sensor_Data(float *pSensorValue)
+void Appli_Sensor_Status(const MOBLEUINT8 *pStatus,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#if 0
- float temp,press;
- LPS25HB_GetTemperature(&temp);
- pSensorValue[0] = temp;
- LPS25HB_GetPressure(&press);
- pSensorValue[1] = press;
-#endif
+ MOBLEUINT8 i;
+
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
+ {
+ TRACE_M(TF_SERIAL_CTRL,"Status value: %d\n\r", pStatus[i]);
+ }
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+ Appli_Light_LC_SensorPropertyUpdate(elementIndex,
+ PRESENCE_DETECTED_PID,
+ (MOBLEUINT32) pStatus[length-1]);
+#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)
+ * @brief Callback corresponding to Appli_Sensor_Column_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
+*/
+void Appli_Sensor_Column_Status(const MOBLEUINT8 *pColumn,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
- 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};
+ MOBLEUINT8 i;
- floatToInt(pSensorData[sensor_Count], &out_value, 2);
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Column_Status callback received \r\n");
- /* Taking the timestamp for the cadence publication and making flag high */
- if(PublishingDataFlag[sensor_Count].CadenceDurationFlag == MOBLE_FALSE)
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_COLUMN_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
{
- cadenceDurationTick[sensor_Count] = Clock_Time();
- PublishingDataFlag[sensor_Count].CadenceDurationFlag = MOBLE_TRUE;
+ TRACE_M(TF_SERIAL_CTRL,"Column Status value: %d\n\r", pColumn[i]);
}
- /* 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))
+}
+
+
+/**
+ * @brief Callback corresponding to Appli_Sensor_Series_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
+*/
+void Appli_Sensor_Series_Status(const MOBLEUINT8 *pSeries,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Series_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_SERIES_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
{
- 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++;
- }
+ TRACE_M(TF_SERIAL_CTRL,"Series Status value: %d\n\r", pSeries[i]);
}
- else
+}
+
+
+/**
+ * @brief Callback corresponding to Sensor_ReadColumn_cb
+ * Fill column width and raw valye Y in data buffer
+ * data length <= 8
+ * @param Sensor offset in sensor init structure
+ * @param Series column parameters
+ * @retval Fail if sensor doesn't exist
+ * else Success
+*/
+MOBLE_RESULT Appli_Sensor_ReadColumn(MOBLEUINT8 sensorOffset,
+ MOBLEUINT8 columnOffset,
+ sensor_ColumnCbParams_t* pColumnParams)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ const sensor_init_params_t* pSensorInitParams = NULL;
+ MOBLEUINT8 dataLength = 0;
+ MOBLEUINT8* data = pColumnParams->data;
+
+ if (sensorOffset < SensorServerInitParams.sensorsCount)
{
- publishTime = SENSOR_PUBLISH_PERIOD ;
+ pSensorInitParams = &(SensorServerInitParams.sensorInitParams[sensorOffset]);
- 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)
+ /* fill sensor column data */
+ memcpy(data+dataLength,
+ &(pSensorInitParams->seriesColumn[columnOffset].columnWidth),
+ pSensorInitParams->dataLength);
+ dataLength = pSensorInitParams->dataLength;
+
+ memset(data+dataLength, 0xAA, pSensorInitParams->dataLength);
+ dataLength += pSensorInitParams->dataLength;
+
+ pColumnParams->dataLength = dataLength;
+ }
+ else
{
- sensor_Count = 0;
+ result = MOBLE_RESULT_FAIL;
}
-
+
+ return result;
}
+
/**
-* @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)
+ * @brief Callback corresponding to Sensor_ReadSeries_cb
+ * Fill sensor series state for all columns between and including X1 and X2
+ * Series data to be concatenated in triplet of raw value X, column width and raw value Y
+ * X[n] CW[n] Y[n] X[n+1] CW[n+1] Y[n+1] ...
+ * data length should be less than minimum of 379 or max application packet length supported
+ * @param Sensor offset in sensor init structure
+ * @param Series parameters
+ * @retval Fail if sensor doesn't exist
+ * else Success
+ */
+MOBLE_RESULT Appli_Sensor_ReadSeries(MOBLEUINT8 sensorOffset,
+ sensor_SeriesCbParams_t* pSeriesParams)
{
- MOBLEUINT32 length;
- MOBLEUINT8 sensor_Data[8];
- MOBLE_ADDRESS srcAdd;
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ const sensor_init_params_t* pSensorInitParams = NULL;
+ MOBLEUINT16 dataLength = 0;
+ MOBLEUINT8* data = pSeriesParams->data;
- srcAdd = BLEMesh_GetAddress();
-
- switch(*pProp_ID)
+ if (sensorOffset < SensorServerInitParams.sensorsCount)
{
- 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:
+ pSensorInitParams = &(SensorServerInitParams.sensorInitParams[sensorOffset]);
+
+ for (MOBLEUINT8 count=0; count<pSensorInitParams->seriesCount; count++)
+ {
+ /* fill sensor series data */
+ if (pSensorInitParams->seriesColumn[count].rawX >= pSeriesParams->rawValueX1 &&
+ pSensorInitParams->seriesColumn[count].rawX <= pSeriesParams->rawValueX2)
{
- /* 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(data+dataLength,
+ &(pSensorInitParams->seriesColumn[count].rawX),
+ pSensorInitParams->dataLength);
+ dataLength += pSensorInitParams->dataLength;
+ memcpy(data+dataLength,
+ &(pSensorInitParams->seriesColumn[count].columnWidth),
+ pSensorInitParams->dataLength);
+ dataLength += pSensorInitParams->dataLength;
+ memset(data+dataLength, 0xAA, pSensorInitParams->dataLength);
+ dataLength += pSensorInitParams->dataLength;
- memcpy(&sensor_Data[3],(void*)&pSensor_Value[0],4);
- length =7;
- break;
+ pSeriesParams->dataLength = dataLength;
}
- case TIME_OF_FLIGHT_PID:
+ else
{
- sensor_Data[0] = ((0x03 <<1) | 0x01);
- sensor_Data[1] = (MOBLEUINT8)TIME_OF_FLIGHT_PID ;
- sensor_Data[2] = (MOBLEUINT8)(TIME_OF_FLIGHT_PID >> 8);
-
- memcpy(&sensor_Data[3],(void*)&pSensor_Value[0],4);
- length =7;
- break;
+ /* */
}
- default:
- break;
+ }
}
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ return result;
+}
- result = BLEMesh_SetRemotePublication(SENSOR_SERVER_MODEL_ID, srcAdd,
- SENSOR_STATUS ,
- sensor_Data,length,
- MOBLE_FALSE, MOBLE_FALSE);
- if(result)
+/**
+ * @brief Callback corresponding to Sensor_IsFastCadence_cb
+ * To check if fast cadence to be used for current sensor state
+ * @param Sensor offset in sensor init structure
+ * @param Fast Cadence Low
+ * @param Fast Cadence High
+ * @retval Trigger status
+ */
+MOBLEUINT8 Appli_Sensor_IsFastCadence(MOBLEUINT8 sensorOffset,
+ void* pFastCadenceLow,
+ void* pFastCadenceHigh)
+{
+ MOBLEUINT8 fastCadenceStatus = 0;
+ MOBLEUINT32 fastCadenceLow = *((MOBLEUINT32*)pFastCadenceLow);
+ MOBLEUINT32 fastCadenceHigh = *((MOBLEUINT32*)pFastCadenceHigh);
+ MOBLEUINT32 sensorValue = PresentTemperatureValue;
+
+ if (sensorOffset == 0)
+ {
+ if (fastCadenceLow <= fastCadenceHigh)
+ {
+ fastCadenceStatus = sensorValue >= fastCadenceLow &&
+ sensorValue <= fastCadenceHigh;
+ }
+ else
+ {
+ fastCadenceStatus = sensorValue > fastCadenceLow ||
+ sensorValue < fastCadenceHigh;
+ }
+}
+ else
{
- TRACE_M(TF_SENSOR,"Publication Error \r\n");
+ /* Implmented only for sensor at offset 0 */
}
+ return fastCadenceStatus;
}
-#endif
-#ifdef ENABLE_SENSOR_MODEL_SERVER
-#if 0
/**
-* @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
+ * @brief Callback corresponding to Sensor_IsStatusTrigger_cb
+ * To check if sensor change in sensor state (delta) is more than
+ * given trigger state value
+ * delta up values
+ * @param Sensor offset in sensor init structure
+ * @param Trigger type -> value or percent change
+ * @param Status trigger delta down
+ * @param Status trigger delta up
+ * @retval Trigger status
*/
-/*
-MOBLE_RESULT Appli_Sensor_GetSettingStatus(MOBLEUINT8* pSetting_Status)
+MOBLEUINT8 Appli_Sensor_IsStatusTrigger(MOBLEUINT8 sensorOffset,
+ status_trigger_type_e triggerType,
+ void* pDeltaDown,
+ void* pDeltaUp)
{
+ const sensor_init_params_t* pSensorInitParams = NULL;
+ MOBLEUINT8 triggerStatus = 0;
+ MOBLEUINT32 deltaDown = *((MOBLEUINT32*)pDeltaDown);
+ MOBLEUINT32 deltaUp = *((MOBLEUINT32*)pDeltaUp);
+ status_trigger_delta_e statusTriggerDelta;
+ MOBLEUINT32 delta;
- *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;
-}*/
-#endif
+ if (sensorOffset == 0)
+ {
+ if (PresentTemperatureValue < PreviousTemperatureValue)
+ {
+ /* status trigger delta down */
+ statusTriggerDelta = STATUS_TRIGGER_DELTA_DOWN;
+ delta = PreviousTemperatureValue - PresentTemperatureValue;
-/**
-* @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
-*/
+ TRACE_M(TF_SENSOR, "Delta down value %ld\r\n", delta);
+ }
+ else
+ {
+ /* status trigger delta up */
+ statusTriggerDelta = STATUS_TRIGGER_DELTA_UP;
+ delta = PresentTemperatureValue - PreviousTemperatureValue;
-MOBLE_RESULT Appli_Sensor_GetSetting_IDStatus(MOBLEUINT8* pSetting_Status , MOBLEUINT16 prop_ID)
-{
- for(int i=0 ;i<NUMBER_OF_SENSOR;i++)
- {
- if(prop_ID == Appli_Sensor_SettingSet[i].Property_ID)
+ TRACE_M(TF_SENSOR, "Delta up value %ld\r\n", delta);
+ }
+
+ if (triggerType == STATUS_TRIGGER_TYPE_PC)
{
- *pSetting_Status = Appli_Sensor_SettingSet[i].Property_ID;
- *(pSetting_Status+1) = Appli_Sensor_SettingSet[i].Property_ID >> 8;
- *(pSetting_Status+2) = Appli_Sensor_SettingSet[i].Sensor_Setting_ID;
- *(pSetting_Status+3) = Appli_Sensor_SettingSet[i].Sensor_Setting_ID >> 8;
- *(pSetting_Status+4) = Appli_Sensor_SettingSet[i].Sensor_Setting_Access;
-
- if(Appli_Sensor_SettingSet[i].Sensor_Setting_Access == 0x03)
+ pSensorInitParams = &(SensorServerInitParams.sensorInitParams[sensorOffset]);
+
+ if (pSensorInitParams->valuesRange != 0)
{
- *(pSetting_Status+5) = Appli_Sensor_SettingSet[i].Sensor_Setting_Value;
- *(pSetting_Status+6) = Appli_Sensor_SettingSet[i].Sensor_Setting_Value >> 8;
+ /* change delta to percentage change (of 0.01 % steps) */
+ delta = (MOBLEUINT32)((delta*10000)/pSensorInitParams->valuesRange);
}
else
{
-
+ triggerStatus = 0;
}
}
- }
- return MOBLE_RESULT_SUCCESS;
+ if ((statusTriggerDelta == STATUS_TRIGGER_DELTA_DOWN && delta >= deltaDown) ||
+ (statusTriggerDelta == STATUS_TRIGGER_DELTA_UP && delta >= deltaUp))
+ {
+ triggerStatus = 1;
+ }
+ else
+ {
+ triggerStatus = 0;
+ }
+ }
+
+ return triggerStatus;
}
+
+
+/**
+* @brief Initialize hardware interfaces for sensors and mesh sensor model structures
+* Sensor init parameters to be defined in sensor_cfg_usr.h
+* Sensors are initialized in the order as defined in sensor_cfg_usr.h
+ * LPS25HB supports pressure and temperature sensor
+* @param void
+ * @retval
+ */
+MOBLE_RESULT Appli_Sensor_Init(void)
+ {
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+// PRESSURE_StatusTypeDef lps25Status;
+
+ /* Hardware interface initialization */
+#ifndef CUSTOM_BOARD_PWM_SELECTION
+// PRESSURE_StatusTypeDef tempStatus;
+// PRESSURE_StatusTypeDef pressStatus;
+// int16_t temperature;
+// int32_t pressure;
+
+#if 0
+ /* Initiallization of sensors */
+ lps25Status = LPS25HB_Init((PRESSURE_InitTypeDef*)(&Lps25InitParams));
+
+ if (lps25Status != PRESSURE_OK)
+ {
+ TRACE_M(TF_SENSOR, "Error initializing LPS25HB. status (%d)\r\n", lps25Status);
+ }
+
+ tempStatus = LPS25HB_I2C_ReadRawTemperature(&temperature);
+ pressStatus = LPS25HB_I2C_ReadRawPressure(&pressure);
+ if (tempStatus == PRESSURE_OK &&
+ pressStatus == PRESSURE_OK)
+ {
+ /* TRACE_M(TF_SENSOR, "Raw temperature (%d) and raw pressure (%d)\r\n",
+ temperature, pressure); */
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR, "Error reading LPS25HB at init\r\n");
+ }
+#endif
+
+#else
+ TRACE_M(TF_SENSOR, "LPS25HB not initialized\r\n");
#endif
+ /* initialize sensor server model */
+ result = SensorServer_Init(&BufferSensorServer,
+ &AppliSensor_cb,
+ TOTAL_SENSOR_SERVER_BUFF_SIZE,
+ &SensorServerInitParams);
+
+ if(MOBLE_FAILED(result))
+ {
+ TRACE_M(TF_SENSOR, "Sensor Server init failed\r\n");
+ }
+
+ return result;
+ }
+
+
/**
-* @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)
+ * @brief Handling of serial inputs to sensor model
+ * @param Sensor offset in sensor init structure
+ * @param Sensor value
+ * @retval void
+ */
+MOBLE_RESULT Appli_Sensor_Update(MOBLEUINT8 sensorOffset, MOBLEUINT32 value)
{
- MOBLE_RESULT result = MOBLE_RESULT_FALSE;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ AppliSensorReadFromSensor = 1;
+
+ /* Update previous with current and current with new */
+ PreviousTemperatureValue = PresentTemperatureValue;
+ PresentTemperatureValue = (MOBLEUINT8)value;
- for(MOBLEUINT8 i=0; i<NUMBER_OF_SENSOR; i++)
+ /* To update cadence parameters
+ results in either status trigger or (and) fast cadence based on change and present
+ Application may decide not to update cadence parameters if senosr value is changing
+ very frequently in some cases to save bandwidth */
+ if (PresentTemperatureValue != PreviousTemperatureValue)
{
- if(prop_ID_Table[i].Property_ID == prop_ID)
- {
- result = MOBLE_RESULT_SUCCESS;
- break;
- }
- }
+ result = Sensor_UpdateCadence(sensorOffset,
+ SensorServerInitParams.sensorInitParams[0].elementIdx,
+ SensorServerInitParams.sensorInitParams[0].propertyId);
+ }
return result;
-}
+ }
+
/**
-* @brief Appli_Sensor_Init: This function is callback for Initialisation of
-* Application interface
-* @param void
-* @retval MOBLE_RESULT
-*/
-MOBLE_RESULT Appli_Sensor_Init(void)
+ * @brief Handling of serial inputs to sensor model
+ * Appli_Sensor_SerialCmd can be used for testing periodic publishing and
+ * triggered publishing with PTS
+ * @param serial string
+ * @param serial string size
+ * @retval void
+ */
+void Appli_Sensor_SerialCmd(char *rcvdStringBuff, uint16_t rcvdStringSize)
{
-#if 0
- LPS25HB_Init(&InitStructure);
-#endif
- return MOBLE_RESULT_SUCCESS;
+ MOBLE_RESULT result = MOBLE_RESULT_INVALIDARG;
+ MOBLEUINT16 value = 0;
+ MOBLEUINT8 sensorOffset = 0;
+
+ if (!strncmp(rcvdStringBuff+6, "SETV", 4))
+ {
+ if (rcvdStringSize == 15)
+ {
+ sscanf(rcvdStringBuff+11, "%4hx", &value);
+
+ /* Set SENSOR1 value at offset 0 */
+ result = Appli_Sensor_Update(sensorOffset, value);
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ BLEMesh_PrintStringCb("Invalid size of string\r\n");
+ }
+ }
+ else if (!strncmp(rcvdStringBuff+6, "PUBLISH", 7))
+ {
+ if (rcvdStringSize == 17)
+ {
+ sscanf(rcvdStringBuff+14, "%1hx", &value);
+
+ sensorOffset = value;
+
+ sscanf(rcvdStringBuff+16, "%1hx", &value);
+
+ /* Enable / Disable publishing of sensor as identified by sensor offset */
+ if(value == 0) /* Disable */
+ {
+ result = Sensor_UpdatePublishState(sensorOffset, 0);
+ }
+ else /* Enable */
+ {
+ result = Sensor_UpdatePublishState(sensorOffset, 1);
+ }
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ BLEMesh_PrintStringCb("Invalid size of string\r\n");
+ }
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ /* Check the result of command processing */
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ BLEMesh_PrintStringCb("Success\r\n");
+ }
+ else if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ BLEMesh_PrintStringCb("Fail Out of memory\r\n");
+ }
+ else if(result == MOBLE_RESULT_INVALIDARG)
+ {
+ BLEMesh_PrintStringCb("Fail Invalid Argument\r\n");
+ }
+ else
+ {
+ BLEMesh_PrintStringCb("Fail\r\n");
+ }
}
@@ -898,5 +1027,5 @@ MOBLE_RESULT Appli_Sensor_Init(void)
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 5e94fc344..613d14df5 100644
--- 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
@@ -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
@@ -23,118 +23,118 @@
/* 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;
- MOBLEUINT8 FastCadenceLow;
- MOBLEUINT8 FastCadenceHigh;
- // float FastCadenceLow;
-// float FastCadenceHigh;
-}Sensor_CadenceSet_t;
-
-typedef struct
-{
- MOBLEUINT16 Property_ID;
- MOBLEUINT16 RawValueX;
- MOBLEUINT16 RawValueWidth;
- MOBLEUINT16 RawValueY;
-}Sensor_Column_param_t;
-
-/* Sensor Series */
-struct Sensor_SeriesData
-{
- MOBLEUINT16 RawValueX;
- MOBLEUINT16 RawColumnWidth;
- MOBLEUINT16 RawValueY;
-};
-
-typedef struct
-{
- MOBLEUINT16 Property_ID;
- struct Sensor_SeriesData SeriesData[SENSOR_SERIES_VALUE];
-}Sensor_Series_param_t ;
-
-#pragma pack(4)
-
-MOBLE_RESULT Appli_Sensor_Cadence_Set(Sensor_CadenceParam_t* pCadence_param,
- MOBLEUINT16 property_ID,
- MOBLEUINT32 length);
-MOBLE_RESULT Appli_Sensor_Cadence_Get(MOBLEUINT8* sensor_DataCadence,
- 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,
- MOBLEUINT16 prop_ID,
- MOBLEUINT32 length);
-MOBLE_RESULT Appli_Sensor_Setting_Set(Sensor_SettingParam_t* pSensor_SettingParam,
- MOBLEUINT8 OptionalValid,
- MOBLEUINT16 prop_ID);
-MOBLE_RESULT Appli_Sensor_Series_Status(MOBLEUINT8* sensor_Series,
- MOBLEUINT32* pLength,
- MOBLEUINT16 prop_ID,
- MOBLEUINT32 length);
-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,
- MOBLEUINT16 prop_ID);
+#include "sensors.h"
+#include "mesh_cfg.h"
+
+/* Exported functions ------------------------------------------------------- */
+void Appli_Sensor_CadenceGet(sensor_CadenceCbParam_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_CadenceSet(sensor_CadenceCbParam_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_CadenceSetUnack(sensor_CadenceCbParam_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_SettingsGet(sensor_SettingsCbParams_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_SettingGet(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_SettingSet(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_SettingSetUnack(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_DescriptorGet(MOBLEUINT8 pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Get (MOBLEUINT16 prop_ID,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_ColumnGet(sensor_ColumnCbParams_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_SeriesGet(sensor_SeriesCbParams_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Sensor_ReadDescriptor(MOBLEUINT8 sensorOffset,
+ sensor_DescriptorCbParams_t* pDescriptorParams);
+MOBLE_RESULT Appli_Sensor_ReadValue(MOBLEUINT8 sensorOffset,
+ sensor_ValueCbParams_t* pValueParams);
+MOBLE_RESULT Appli_Sensor_ReadColumn(MOBLEUINT8 sensorOffset,
+ MOBLEUINT8 columnOffset,
+ sensor_ColumnCbParams_t* pColumnParams);
+MOBLE_RESULT Appli_Sensor_ReadSeries(MOBLEUINT8 sensorOffset,
+ sensor_SeriesCbParams_t* pSeriesParams);
+MOBLEUINT8 Appli_Sensor_IsFastCadence(MOBLEUINT8 sensorOffset,
+ void* pFastCadenceLow,
+ void* pFastCadenceHigh);
+MOBLEUINT8 Appli_Sensor_IsStatusTrigger(MOBLEUINT8 sensorOffset,
+ status_trigger_type_e triggerType,
+ void* pDeltaDown,
+ void* pDeltaUp);
MOBLE_RESULT Appli_Sensor_Init(void);
-void Sensor_Process(void);
-void Sensor_LC_Light_Publish(void);
-
+//void Appli_Sensor_SerialCmd(char *rcvdStringBuff, uint16_t rcvdStringSize);
+MOBLE_RESULT Appli_Sensor_Update(MOBLEUINT8 sensorOffset, MOBLEUINT32 value);
+
+void Appli_Sensor_Descriptor_Status(const MOBLEUINT8 *pDescriptor,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Cadence_Status(const MOBLEUINT8 *pCadence,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Settings_Status(const MOBLEUINT8 *pSettings,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Setting_Status(const MOBLEUINT8 *pSetting,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Status(const MOBLEUINT8 *pStatus,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Column_Status(const MOBLEUINT8 *pColumn,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Series_Status(const MOBLEUINT8 *pSeries,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Sensor_Update(MOBLEUINT8 sensorOffset,
+ MOBLEUINT32 value);
+void Appli_Sensor_SerialCmd(char *rcvdStringBuff,
+ uint16_t rcvdStringSize);
#endif /* __APPLI_SENSOR_H */
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensors_client.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensors_client.c
new file mode 100644
index 000000000..aecf584d4
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensors_client.c
@@ -0,0 +1,153 @@
+/**
+******************************************************************************
+* @file appli_sensors_client.c
+* @author BLE Mesh Team
+* @brief Application interface for Generic Mesh Models
+******************************************************************************
+* @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 "hal_common.h"
+#include "types.h"
+#include "appli_sensor.h"
+#include "appli_light.h"
+#include "common.h"
+#include "mesh_cfg_usr.h"
+#include "appli_nvm.h"
+#include "appli_mesh.h"
+#include "sensors_client.h"
+#include "appli_sensors_client.h"
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+
+
+/* Private functions ---------------------------------------------------------*/
+/**
+* @brief Appli_SensorsClient_API: This function is a Wrapper to call Sensors Client API depending on opcode received in input
+* @param elementIndex: Index of the element
+* @param msg_opcode: opcode of the desired API
+* @param msg_params: buffer containing the desired API parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_SensorsClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8 *msg_params)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+ switch(msg_opcode){
+/******************************************************************************/
+#ifdef ENABLE_SENSOR_MODEL_CLIENT
+/******************************************************************************/
+ case SENSOR_DESCRIPTOR_GET:
+ {
+ result = SensorsClient_Descriptor_Get(elementIndex, msg_params);
+ break;
+ }
+ case SENSOR_CADENCE_GET:
+ {
+ result = SensorsClient_Cadence_Get(elementIndex, msg_params);
+ break;
+ }
+ case SENSOR_CADENCE_SET:
+ {
+ //TODO: Set dynamic data size depending on Sensor DATA LENTGH: length = 4 + 4 + 2* SensorDataLength
+ result = SensorsClient_Cadence_Set(elementIndex,
+ msg_params,
+ 10); //(sizeof(sensor_CadenceCbParam_t)-3));
+ break;
+ }
+ case SENSOR_CADENCE_SET_UNACK:
+ {
+ //TODO: Set dynamic data size depending on Sensor DATA LENTGH: length = 4 + 4 + 2 * SensorDataLength
+ result = SensorsClient_Cadence_Set_Unack(elementIndex,
+ msg_params,
+ 10); //(sizeof(sensor_CadenceCbParam_t)-3));
+ break;
+ }
+ case SENSOR_SETTINGS_GET:
+ {
+ result = SensorsClient_Settings_Get(elementIndex, msg_params);
+ break;
+ }
+
+ case SENSOR_SETTING_GET:
+ {
+ result = SensorsClient_Setting_Get(elementIndex, msg_params, sizeof(sensor_SettingsCbParams_t));
+ break;
+ }
+ case SENSOR_SETTING_SET:
+ {
+ //TODO: Set dynamic data size depending on Sensor DATA LENTGH: length = 4 + SensorDataLength
+ result = SensorsClient_Setting_Set(elementIndex,
+ msg_params,
+ 6);
+ break;
+ }
+ case SENSOR_SETTING_SET_UNACK:
+ {
+ //TODO: Set dynamic data size depending on Sensor DATA LENTGH: length = 4 + SensorDataLength
+ result = SensorsClient_Setting_Set_Unack(elementIndex,
+ msg_params,
+ 6);
+ break;
+ }
+ case SENSOR_GET:
+ {
+ result = SensorsClient_Get(elementIndex, msg_params);
+ break;
+ }
+ case SENSOR_COLUMN_GET:
+ {
+ result = SensorsClient_Column_Get(elementIndex, msg_params, 4);
+ break;
+ }
+ case SENSOR_SERIES_GET:
+ {
+ result = SensorsClient_Series_Get(elementIndex, msg_params, 4);
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_SENSOR_MODEL_CLIENT */
+/******************************************************************************/
+
+
+ default:
+ {
+ TRACE_M(TF_SENSOR, "OpCode value invalid %d \r\n", msg_opcode);
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+ return result;
+}
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensors_client.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensors_client.h
new file mode 100644
index 000000000..431b5c691
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/appli_sensors_client.h
@@ -0,0 +1,42 @@
+/**
+******************************************************************************
+* @file appli_sensor_client.h
+* @author BLE Mesh Team
+* @brief Application interface for Sensor Mesh Models
+******************************************************************************
+* @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 __APPLI_SENSOR_CLIENT_H
+#define __APPLI_SENSOR_CLIENT_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "sensors.h"
+#include "mesh_cfg.h"
+
+
+/* Exported macro ------------------------------------------------------------*/
+/* Exported variables ------------------------------------------------------- */
+/* Application Variable-------------------------------------------------------*/
+/* Exported Functions Prototypes ---------------------------------------------*/
+MOBLE_RESULT Appli_ConfigClient_Set(void);
+MOBLE_RESULT Appli_SensorsClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8 *msg_params);
+
+
+
+
+#endif /* __APPLI_SENSOR_CLIENT_H */
+
+/******************* (C) COPYRIGHT 2020 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
index 38004a61d..55a67d8a2 100644
--- 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
@@ -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
@@ -30,23 +30,34 @@
#include "mesh_cfg.h"
#include <string.h>
-
-/** @addtogroup MODEL_VENDOR
+/** @addtogroup ST_BLE_Mesh
* @{
*/
-/** @addtogroup Vendor_Model_Callbacks
+/** @addtogroup Application_Mesh_Models
* @{
*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
+typedef struct
+{
+ MOBLE_ADDRESS dst;
+ MOBLEUINT8 data[VENDOR_DATA_BUFFER_SIZE];
+ MOBLEUINT32 length;
+ MOBLEUINT8 elementIndex;
+} APPLI_SEND_BIG_DATA_PACKET;
+
/* Private variables ---------------------------------------------------------*/
-MOBLEUINT8 ResponseBuffer[VENDOR_DATA_BYTE];
+MOBLEUINT8 ResponseBuffer[VENDOR_DATA_BUFFER_SIZE];
MOBLEUINT16 BuffLength;
+APPLI_SEND_BIG_DATA_PACKET Appli_VendorBigData;
+
+/*Variable to enable OTA for received vendor command*/
extern MOBLEUINT8 Appli_LedState;
extern uint16_t DUTY;
+extern MOBLEUINT8 NumberOfElements;
MOBLEUINT32 TestHitCounter = 0;
extern Appli_LightPwmValue_t Appli_LightPwmValue;
@@ -268,18 +279,17 @@ MOBLE_RESULT Appli_Vendor_Test(MOBLEUINT8 const *data, MOBLEUINT32 length)
* @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
+* @param elementIndex : selected element where '0' is first element
* @retval MOBLE_RESULT status of result
*/
MOBLE_RESULT Appli_Vendor_LEDControl( MOBLEUINT8 const *data, MOBLEUINT32 length,
- MOBLEUINT8 elementNumber , MOBLE_ADDRESS dst_peer)
+ MOBLEUINT8 elementIndex , 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,"#03-%02hx!\n\r",data[0]);
switch(subCommand)
@@ -291,139 +301,102 @@ MOBLE_RESULT Appli_Vendor_LEDControl( MOBLEUINT8 const *data, MOBLEUINT32 length
*/
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 Need to write the commands as per the element selected*/
+
+ TRACE_M(TF_VENDOR,"Appli_LED_Control callback received for elementIndex %d \r\n", elementIndex);
+ Appli_LedState = *(data+1); /* Toggle the state of the Blue LED */
+ if( Appli_LedState == 1)
{
- /* user application code */
+ BSP_LED_On(LED_BLUE);
}
- else if(elementNumber == THIRD_ELEMENT)
+ else
{
- /* user application code */
- }
+ BSP_LED_Off(LED_BLUE);
+ }
break;
}
/* Toggle Command */
case APPLI_CMD_TOGGLE:
{
- if(elementNumber == FIRST_ELEMENT)
+ /*User Need to write the commands as per the element selected*/
+
+ TRACE_M(TF_VENDOR,"Appli_LED_Toggle callback received for elementIndex %d \r\n", elementIndex);
+ if(Appli_LedState == 1)
{
- if(Appli_LedState == 1)
- {
- Appli_LightPwmValue.IntensityValue = LED_OFF_VALUE;
+ 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) */
+ 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) */
+ 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 */
+ Appli_LedState = 0;
+ BSP_LED_Off(LED_BLUE);
}
- else if(elementNumber == THIRD_ELEMENT)
+ else
{
- /* user application code */
+ Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ Appli_LedState = 1;
+ BSP_LED_On(LED_BLUE);
}
+
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 */
- }
+ /*User Need to write the commands as per the element selected*/
+
+ TRACE_M(TF_VENDOR,"Appli_LED_ON callback received for elementIndex %d \r\n", elementIndex);
+ 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;
+
break;
}
/* Off Command */
case APPLI_CMD_OFF:
{
- if(elementNumber == FIRST_ELEMENT)
- {
- Appli_LightPwmValue.IntensityValue = LED_OFF_VALUE;
+ /*User Need to write the commands as per the element selected*/
+
+ TRACE_M(TF_VENDOR,"Appli_LED_OFF callback received for elementIndex %d \r\n", elementIndex);
+ 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) */
+ 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) */
+ 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 */
- }
+ Appli_LedState = 0;
+ BSP_LED_Off(LED_BLUE);
break;
}
/* intensity command */
case APPLI_CMD_LED_INTENSITY:
{
- if(elementNumber == FIRST_ELEMENT)
- {
- intensityValue = data[2] << 8;
- intensityValue |= data[1];
+ /*User Need to write the commands as per the element selected*/
+
+ TRACE_M(TF_VENDOR,"Appli_LED_Intensity callback received for elementIndex %d \r\n", elementIndex);
+ 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)
+ duty = PwmValueMapping(intensityValue , 0x7FFF ,0);
+ Appli_LightPwmValue.IntensityValue = duty;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ if(duty > 16000)
{
- /* user application code */
+ BSP_LED_On(LED_BLUE);
}
- else if(elementNumber == THIRD_ELEMENT)
+ else
{
- /* user application code */
+ BSP_LED_Off(LED_BLUE);
}
- break;
- }
+ break;
+ }
/* Default case - Not valid command */
default:
{
@@ -457,26 +430,32 @@ MOBLE_RESULT Appli_Vendor_LEDControl( MOBLEUINT8 const *data, MOBLEUINT32 length
*/
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,"#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;
+ MOBLE_RESULT status = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 subCmd = data[0];
+ /*First Byte is sending the Sub Command*/
+ ResponseBuffer[0]=subCmd;
+
+ TRACE_M(TF_VENDOR, "#0E-%02hx %02lx! \n\r",data[0], length);
+ for(MOBLEUINT16 i=0; i<length; i++)
+ {
+ TRACE_I(TF_VENDOR,"%02hx ",data[i]);
+ }
+ TRACE_I(TF_VENDOR,"\n\r");
+ switch(subCmd)
+ {
+ case APPLI_STRING_WRITE:
+ {
+ memcpy(&ResponseBuffer,data,length);
+ BuffLength = length;
+ break;
+ }
+ default:
+ {
+ status = MOBLE_RESULT_FALSE;
+ break;
+ }
+ }
+ return status;
}
/**
@@ -494,6 +473,58 @@ void Appli_GetTestValue (MOBLEUINT8 *responseValue)
TestHitCounter = 0;
}
/**
+* @brief Process the Vendor LED Control Command
+* @param data: Pointer to the data received from peer_addr
+* @param length: Length of the data
+* @param elementIndex : selected element where '0' is first element
+* @param dst_peer : Destination address
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_Vendor_SetBigDataPacket(MOBLEUINT8 *data, MOBLEUINT32 length,
+ MOBLEUINT8 elementIndex , MOBLE_ADDRESS dst_peer)
+{
+ MOBLE_RESULT status = MOBLE_RESULT_SUCCESS;
+
+ if (length > VENDOR_DATA_BUFFER_SIZE)
+ {
+ status = MOBLE_RESULT_INVALIDARG;
+ }
+ memmove(Appli_VendorBigData.data, data, length);
+ Appli_VendorBigData.dst = dst_peer;
+ Appli_VendorBigData.length = length;
+ Appli_VendorBigData.elementIndex = elementIndex;
+ return status;
+}
+/**
+* @brief Send Vendor big data packet
+* @param void
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_Vendor_SendBigDataPacket(void)
+{
+ MOBLE_RESULT status = MOBLE_RESULT_SUCCESS;
+
+ if(BLEMesh_TrsptIsBusyState())
+ {
+ BSP_LED_On(LED_BLUE);
+ status = MOBLE_RESULT_FALSE;
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+ status = BLEMesh_SetRemoteData(Appli_VendorBigData.dst,
+ Appli_VendorBigData.elementIndex,
+ 0x000E,
+ Appli_VendorBigData.data,
+ Appli_VendorBigData.length,
+ MOBLE_FALSE,
+ MOBLE_TRUE);
+
+ }
+ return status;
+}
+
+/**
* @}
*/
@@ -501,5 +532,5 @@ void Appli_GetTestValue (MOBLEUINT8 *responseValue)
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 2b9390099..8b8e60aa6 100644
--- 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
@@ -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
@@ -36,8 +36,10 @@ 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);
-
+MOBLE_RESULT Appli_Vendor_SendBigDataPacket(void);
+MOBLE_RESULT Appli_Vendor_SetBigDataPacket(MOBLEUINT8 *data, MOBLEUINT32 length,
+ MOBLEUINT8 elementIndex , MOBLE_ADDRESS dst_peer);
#endif /* __APPLI_VENDOR_H */
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 730c40219..704a08d80 100644
--- 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
@@ -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
@@ -44,12 +44,10 @@
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****/
+/******************* (C) COPYRIGHT 2020 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
deleted file mode 100644
index d668eae80..000000000
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/mesh_cfg.h
+++ /dev/null
@@ -1,273 +0,0 @@
-/**
- ******************************************************************************
- * @file mesh_cfg.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_H
-#define __MESH_CFG_H
-
-/* Includes ------------------------------------------------------------------*/
-#include "mesh_cfg_usr.h"
-#include "app_conf.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
-
-/*
-* TRACE_M includes function name and clock
-*/
-void TraceHeader(const char* func_name, int mode);
-#define TraceB0(func_name, ...)
-#if ( CFG_DEBUG_TRACE != 0 )
-#define TraceB1(func_name, ...) do {TraceHeader(func_name, 0); printf( __VA_ARGS__);} while(0)
-#else
-#define TraceB1(func_name, ...)
-#endif
-#define TraceBX(flags, func_name, ...) TraceB ##flags(func_name, ##__VA_ARGS__)
-#define TRACE_M(flag, ...) TraceBX(flag, __func__, ##__VA_ARGS__)
-
-/*
-* TRACE_I does not include function name and clock
-*/
-#define TraceC0(...)
-#if ( CFG_DEBUG_TRACE != 0 )
-#define TraceC1(...) do { printf( __VA_ARGS__);} while(0)
-#else
-#define TraceC1(...)
-#endif
-//#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 DEVICE_NAME_PARAMS \
-{ \
- DEVICE_NAME_SIZE, \
- Device_Name \
-}
-
-#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 device_name_params_t DeviceNameParams;
-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
index 54bbc4966..a0c240594 100644
--- 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
@@ -3,11 +3,11 @@
******************************************************************************
* @file mesh_cfg_usr.h
* @author BLE Mesh Team
- * @brief Header file for mesh_usr_cfg.c
+ * @brief user configurable settings
******************************************************************************
* @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,6 +34,42 @@
*/
#define ENABLE_LOW_POWER_FEATURE
+/*
+* 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_NO_OOB
+//#define ENABLE_AUTH_TYPE_STATIC_OOB
+//#define ENABLE_AUTH_TYPE_OUTPUT_OOB
+//#define ENABLE_AUTH_TYPE_INPUT_OOB
+
+/* Static OOB Configurations */
+#define STATIC_OOB_SIZE 16U
+
+/* Output OOB Configurations */
+#define OUTPUT_OOB_SIZE 1U
+#define OUTPUT_OOB_ACTION OUTPUT_OOB_ACTION_BIT_BLINK
+
+/* Input OOB Configurations */
+#define INPUT_OOB_SIZE 1U
+#define INPUT_OOB_ACTION INPUT_OOB_ACTION_BIT_PUSH
+
+/******************************************************************************/
+/* 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_SIG_MODELS_AT_COMMANDS 1
+#define ENABLE_VENDOR_MODELS_AT_COMMANDS 0
+#define ENABLE_UT 1
+
/* Macros Used for user defined serial print data for models.
Either use 0 to disable or 1 to enable
@ TF_GENERIC -> Generic server
@@ -81,6 +117,7 @@ Either use 0 to disable or 1 to enable
#define TF_GENERIC_M 0
#define TF_GENERIC_CLIENT_M 0
#define TF_SENSOR_M 0
+#define TF_SENSOR_CLIENT_M 0
#define TF_LIGHT_M 0
#define TF_LIGHT_CLIENT_M 0
#define TF_LIGHT_LC_M 0
@@ -90,6 +127,7 @@ Either use 0 to disable or 1 to enable
#define TF_MEMORY 0
#define TF_BEACON 0
#define TF_SERIAL_CTRL 0
+#define TF_VENDOR_APPLI_TEST 0 /* Vendor commands testing */
/*******************************************************************************
*** Following section helps to define Device Name during Provisioning *********
@@ -112,12 +150,11 @@ Either use 0 to disable or 1 to enable
/* Define the following Macros to enable the usage of the Server Generic Models */
#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
+//#define ENABLE_GENERIC_MODEL_SERVER_LEVEL (1)
+//#define ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF (1)
+//#define ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF_SETUP (1)
+//#define ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME (1)
-/* 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_GENERIC_MODEL_CLIENT_POWER_ONOFF (1)
@@ -148,14 +185,14 @@ Either use 0 to disable or 1 to enable
/******************************************************************************/
#define ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS (1)
-//#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
+//#define ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP (1)
+//#define ENABLE_LIGHT_MODEL_SERVER_CTL (1)
+//#define ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP (1)
+//#define ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE (1)
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL (1)
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP (1)
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL_HUE (1)
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION (1)
//#define ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS (1)
//#define ENABLE_LIGHT_MODEL_CLIENT_CTL (1)
@@ -164,8 +201,7 @@ Either use 0 to disable or 1 to enable
/*
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 ENABLE_LIGHT_MODEL_SERVER_LC (1)
//#define ENABLE_LIGHT_MODEL_CLIENT_LC (1)
@@ -177,8 +213,7 @@ Either use 0 to disable or 1 to enable
/* 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 (1)
//#define ENABLE_SENSOR_MODEL_CLIENT (1)
@@ -203,29 +238,23 @@ 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 (1)
#define GENERIC_SERVER_MODEL_PUBLISH
-/* Define the following Macros to enable the usage of the Client Generic Models */
-//#define ENABLE_CONFIG_MODEL_CLIENT (1)
-
/******************************************************************************/
/*
-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 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
-//#define ENABLE_MODEL_BINDING
-
/* Define the macros for the numbers of sensor present.*/
-#define NUMBER_OF_SENSOR 3
+//#define NUMBER_OF_SENSOR 1
//#define ENABLE_OCCUPANCY_SENSOR
/*
Macro is responsible for enabling and desabling the sensor publication.
@@ -237,7 +266,7 @@ Comment this macro to disable the publication
/* Maximum Time period value of PWM */
-#define PWM_TIME_PERIOD 31990U
+#define PWM_TIME_PERIOD 31990U
/******************************************************************************/
/***** MACROS for POWER ON-OFF CYCLE BASED UNPROVISIONING *********************/
@@ -249,11 +278,11 @@ Define the following Macro to check the Power-OnOff Cycles
*/
//#define ENABLE_UNPROVISIONING_BY_POWER_ONOFF_CYCLE
-#define POWER_ON_OFF_CYCLES_FOR_UNPROVISIONING 5
+#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 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
@@ -266,12 +295,16 @@ this should be avoided to ensure flash longevity
//#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.
+
+/* Macros defined for the number of bytes saved, number of bytes dedicated for ganeric
+ model and light model.
*/
-#define APP_NVM_GENERIC_MODEL_SIZE 16U
-#define APP_NVM_LIGHT_MODEL_SIZE 32U
-#define APP_NVM_MODEL_SIZE 50U
+#define APP_NVM_GENERIC_MODEL_SIZE 16U
+#define APP_NVM_LIGHT_MODEL_SIZE 48U/*32U*/
+#define APP_NVM_MODELDATA_PER_ELEMENT_SIZE (APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE)
+//#define APP_NVM_MODEL_SIZE 50U
+#define APP_NVM_MODEL_SIZE (APP_NVM_MODELDATA_PER_ELEMENT_SIZE * APPLICATION_NUMBER_OF_ELEMENTS)
+//#define APP_NVM_MODEL_ALL_ELEMENTS_SIZE
/*Macros are defined for the selection of the number of led and type of lighting
@@ -293,23 +326,15 @@ this should be avoided to ensure flash longevity
/* 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
+/* Max SIG Models per element */
+#define USER_SIG_MODELS_MAX_COUNT 17
+/* Max Vendor Models per element */
+#define USER_VENDOR_MODELS_MAX_COUNT 1
/* Contains a 16-bit company identifier assigned by the Bluetooth SIG
@@ -360,43 +385,6 @@ For STMicroelectronics : it is 0x0030 */
/*
-* 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
*/
@@ -577,100 +565,6 @@ For STMicroelectronics : it is 0x0030 */
#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_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
-
-#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 ---------------------------------------------*/
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
index ce2370722..58846f4c5 100644
--- 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
@@ -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
@@ -42,7 +42,9 @@
#include "config_client.h"
#include "generic_client.h"
#include "light_client.h"
+#include "sensors_client.h"
#include "appli_light_client.h"
+#include "appli_sensors_client.h"
/** @addtogroup ST_BLE_Mesh
* @{
@@ -59,6 +61,9 @@ typedef struct
MOBLE_ADDRESS peer;
MOBLE_ADDRESS dst;
MOBLEUINT8 command;
+ MOBLEUINT8 elementIndex;
+ MOBLEUINT8 appKeyOffset;
+ MOBLEUINT8 netKeyOffset;
MOBLEUINT8 data[DATA_BUFFER_LENGTH]; /* 8-Bytes response packet */
MOBLEUINT32 length;
} APPLI_SEND_RESPONSE_MODULE;
@@ -78,18 +83,48 @@ typedef struct
/* Private variables ---------------------------------------------------------*/
+MOBLEUINT8 Led_Value = 0;
+
+MOBLEUINT8 ButtonIndex_Value = 0;
+
APPLI_PENDING_PACKETS Appli_PendingPackets = {0};
-__attribute__((aligned(4)))
-const MOBLE_VENDOR_CB_MAP vendor_cb =
+MOBLEUINT8 pGeneric_OnOffParam[sizeof(Generic_OnOffParam_t)];
+MOBLEUINT8 pGeneric_LevelParam[sizeof(Generic_LevelParam_t)];
+MOBLEUINT8 pGeneric_DeltaLevelParam[sizeof(Generic_DeltaLevelParam_t)];
+MOBLEUINT8 pGeneric_MoveLevelParam[sizeof(Generic_LevelMoveParam_t)];
+MOBLEUINT8 pGeneric_PowerOnOffParam[sizeof(Generic_PowerOnOffParam_t)];
+MOBLEUINT8 pGeneric_DefaultTransitionTimeParam[sizeof(Generic_DefaultTransitionParam_t)];
+
+MOBLEUINT8 pLightnessParam[sizeof(Light_LightnessParam_t)];
+MOBLEUINT8 pLightnessRangeParam[sizeof(Light_LightnessRangeParam_t)];
+
+MOBLEUINT8 pLightCtlParam[sizeof(Light_CtlParam_t)];
+MOBLEUINT8 pLightCtlTemperatureParam[sizeof(Light_CtlTemperatureParam_t)];
+MOBLEUINT8 pLightCtlTemperatureRangeParam[sizeof(Light_CtlTemperatureRangeParam_t)];
+MOBLEUINT8 pLightCtlDefaultParam[sizeof(Light_CtlDefaultParam_t)];
+
+MOBLEUINT8 pLightHslParam[sizeof(Light_HslParam_t)];
+MOBLEUINT8 pLightHslRangeParam[sizeof(Light_HslRangeParam_t)];
+MOBLEUINT8 pLightHslHueParam[sizeof(Light_HslHueParam_t)];
+MOBLEUINT8 pLightHslSaturationParam[sizeof(Light_HslSaturationParam_t)];
+
+MOBLEUINT8 pLightLCModeParam[sizeof(Light_LC_ModeParam_t)];
+MOBLEUINT8 pLightLCOccupancyModeParam[sizeof(Light_LC_ModeParam_t)];
+MOBLEUINT8 pLightLCOnOffParam[sizeof(Light_LC_OnOffParam_t)];
+MOBLEUINT8 pLightLCPropertyParam[6];
+
+MOBLEUINT8 pSensorsCadenceParam[sizeof(sensor_CadenceCbParam_t)];
+MOBLEUINT8 pSensorsSettingParam[sizeof(sensor_SettingCbParams_t)];
+
+__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 =
+__attribute__((aligned(4)))const Appli_Vendor_cb_t VendorAppli_cb =
{
/*Vendor Commads*/
Appli_Vendor_LEDControl,
@@ -100,8 +135,7 @@ const Appli_Vendor_cb_t VendorAppli_cb =
Appli_Vendor_Data_write
};
-__attribute__((aligned(4)))
-const Appli_Generic_cb_t GenericAppli_cb =
+__attribute__((aligned(4)))const Appli_Generic_cb_t GenericAppli_cb =
{
/* Generic OnOff callbacks */
Appli_Generic_OnOff_Set,
@@ -124,8 +158,7 @@ const Appli_Generic_cb_t GenericAppli_cb =
Appli_Generic_DefaultTransitionTime_Status
};
-__attribute__((aligned(4)))
-const Appli_Generic_State_cb_t Appli_GenericState_cb =
+__attribute__((aligned(4)))const Appli_Generic_State_cb_t Appli_GenericState_cb =
{
/* Generic Get On Off status */
@@ -139,8 +172,7 @@ const Appli_Generic_State_cb_t Appli_GenericState_cb =
Appli_Generic_GetDefaultTransitionStatus
};
-__attribute__((aligned(4)))
-const Appli_Light_GetStatus_cb_t Appli_Light_GetStatus_cb =
+__attribute__((aligned(4)))const Appli_Light_GetStatus_cb_t Appli_Light_GetStatus_cb =
{
Appli_Light_GetLightnessStatus,
Appli_Light_GetLightnessLinearStatus,
@@ -148,10 +180,12 @@ const Appli_Light_GetStatus_cb_t Appli_Light_GetStatus_cb =
Appli_Light_GetLightnessLastStatus,
Appli_Light_GetLightnessRangeStatus,
Appli_Light_GetCtlLightStatus,
+ Appli_Light_GetCtlTargetStatus,
Appli_Light_GetCtlTemperatureStatus,
Appli_Light_GetCtlTemperatureRange,
Appli_Light_GetCtlDefaultStatus,
Appli_Light_GetHslStatus,
+ Appli_Light_GetHslTargetStatus,
Appli_Light_GetHslHueStatus,
Appli_Light_GetHslSaturationStatus,
Appli_Light_GetHslHueRange,
@@ -160,8 +194,7 @@ const Appli_Light_GetStatus_cb_t Appli_Light_GetStatus_cb =
};
-__attribute__((aligned(4)))
-const Appli_Light_cb_t LightAppli_cb =
+__attribute__((aligned(4)))const Appli_Light_cb_t LightAppli_cb =
{
/* Light Lightness callbacks */
Appli_Light_Lightness_Set,
@@ -173,6 +206,9 @@ const Appli_Light_cb_t LightAppli_cb =
Appli_Light_Lightness_Default_Set,
Appli_Light_Lightness_Default_Status,
+ Appli_Light_Lightness_Last_Set,
+ Appli_Light_Lightness_Last_Status,
+
Appli_Light_Lightness_Range_Set,
Appli_Light_Lightness_Range_Status,
@@ -205,17 +241,19 @@ const Appli_Light_cb_t LightAppli_cb =
};
-__attribute__((aligned(4)))
-const Appli_Light_Ctrl_cb_t LightLCAppli_cb =
+#if 0
+__attribute__((aligned(4)))const Appli_Light_Ctrl_cb_t LightLCAppli_cb =
{
/* Light LC mode set callbacks */
Appli_LightLC_Mode_Set,
+ Appli_LightLC_Mode_Status,
Appli_LightLC_OM_Set,
+ Appli_LightLC_OM_Status,
Appli_LightLC_OnOff_Set,
+ Appli_LightLC_OnOff_Status,
};
-__attribute__((aligned(4)))
-const Appli_LightLC_GetStatus_cb_t Appli_LightLC_GetStatus_cb =
+__attribute__((aligned(4)))const Appli_LightLC_GetStatus_cb_t Appli_LightLC_GetStatus_cb =
{
Appli_LightLC_Get_ModeStatus,
Appli_LightLC_Get_OMModeStatus,
@@ -223,33 +261,44 @@ const Appli_LightLC_GetStatus_cb_t Appli_LightLC_GetStatus_cb =
Appli_LightLC_Get_AmbientLuxLevelOutput,
Appli_Light_LC_PIRegulatorOutput,
};
+#endif
-#ifdef ENABLE_SENSOR_MODEL_SERVER
-
-__attribute__((aligned(4)))
-const Appli_Sensor_cb_t SensorAppli_cb =
+__attribute__((aligned(4)))const sensor_server_cb_t SensorAppli_cb =
{
- /* Sensor Model callbacks */
- Appli_Sensor_Cadence_Set,
- Appli_Sensor_Data_Status,
- Appli_Sensor_Descriptor_Status ,
- Appli_Sensor_Setting_Set,
+ Appli_Sensor_CadenceGet,
+ Appli_Sensor_CadenceSet,
+ Appli_Sensor_CadenceSetUnack,
+ Appli_Sensor_SettingsGet,
+ Appli_Sensor_SettingGet,
+ Appli_Sensor_SettingSet,
+ Appli_Sensor_SettingSetUnack,
+ Appli_Sensor_DescriptorGet,
+ Appli_Sensor_Get,
+ Appli_Sensor_ColumnGet,
+ Appli_Sensor_SeriesGet,
+ Appli_Sensor_ReadDescriptor,
+ Appli_Sensor_ReadValue,
+ Appli_Sensor_ReadColumn,
+ Appli_Sensor_ReadSeries,
+ Appli_Sensor_IsFastCadence,
+ Appli_Sensor_IsStatusTrigger,
+ Appli_Sensor_Descriptor_Status,
+ Appli_Sensor_Cadence_Status,
+ Appli_Sensor_Settings_Status,
+ Appli_Sensor_Setting_Status,
+ Appli_Sensor_Status,
Appli_Sensor_Column_Status,
Appli_Sensor_Series_Status
};
-__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 Appli_Sensor_GetStatus_cb_t Appli_Sensor_GetStatus_cb =
+//{
+// // Appli_Sensor_GetSettingStatus,
+// Appli_Sensor_GetSetting_IDStatus,
+//};
-__attribute__((aligned(4)))
-const MODEL_SIG_cb_t Model_SIG_cb[] =
+__attribute__((aligned(4)))const MODEL_SIG_cb_t Model_SIG_cb[] =
{
#ifdef ENABLE_GENERIC_MODEL_SERVER
{
@@ -266,6 +315,7 @@ const MODEL_SIG_cb_t Model_SIG_cb[] =
LightModelServer_ProcessMessageCb
},
#endif
+
#ifdef ENABLE_SENSOR_MODEL_SERVER
{
SensorModelServer_GetOpcodeTableCb,
@@ -273,6 +323,7 @@ const MODEL_SIG_cb_t Model_SIG_cb[] =
SensorModelServer_ProcessMessageCb
},
#endif
+
#ifdef ENABLE_TIME_SCENE_MODEL_SERVER
{
Time_SceneModelServer_GetOpcodeTableCb,
@@ -280,13 +331,15 @@ const MODEL_SIG_cb_t Model_SIG_cb[] =
Time_SceneModelServer_ProcessMessageCb
},
#endif
+
#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
{
- Light_LC_ModelServer_GetOpcodeTableCb,
- Light_LC_ModelServer_GetStatusRequestCb,
- Light_LC_ModelServer_ProcessMessageCb
+ LightLcServer_GetOpcodeTableCb,
+ LightLcServer_GetStatusRequestCb,
+ LightLcServer_ProcessMessageCb
},
#endif
+
#ifdef ENABLE_GENERIC_MODEL_CLIENT
{
GenericModelClient_GetOpcodeTableCb,
@@ -294,6 +347,7 @@ const MODEL_SIG_cb_t Model_SIG_cb[] =
GenericModelClient_ProcessMessageCb
},
#endif
+
#ifdef ENABLE_CONFIG_MODEL_CLIENT
{
ConfigClientModel_GetOpcodeTableCb,
@@ -309,15 +363,29 @@ const MODEL_SIG_cb_t Model_SIG_cb[] =
},
#endif
- { 0, 0,0 }
+#ifdef ENABLE_SENSOR_MODEL_CLIENT
+ {
+ SensorsModelClient_GetOpcodeTableCb,
+ SensorsModelClient_GetStatusRequestCb,
+ SensorsModelClient_ProcessMessageCb
+ },
+#endif
+
+ {
+ 0, 0, 0
+ }
};
__attribute__((aligned(4))) const APPLI_SAVE_MODEL_STATE_CB SaveModelState_cb = AppliNvm_SaveModelState;
+#if 0
+__attribute__((aligned(4))) const APPLI_SAVE_MODEL_TEST_STATE_CB SaveModelTestState_cb = AppliNVM_Save_FlashTesting;
+__attribute__((aligned(4))) const APPLI_RETRIEVE_MODEL_TEST_STATE_CB RetrieveModelTestState_cb = AppliNVM_Retrieve_FlashTesting;
+#endif
+
#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[] =
+__attribute__((aligned(4))) const MODEL_Vendor_cb_t Model_Vendor_cb[] =
{
#ifdef ENABLE_VENDOR_MODEL_SERVER
{
@@ -341,7 +409,7 @@ void GetApplicationVendorModels(const MODEL_Vendor_cb_t** pModelsTable, MOBLEUIN
*pModelsTable = Model_Vendor_cb ;
*VendorModelscount = MODEL_VENDOR_COUNT;
- TRACE_M(TF_VENDOR,"GetApplicationVendorModels \r\n");
+ TRACE_M(TF_VENDOR_M, "GetApplicationVendorModels \r\n");
}
/**
@@ -354,7 +422,7 @@ void BLEMesh_ModelsInit(void)
#ifdef ENABLE_SAVE_MODEL_STATE_NVM
- MOBLEUINT8 modelStateLoad_Size;
+ MOBLEUINT16 modelStateLoad_Size;
MOBLEUINT8 modelStateLoadBuff[APP_NVM_MODEL_SIZE];
#ifdef CLIENT
@@ -362,28 +430,39 @@ void BLEMesh_ModelsInit(void)
MOBLEUINT8 PrvnlStateLoadBuff[16];
#endif
+#if 0
+#ifdef ENABLE_NVM_TEST
+ /* Testing of flash code */
+ Device_FlashTesting();
+#endif
+#endif
+
+ /* Inintialise the light model range states with default values */
+ Light_ModelRangeInit();
+
/* 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);
+#if defined ENABLE_SENSOR_MODEL_SERVER && !defined CUSTOM_BOARD_PWM_SELECTION
+ /* Initialization of sensors */
+ Appli_Sensor_Init();
+#endif
+
+ Appli_Light_LCs_Init();
#endif
+ /* Load generic model states from nvm */
+ AppliNvm_LoadModelState(modelStateLoadBuff, &modelStateLoad_Size);
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
+#ifdef CLIENT
+ AppliPrvnNvm_LoadData(PrvnlStateLoadBuff,&PrvnStateLoad_Size);
+#endif
+
}
/**
@@ -418,7 +497,7 @@ void BLEMesh_ModelsProcess(void)
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
- Light_control_Process();
+ Light_LC_Process();
#endif
}
@@ -433,23 +512,498 @@ void BLEMesh_ModelsCommand(void)
Vendor_Publish(BLEMesh_GetAddress());
#endif
+#if defined(GENERIC_CLIENT_MODEL_PUBLISH) || defined(LIGHT_CLIENT_MODEL_PUBLISH)
+ Led_Value ^= APPLI_LED_ON;
+ pGeneric_OnOffParam[0] = Led_Value; // OnOff parameter byte 0 : The target value of the Generic Onoff state
+
+ pLightLCModeParam[0] = Led_Value;
+ pLightLCOccupancyModeParam[0] = Led_Value;
+ pLightLCOnOffParam[0] = Led_Value;
+
+ //This Switch-case allows to quickly set the different Models Messages parameters in order to demonstrate Client APIs functionning
+ switch (ButtonIndex_Value){
+ case 0:
+ ButtonIndex_Value=0x1;
+
+ pGeneric_LevelParam[0]= 0xE8; // Level parameter byte 0 : The target value of the Generic Level state
+ pGeneric_LevelParam[1]= 0x03; // Level parameter byte 1 : The target value of the Generic Level state
+
+ pGeneric_DeltaLevelParam[0]= 0xE8; // Delta Level parameter byte 0 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[1]= 0x03; // Delta Level parameter byte 1 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[2]= 0x00; // Delta Level parameter byte 2 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[3]= 0x00; // Delta Level parameter byte 3 : The Delta change of the Generic Level state
+
+ pGeneric_MoveLevelParam[0]= 0xE8; //Move Delta Level parameter byte 0 : The Delta Level step to calculate Move speed for the Generic Level state
+ pGeneric_MoveLevelParam[1]= 0x03; //Move Delta Level parameter byte 1 : The Delta Level step to calculate Move speed for the Generic Level state
+
+ pGeneric_DefaultTransitionTimeParam[0]=0x0F; //Transition time parameter byte 0 : The value of the Generic Default Transition Time state
+
+ pGeneric_PowerOnOffParam[0]=0x1; //OnPowerUp parameter byte 0 : The value of the Generic OnPowerUp state.
+
+ pLightnessParam[0] = 0xE8; //Lightness parameter byte 0 : The target value of the Light Lightness Actual/Linear/Default state
+ pLightnessParam[1] = 0x03; //Lightness parameter byte 1 : The target value of the Light Lightness Actual/Linear/Default state
+
+ pLightnessRangeParam[0] = 0xE8; //Lightness Range Min parameter byte 0 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[1] = 0x03; //Lightness Range Min parameter byte 1 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[2] = 0x88; //Lightness Range Max parameter byte 0 : The value of the Lightness Range Max field of the Light Lightness Range state
+ pLightnessRangeParam[3] = 0x13; //Lightness Range Max parameter byte 1 : The value of the Lightness Range Max field of the Light Lightness Range state
+
+ pLightCtlParam[0] = 0xE8; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness state
+ pLightCtlParam[1] = 0x03; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness state
+ pLightCtlParam[2] = 0xE8; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlParam[3] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlParam[4] = 0xE8; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlParam[5] = 0x03; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureParam[0] = 0xE8; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[1] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[2] = 0xE8; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlTemperatureParam[3] = 0x03; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureRangeParam[0] = 0xE8; //Temperature Range Min parameter byte 0 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[1] = 0x03; //Temperature Range Min parameter byte 1 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[2] = 0x88; //Temperature Range Max parameter byte 0 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[3] = 0x13; //Temperature Range Max parameter byte 1 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+
+ pLightCtlDefaultParam[0] = 0xE8; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[1] = 0x03; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[2] = 0xE8; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[3] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[4] = 0xE8; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV Default state
+ pLightCtlDefaultParam[5] = 0x03; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV Default state
+
+ pLightHslParam[0] = 0xE8; //HSL Lightness parameter byte 0 : The target value of the Light HSL Lightness state
+ pLightHslParam[1] = 0x03; //HSL Lightness parameter byte 1 : The target value of the Light HSL Lightness state
+ pLightHslParam[2] = 0xE8; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslParam[3] = 0x03; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+ pLightHslParam[4] = 0xE8; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslParam[5] = 0x03; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ pLightHslRangeParam[0] = 0xE8; //HSL Hue Range Min parameter byte 0 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[1] = 0x03; //HSL Hue Range Min parameter byte 1 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[2] = 0x88; //HSL Hue Range Max parameter byte 0 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[3] = 0x13; //HSL Hue Range Max parameter byte 1 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[4] = 0x88; //HSL Saturation Min parameter byte 0 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[5] = 0x13; //HSL Saturation Min parameter byte 1 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[6] = 0x70; //HSL Saturation Max parameter byte 0 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+ pLightHslRangeParam[7] = 0x17; //HSL Saturation Max parameter byte 1 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+
+ pLightHslHueParam[0] = 0xE8; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslHueParam[1] = 0x03; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+
+ pLightHslSaturationParam[0] = 0xE8; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslSaturationParam[1] = 0x03; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ //LIGHT_CONTROL_LUX_LEVEL_ON_ID : 0x202B
+ pLightLCPropertyParam[0]= 0x2B; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[1]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[2]= 0x44; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[3]= 0x44; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[4]= 0x44; // Property ID byte 2 : Property ID identifying a Light LC Property.
+ break;
+
+ case 1:
+ ButtonIndex_Value=0x2;
+
+ pGeneric_LevelParam[0]= 0xff; // Level parameter byte 0 : The target value of the Generic Level state
+ pGeneric_LevelParam[1]= 0x7f; // Level parameter byte 1 : The target value of the Generic Level state
+
+ pGeneric_DeltaLevelParam[0]= 0x10; // Delta Level parameter byte 0 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[1]= 0x27; // Delta Level parameter byte 1 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[2]= 0x00; // Delta Level parameter byte 2 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[3]= 0x00; // Delta Level parameter byte 3 : The Delta change of the Generic Level state
+
+ pGeneric_MoveLevelParam[0]= 0xff; //Move Delta Level parameter byte 0 : The Delta Level step to calculate Move speed for the Generic Level state
+ pGeneric_MoveLevelParam[1]= 0x7f; //Move Delta Level parameter byte 1 : The Delta Level step to calculate Move speed for the Generic Level state
+
+ pGeneric_DefaultTransitionTimeParam[0]=0x10; //Transition time parameter byte 0 : The value of the Generic Default Transition Time state
+
+ pGeneric_PowerOnOffParam[0]=0x2; //OnPowerUp parameter byte 0 : The value of the Generic OnPowerUp state.
+
+ pLightnessParam[0] = 0xff; //Lightness parameter byte 0 : The target value of the Light Lightness Actual/Linear/Default state
+ pLightnessParam[1] = 0xff; //Lightness parameter byte 1 : The target value of the Light Lightness Actual/Linear/Default state
+
+ pLightnessRangeParam[0] = 0x00; //Lightness Range Min parameter byte 0 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[1] = 0x00; //Lightness Range Min parameter byte 1 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[2] = 0xff; //Lightness Range Max parameter byte 0 : The value of the Lightness Range Max field of the Light Lightness Range state
+ pLightnessRangeParam[3] = 0xff; //Lightness Range Max parameter byte 1 : The value of the Lightness Range Max field of the Light Lightness Range state
+
+ pLightCtlParam[0] = 0xff; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness state
+ pLightCtlParam[1] = 0xff; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness state
+ pLightCtlParam[2] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlParam[3] = 0x4e; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlParam[4] = 0xff; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlParam[5] = 0x7f; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureParam[0] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[1] = 0x4e; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[2] = 0xff; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlTemperatureParam[3] = 0x7f; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureRangeParam[0] = 0x19; //Temperature Range Min parameter byte 0 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[1] = 0x4e; //Temperature Range Min parameter byte 1 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[2] = 0x20; //Temperature Range Max parameter byte 0 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[3] = 0x4e; //Temperature Range Max parameter byte 1 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+
+ pLightCtlDefaultParam[0] = 0xff; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[1] = 0xff; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[2] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[3] = 0x4e; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[4] = 0xff; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV Default state
+ pLightCtlDefaultParam[5] = 0x7f; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV Default state
+
+ pLightHslParam[0] = 0xff; //HSL Lightness parameter byte 0 : The target value of the Light HSL Lightness state
+ pLightHslParam[1] = 0xff; //HSL Lightness parameter byte 1 : The target value of the Light HSL Lightness state
+ pLightHslParam[2] = 0xee; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslParam[3] = 0xee; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+ pLightHslParam[4] = 0xdd; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslParam[5] = 0xdd; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ pLightHslRangeParam[0] = 0x00; //HSL Hue Range Min parameter byte 0 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[1] = 0xf0; //HSL Hue Range Min parameter byte 1 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[2] = 0xff; //HSL Hue Range Max parameter byte 0 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[3] = 0xff; //HSL Hue Range Max parameter byte 1 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[4] = 0x00; //HSL Saturation Min parameter byte 0 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[5] = 0xe0; //HSL Saturation Min parameter byte 1 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[6] = 0xff; //HSL Saturation Max parameter byte 0 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+ pLightHslRangeParam[7] = 0xef; //HSL Saturation Max parameter byte 1 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+
+ pLightHslHueParam[0] = 0xff; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslHueParam[1] = 0xff; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+
+ pLightHslSaturationParam[0] = 0xff; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslSaturationParam[1] = 0xff; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ //LIGHT_CONTROL_LUX_LEVEL_ON_ID : 0x202B
+ pLightLCPropertyParam[0]= 0x2B; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[1]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[2]= 0x01; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[3]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[4]= 0x10; // Property ID byte 2 : Property ID identifying a Light LC Property.
+ break;
+
+ case 2:
+ ButtonIndex_Value=0x0;
+
+ pGeneric_LevelParam[0]= 0x00; // Level parameter byte 0 : The target value of the Generic Level state
+ pGeneric_LevelParam[1]= 0x00; // Level parameter byte 1 : The target value of the Generic Level state
+
+ pGeneric_DeltaLevelParam[0]= 0x00; // Delta Level parameter byte 0 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[1]= 0x00; // Delta Level parameter byte 1 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[2]= 0x00; // Delta Level parameter byte 2 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[3]= 0x00; // Delta Level parameter byte 3 : The Delta change of the Generic Level state
+
+ pGeneric_MoveLevelParam[0]= 0x00; //Move Delta Level parameter byte 0 : The Delta Level step to calculate Move speed for the Generic Level state
+ pGeneric_MoveLevelParam[1]= 0x00; //Move Delta Level parameter byte 1 : The Delta Level step to calculate Move speed for the Generic Level state
+
+ pGeneric_DefaultTransitionTimeParam[0]=0x00; //Transition time parameter byte 0 : The value of the Generic Default Transition Time state
+
+ pGeneric_PowerOnOffParam[0]=0x0; //OnPowerUp parameter byte 0 : The value of the Generic OnPowerUp state.
+
+ pLightnessParam[0] = 0x00; //Lightness parameter byte 0 : The target value of the Light Lightness Actual/Linear/Default state
+ pLightnessParam[1] = 0x00; //Lightness parameter byte 1 : The target value of the Light Lightness Actual/Linear/Default state
+
+ pLightnessRangeParam[0] = 0x00; //Lightness Range Min parameter byte 0 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[1] = 0x00; //Lightness Range Min parameter byte 1 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[2] = 0x00; //Lightness Range Max parameter byte 0 : The value of the Lightness Range Max field of the Light Lightness Range state
+ pLightnessRangeParam[3] = 0x10; //Lightness Range Max parameter byte 1 : The value of the Lightness Range Max field of the Light Lightness Range state
+
+ pLightCtlParam[0] = 0x00; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness state
+ pLightCtlParam[1] = 0x00; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness state
+ pLightCtlParam[2] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlParam[3] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlParam[4] = 0x00; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlParam[5] = 0x00; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureParam[0] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[1] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[2] = 0x00; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlTemperatureParam[3] = 0x00; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureRangeParam[0] = 0x20; //Temperature Range Min parameter byte 0 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[1] = 0x03; //Temperature Range Min parameter byte 1 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[2] = 0x21; //Temperature Range Max parameter byte 0 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[3] = 0x03; //Temperature Range Max parameter byte 1 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+
+ pLightCtlDefaultParam[0] = 0x00; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[1] = 0x00; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[2] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[3] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[4] = 0x00; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV Default state
+ pLightCtlDefaultParam[5] = 0x00; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV Default state
+
+ pLightHslParam[0] = 0x00; //HSL Lightness parameter byte 0 : The target value of the Light HSL Lightness state
+ pLightHslParam[1] = 0x00; //HSL Lightness parameter byte 1 : The target value of the Light HSL Lightness state
+ pLightHslParam[2] = 0x00; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslParam[3] = 0x00; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+ pLightHslParam[4] = 0x00; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslParam[5] = 0x00; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ pLightHslRangeParam[0] = 0x00; //HSL Hue Range Min parameter byte 0 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[1] = 0x00; //HSL Hue Range Min parameter byte 1 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[2] = 0x00; //HSL Hue Range Max parameter byte 0 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[3] = 0x10; //HSL Hue Range Max parameter byte 1 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[4] = 0x00; //HSL Saturation Min parameter byte 0 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[5] = 0x00; //HSL Saturation Min parameter byte 1 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[6] = 0x00; //HSL Saturation Max parameter byte 0 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+ pLightHslRangeParam[7] = 0x20; //HSL Saturation Max parameter byte 1 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+
+ pLightHslHueParam[0] = 0x00; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslHueParam[1] = 0x00; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+
+ pLightHslSaturationParam[0] = 0x00; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslSaturationParam[1] = 0x00; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ //LIGHT_CONTROL_LUX_LEVEL_ON_ID : 0x202B
+ pLightLCPropertyParam[0]= 0x2B; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[1]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[2]= 0x00; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[3]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[4]= 0x00; // Property ID byte 2 : Property ID identifying a Light LC Property.
+ break;
+
+ default:
+ break;
+ }
+
+
#ifdef GENERIC_CLIENT_MODEL_PUBLISH
- Appli_GenericClient_OnOff_Set();
+ /** GENERIC ONOFF **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API ONOFF SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_ON_OFF_SET_ACK, pGeneric_OnOffParam);
+
+ TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API ONOFF SET UNACK ------------- \r\n");
+ Appli_GenericClient_API(0, GENERIC_ON_OFF_SET_UNACK, pGeneric_OnOffParam);
+
+ /** GENERIC LEVEL **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API LEVEL SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_LEVEL_SET_ACK, pGeneric_LevelParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API LEVEL SET UNACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_LEVEL_SET_UNACK, pGeneric_LevelParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API DELTA LEVEL SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_DELTA_SET, pGeneric_DeltaLevelParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API DELTA LEVEL SET UNACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_DELTA_SET_UNACK, pGeneric_DeltaLevelParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API MOVE DELTA LEVEL SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_MOVE_SET, pGeneric_MoveLevelParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API MOVE DELTA LEVEL SET UNACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_MOVE_SET_UNACK, pGeneric_MoveLevelParam);
+
+ /** GENERIC POWER ONOFF **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API POWER ON OFF SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_POWER_ON_OFF_SET, pGeneric_PowerOnOffParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API POWER ON OFF SET UNACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_POWER_ON_OFF_SET_UNACK, pGeneric_PowerOnOffParam);
+
+ /** GENERIC TRANSITION TIME **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API DEFAULT TRANSITION TIME SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_DEFAULT_TRANSITION_TIME_SET, pGeneric_DefaultTransitionTimeParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API DEFAULT TRANSITION TIME SET UNACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_DEFAULT_TRANSITION_TIME_SET_UNACK, pGeneric_DefaultTransitionTimeParam);
+
+
+
+#if 1 /* TODO FAGOTV: Initialize Present Ambient Temparature Sensor in sensor_cfg_usr.h */
+ //PRESENT_AMBIENT_TEMPERATURE_PID : 0x004F
+ pSensorsCadenceParam[0]= 0x4F; // Property ID byte 0 : Property ID for the sensor.
+ pSensorsCadenceParam[1]= 0x00; // Property ID byte 1 : Property ID for the sensor.
+
+ pSensorsCadenceParam[2]= 0x81; // Fast Cadence Period Divisor bits 0-7: Divisor for the Publish Period.
+ // Status Trigger Type bit 8 : Defines the unit and format of the Status Trigger Delta fields.
+ pSensorsCadenceParam[3]= 0x11; // Status Trigger Delta Down byte 0 : Delta down value that triggers a status message.
+ pSensorsCadenceParam[4]= 0x11; // Status Trigger Delta Down byte 1 : Delta down value that triggers a status message.
+
+ pSensorsCadenceParam[5]= 0x22; // Status Trigger Delta Up byte 0 : Delta down value that triggers a status message.
+ pSensorsCadenceParam[6]= 0x22; // Status Trigger Delta Up byte 1 : Delta down value that triggers a status message.
+
+ pSensorsCadenceParam[7]= 0x10; // Status Min Interval byte 0 : Minimum interval between two consecutive Status messages.
+
+ pSensorsCadenceParam[8]= 0x33; // Fast Cadence Low byte 0 : Low value for the fast cadence range.
+
+ pSensorsCadenceParam[9]= 0x44; // Fast Cadence High byte 0 : High value for the fast cadence range.
+
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR CADENCE SET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_CADENCE_SET, pSensorsCadenceParam);
+
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR CADENCE SET UNACK ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_CADENCE_SET_UNACK, pSensorsCadenceParam);
+
+ /** SENSOR SETTING**/
+ /*
+ PRESENT_AMBIENT_TEMPERATURE_PID : 0x004F
+ Second Property PID : 0x00AD
+ */
+ pSensorsSettingParam[0]= 0x4F; // Property ID byte 0 : Property ID for the sensor
+ pSensorsSettingParam[1]= 0x00; // Property ID byte 1 : Property ID for the sensor
+ pSensorsSettingParam[2]= 0xAD; // Sensor Setting Property ID byte 0 : Property ID for the sensor setting
+ pSensorsSettingParam[3]= 0x00; // Sensor Setting Property ID byte 1 : Property ID for the sensor setting
+
+ switch (ButtonIndex_Value){
+ case 0:
+ pSensorsSettingParam[4]= 0x10; // Sensor Setting Property ID byte 0 : Property ID for the sensor setting
+ //pSensorsSettingParam[5]= 0x10; // Sensor Setting Property ID byte 1 : Property ID for the sensor setting
+ break;
+ case 1:
+ pSensorsSettingParam[4]= 0x20; // Sensor Setting Property ID byte 0 : Property ID for the sensor setting
+ //pSensorsSettingParam[5]= 0x20; // Sensor Setting Property ID byte 1 : Property ID for the sensor setting
+ break;
+ case 2:
+ pSensorsSettingParam[4]= 0x0F; // Sensor Setting Property ID byte 0 : Property ID for the sensor setting
+ //pSensorsSettingParam[5]= 0x00; // Sensor Setting Property ID byte 1 : Property ID for the sensor setting
+ break;
+ default:
+ break;
+ }
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR SETTING SET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_SETTING_SET, pSensorsSettingParam);
+
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR SETTING SET UNACK ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_SETTING_SET_UNACK, pSensorsSettingParam);
+#endif
+
+#endif
+
+#ifdef LIGHT_CLIENT_MODEL_PUBLISH
+ /** LIGHT LIGHTNESS **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_SET, pLightnessParam);
+//
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_SET_UNACK, pLightnessParam);
+
+ /** LIGHT LIGHTNESS LINEAR **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS SET LINEAR ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_LINEAR_SET, pLightnessParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS SET LINEAR UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_LINEAR_SET_UNACK, pLightnessParam);
+
+ /** LIGHT LIGHTNESS DEFAULT **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS DEFAULT SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_DEFAULT_SET, pLightnessParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS DEFAULT SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_DEFAULT_SET_UNACK, pLightnessParam);
+
+ /** LIGHT LIGHTNESS RANGE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS RANGE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_RANGE_SET, pLightnessRangeParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS RANGE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_RANGE_SET_UNACK, pLightnessRangeParam);
+
+ /** LIGHT LIGHTNESS CTL **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_SET, pLightCtlParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_SET_UNACK, pLightCtlParam);
+
+ /** LIGHT LIGHTNESS CTL TEMPERATURE**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_SET, pLightCtlTemperatureParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_SET_UNACK, pLightCtlTemperatureParam);
+
+ /** LIGHT LIGHTNESS CTL TEMPERATURE RANGE**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE RANGE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_RANGE_SET, pLightCtlTemperatureRangeParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE RANGE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_RANGE_SET_UNACK, pLightCtlTemperatureRangeParam);
+
+ /** LIGHT LIGHTNESS CTL DEFAULT**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL DEFAULT SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_DEFAULT_SET, pLightCtlDefaultParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL DEFAULT SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_DEFAULT_SET_UNACK, pLightCtlDefaultParam);
+
+ /** LIGHT LIGHTNESS HSL **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_SET, pLightHslParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_SET_UNACK, pLightHslParam);
+
+ /** LIGHT LIGHTNESS HSL DEFAULT **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL DEFAULT SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_DEFAULT_SET, pLightHslParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL DEFAULT SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_DEFAULT_SET_UNACK, pLightHslParam);
+
+ /** LIGHT LIGHTNESS HSL RANGE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL RANGE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_RANGE_SET, pLightHslRangeParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL RANGE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_RANGE_SET_UNACK, pLightHslRangeParam);
+
+ /** LIGHT LIGHTNESS HSL HUE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL HUE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_HUE_SET, pLightHslHueParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL HUE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_HUE_SET_UNACK, pLightHslHueParam);
+
+ /** LIGHT LIGHTNESS HSL SATURATION **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL SATURATION SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_SATURATION_SET, pLightHslSaturationParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL SATURATION SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_SATURATION_SET_UNACK, pLightHslSaturationParam);
+
+ /** LIGHT LC MODE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC MODE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_MODE_SET, pLightLCModeParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC MODE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_MODE_SET_UNACK, pLightLCModeParam);
+
+ /** LIGHT LC OM **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC OM SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_OM_SET, pLightLCOccupancyModeParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC OM SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_OM_SET_UNACK, pLightLCOccupancyModeParam);
+
+ /** LIGHT LC ONOFF **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC ONOFF SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_ON_OFF_SET, pLightLCOnOffParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC ONOFF SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_ON_OFF_SET_UNACK, pLightLCOnOffParam);
+
+ /** LIGHT LC PROPERTY **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC PROPERTY SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_PROPERTY_SET, pLightLCPropertyParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC PROPERTY SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_PROPERTY_SET_UNACK, pLightLCPropertyParam);
+#endif
#endif
-#ifndef CLIENT
/* if CLIENT and SERVER => Publish is already done in CLIENT */
#ifdef GENERIC_SERVER_MODEL_PUBLISH
+#ifndef GENERIC_CLIENT_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
+* @retval MOBLEUINT8 : elementNumber
*/
MOBLEUINT8 BLEMesh_ModelsGetElementNumber(MOBLE_ADDRESS dst_peer)
{
@@ -464,46 +1018,35 @@ MOBLEUINT8 BLEMesh_ModelsGetElementNumber(MOBLE_ADDRESS dst_peer)
}
/**
-* @brief Check Subscription of Elements for Group Address for selected Model
+* @brief Get the Element Index for selected Model
* @param dst_peer : Destination Address received
-* @param elementNumber : Number of element to check Subscription
-* @retval MOBLE_RESULT status of result
+* @retval MOBLEUINT8 : elementIndex
*/
-MOBLE_RESULT BLEMesh_ModelsCheckSubscription(MOBLE_ADDRESS dst_peer, \
- MOBLEUINT8 elementNumber)
+MOBLEUINT8 BLEMesh_ModelsGetElementIndex(MOBLE_ADDRESS dst_peer)
{
- 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);
+ MOBLE_ADDRESS nodeAddress;
+ MOBLEUINT8 elementIndex;
- for(uint8_t list=0; list<length; list++)
- {
- if(dst_peer == subscriptionList[list])
- {
- status = MOBLE_RESULT_SUCCESS;
- break;
- }
- }
+ nodeAddress = BLEMesh_GetAddress();
+ elementIndex =(dst_peer - nodeAddress);
- return status;
+ return elementIndex;
}
+
/**
* @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 *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* @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,
+void BLEMesh_ModelsDelayPacket(MODEL_MessageHeader_t *pmsgParams,
MOBLEUINT8 command,
MOBLEUINT8 const * data,
MOBLEUINT32 length)
@@ -541,8 +1084,11 @@ void BLEMesh_ModelsDelayPacket(MOBLE_ADDRESS peer,
}
}
- Appli_PendingPackets.head->peer = peer;
- Appli_PendingPackets.head->dst = dst;
+ Appli_PendingPackets.head->peer = pmsgParams->peer_addr;
+ Appli_PendingPackets.head->dst = pmsgParams->dst_peer;
+ Appli_PendingPackets.head->elementIndex = pmsgParams->elementIndex;
+ Appli_PendingPackets.head->appKeyOffset = pmsgParams->rcvdAppKeyOffset;
+ Appli_PendingPackets.head->netKeyOffset = pmsgParams->rcvdNetKeyOffset;
Appli_PendingPackets.head->command = command;
Appli_PendingPackets.head->length = length;
for (MOBLEUINT8 count=0; count<length; count++)
@@ -558,6 +1104,7 @@ void BLEMesh_ModelsDelayPacket(MOBLE_ADDRESS peer,
void BLEMesh_ModelsSendDelayedPacket(void)
{
APPLI_SEND_RESPONSE_MODULE* ptr;
+ MODEL_MessageHeader_t msgParam;
MOBLEUINT8 temp_index;
if ((Appli_PendingPackets.packet_count != 0) &&
@@ -571,9 +1118,17 @@ void BLEMesh_ModelsSendDelayedPacket(void)
-count)%MAX_PENDING_PACKETS_QUE_SIZE;
ptr = Appli_PendingPackets.packet + temp_index;
+ /* Initialize the messageParam*/
+ msgParam.dst_peer = ptr->dst;
+ msgParam.peer_addr = ptr->peer;
+ msgParam.elementIndex = 0;
+ msgParam.rcvdAppKeyOffset = 0;
+ msgParam.rcvdNetKeyOffset = 0;
+ msgParam.rssi = 0;
+ msgParam.ttl = 0;
+
VendorModel_SendResponse(VENDOR_STMICRO_CID,
- ptr->peer,
- ptr->dst,
+ &msgParam,
ptr->command,
ptr->data,
ptr->length);
@@ -587,14 +1142,14 @@ void BLEMesh_ModelsSendDelayedPacket(void)
* 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 elementIdx element index
* @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,
+MOBLE_RESULT MeshClient_SetRemotePublication(MOBLEUINT32 modelId, MOBLEUINT8 elementIdx,
MOBLEUINT16 msg_opcode, MOBLEUINT8 const *msg_buff,
MOBLEUINT32 length, MOBLEBOOL ack_flag,
MOBLEUINT8 isVendor)
@@ -604,7 +1159,7 @@ MOBLE_RESULT MeshClient_SetRemotePublication(MOBLEUINT32 modelId, MOBLEUINT16 el
srcAddress = BLEMesh_GetAddress();
srcAddress += elementIdx; /* Get the Address to send in the message */
- return BLEMesh_SetRemotePublication(GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
+ return BLEMesh_SetRemotePublication(modelId,
srcAddress ,
msg_opcode ,
msg_buff, length,
@@ -634,4 +1189,4 @@ __weak void Test_Process(void)
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 486e0bcec..f00d2d28d 100644
--- 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
@@ -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
@@ -33,18 +33,19 @@
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 BLEMesh_ModelsGetElementIndex(MOBLE_ADDRESS dst_peer);
+void BLEMesh_ModelsDelayPacket(MODEL_MessageHeader_t *pmsgParams, 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,
+MOBLE_RESULT MeshClient_SetRemotePublication(MOBLEUINT32 modelId, MOBLEUINT8 elementIdx,
MOBLEUINT16 msg_opcode, MOBLEUINT8 const *msg_buff,
MOBLEUINT32 length, MOBLEBOOL ack_flag,
MOBLEUINT8 isVendor);
#endif /* __MODELS_H */
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 49d7f4c9f..12df6a87f 100644
--- 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
@@ -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
@@ -30,7 +30,7 @@
#include "hw_flash.h"
/* Private define ------------------------------------------------------------*/
-#define FLASH_SECTOR_SIZE 0x1000
+#define FLASH_SECTOR_SIZE 0x1000
/* Private variables ---------------------------------------------------------*/
@@ -121,10 +121,10 @@ MOBLEBOOL PalNvmIsWriteProtected(void)
* @retval Result of read operation
*/
MOBLE_RESULT PalNvmRead(MOBLEUINT32 address,
- MOBLEUINT32 offset,
- void *buf,
- MOBLEUINT32 size,
- MOBLEBOOL backup)
+ MOBLEUINT32 offset,
+ void *buf,
+ MOBLEUINT32 size,
+ MOBLEBOOL backup)
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
@@ -161,14 +161,14 @@ MOBLE_RESULT PalNvmRead(MOBLEUINT32 address,
* @retval Result
*/
MOBLE_RESULT PalNvmCompare(MOBLEUINT32 address,
- MOBLEUINT32 offset,
- void const *buf,
- MOBLEUINT32 size,
- MOBLE_NVM_COMPARE* comparison)
+ MOBLEUINT32 offset,
+ void const *buf,
+ MOBLEUINT32 size,
+ MOBLE_NVM_COMPARE* comparison)
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
MOBLEUINT32 i;
-
+
#ifdef ENABLE_SAVE_MODEL_STATE_NVM
// printf("MoblePalNvmCompare >>>\r\n");
@@ -228,7 +228,7 @@ MOBLE_RESULT PalNvmCompare(MOBLEUINT32 address,
* @retval Result
*/
MOBLE_RESULT PalNvmErase(MOBLEUINT32 address,
- MOBLEUINT32 offset)
+ MOBLEUINT32 offset)
{
HAL_StatusTypeDef status = HAL_OK;
@@ -272,9 +272,9 @@ MOBLE_RESULT PalNvmErase(MOBLEUINT32 address,
* @retval Result
*/
MOBLE_RESULT PalNvmWrite(MOBLEUINT32 address,
- MOBLEUINT32 offset,
- void const *buf,
- MOBLEUINT32 size)
+ MOBLEUINT32 offset,
+ void const *buf,
+ MOBLEUINT32 size)
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
@@ -436,8 +436,8 @@ static MOBLE_RESULT PalNvmBackupProcess(void)
*/
MOBLE_RESULT PalNvmProcess(void)
{
- /* do nothing */
- return MOBLE_RESULT_SUCCESS;
+ /* do nothing */
+ return MOBLE_RESULT_SUCCESS;
}
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/sensor_cfg_usr.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/sensor_cfg_usr.h
new file mode 100644
index 000000000..e7a4df96a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/sensor_cfg_usr.h
@@ -0,0 +1,685 @@
+/**
+******************************************************************************
+* @file sensor_cfg_usr.h
+* @author BLE Mesh Team
+* @brief sensor server initialization parameters
+******************************************************************************
+* @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 __SENSOR_USR_CFG_H
+#define __SENSOR_USR_CFG_H
+
+/**
+* Maximum count of settings that can be supported by a sensor
+* E.g., 5 sensors
+* 1st sensor has 2 settings
+* 2nd sensor has 3 settings
+* 3rd sensor has 2 settings
+* 4th sensor has 1 setting
+* 5th sensor has 2 settings
+* This value is max(2, 3, 2, 1, 2) = 3
+* value is >=1
+*/
+#define SENSOR_MAX_SETTINGS_COUNT 2
+
+/**
+* Maximum count of series column that is supported by a sensor
+* E.g., 2 sensors supporting series column
+* One sensor supports 2 columns while other sensor supports 20 columns
+* This value is max(2, 20) = 20
+* value is >=1
+*/
+#define SENSOR_MAX_SERIES_COUNT 1
+
+/**
+* Total sensors count on all elements
+* It is sum of sensors count on all elements
+* Sensor init fails in case of mismatch with sensor server initialization parameters
+*/
+#define TOTAL_SENSORS_COUNT 2
+
+/**
+* Sum of sensor settings on all sensors on all elements
+* Sensor init fails in case of mismatch with sensor server initialization parameters
+*/
+#define TOTAL_SENSOR_SETTINGS_COUNT 4
+
+/**
+* Sum of sensor series columns on all sensors on all elements
+* Sensor init fails in case of mismatch with sensor server initialization parameters
+*/
+#define TOTAL_SENSOR_SERIES_COLUMN_COUNT 0
+
+
+/**
+* This structure contains sensor setting initialization parameters
+*/
+typedef struct
+{
+ uint16_t settingPropertyId;
+ uint8_t settingAccess;
+ uint32_t settingRaw;
+}sensor_settings_init_params_t;
+
+
+/**
+* This structure contains sensor series column initialization parameters
+*/
+typedef struct
+{
+ uint32_t rawX;
+ uint32_t columnWidth;
+}sensor_series_column_init_params_t;
+
+
+/**
+* This structure contains sensor initialization parameters
+*/
+typedef struct
+{
+ uint8_t elementIdx;
+ uint16_t propertyId;
+ uint16_t positiveTolerance;
+ uint16_t negativeTolerance;
+ uint8_t samplingFunction;
+ uint8_t measurementPeriod;
+ uint8_t updateInterval;
+ uint8_t dataLength;
+ uint8_t cadenceState;
+ uint32_t valuesRange;
+ uint8_t settingsCount;
+ sensor_settings_init_params_t settings[SENSOR_MAX_SETTINGS_COUNT];
+ uint16_t seriesCount;
+ sensor_series_column_init_params_t seriesColumn[SENSOR_MAX_SERIES_COUNT];
+}sensor_init_params_t;
+
+
+/**
+* This structure contains sensor server initialization parameters
+*/
+typedef struct
+{
+ uint8_t sensorsCount;
+ sensor_init_params_t sensorInitParams[TOTAL_SENSORS_COUNT];
+} sensor_server_init_params_t;
+
+
+/**
+* Below section represents initialization parameters of sensors supported
+* Define sensors in ascending order of element index followed by ascending
+* order of Property IDs else initialization of sensor structure would fail
+* Single element can support one instance of sensor PID, there can't be multiple
+* instances of same PID on same element
+* For e.g. 10 sensors with PID (PID1 < PIDn ... < PID7) supported on 3 elements
+* with element index (0, 1 and 2) in below fashion
+* Element index 0 supports sensors corresponding to PID3, PID4, PID6 and PID7
+* Element index 1 supports sensors corresponding to PID2, PID4, PID5 and PID6
+* Element index 2 supports sensors corresponding to PID1, PID5
+* Corrector order of naming sensors (SENSORX) is
+* Element index 0 -> SENSOR1(PID3), SENSOR2(PID4), SENSOR3(PID6) and SENSOR4(PID7)
+* Element index 1 -> SENSOR5(PID2), SENSOR6(PID4), SENSOR7(PID5), and SENSOR8(PID6)
+* Element index 2 -> SENSOR9(PID1), and SENSOR10(PID5)
+*/
+
+/* Sensor 1 initialization */
+
+#define SENSOR1_ELEMENT_IDX 0
+#define SENSOR1_PROPERTY_ID PRESENT_AMBIENT_TEMPERATURE_PID
+#define SENSOR1_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR1_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR1_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR1_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR1_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR1_DATA_LENGTH 1
+#define SENSOR1_CADENCE_STATE SENSOR_CADENCE_SUPPORTED
+#define SENSOR1_VALUES_RANGE 254
+#define SENSOR1_SETTINGS_COUNT 2
+#define SENSOR1_SETTING1_PROPERTY_ID 0x00BB
+#define SENSOR1_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR1_SETTING1_RAW 0
+#define SENSOR1_SETTING2_PROPERTY_ID 0x00AD
+#define SENSOR1_SETTING2_ACCESS SENSOR_SETTING_ACCESS_READ_WRITE
+#define SENSOR1_SETTING2_RAW 0
+#define SENSOR1_SERIES_COUNT 0
+
+#define SENSOR1_SETTINGS1_INIT_PARAMS \
+{\
+ SENSOR1_SETTING1_PROPERTY_ID,\
+ SENSOR1_SETTING1_ACCESS,\
+ SENSOR1_SETTING1_RAW \
+}
+
+#define SENSOR1_SETTINGS2_INIT_PARAMS \
+{\
+ SENSOR1_SETTING2_PROPERTY_ID,\
+ SENSOR1_SETTING2_ACCESS,\
+ SENSOR1_SETTING2_RAW \
+}
+
+#define SENSOR1_INIT_PARAMS \
+{\
+ SENSOR1_ELEMENT_IDX,\
+ SENSOR1_PROPERTY_ID,\
+ SENSOR1_POSITIVE_TOLERANCE,\
+ SENSOR1_NEGATIVE_TOLERANCE,\
+ SENSOR1_SAMPLING_FUNCTION,\
+ SENSOR1_MEASUREMENT_PERIOD,\
+ SENSOR1_UPDATE_INTERVAL,\
+ SENSOR1_DATA_LENGTH,\
+ SENSOR1_CADENCE_STATE,\
+ SENSOR1_VALUES_RANGE,\
+ SENSOR1_SETTINGS_COUNT,\
+ {\
+ SENSOR1_SETTINGS1_INIT_PARAMS,\
+ SENSOR1_SETTINGS2_INIT_PARAMS\
+ },\
+ SENSOR1_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+/* Sensor 2 initialization */
+
+#define SENSOR2_ELEMENT_IDX 0
+#define SENSOR2_PROPERTY_ID PRESSURE_PID
+#define SENSOR2_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR2_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR2_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR2_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR2_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR2_DATA_LENGTH 4
+#define SENSOR2_CADENCE_STATE SENSOR_CADENCE_NOT_SUPPORTED
+#define SENSOR2_VALUES_RANGE 500
+#define SENSOR2_SETTINGS_COUNT 2
+#define SENSOR2_SETTING1_PROPERTY_ID 0x0AAA
+#define SENSOR2_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR2_SETTING1_RAW 35666
+#define SENSOR2_SETTING2_PROPERTY_ID 0x0AAC
+#define SENSOR2_SETTING2_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR2_SETTING2_RAW 33666
+#define SENSOR2_SERIES_COUNT 0
+
+#define SENSOR2_SETTINGS1_INIT_PARAMS \
+{\
+ SENSOR2_SETTING1_PROPERTY_ID,\
+ SENSOR2_SETTING1_ACCESS,\
+ SENSOR2_SETTING1_RAW\
+}
+
+#define SENSOR2_SETTINGS2_INIT_PARAMS \
+{\
+ SENSOR2_SETTING2_PROPERTY_ID,\
+ SENSOR2_SETTING2_ACCESS,\
+ SENSOR2_SETTING2_RAW\
+}
+
+#define SENSOR2_INIT_PARAMS \
+{\
+ SENSOR2_ELEMENT_IDX,\
+ SENSOR2_PROPERTY_ID,\
+ SENSOR2_POSITIVE_TOLERANCE,\
+ SENSOR2_NEGATIVE_TOLERANCE,\
+ SENSOR2_SAMPLING_FUNCTION,\
+ SENSOR2_MEASUREMENT_PERIOD,\
+ SENSOR2_UPDATE_INTERVAL,\
+ SENSOR2_DATA_LENGTH,\
+ SENSOR2_CADENCE_STATE,\
+ SENSOR2_VALUES_RANGE,\
+ SENSOR2_SETTINGS_COUNT,\
+ {\
+ SENSOR2_SETTINGS1_INIT_PARAMS,\
+ SENSOR2_SETTINGS2_INIT_PARAMS\
+ },\
+ SENSOR2_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+/**
+* Combined defined of all sensors intialization parameters
+*/
+
+#define SENSOR_SERVER_INIT_PARAMS \
+{\
+ TOTAL_SENSORS_COUNT,\
+ {\
+ SENSOR1_INIT_PARAMS,\
+ SENSOR2_INIT_PARAMS,\
+ }\
+}
+#endif /* __SENSOR_USR_CFG_H */
+
+/*
+
+Example for multiple sensors with series column support
+
+#define SENSOR_MAX_SETTINGS_COUNT 3
+#define SENSOR_MAX_SERIES_COUNT 20
+#define TOTAL_SENSORS_COUNT 5
+#define TOTAL_SENSOR_SETTINGS_COUNT 9
+#define TOTAL_SENSOR_SERIES_COLUMN_COUNT 22
+
+#define SENSOR1_ELEMENT_IDX 0
+#define SENSOR1_PROPERTY_ID PEOPLE_COUNT_PID
+#define SENSOR1_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR1_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR1_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR1_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR1_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR1_DATA_LENGTH 2
+#define SENSOR1_CADENCE_STATE SENSOR_CADENCE_SUPPORTED
+#define SENSOR1_VALUES_RANGE 1000
+#define SENSOR1_SETTINGS_COUNT 3
+#define SENSOR1_SETTING1_PROPERTY_ID 0x000A
+#define SENSOR1_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR1_SETTING1_RAW 234
+#define SENSOR1_SETTING2_PROPERTY_ID 0x000C
+#define SENSOR1_SETTING2_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR1_SETTING2_RAW 246
+#define SENSOR1_SETTING3_PROPERTY_ID 0x0010
+#define SENSOR1_SETTING3_ACCESS SENSOR_SETTING_ACCESS_READ_WRITE
+#define SENSOR1_SETTING3_RAW 278
+#define SENSOR1_SERIES_COUNT 0
+
+#define SENSOR1_SETTINGS1_INIT_PARAMS \
+{\
+ SENSOR1_SETTING1_PROPERTY_ID,\
+ SENSOR1_SETTING1_ACCESS,\
+ SENSOR1_SETTING1_RAW\
+}
+
+#define SENSOR1_SETTINGS2_INIT_PARAMS \
+{\
+ SENSOR1_SETTING2_PROPERTY_ID,\
+ SENSOR1_SETTING2_ACCESS,\
+ SENSOR1_SETTING2_RAW\
+}
+
+#define SENSOR1_SETTINGS3_INIT_PARAMS \
+{\
+ SENSOR1_SETTING3_PROPERTY_ID,\
+ SENSOR1_SETTING3_ACCESS,\
+ SENSOR1_SETTING3_RAW\
+}
+
+#define SENSOR1_INIT_PARAMS \
+{\
+ SENSOR1_ELEMENT_IDX,\
+ SENSOR1_PROPERTY_ID,\
+ SENSOR1_POSITIVE_TOLERANCE,\
+ SENSOR1_NEGATIVE_TOLERANCE,\
+ SENSOR1_SAMPLING_FUNCTION,\
+ SENSOR1_MEASUREMENT_PERIOD,\
+ SENSOR1_UPDATE_INTERVAL,\
+ SENSOR1_DATA_LENGTH,\
+ SENSOR1_CADENCE_STATE,\
+ SENSOR1_VALUES_RANGE,\
+ SENSOR1_SETTINGS_COUNT,\
+ {\
+ SENSOR1_SETTINGS1_INIT_PARAMS,\
+ SENSOR1_SETTINGS2_INIT_PARAMS,\
+ SENSOR1_SETTINGS3_INIT_PARAMS\
+ },\
+ SENSOR1_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+#define SENSOR2_ELEMENT_IDX 0
+#define SENSOR2_PROPERTY_ID DESIRED_AMBIENT_TEMPERATURE_PID
+#define SENSOR2_POSITIVE_TOLERANCE 0xabc
+#define SENSOR2_NEGATIVE_TOLERANCE 0xdef
+#define SENSOR2_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_RMS
+#define SENSOR2_MEASUREMENT_PERIOD 0x04
+#define SENSOR2_UPDATE_INTERVAL 0x05
+#define SENSOR2_DATA_LENGTH 1
+#define SENSOR2_CADENCE_STATE SENSOR_CADENCE_SUPPORTED
+#define SENSOR2_VALUES_RANGE 100
+#define SENSOR2_SETTINGS_COUNT 2
+#define SENSOR2_SETTING1_PROPERTY_ID 0x00BB
+#define SENSOR2_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR2_SETTING1_RAW 345
+#define SENSOR2_SETTING2_PROPERTY_ID 0x00AD
+#define SENSOR2_SETTING2_ACCESS SENSOR_SETTING_ACCESS_READ_WRITE
+#define SENSOR2_SETTING2_RAW 435
+#define SENSOR2_SERIES_COUNT 0
+
+#define SENSOR2_SETTINGS1_INIT_PARAMS \
+{\
+ SENSOR2_SETTING1_PROPERTY_ID,\
+ SENSOR2_SETTING1_ACCESS,\
+ SENSOR2_SETTING1_RAW\
+}
+
+#define SENSOR2_SETTINGS2_INIT_PARAMS \
+{\
+ SENSOR2_SETTING2_PROPERTY_ID,\
+ SENSOR2_SETTING2_ACCESS,\
+ SENSOR2_SETTING2_RAW \
+}
+
+#define SENSOR2_INIT_PARAMS \
+{\
+ SENSOR2_ELEMENT_IDX,\
+ SENSOR2_PROPERTY_ID,\
+ SENSOR2_POSITIVE_TOLERANCE,\
+ SENSOR2_NEGATIVE_TOLERANCE,\
+ SENSOR2_SAMPLING_FUNCTION,\
+ SENSOR2_MEASUREMENT_PERIOD,\
+ SENSOR2_UPDATE_INTERVAL,\
+ SENSOR2_DATA_LENGTH,\
+ SENSOR2_CADENCE_STATE,\
+ SENSOR2_VALUES_RANGE,\
+ SENSOR2_SETTINGS_COUNT,\
+ {\
+ SENSOR2_SETTINGS1_INIT_PARAMS,\
+ SENSOR2_SETTINGS2_INIT_PARAMS\
+ },\
+ SENSOR2_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+#define SENSOR3_ELEMENT_IDX 0
+#define SENSOR3_PROPERTY_ID PRESSURE_PID
+#define SENSOR3_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR3_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR3_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR3_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR3_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR3_DATA_LENGTH 2
+#define SENSOR3_CADENCE_STATE SENSOR_CADENCE_NOT_SUPPORTED
+#define SENSOR3_VALUES_RANGE 500
+#define SENSOR3_SETTINGS_COUNT 2
+#define SENSOR3_SETTING1_PROPERTY_ID 0x0AAA
+#define SENSOR3_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR3_SETTING1_RAW 35666
+#define SENSOR3_SETTING2_PROPERTY_ID 0x0AAC
+#define SENSOR3_SETTING2_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR3_SETTING2_RAW 33666
+#define SENSOR3_SERIES_COUNT 20
+#define SENSOR3_SERIES1_RAWX 0
+#define SENSOR3_SERIES1_CW 10
+#define SENSOR3_SERIES2_RAWX 23
+#define SENSOR3_SERIES2_CW 10
+#define SENSOR3_SERIES3_RAWX 34
+#define SENSOR3_SERIES3_CW 10
+#define SENSOR3_SERIES4_RAWX 35
+#define SENSOR3_SERIES4_CW 10
+#define SENSOR3_SERIES5_RAWX 36
+#define SENSOR3_SERIES5_CW 10
+#define SENSOR3_SERIES6_RAWX 40
+#define SENSOR3_SERIES6_CW 10
+#define SENSOR3_SERIES7_RAWX 41
+#define SENSOR3_SERIES7_CW 10
+#define SENSOR3_SERIES8_RAWX 42
+#define SENSOR3_SERIES8_CW 10
+#define SENSOR3_SERIES9_RAWX 43
+#define SENSOR3_SERIES9_CW 10
+#define SENSOR3_SERIES10_RAWX 45
+#define SENSOR3_SERIES10_CW 10
+#define SENSOR3_SERIES11_RAWX 46
+#define SENSOR3_SERIES11_CW 10
+#define SENSOR3_SERIES12_RAWX 47
+#define SENSOR3_SERIES12_CW 10
+#define SENSOR3_SERIES13_RAWX 48
+#define SENSOR3_SERIES13_CW 10
+#define SENSOR3_SERIES14_RAWX 49
+#define SENSOR3_SERIES14_CW 10
+#define SENSOR3_SERIES15_RAWX 50
+#define SENSOR3_SERIES15_CW 10
+#define SENSOR3_SERIES16_RAWX 51
+#define SENSOR3_SERIES16_CW 10
+#define SENSOR3_SERIES17_RAWX 52
+#define SENSOR3_SERIES17_CW 10
+#define SENSOR3_SERIES18_RAWX 53
+#define SENSOR3_SERIES18_CW 10
+#define SENSOR3_SERIES19_RAWX 55
+#define SENSOR3_SERIES19_CW 10
+#define SENSOR3_SERIES20_RAWX 89
+#define SENSOR3_SERIES20_CW 10
+
+#define SENSOR3_SETTINGS1_INIT_PARAMS \
+{\
+ SENSOR3_SETTING1_PROPERTY_ID,\
+ SENSOR3_SETTING1_ACCESS,\
+ SENSOR3_SETTING1_RAW\
+}
+
+#define SENSOR3_SETTINGS2_INIT_PARAMS \
+{\
+ SENSOR3_SETTING2_PROPERTY_ID,\
+ SENSOR3_SETTING2_ACCESS,\
+ SENSOR3_SETTING2_RAW\
+}
+
+#define SENSOR3_COLUMN1_INIT_PARAMS {SENSOR3_SERIES1_RAWX,SENSOR3_SERIES1_CW}
+#define SENSOR3_COLUMN2_INIT_PARAMS {SENSOR3_SERIES2_RAWX,SENSOR3_SERIES2_CW}
+#define SENSOR3_COLUMN3_INIT_PARAMS {SENSOR3_SERIES3_RAWX,SENSOR3_SERIES3_CW}
+#define SENSOR3_COLUMN4_INIT_PARAMS {SENSOR3_SERIES4_RAWX,SENSOR3_SERIES4_CW}
+#define SENSOR3_COLUMN5_INIT_PARAMS {SENSOR3_SERIES5_RAWX,SENSOR3_SERIES5_CW}
+#define SENSOR3_COLUMN6_INIT_PARAMS {SENSOR3_SERIES6_RAWX,SENSOR3_SERIES6_CW}
+#define SENSOR3_COLUMN7_INIT_PARAMS {SENSOR3_SERIES7_RAWX,SENSOR3_SERIES7_CW}
+#define SENSOR3_COLUMN8_INIT_PARAMS {SENSOR3_SERIES8_RAWX,SENSOR3_SERIES8_CW}
+#define SENSOR3_COLUMN9_INIT_PARAMS {SENSOR3_SERIES9_RAWX,SENSOR3_SERIES9_CW}
+#define SENSOR3_COLUMN10_INIT_PARAMS {SENSOR3_SERIES10_RAWX,SENSOR3_SERIES10_CW}
+#define SENSOR3_COLUMN11_INIT_PARAMS {SENSOR3_SERIES11_RAWX,SENSOR3_SERIES11_CW}
+#define SENSOR3_COLUMN12_INIT_PARAMS {SENSOR3_SERIES12_RAWX,SENSOR3_SERIES12_CW}
+#define SENSOR3_COLUMN13_INIT_PARAMS {SENSOR3_SERIES13_RAWX,SENSOR3_SERIES13_CW}
+#define SENSOR3_COLUMN14_INIT_PARAMS {SENSOR3_SERIES14_RAWX,SENSOR3_SERIES14_CW}
+#define SENSOR3_COLUMN15_INIT_PARAMS {SENSOR3_SERIES15_RAWX,SENSOR3_SERIES15_CW}
+#define SENSOR3_COLUMN16_INIT_PARAMS {SENSOR3_SERIES16_RAWX,SENSOR3_SERIES16_CW}
+#define SENSOR3_COLUMN17_INIT_PARAMS {SENSOR3_SERIES17_RAWX,SENSOR3_SERIES17_CW}
+#define SENSOR3_COLUMN18_INIT_PARAMS {SENSOR3_SERIES18_RAWX,SENSOR3_SERIES18_CW}
+#define SENSOR3_COLUMN19_INIT_PARAMS {SENSOR3_SERIES19_RAWX,SENSOR3_SERIES19_CW}
+#define SENSOR3_COLUMN20_INIT_PARAMS {SENSOR3_SERIES20_RAWX,SENSOR3_SERIES20_CW}
+
+#define SENSOR3_INIT_PARAMS \
+{\
+ SENSOR3_ELEMENT_IDX,\
+ SENSOR3_PROPERTY_ID,\
+ SENSOR3_POSITIVE_TOLERANCE,\
+ SENSOR3_NEGATIVE_TOLERANCE,\
+ SENSOR3_SAMPLING_FUNCTION,\
+ SENSOR3_MEASUREMENT_PERIOD,\
+ SENSOR3_UPDATE_INTERVAL,\
+ SENSOR3_DATA_LENGTH,\
+ SENSOR3_CADENCE_STATE,\
+ SENSOR3_VALUES_RANGE,\
+ SENSOR3_SETTINGS_COUNT,\
+ {\
+ SENSOR3_SETTINGS1_INIT_PARAMS,\
+ SENSOR3_SETTINGS2_INIT_PARAMS\
+ },\
+ SENSOR3_SERIES_COUNT,\
+ {\
+ SENSOR3_COLUMN1_INIT_PARAMS,\
+ SENSOR3_COLUMN2_INIT_PARAMS,\
+ SENSOR3_COLUMN3_INIT_PARAMS,\
+ SENSOR3_COLUMN4_INIT_PARAMS,\
+ SENSOR3_COLUMN5_INIT_PARAMS,\
+ SENSOR3_COLUMN6_INIT_PARAMS,\
+ SENSOR3_COLUMN7_INIT_PARAMS,\
+ SENSOR3_COLUMN8_INIT_PARAMS,\
+ SENSOR3_COLUMN9_INIT_PARAMS,\
+ SENSOR3_COLUMN10_INIT_PARAMS,\
+ SENSOR3_COLUMN11_INIT_PARAMS,\
+ SENSOR3_COLUMN12_INIT_PARAMS,\
+ SENSOR3_COLUMN13_INIT_PARAMS,\
+ SENSOR3_COLUMN14_INIT_PARAMS,\
+ SENSOR3_COLUMN15_INIT_PARAMS,\
+ SENSOR3_COLUMN16_INIT_PARAMS,\
+ SENSOR3_COLUMN17_INIT_PARAMS,\
+ SENSOR3_COLUMN18_INIT_PARAMS,\
+ SENSOR3_COLUMN19_INIT_PARAMS,\
+ SENSOR3_COLUMN20_INIT_PARAMS}\
+}
+
+#define SENSOR4_ELEMENT_IDX 0
+#define SENSOR4_PROPERTY_ID HUMIDITY_PID
+#define SENSOR4_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR4_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR4_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR4_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR4_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR4_DATA_LENGTH 2
+#define SENSOR4_CADENCE_STATE SENSOR_CADENCE_SUPPORTED
+#define SENSOR4_VALUES_RANGE 200
+#define SENSOR4_SETTINGS_COUNT 1
+#define SENSOR4_SETTING1_PROPERTY_ID 0xAAAA
+#define SENSOR4_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ_WRITE
+#define SENSOR4_SETTING1_RAW 35666
+#define SENSOR4_SERIES_COUNT 0
+
+#define SENSOR4_SETTINGS_INIT_PARAMS \
+{\
+ SENSOR4_SETTING1_PROPERTY_ID,\
+ SENSOR4_SETTING1_ACCESS,\
+ SENSOR4_SETTING1_RAW\
+}
+
+#define SENSOR4_INIT_PARAMS \
+{\
+ SENSOR4_ELEMENT_IDX,\
+ SENSOR4_PROPERTY_ID,\
+ SENSOR4_POSITIVE_TOLERANCE,\
+ SENSOR4_NEGATIVE_TOLERANCE,\
+ SENSOR4_SAMPLING_FUNCTION,\
+ SENSOR4_MEASUREMENT_PERIOD,\
+ SENSOR4_UPDATE_INTERVAL,\
+ SENSOR4_DATA_LENGTH,\
+ SENSOR4_CADENCE_STATE,\
+ SENSOR4_VALUES_RANGE,\
+ SENSOR4_SETTINGS_COUNT,\
+ {\
+ SENSOR4_SETTINGS_INIT_PARAMS\
+ },\
+ SENSOR4_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+#define SENSOR5_ELEMENT_IDX 0
+#define SENSOR5_PROPERTY_ID TIME_OF_FLIGHT_PID
+#define SENSOR5_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR5_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR5_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR5_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR5_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR5_DATA_LENGTH 2
+#define SENSOR5_CADENCE_STATE SENSOR_CADENCE_NOT_SUPPORTED
+#define SENSOR5_VALUES_RANGE 0
+#define SENSOR5_SETTINGS_COUNT 1
+#define SENSOR5_SETTING1_PROPERTY_ID 0xAAFA
+#define SENSOR5_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR5_SETTING1_RAW 35666
+#define SENSOR5_SERIES_COUNT 2
+#define SENSOR5_SERIES1_RAWX 20
+#define SENSOR5_SERIES1_CW 30
+#define SENSOR5_SERIES2_RAWX 50
+#define SENSOR5_SERIES2_CW 40
+
+#define SENSOR5_SETTINGS_INIT_PARAMS \
+{\
+ SENSOR5_SETTING1_PROPERTY_ID,\
+ SENSOR5_SETTING1_ACCESS,\
+ SENSOR5_SETTING1_RAW\
+}
+
+#define SENSOR5_COLUMN1_INIT_PARAMS {SENSOR5_SERIES1_RAWX,SENSOR5_SERIES1_CW}
+#define SENSOR5_COLUMN2_INIT_PARAMS {SENSOR5_SERIES2_RAWX,SENSOR5_SERIES2_CW}
+
+#define SENSOR5_INIT_PARAMS \
+{\
+ SENSOR5_ELEMENT_IDX,\
+ SENSOR5_PROPERTY_ID,\
+ SENSOR5_POSITIVE_TOLERANCE,\
+ SENSOR5_NEGATIVE_TOLERANCE,\
+ SENSOR5_SAMPLING_FUNCTION,\
+ SENSOR5_MEASUREMENT_PERIOD,\
+ SENSOR5_UPDATE_INTERVAL,\
+ SENSOR5_DATA_LENGTH,\
+ SENSOR5_CADENCE_STATE,\
+ SENSOR5_VALUES_RANGE,\
+ SENSOR5_SETTINGS_COUNT,\
+ {\
+ SENSOR5_SETTINGS_INIT_PARAMS\
+ },\
+ SENSOR5_SERIES_COUNT,\
+ {\
+ SENSOR5_COLUMN1_INIT_PARAMS,\
+ SENSOR5_COLUMN2_INIT_PARAMS\
+ }\
+}
+
+#define SENSOR6_ELEMENT_IDX 0
+#define SENSOR6_PROPERTY_ID PRESENCE_PID
+#define SENSOR6_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR6_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR6_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR6_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR6_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR6_DATA_LENGTH 1
+#define SENSOR6_CADENCE_STATE SENSOR_CADENCE_NOT_SUPPORTED
+#define SENSOR6_VALUES_RANGE 0
+#define SENSOR6_SETTINGS_COUNT 0
+#define SENSOR6_SERIES_COUNT 0
+
+#define SENSOR6_SETTINGS_INIT_PARAMS \
+{\
+ {\
+ {0}\
+ }\
+}
+
+#define SENSOR6_INIT_PARAMS \
+{\
+ SENSOR6_ELEMENT_IDX,\
+ SENSOR6_PROPERTY_ID,\
+ SENSOR6_POSITIVE_TOLERANCE,\
+ SENSOR6_NEGATIVE_TOLERANCE,\
+ SENSOR6_SAMPLING_FUNCTION,\
+ SENSOR6_MEASUREMENT_PERIOD,\
+ SENSOR6_UPDATE_INTERVAL,\
+ SENSOR6_DATA_LENGTH,\
+ SENSOR6_CADENCE_STATE,\
+ SENSOR6_VALUES_RANGE,\
+ SENSOR6_SETTINGS_COUNT,\
+ {\
+ {0}\
+ },\
+ SENSOR6_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+#define SENSOR_SERVER_INIT_PARAMS \
+{\
+ TOTAL_SENSORS_COUNT,\
+ {\
+ SENSOR1_INIT_PARAMS,\
+ SENSOR2_INIT_PARAMS,\
+ SENSOR3_INIT_PARAMS,\
+ SENSOR4_INIT_PARAMS,\
+ SENSOR5_INIT_PARAMS\
+ }\
+}
+*/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/tl_dbg_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/tl_dbg_conf.h
new file mode 100644
index 000000000..b468b2863
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingLPN/STM32_WPAN/app/tl_dbg_conf.h
@@ -0,0 +1,126 @@
+/**
+ ******************************************************************************
+ * File Name : tl_dbg_conf.h
+ * Description : Debug configuration file for stm32wpan transport layer 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
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __TL_DBG_CONF_H
+#define __TL_DBG_CONF_H
+
+/* USER CODE BEGIN Tl_Conf */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_conf.h" /* required as some configuration used in dbg_trace.h are set there */
+#include "dbg_trace.h"
+#include "hw_if.h"
+
+/**
+ * Enable or Disable traces
+ * The raw data output is the hci binary packet format as specified by the BT specification *
+ */
+#define TL_SHCI_CMD_DBG_EN 0 /* Reports System commands sent to CPU2 and the command response */
+#define TL_SHCI_CMD_DBG_RAW_EN 0 /* Reports raw data System commands sent to CPU2 and the command response */
+#define TL_SHCI_EVT_DBG_EN 0 /* Reports System Asynchronous Events received from CPU2 */
+#define TL_SHCI_EVT_DBG_RAW_EN 0 /* Reports raw data System Asynchronous Events received from CPU2 */
+
+#define TL_HCI_CMD_DBG_EN 0 /* Reports BLE command sent to CPU2 and the command response */
+#define TL_HCI_CMD_DBG_RAW_EN 0 /* Reports raw data BLE command sent to CPU2 and the command response */
+#define TL_HCI_EVT_DBG_EN 0 /* Reports BLE Asynchronous Events received from CPU2 */
+#define TL_HCI_EVT_DBG_RAW_EN 0 /* Reports raw data BLE Asynchronous Events received from CPU2 */
+
+#define TL_MM_DBG_EN 0 /* Reports the informations of the buffer released to CPU2 */
+
+/**
+ * Macro definition
+ */
+
+/**
+ * System Transport Layer
+ */
+#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_CMD_DBG_RAW_EN != 0)
+#define TL_SHCI_CMD_DBG_RAW(_PDATA_, _SIZE_) HW_UART_Transmit(hw_uart1, (uint8_t*)_PDATA_, _SIZE_, (~0))
+#else
+#define TL_SHCI_CMD_DBG_RAW(...)
+#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
+
+#if (TL_SHCI_EVT_DBG_RAW_EN != 0)
+#define TL_SHCI_EVT_DBG_RAW(_PDATA_, _SIZE_) HW_UART_Transmit(hw_uart1, (uint8_t*)_PDATA_, _SIZE_, (~0))
+#else
+#define TL_SHCI_EVT_DBG_RAW(...)
+#endif
+
+/**
+ * BLE Transport Layer
+ */
+#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_CMD_DBG_RAW_EN != 0)
+#define TL_HCI_CMD_DBG_RAW(_PDATA_, _SIZE_) HW_UART_Transmit(hw_uart1, (uint8_t*)_PDATA_, _SIZE_, (~0))
+#else
+#define TL_HCI_CMD_DBG_RAW(...)
+#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
+
+#if (TL_HCI_EVT_DBG_RAW_EN != 0)
+#define TL_HCI_EVT_DBG_RAW(_PDATA_, _SIZE_) HW_UART_Transmit(hw_uart1, (uint8_t*)_PDATA_, _SIZE_, (~0))
+#else
+#define TL_HCI_EVT_DBG_RAW(...)
+#endif
+
+/**
+ * Memory Manager - Released buffer tracing
+ */
+#if (TL_MM_DBG_EN != 0)
+#define TL_MM_DBG_MSG PRINT_MESG_DBG
+#else
+#define TL_MM_DBG_MSG(...)
+#endif
+
+/* USER CODE END Tl_Conf */
+
+#endif /*__TL_DBG_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
index a58b95cad..e7049681d 100644
--- 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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_MeshLightingPRFNode/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/Core/Inc/app_common.h
index 9dbfbba05..7e66ee35a 100644
--- 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
@@ -67,9 +67,13 @@ extern "C"
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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
index 5556ff3f9..e95399c9f 100644
--- 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
@@ -72,8 +72,24 @@
#define CFG_MITM_PROTECTION_NOT_REQUIRED (0x00)
#define CFG_MITM_PROTECTION_REQUIRED (0x01)
-#define CFG_MITM_PROTECTION CFG_MITM_PROTECTION_REQUIRED
+#define CFG_MITM_PROTECTION CFG_MITM_PROTECTION_NOT_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_NOT_SUPPORTED
+
+/**
+ * Define Keypress Notification Support
+ */
+#define CFG_KEYPRESS_NOT_SUPPORTED (0x00)
+#define CFG_KEYPRESS_SUPPORTED (0x01)
+
+#define CFG_KEYPRESS_NOTIFICATION_SUPPORT CFG_KEYPRESS_NOT_SUPPORTED
/**
* Define PHY
@@ -140,7 +156,7 @@
* Maximum number of simultaneous connections that the device will support.
* Valid values are from 1 to 8
*/
-#define CFG_BLE_NUM_LINK 8
+#define CFG_BLE_NUM_LINK 2
/**
* Maximum number of Services that can be stored in the GATT database.
@@ -494,7 +510,7 @@ typedef enum
typedef enum
{
CFG_FIRST_TASK_ID_WITH_NO_HCICMD = CFG_LAST_TASK_ID_WITH_HCICMD - 1, /**< Shall be FIRST in the list */
-
+ CFG_TASK_SW1_BUTTON_PUSHED_ID,
CFG_TASK_SYSTEM_HCI_ASYNCH_EVT_ID,
CFG_TASK_VCP_SEND_DATA_ID,
@@ -509,8 +525,6 @@ typedef enum
typedef enum
{
CFG_SCH_PRIO_0,
- CFG_SCH_PRIO_1,
-
CFG_PRIO_NBR,
} CFG_SCH_Prio_Id_t;
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
index 1e2d7a616..b703e7393 100644
--- 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
@@ -1,36 +1,39 @@
+/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file hw_conf.h
* @author MCD Application Team
* @brief Configuration of hardware interface
- ******************************************************************************
- * @attention
- *
+ ******************************************************************************
+ * @attention
+ *
* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under Ultimate Liberty license
- * SLA0044, the "License"; You may not use this file except in compliance with
- * the License. You may obtain a copy of the License at:
- * www.st.com/SLA0044
- *
- ******************************************************************************
- */
-
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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
+#ifndef HW_CONF_H
+#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
* 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.
+* Once the Semaphore has been released, there shall be at least 1us before it can be taken again. This is required
+* to give the opportunity to CPU2 to take it.
* 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()
@@ -69,7 +72,6 @@
/* Index of the semaphore used to access the RNG */
#define CFG_HW_RNG_SEMID 0
-
/******************************************************************************
* HW TIMER SERVER
*****************************************************************************/
@@ -84,7 +86,7 @@
* wakeup timer.
* This setting is the preemptpriority part of the NVIC.
*/
-#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+#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
@@ -92,7 +94,7 @@
* 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 CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
/**
* Define a critical section in the Timer server
@@ -108,35 +110,35 @@
* 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
+#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
- */
+ * 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_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
+#define CFG_HW_USART1_ENABLED 1
+#define CFG_HW_USART1_DMA_TX_SUPPORTED 1
/**
* LPUART1
@@ -242,6 +244,6 @@
#define CFG_HW_USART1_TX_DMA_IRQn DMA2_Channel4_IRQn
#define CFG_HW_USART1_DMA_TX_IRQHandler DMA2_Channel4_IRQHandler
-#endif /*__HW_CONF_H */
+#endif /*HW_CONF_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
index 3de57ae3e..0dfed68a8 100644
--- 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
@@ -31,6 +31,8 @@
extern RTC_HandleTypeDef hrtc; /**< RTC handler declaration */
/* Exported macro ------------------------------------------------------------*/
+/* Exported functions prototypes ---------------------------------------------*/
+void Error_Handler(void);
/* Exported functions ------------------------------------------------------- */
#endif /* __MAIN_H */
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
index 7280c33b9..4b9e79dde 100644
--- 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
@@ -33,7 +33,7 @@ extern "C"
#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)
+#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)
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
index 7543c6d8b..ff9891b2d 100644
--- 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
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "main.h"
@@ -28,6 +29,7 @@
#include "stm32_seq.h"
#include "shci_tl.h"
#include "stm32_lpm.h"
+#include "app_debug.h"
#include "app_debug.h"
@@ -84,7 +86,6 @@ 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 */
@@ -232,7 +233,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
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
index 34c013a8e..95537ac98 100644
--- 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
@@ -327,11 +327,10 @@ void SystemClock_Config(void)
/** Configure LSE Drive Capability
*/
__HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
- /** Configure the main internal regulator output voltage
+ /** Configure the main internal regulator output voltage
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
- /** Initializes the RCC Oscillators according to the specified parameters
- * in the RCC_OscInitTypeDef structure.
+ /** Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE
|RCC_OSCILLATORTYPE_LSE;
@@ -344,7 +343,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
+ /** Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK4|RCC_CLOCKTYPE_HCLK2
|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
@@ -364,7 +363,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
- /** Initializes the peripherals clocks
+ /** Initializes the peripherals clocks
*/
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SMPS|RCC_PERIPHCLK_RFWAKEUP
|RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1
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
index 82b067837..e8258bcb7 100644
--- 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
@@ -366,7 +366,6 @@
<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_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>
@@ -837,7 +836,6 @@
<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>
@@ -1124,6 +1122,9 @@
<name>$PROJ_DIR$\..\STM32_WPAN\app\appli_sensor.c</name>
</file>
<file>
+ <name>$PROJ_DIR$\..\STM32_WPAN\app\appli_sensors_client.c</name>
+ </file>
+ <file>
<name>$PROJ_DIR$\..\STM32_WPAN\app\appli_vendor.c</name>
</file>
<file>
@@ -1288,6 +1289,9 @@
<name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\sensors.c</name>
</file>
<file>
+ <name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\sensors_client.c</name>
+ </file>
+ <file>
<name>$PROJ_DIR$\..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\svc\Src\svc_ctl.c</name>
</file>
<file>
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/BLE_MeshLightingDemoPRFNode.uvoptx b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/BLE_MeshLightingDemoPRFNode.uvoptx
index 67f89ddc2..2ecd1c306 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/BLE_MeshLightingDemoPRFNode.uvoptx
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/MDK-ARM/BLE_MeshLightingDemoPRFNode.uvoptx
@@ -455,6 +455,42 @@
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>23</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>24</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>25</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\STM32_WPAN\app\appli_sensors_client.c</PathWithFileName>
+ <FilenameWithoutPath>appli_sensors_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
</Group>
<Group>
@@ -465,7 +501,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>4</GroupNumber>
- <FileNumber>23</FileNumber>
+ <FileNumber>26</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -485,7 +521,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>5</GroupNumber>
- <FileNumber>24</FileNumber>
+ <FileNumber>27</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -505,7 +541,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>6</GroupNumber>
- <FileNumber>25</FileNumber>
+ <FileNumber>28</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -525,7 +561,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>7</GroupNumber>
- <FileNumber>26</FileNumber>
+ <FileNumber>29</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -545,7 +581,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>27</FileNumber>
+ <FileNumber>30</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -557,7 +593,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>28</FileNumber>
+ <FileNumber>31</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -569,7 +605,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>29</FileNumber>
+ <FileNumber>32</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -581,7 +617,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>30</FileNumber>
+ <FileNumber>33</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -593,7 +629,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>31</FileNumber>
+ <FileNumber>34</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -605,7 +641,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>32</FileNumber>
+ <FileNumber>35</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -617,7 +653,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>33</FileNumber>
+ <FileNumber>36</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -629,7 +665,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>34</FileNumber>
+ <FileNumber>37</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -641,7 +677,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>35</FileNumber>
+ <FileNumber>38</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -653,7 +689,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>36</FileNumber>
+ <FileNumber>39</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -665,7 +701,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>37</FileNumber>
+ <FileNumber>40</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -677,7 +713,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>38</FileNumber>
+ <FileNumber>41</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -689,7 +725,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>39</FileNumber>
+ <FileNumber>42</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -701,7 +737,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>40</FileNumber>
+ <FileNumber>43</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -713,7 +749,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>41</FileNumber>
+ <FileNumber>44</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -725,7 +761,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>42</FileNumber>
+ <FileNumber>45</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -737,7 +773,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>43</FileNumber>
+ <FileNumber>46</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -749,7 +785,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>44</FileNumber>
+ <FileNumber>47</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -761,7 +797,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>45</FileNumber>
+ <FileNumber>48</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -773,7 +809,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>46</FileNumber>
+ <FileNumber>49</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -785,7 +821,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
- <FileNumber>47</FileNumber>
+ <FileNumber>50</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -805,7 +841,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>48</FileNumber>
+ <FileNumber>51</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -817,7 +853,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>49</FileNumber>
+ <FileNumber>52</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -829,7 +865,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>50</FileNumber>
+ <FileNumber>53</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -841,7 +877,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
- <FileNumber>51</FileNumber>
+ <FileNumber>54</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -855,13 +891,13 @@
<Group>
<GroupName>Middlewares/STM32_WPAN/ble/blesvc</GroupName>
- <tvExp>0</tvExp>
+ <tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>52</FileNumber>
+ <FileNumber>55</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -873,7 +909,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>53</FileNumber>
+ <FileNumber>56</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -885,7 +921,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>54</FileNumber>
+ <FileNumber>57</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -897,7 +933,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>55</FileNumber>
+ <FileNumber>58</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -909,7 +945,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>56</FileNumber>
+ <FileNumber>59</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -921,7 +957,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>57</FileNumber>
+ <FileNumber>60</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -933,7 +969,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>58</FileNumber>
+ <FileNumber>61</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -945,7 +981,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>59</FileNumber>
+ <FileNumber>62</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -957,7 +993,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>60</FileNumber>
+ <FileNumber>63</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -969,7 +1005,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
- <FileNumber>61</FileNumber>
+ <FileNumber>64</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -979,6 +1015,42 @@
<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\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>66</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>67</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\sensors_client.c</PathWithFileName>
+ <FilenameWithoutPath>sensors_client.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
</Group>
<Group>
@@ -989,7 +1061,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>11</GroupNumber>
- <FileNumber>62</FileNumber>
+ <FileNumber>68</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1001,7 +1073,7 @@
</File>
<File>
<GroupNumber>11</GroupNumber>
- <FileNumber>63</FileNumber>
+ <FileNumber>69</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1013,7 +1085,7 @@
</File>
<File>
<GroupNumber>11</GroupNumber>
- <FileNumber>64</FileNumber>
+ <FileNumber>70</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1025,7 +1097,7 @@
</File>
<File>
<GroupNumber>11</GroupNumber>
- <FileNumber>65</FileNumber>
+ <FileNumber>71</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1037,7 +1109,7 @@
</File>
<File>
<GroupNumber>11</GroupNumber>
- <FileNumber>66</FileNumber>
+ <FileNumber>72</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1049,7 +1121,7 @@
</File>
<File>
<GroupNumber>11</GroupNumber>
- <FileNumber>67</FileNumber>
+ <FileNumber>73</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1069,7 +1141,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>12</GroupNumber>
- <FileNumber>68</FileNumber>
+ <FileNumber>74</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1089,7 +1161,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>69</FileNumber>
+ <FileNumber>75</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1101,7 +1173,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>70</FileNumber>
+ <FileNumber>76</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1113,7 +1185,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>71</FileNumber>
+ <FileNumber>77</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1125,7 +1197,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>72</FileNumber>
+ <FileNumber>78</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1137,7 +1209,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
- <FileNumber>73</FileNumber>
+ <FileNumber>79</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1157,7 +1229,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>14</GroupNumber>
- <FileNumber>74</FileNumber>
+ <FileNumber>80</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1169,7 +1241,7 @@
</File>
<File>
<GroupNumber>14</GroupNumber>
- <FileNumber>75</FileNumber>
+ <FileNumber>81</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1181,7 +1253,7 @@
</File>
<File>
<GroupNumber>14</GroupNumber>
- <FileNumber>76</FileNumber>
+ <FileNumber>82</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1201,7 +1273,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>15</GroupNumber>
- <FileNumber>77</FileNumber>
+ <FileNumber>83</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1213,7 +1285,7 @@
</File>
<File>
<GroupNumber>15</GroupNumber>
- <FileNumber>78</FileNumber>
+ <FileNumber>84</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1225,7 +1297,7 @@
</File>
<File>
<GroupNumber>15</GroupNumber>
- <FileNumber>79</FileNumber>
+ <FileNumber>85</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1237,7 +1309,7 @@
</File>
<File>
<GroupNumber>15</GroupNumber>
- <FileNumber>80</FileNumber>
+ <FileNumber>86</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1249,7 +1321,7 @@
</File>
<File>
<GroupNumber>15</GroupNumber>
- <FileNumber>81</FileNumber>
+ <FileNumber>87</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1261,7 +1333,7 @@
</File>
<File>
<GroupNumber>15</GroupNumber>
- <FileNumber>82</FileNumber>
+ <FileNumber>88</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1281,7 +1353,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>16</GroupNumber>
- <FileNumber>83</FileNumber>
+ <FileNumber>89</FileNumber>
<FileType>4</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1294,26 +1366,6 @@
</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>
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
index 1b1697e6e..8559c22d5 100644
--- 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
@@ -502,6 +502,21 @@
<FileType>1</FileType>
<FilePath>../STM32_WPAN/app/PWM_handlers.c</FilePath>
</File>
+ <File>
+ <FileName>appli_generic_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\STM32_WPAN\app\appli_generic_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>appli_light_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\STM32_WPAN\app\appli_light_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>appli_sensors_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\STM32_WPAN\app\appli_sensors_client.c</FilePath>
+ </File>
</Files>
</Group>
<Group>
@@ -732,6 +747,21 @@
<FileType>1</FileType>
<FilePath>../../../../../../Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/vendor.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>
+ </File>
+ <File>
+ <FileName>light_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\light_client.c</FilePath>
+ </File>
+ <File>
+ <FileName>sensors_client.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\..\..\..\..\..\Middlewares\ST\STM32_WPAN\ble\mesh\MeshModel\Src\sensors_client.c</FilePath>
+ </File>
</Files>
</Group>
<Group>
@@ -875,16 +905,6 @@
</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>
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32CubeIDE/.cproject b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32CubeIDE/.cproject
index 5576127b1..3e24fb0c3 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32CubeIDE/.cproject
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32CubeIDE/.cproject
@@ -82,11 +82,9 @@
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script.910771431" name="Linker Script (-T)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" useByScannerDiscovery="false" value="${workspace_loc:/${ProjName}/STM32WB55CGUX_FLASH.ld}" valueType="string"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.directories.1605699383" name="Library search path (-L)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.directories" 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 IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.libraries.497787694" name="Libraries (-l)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.libraries" useByScannerDiscovery="false" valueType="libs">
<listOptionValue builtIn="false" value=":libBle_Mesh_CM4_GCC.a"/>
- <listOptionValue builtIn="false" value=":STM32CryptographicV3.1.3_CM4_GCC.a"/>
</option>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input.17146866" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input">
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
@@ -145,7 +143,7 @@
</tool>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.1600571182" name="MCU GCC Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler">
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.30653138" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.value.g0" valueType="enumerated"/>
- <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.1387065609" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.value.os" valueType="enumerated"/>
+ <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.1387065609" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.value.o3" valueType="enumerated"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols.1140577567" name="Define symbols (-D)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols" useByScannerDiscovery="false" valueType="definedSymbols">
<listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
<listOptionValue builtIn="false" value="STM32"/>
@@ -190,11 +188,9 @@
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script.1591791336" name="Linker Script (-T)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" useByScannerDiscovery="false" value="${workspace_loc:/${ProjName}/STM32WB55CGUX_FLASH.ld}" valueType="string"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.directories.1616628260" name="Library search path (-L)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.directories" 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 IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.libraries.556131696" name="Libraries (-l)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.libraries" useByScannerDiscovery="false" valueType="libs">
<listOptionValue builtIn="false" value=":libBle_Mesh_CM4_GCC.a"/>
- <listOptionValue builtIn="false" value=":STM32CryptographicV3.1.3_CM4_GCC.a"/>
</option>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input.862521785" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input">
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32CubeIDE/.project b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32CubeIDE/.project
index 739f79df4..8cd22cfce 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32CubeIDE/.project
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32CubeIDE/.project
@@ -232,11 +232,21 @@
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/app/appli_generic.c</locationURI>
</link>
<link>
+ <name>Application/STM32_WPAN/app/appli_generic_client.c</name>
+ <type>1</type>
+ <locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/app/appli_generic_client.c</locationURI>
+ </link>
+ <link>
<name>Application/STM32_WPAN/app/appli_light.c</name>
<type>1</type>
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/app/appli_light.c</locationURI>
</link>
<link>
+ <name>Application/STM32_WPAN/app/appli_light_client.c</name>
+ <type>1</type>
+ <locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/app/appli_light_client.c</locationURI>
+ </link>
+ <link>
<name>Application/STM32_WPAN/app/appli_light_lc.c</name>
<type>1</type>
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/app/appli_light_lc.c</locationURI>
@@ -257,6 +267,11 @@
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/app/appli_sensor.c</locationURI>
</link>
<link>
+ <name>Application/STM32_WPAN/app/appli_sensors_client.c</name>
+ <type>1</type>
+ <locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/app/appli_sensors_client.c</locationURI>
+ </link>
+ <link>
<name>Application/STM32_WPAN/app/appli_vendor.c</name>
<type>1</type>
<locationURI>$%7BPARENT-1-PROJECT_LOC%7D/STM32_WPAN/app/appli_vendor.c</locationURI>
@@ -322,11 +337,21 @@
<locationURI>$%7BPARENT-6-PROJECT_LOC%7D/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic.c</locationURI>
</link>
<link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/generic_client.c</name>
+ <type>1</type>
+ <locationURI>$%7BPARENT-6-PROJECT_LOC%7D/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/generic_client.c</locationURI>
+ </link>
+ <link>
<name>Middlewares/STM32_WPAN/ble/blesvc/light.c</name>
<type>1</type>
<locationURI>$%7BPARENT-6-PROJECT_LOC%7D/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light.c</locationURI>
</link>
<link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/light_client.c</name>
+ <type>1</type>
+ <locationURI>$%7BPARENT-6-PROJECT_LOC%7D/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_client.c</locationURI>
+ </link>
+ <link>
<name>Middlewares/STM32_WPAN/ble/blesvc/light_lc.c</name>
<type>1</type>
<locationURI>$%7BPARENT-6-PROJECT_LOC%7D/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/light_lc.c</locationURI>
@@ -347,6 +372,11 @@
<locationURI>$%7BPARENT-6-PROJECT_LOC%7D/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors.c</locationURI>
</link>
<link>
+ <name>Middlewares/STM32_WPAN/ble/blesvc/sensors_client.c</name>
+ <type>1</type>
+ <locationURI>$%7BPARENT-6-PROJECT_LOC%7D/Middlewares/ST/STM32_WPAN/ble/mesh/MeshModel/Src/sensors_client.c</locationURI>
+ </link>
+ <link>
<name>Middlewares/STM32_WPAN/ble/blesvc/svc_ctl.c</name>
<type>1</type>
<locationURI>$%7BPARENT-6-PROJECT_LOC%7D/Middlewares/ST/STM32_WPAN/ble/svc/Src/svc_ctl.c</locationURI>
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
index 2550466f7..76861a0e5 100644
--- 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
@@ -18,6 +18,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "main.h"
@@ -35,7 +36,7 @@
#include "types.h"
#include "ble_mesh.h"
-#include "appli_mesh.h"
+//#include "appli_mesh.h"
#include "mesh_cfg.h"
/* Private includes ----------------------------------------------------------*/
@@ -296,7 +297,10 @@ void APP_BLE_Init( void )
/**
* Starts the BLE Stack on CPU2
*/
- SHCI_C2_BLE_Init( &ble_init_cmd_packet );
+ if (SHCI_C2_BLE_Init( &ble_init_cmd_packet ) != SHCI_Success)
+ {
+ Error_Handler();
+ }
/**
* Initialization of HCI & GATT & GAP layer
@@ -329,6 +333,7 @@ void APP_BLE_Init( void )
SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
{
+ /* callback of mesh Library to receive all GAP/GATT events*/
HCI_Event_CB(pckt);
#if (LOW_POWER_FEATURE == 1)
@@ -479,12 +484,11 @@ static void Ble_Hci_Gap_Gatt_Init(void){
* 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;
+ 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;
@@ -492,13 +496,13 @@ static void Ble_Hci_Gap_Gatt_Init(void){
aci_gap_set_authentication_requirement(BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode,
BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode,
- 0,
- 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
);
/**
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
index 578a6f4bf..3b7fce7a2 100644
--- 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
@@ -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
@@ -24,6 +24,7 @@
#include "appli_generic.h"
#include "appli_light.h"
#include "common.h"
+#include "mesh_cfg.h"
#include "mesh_cfg_usr.h"
#include "appli_nvm.h"
#include "config_client.h"
@@ -58,6 +59,10 @@
#define NUM_VENDOR_MODELS_TO_PUBLISH 0
#define NUM_VENDOR_MODELS_TO_BIND_APP 0
+/******************************************************************************/
+#if defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER)
+/******************************************************************************/
+
const MOBLEUINT8 aConfigAppKeyDefault[19]=
{ /* NetKeyIndexAndAppKeyIndex : 3B
Index of the NetKey and index of the AppKey*/
@@ -88,51 +93,6 @@ 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,
@@ -618,7 +578,7 @@ const MODEL_CONFIG_CLIENT_OpcodeTableParam_t ConfigClient_MessageOpcodes_Table[]
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
+ /* { OPCODE_HEALTH_PERIOD_STATUS 0x8037 */
@@ -732,6 +692,8 @@ 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 ---------------------------------------------------------*/
/**
@@ -1478,10 +1440,10 @@ MOBLE_RESULT AppliConfigClient_SelfPublicationSetDefault (void)
MOBLEUINT8 elementIndex;
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
- for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ for (elementIndex=0; elementIndex < APPLICATION_NUMBER_OF_ELEMENTS; elementIndex++ )
{
/*Checking for SIG Models*/
- for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
+ for (MOBLEUINT8 index=0; index < APPLICATION_SIG_MODELS_MAX_COUNT; index++)
{
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1492,6 +1454,14 @@ MOBLE_RESULT AppliConfigClient_SelfPublicationSetDefault (void)
{
break;
}
+ else if (MODEL_IS_FOUNDATION_MODEL(modelIdentifier))
+ {
+ /* If Model is Foundation Model, then it doesnt need to be
+ added for Publishing */
+
+ /* Do NOTHING, let the next Model be picked */
+ }
+
else
{
ConfigClient_PublicationSet(elementAddress,
@@ -1507,7 +1477,7 @@ MOBLE_RESULT AppliConfigClient_SelfPublicationSetDefault (void)
}
/*Checking for VENDOR Models*/
- for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
+ for (MOBLEUINT8 index=0; index < APPLICATION_VENDOR_MODELS_MAX_COUNT; index++)
{
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1551,10 +1521,10 @@ MOBLE_RESULT AppliConfigClient_SelfSubscriptionSetDefault (void)
MOBLEUINT16 address = DEFAULT_GROUP_ADDR;
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
- for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ for (elementIndex=0; elementIndex < APPLICATION_NUMBER_OF_ELEMENTS; elementIndex++ )
{
/*Checking for SIG Models*/
- for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
+ for (MOBLEUINT8 index=0; index < APPLICATION_SIG_MODELS_MAX_COUNT; index++)
{
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1566,6 +1536,13 @@ MOBLE_RESULT AppliConfigClient_SelfSubscriptionSetDefault (void)
{
break;
}
+ else if (MODEL_IS_FOUNDATION_MODEL(modelIdentifier))
+ {
+ /* If Model is Foundation Model, then it doesnt need to be
+ Subscribed */
+
+ /* Do NOTHING, let the next Model be picked */
+ }
else
{
ConfigClient_SubscriptionAdd (elementAddress, address, modelIdentifier);
@@ -1573,7 +1550,7 @@ MOBLE_RESULT AppliConfigClient_SelfSubscriptionSetDefault (void)
}
/*Checking for Vendor Models*/
- for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
+ for (MOBLEUINT8 index=0; index < APPLICATION_VENDOR_MODELS_MAX_COUNT; index++)
{
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1610,10 +1587,10 @@ MOBLE_RESULT Appli_ConfigClient_SelfDefaultAppKeyBind (void)
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
appKeyIndex = DEFAULT_APPKEY_INDEX;
- for (elementIndex=0; elementIndex < MAX_ELEMENTS_PER_NODE; elementIndex++ )
+ for (elementIndex=0; elementIndex < APPLICATION_NUMBER_OF_ELEMENTS; elementIndex++ )
{
/*Checking for SIG Models*/
- for (MOBLEUINT8 index=0; index < MAX_SIG_MODELS_PER_ELEMENT; index++)
+ for (MOBLEUINT8 index=0; index < APPLICATION_SIG_MODELS_MAX_COUNT; index++)
{
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1624,6 +1601,13 @@ MOBLE_RESULT Appli_ConfigClient_SelfDefaultAppKeyBind (void)
{
break;
}
+ else if (MODEL_IS_FOUNDATION_MODEL(modelIdentifier))
+ {
+ /* If Model is Foundation Model, then it doesnt need to be binded
+ with AppKey */
+
+ /* Do NOTHING, let the next Model be picked */
+ }
else
{
ConfigClient_ModelAppBind (elementAddress, appKeyIndex, modelIdentifier);
@@ -1631,7 +1615,7 @@ MOBLE_RESULT Appli_ConfigClient_SelfDefaultAppKeyBind (void)
}
/*Checking for VENDOR Models*/
- for (MOBLEUINT8 index=0; index < MAX_VENDOR_MODELS_PER_ELEMENT; index++)
+ for (MOBLEUINT8 index=0; index < APPLICATION_VENDOR_MODELS_MAX_COUNT; index++)
{
elementAddress = BLEMesh_GetAddress();
elementAddress += elementIndex;
@@ -1741,7 +1725,6 @@ MOBLEUINT16 GetSIGModelToBindApp(MOBLEUINT8 elementIndex,
MOBLEUINT8 numberOfModels)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
MOBLEUINT16 model_id;
MOBLEUINT8 index;
MOBLEUINT8 idxSIG = *pModelIndex;
@@ -1762,9 +1745,7 @@ MOBLEUINT16 GetSIGModelToBindApp(MOBLEUINT8 elementIndex,
*pModelIndex = index;
return model_id;
-#else
- return aSigModelsToBind[idxSIG][elementIdx] ;
-#endif
+
}
@@ -1777,11 +1758,7 @@ MOBLEUINT16 GetSIGModelToBindApp(MOBLEUINT8 elementIndex,
*/
MOBLEUINT32 GetVendorModelToBindApp(MOBLEUINT8 elementIndex, MOBLEUINT8 indexModels)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].aVendorModels[indexModels];
-#else
- return VENDORMODEL_STMICRO_ID1 ;
-#endif
}
/**
@@ -1792,11 +1769,7 @@ MOBLEUINT32 GetVendorModelToBindApp(MOBLEUINT8 elementIndex, MOBLEUINT8 indexMod
*/
MOBLEUINT8 GetCountSIGModelToBindApp(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumSIGmodels;
-#else
- return sizeof(aSigModelsToBind)/sizeof(MOBLEUINT16);
-#endif
}
@@ -1807,11 +1780,7 @@ MOBLEUINT8 GetCountSIGModelToBindApp(MOBLEUINT8 elementIndex)
*/
MOBLEUINT8 GetCountVendorModelToBindApp(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumVendorModels;
-#else
- return NUM_VENDOR_MODELS_TO_BIND_APP;
-#endif
}
@@ -1827,13 +1796,9 @@ MOBLEUINT16 GetSIGModelToPublish(MOBLEUINT8 elementIndex,
MOBLEUINT8 numberOfModels)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return GetSIGModelToBindApp(elementIndex,
pModelIndex,
numberOfModels);
-#else
- return aPublishModels[idxSIG] ;
-#endif
}
@@ -1845,11 +1810,7 @@ MOBLEUINT16 GetSIGModelToPublish(MOBLEUINT8 elementIndex,
*/
MOBLEUINT32 GetVendorModelToPublish(MOBLEUINT8 elementIndex, MOBLEUINT8 idxSIG)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].aVendorModels[idxSIG];
-#else
- return VENDORMODEL_STMICRO_ID1 ;
-#endif
}
@@ -1860,11 +1821,7 @@ MOBLEUINT32 GetVendorModelToPublish(MOBLEUINT8 elementIndex, MOBLEUINT8 idxSIG)
*/
MOBLEUINT8 GetCountSIGModelToPublish(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumSIGmodels;
-#else
- return sizeof(aPublishModels)/sizeof(MOBLEUINT16);
-#endif
}
@@ -1875,11 +1832,7 @@ MOBLEUINT8 GetCountSIGModelToPublish(MOBLEUINT8 elementIndex)
*/
MOBLEUINT8 GetCountVendorModelToPublish(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumVendorModels;
-#else
- return NUM_VENDOR_MODELS_TO_PUBLISH;
-#endif
}
@@ -1894,13 +1847,9 @@ MOBLEUINT16 GetSIGModelToSubscribe(MOBLEUINT8 elementIndex,
MOBLEUINT8 *pModelIndex,
MOBLEUINT8 numberOfModels)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return GetSIGModelToBindApp(elementIndex,
pModelIndex,
numberOfModels);
-#else
- return aSubscribeModels[idxSIG] ;
-#endif
}
@@ -1914,11 +1863,7 @@ MOBLEUINT16 GetSIGModelToSubscribe(MOBLEUINT8 elementIndex,
MOBLEUINT32 GetVendorModelToSubscribe(MOBLEUINT8 elementIndex,
MOBLEUINT8 idxSIG)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].aVendorModels[idxSIG];
-#else
- return VENDORMODEL_STMICRO_ID1 ;
-#endif
}
@@ -1929,11 +1874,7 @@ MOBLEUINT32 GetVendorModelToSubscribe(MOBLEUINT8 elementIndex,
*/
MOBLEUINT8 GetCountSIGModelToSubscribe(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumSIGmodels;
-#else
- return sizeof(aSubscribeModels)/sizeof(MOBLEUINT16);
-#endif
}
@@ -1945,11 +1886,7 @@ MOBLEUINT8 GetCountSIGModelToSubscribe(MOBLEUINT8 elementIndex)
*/
MOBLEUINT8 GetCountVendorModelToSubscribe(MOBLEUINT8 elementIndex)
{
-#ifdef CONFIGURE_AS_PER_COMPOSITION_DATA
return aNodeElements[elementIndex].NumVendorModels;
-#else
- return NUM_VENDOR_MODELS_TO_SUBSCRIBE;
-#endif
}
@@ -1965,6 +1902,9 @@ MOBLEUINT8 AppliConfigClient_SendMessageDefault(MOBLEUINT8 elementIdx)
return NUM_VENDOR_MODELS_TO_SUBSCRIBE;
}
+/******************************************************************************/
+#endif /* defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER) */
+/******************************************************************************/
/**
* @}
@@ -1974,5 +1914,5 @@ MOBLEUINT8 AppliConfigClient_SendMessageDefault(MOBLEUINT8 elementIdx)
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 34169448c..b380cf636 100644
--- 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
@@ -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
@@ -26,7 +26,7 @@
#include "generic.h"
#include "mesh_cfg.h"
#include "config_client.h"
-
+#include "mesh_cfg_usr.h"
/* Exported macro ------------------------------------------------------------*/
#define MAX_CONFIG_PARAM_SIZE 22
@@ -35,6 +35,9 @@
/* Exported variables ------------------------------------------------------- */
/* Application Variable-------------------------------------------------------*/
/* Exported Functions Prototypes ---------------------------------------------*/
+
+#if defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER)
+
MOBLE_RESULT Appli_ConfigClient_Init(void);
MOBLE_RESULT Appli_ConfigClient_Process(void);
MOBLE_RESULT Appli_ConfigClient_ConfigureNode(void);
@@ -82,8 +85,9 @@ MOBLEUINT8 GetCountSIGModelToPublish(MOBLEUINT8 elementIdx);
MOBLEUINT8 GetCountVendorModelToPublish(MOBLEUINT8 elementIdx);
+#endif /*defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER) */
#endif /* __APPLI_CONFIG_CLIENT_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 0ecaea465..c5d21b225 100644
--- 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
@@ -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
@@ -50,16 +50,21 @@ 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;
+
+Appli_Generic_OnOffSet AppliOnOffSet[APPLICATION_NUMBER_OF_ELEMENTS];
+Appli_Generic_LevelSet AppliLevelSet[APPLICATION_NUMBER_OF_ELEMENTS];
+Appli_Generic_PowerOnOffSet AppliPowerOnSet[APPLICATION_NUMBER_OF_ELEMENTS];
+Appli_Generic_DefaultTransitionSet AppliDefaultTransitionSet[APPLICATION_NUMBER_OF_ELEMENTS];
/* 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);
+MOBLE_RESULT Appli_Generic_LevelDelta_Set(Generic_LevelStatus_t* pdeltalevelParam,
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_LevelMove_Set(Generic_LevelStatus_t* pdeltaMoveParam,
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
/* Private functions ---------------------------------------------------------*/
/******************************************************************************/
@@ -71,43 +76,57 @@ MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t* pdeltalevelParam,
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t* pGeneric_OnOffParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- AppliOnOffSet.Present_OnOff = pGeneric_OnOffParam->Present_OnOff_State;
- AppliOnOffSet.Present_OnOffValue = pGeneric_OnOffParam->Present_OnOff_Value;
-
+ /*User need to modify the parameters as per the number of elements per node*/
+ AppliOnOffSet[elementIndex].Present_OnOff = pGeneric_OnOffParam->Present_OnOff_State;
+ AppliOnOffSet[elementIndex].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.
- */
+ /* 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;
+ Appli_LightPwmValue.IntensityValue = AppliOnOffSet[elementIndex].Present_OnOffValue;
Light_UpdateLedValue(LOAD_STATE ,Appli_LightPwmValue);
- if(AppliOnOffSet.Present_OnOff == APPLI_LED_ON)
+
+ #if 0 /* EME */
+ if(AppliOnOffSet[elementIndex].Present_OnOff == APPLI_LED_ON)
{
- AppliOnOffSet.TargetValue = PWM_TIME_PERIOD;
+ AppliOnOffSet[elementIndex].TargetValue = PWM_TIME_PERIOD;
}
else
{
- AppliOnOffSet.TargetValue = APPLI_LED_OFF;
+ AppliOnOffSet[elementIndex].TargetValue = APPLI_LED_OFF;
}
+ #else
+ AppliOnOffSet[elementIndex].TargetValue = pGeneric_OnOffParam->Target_OnOff;
+ #endif /* EME */
- if(AppliOnOffSet.Present_OnOffValue > 16000)
- {
- BSP_LED_On(LED_BLUE);
- }
- else
+ if(AppliOnOffSet[elementIndex].Present_OnOffValue == AppliOnOffSet[elementIndex].TargetValue)
{
- BSP_LED_Off(LED_BLUE);
+ if(AppliOnOffSet[elementIndex].Present_OnOffValue > 0)
+ {
+ BSP_LED_On(LED_BLUE);
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+ }
}
}
else
{
- if((AppliOnOffSet.Present_OnOff == APPLI_LED_ON) && (OptionalValid == NO_TRANSITION))
+ if((AppliOnOffSet[elementIndex].Present_OnOff == APPLI_LED_ON) && (OptionalValid == NO_TRANSITION))
{
Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
@@ -120,18 +139,15 @@ MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t* pGeneric_OnOffParam,
BSP_LED_Off(LED_BLUE);
}
}
+
+ TRACE_M(TF_GENERIC,"Generic_OnOff_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8202%02hx!\n\r",AppliOnOffSet[elementIndex].Present_OnOff);
- TRACE_M(TF_SERIAL_CTRL,"#8202%02hx!\n\r",AppliOnOffSet.Present_OnOff);
+ NvmStatePowerFlag_Set(GENERIC_ON_OFF_NVM_FLAG, elementIndex);
- /* set the flag value for NVM store */
- RestoreFlag = GENERIC_ON_OFF_NVM_FLAG;
-
- AppliNvm_SaveMessageParam();
-
return MOBLE_RESULT_SUCCESS;
}
-
/******************************************************************************/
#endif /* #ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF */
/******************************************************************************/
@@ -142,15 +158,20 @@ MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t* pGeneric_OnOffParam,
* when Generic OnOff message is received
* @param pOnOff_status: Pointer to the parameters received for message
* @param plength: length of the data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUINT32 plength)
+MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
MOBLEUINT8 i;
- TRACE_M(TF_GENERIC,"Appli_Generic_OnOff_Status callback received \r\n");
+ TRACE_M(TF_GENERIC,"Generic_OnOff_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8204!\r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8204! \n\r");
for(i = 0; i < plength; i++)
{
if(i == 0)
@@ -164,6 +185,7 @@ MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUI
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_GENERIC_MODEL_SERVER_LEVEL
/******************************************************************************/
@@ -173,21 +195,26 @@ MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status, MOBLEUI
* when Generic Level message is received
* @param plevelParam: Pointer to the parameters message
* @param OptionalValid: Flag to inform about the validity of optional parameters
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t* plevelParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid,MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
MOBLEUINT16 duty;
static MOBLEUINT16 previousIntensity = 0;
- AppliLevelSet.Present_Level16= plevelParam->Present_Level16;
- if(AppliLevelSet.Present_Level16 <= 0)
+ AppliLevelSet[elementIndex].Present_Level16= plevelParam->Present_Level16;
+ if(AppliLevelSet[elementIndex].Present_Level16 <= 0)
{
- AppliLevelSet.Present_Level16 = 0;
+ AppliLevelSet[elementIndex].Present_Level16 = 0;
}
- IntensityValue = AppliLevelSet.Present_Level16;
+ IntensityValue = AppliLevelSet[elementIndex].Present_Level16;
if(((IntensityValue > previousIntensity) && (IntensityValue <PWM_TIME_PERIOD)) ||
IntensityValue == INTENSITY_LEVEL_ZERO)
@@ -200,49 +227,42 @@ MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t* plevelParam,
}
previousIntensity = IntensityValue;
- if(AppliLevelSet.Present_Level16 < 0x00)
+ if(AppliLevelSet[elementIndex].Present_Level16 < 0x00)
{
- AppliLevelSet.Present_Level16 = 0;
+ AppliLevelSet[elementIndex].Present_Level16 = 0;
}
- duty = PwmValueMapping(AppliLevelSet.Present_Level16 , 0x7FFF ,0x0000);
+ duty = PwmValueMapping(AppliLevelSet[elementIndex].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);
- }
+ TRACE_M(TF_GENERIC,"Generic_Level_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8206!\r\n");
+ NvmStatePowerFlag_Set(GENERIC_LEVEL_NVM_FLAG, elementIndex);
+
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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t* pdeltalevelParam,
- MOBLEUINT8 OptionalValid)
+MOBLE_RESULT Appli_Generic_LevelDelta_Set(Generic_LevelStatus_t* pdeltalevelParam,
+ MOBLEUINT8 OptionalValid,MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-
- AppliLevelSet.Present_Level16 = pdeltalevelParam->Present_Level16;
+ AppliLevelSet[elementIndex].Present_Level16 = pdeltalevelParam->Present_Level16;
/* For demo, if Level is more than 50, switch ON the LED */
- if (AppliLevelSet.Present_Level16 >= 50)
+ if (AppliLevelSet[elementIndex].Present_Level16 >= 50)
{
Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
@@ -253,32 +273,43 @@ MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t* pdeltalevelParam,
Light_UpdateLedValue(RESET_STATE , Appli_LightPwmValue);
BSP_LED_Off(LED_BLUE);
}
- TRACE_M(TF_SERIAL_CTRL,"#8206!\n\r");
+
+ TRACE_M(TF_GENERIC,"Generic_LevelDelta_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8209!\r\n");
+
return MOBLE_RESULT_SUCCESS;
}
/**
-* @brief Appli_Generic_Move_Set: This function is callback for Application
+* @brief Appli_Generic_LevelMove_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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
- MOBLEUINT8 OptionalValid)
+MOBLE_RESULT Appli_Generic_LevelMove_Set(Generic_LevelStatus_t* pdeltaMoveParam,
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- AppliLevelSet.Last_delta_level = pdeltaMoveParam->Last_delta_level;
- AppliLevelSet.Last_Level_TID = pdeltaMoveParam->Last_Level_TID;
- AppliLevelSet.Last_Present_Level16 = pdeltaMoveParam->Last_Present_Level16;
- AppliLevelSet.Present_Level16 = pdeltaMoveParam->Present_Level16;
- AppliLevelSet.RemainingTime = pdeltaMoveParam->RemainingTime;
- AppliLevelSet.Target_Level16 = pdeltaMoveParam->Target_Level16;
+// if(OptionalValid == 1)
+// {
+ AppliLevelSet[elementIndex].Last_delta_level = pdeltaMoveParam->Last_delta_level;
+ AppliLevelSet[elementIndex].Last_Level_TID = pdeltaMoveParam->Last_Level_TID;
+ AppliLevelSet[elementIndex].Last_Present_Level16 = pdeltaMoveParam->Last_Present_Level16;
+ AppliLevelSet[elementIndex].Present_Level16 = pdeltaMoveParam->Present_Level16;
+ AppliLevelSet[elementIndex].RemainingTime = pdeltaMoveParam->RemainingTime;
+ AppliLevelSet[elementIndex].Target_Level16 = pdeltaMoveParam->Target_Level16;
+// }
- TRACE_M(TF_SERIAL_CTRL,"#8206!\n\r");
-
- return MOBLE_RESULT_SUCCESS;
+ TRACE_M(TF_GENERIC,"Generic_LevelMove_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#820B! \r\n");
+ return MOBLE_RESULT_SUCCESS;
}
@@ -291,39 +322,45 @@ MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
* when Generic Level Move message is received
* @param plevel_status: Pointer to the parameters message
* @param plength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Generic_Level_Status(MOBLEUINT8 const *plevel_status,
- MOBLEUINT32 plength)
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT8 i;
MOBLEUINT8 level = 0;
-#endif
-
- TRACE_M(TF_GENERIC,"Generic_Level_Status callback received \r\n");
+#endif
- TRACE_M(TF_SERIAL_CTRL,"#8208! \n\r");
+ TRACE_M(TF_GENERIC,"Generic_Level_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8208! \r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < plength; i++)
{
if((i == 0) || (i == 2))
level = plevel_status[i];
else if(i == 1)
- TRACE_M(TF_GENERIC,"Present Level value: %d\n\r",
+ TRACE_M(TF_SERIAL_CTRL,"Present Level value: %d\n\r",
(plevel_status[i]<<8)|level);
else if(i == 3)
- TRACE_M(TF_GENERIC,"Target Level value: %d\n\r",
+ TRACE_M(TF_SERIAL_CTRL,"Target Level value: %d\n\r",
(plevel_status[i]<<8)|level);
else if(i == 4)
- TRACE_M(TF_GENERIC,"Remaining Time value: %d\n\r", plevel_status[i]);
+ TRACE_M(TF_SERIAL_CTRL,"Remaining Time value: %d\n\r", plevel_status[i]);
}
-#endif
+#endif
+
return MOBLE_RESULT_SUCCESS;
}
-
+
/******************************************************************************/
#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF
/******************************************************************************/
@@ -333,17 +370,26 @@ MOBLE_RESULT Appli_Generic_Level_Status(MOBLEUINT8 const *plevel_status,
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Generic_PowerOnOff_Set(Generic_PowerOnOffParam_t* pPowerOnOffParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- AppliPowerOnSet.PowerOnState = pPowerOnOffParam->PowerOnOffState;
-
- TRACE_M(TF_SERIAL_CTRL,"#8213!\n\r");
+ AppliPowerOnSet[elementIndex].PowerOnState = pPowerOnOffParam->PowerOnOffState;
+
+ TRACE_M(TF_GENERIC,"Generic_PowerOnOff_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8213!\r\n");
- /* set the flag value for NVM store */
- //RestoreFlag = GENERIC_ON_OFF_NVM_FLAG;
+ if(AppliPowerOnSet[elementIndex].PowerOnState == GENERIC_POWER_ON_STATE)
+ {
+ /* set the flag value for NVM store */
+ RestoreFlag = GENERIC_ON_OFF_NVM_FLAG;
+ }
AppliNvm_SaveMessageParam();
@@ -359,17 +405,20 @@ MOBLE_RESULT Appli_Generic_PowerOnOff_Set(Generic_PowerOnOffParam_t* pPowerOnOff
* when Generic Power on off set message is received
* @param powerOnOff_status: Pointer to the parameters message
* @param plength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status ,
- MOBLEUINT32 plength)
+MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status,\
+ MOBLEUINT32 plength, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
MOBLEUINT8 i;
- TRACE_M(TF_GENERIC,"Generic_PowerOnOff_Status callback received \r\n");
+ TRACE_M(TF_GENERIC,"Generic_PowerOnOff_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8212!\r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8212! \n\r");
-
for(i = 0; i < plength; i++)
{
if(i == 0)
@@ -390,37 +439,43 @@ MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Set(Generic_DefaultTransitionParam_t* pDefaultTimeParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- AppliDefaultTransitionSet.DefaultTransitionTime = pDefaultTimeParam->DefaultTransitionTime;
+ AppliDefaultTransitionSet[elementIndex].DefaultTransitionTime = pDefaultTimeParam->DefaultTransitionTime;
+ TRACE_M(TF_GENERIC,"Generic_DefaultTransitionTime_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#820E!\r\n");
return MOBLE_RESULT_SUCCESS;
}
-
/******************************************************************************/
#endif /* ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME */
/******************************************************************************/
-
/**
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status ,
- MOBLEUINT32 plength)
+MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status , MOBLEUINT32 plength,MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_GENERIC,"Generic_DefaultTransitionTime_Status callback received \r\n");
-
- TRACE_M(TF_SERIAL_CTRL,"#8210! \n\r");
+ TRACE_M(TF_GENERIC,"Generic_DefaultTransitionTime_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8210!\r\n");
return MOBLE_RESULT_SUCCESS;
}
@@ -431,83 +486,99 @@ MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTrans
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_GetOnOffStatus(MOBLEUINT8* pOnOff_Status)
+MOBLE_RESULT Appli_Generic_GetOnOffStatus(MOBLEUINT8* pOnOff_Status,MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- *pOnOff_Status = AppliOnOffSet.Present_OnOff;
- TRACE_M(TF_SERIAL_CTRL,"Generic Get OnOff Status: Status %d!\n\r",
- AppliOnOffSet.Present_OnOff);
-
+ *pOnOff_Status = AppliOnOffSet[elementIndex].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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_GetOnOffValue(MOBLEUINT8* pOnOff_Value)
+MOBLE_RESULT Appli_Generic_GetOnOffValue(MOBLEUINT8* pOnOff_Value, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- *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);
+ *pOnOff_Value = AppliOnOffSet[elementIndex].Present_OnOffValue;
+ *(pOnOff_Value+1) = AppliOnOffSet[elementIndex].Present_OnOffValue >> 8;
+ *(pOnOff_Value+2) = AppliOnOffSet[elementIndex].TargetValue;
+ *(pOnOff_Value+3) = AppliOnOffSet[elementIndex].TargetValue >> 8;
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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_GetLevelStatus(MOBLEUINT8* pLevel_Status)
+MOBLE_RESULT Appli_Generic_GetLevelStatus(MOBLEUINT8* pLevel_Status, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- *pLevel_Status = AppliLevelSet.Present_Level16;
- *(pLevel_Status+1) = AppliLevelSet.Present_Level16 >> 8;
- *(pLevel_Status+2) = AppliLevelSet.Target_Level16;
- *(pLevel_Status+3) = AppliLevelSet.Target_Level16 >> 8;
-// TRACE_M(TF_SERIAL_CTRL,"Generic Get Level Status: Value %d!\n\r",
-// *pLevel_Status);
+ *pLevel_Status = AppliLevelSet[elementIndex].Present_Level16;
+ *(pLevel_Status+1) = AppliLevelSet[elementIndex].Present_Level16 >> 8;
+ *(pLevel_Status+2) = AppliLevelSet[elementIndex].Target_Level16;
+ *(pLevel_Status+3) = AppliLevelSet[elementIndex].Target_Level16 >> 8;
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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_GetPowerOnOffStatus(MOBLEUINT8* pPower_Status)
+MOBLE_RESULT Appli_Generic_GetPowerOnOffStatus(MOBLEUINT8* pPower_Status, MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- *pPower_Status = AppliPowerOnSet.PowerOnState;
- TRACE_M(TF_SERIAL_CTRL,"Generic Get OnOff Status: Status %d!\n\r",
- AppliPowerOnSet.PowerOnState);
+
+ *pPower_Status = AppliPowerOnSet[elementIndex].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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_Status)
+MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_Status,MOBLEUINT16 dstPeer, MOBLEUINT8 elementIndex)
{
- *pTransition_Status = AppliDefaultTransitionSet.DefaultTransitionTime;
- TRACE_M(TF_SERIAL_CTRL,"Get Default Transition Status: Status %d!\n\r",
- AppliDefaultTransitionSet.DefaultTransitionTime);
+
+ *pTransition_Status = AppliDefaultTransitionSet[elementIndex].DefaultTransitionTime;
return MOBLE_RESULT_SUCCESS;
}
+
/**
* @}
*/
@@ -516,5 +587,5 @@ MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_St
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 992baad9b..370769608 100644
--- 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
@@ -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
@@ -86,35 +86,72 @@ typedef struct
/* Exported Functions Prototypes ---------------------------------------------*/
-MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t*, MOBLEUINT8);
+MOBLE_RESULT Appli_Generic_OnOff_Set(Generic_OnOffStatus_t*,
+ MOBLEUINT8,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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 );
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_Level_Set(Generic_LevelStatus_t*,
+ MOBLEUINT8,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_Delta_Set(Generic_LevelStatus_t*,
+ MOBLEUINT8,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_Move_Set(Generic_LevelStatus_t* pdeltaMoveParam,
- MOBLEUINT8 OptionalValid);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_Level_Status(MOBLEUINT8 const *plevel_status,
- MOBLEUINT32 plength);
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_PowerOnOff_Set(Generic_PowerOnOffParam_t* pPowerOnOffParam,
- MOBLEUINT8 OptionalValid);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_PowerOnOff_Status(MOBLEUINT8 const *powerOnOff_status ,
- MOBLEUINT32 plength);
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Set(Generic_DefaultTransitionParam_t* pDefaultTimeParam,
- MOBLEUINT8 OptionalValid);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_DefaultTransitionTime_Status(MOBLEUINT8 const *pTransition_status ,
- MOBLEUINT32 plength);
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
-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_GetOnOffStatus(MOBLEUINT8* pOnOff_Status,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_GetOnOffValue(MOBLEUINT8* pOnOff_Value,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_GetLevelStatus(MOBLEUINT8* pLevel_Status,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_GetPowerOnOffStatus(MOBLEUINT8* pLevel_Status,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Generic_Restore_PowerOn_Value(MOBLEUINT8 restoreValue,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Generic_GetDefaultTransitionStatus(MOBLEUINT8* pTransition_Status,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
MOBLE_RESULT Appli_Generic_OnOff_Status(MOBLEUINT8 const *pOnOff_status,
- MOBLEUINT32 plength);
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
#endif /* __APPLI_GENERIC_H */
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index aecd5575e..317071a1c 100644
--- 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
@@ -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
@@ -41,58 +41,166 @@
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
-
-MOBLEUINT8 Led_Value;
/* Private function prototypes -----------------------------------------------*/
-MOBLE_RESULT Appli_GenericClient_OnOff_Set(void);
-/* Private functions ---------------------------------------------------------*/
+
+/* Private functions ---------------------------------------------------------*/
/**
-* @brief Appli_Generic_OnOff_Set: This function is callback for Application
-* when Generic OnOff message is called
-* @param void
+* @brief Appli_GenericClient_API: This function is a Wrapper to call Generic Client API depending on opcode received in input
+* @param elementIndex: Index of the element
+* @param msg_opcode: opcode of the desired API
+* @param msg_params: buffer containing the desired API parameters
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_GenericClient_OnOff_Set(void)
+MOBLE_RESULT Appli_GenericClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8 *msg_params)
{
- 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;
-}
-
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+ switch(msg_opcode){
/******************************************************************************/
-#ifdef ENABLE_GENERIC_MODEL_CLIENT_LEVEL
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_ONOFF
/******************************************************************************/
-
-/**
-* @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));
+ case GENERIC_ON_OFF_GET:
+ {
+ result = GenericClient_OnOff_Get(elementIndex);
+ break;
+ }
+ case GENERIC_ON_OFF_SET_ACK:
+ {
+ result = GenericClient_OnOff_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_OnOffParam_t) );
+ break;
+ }
+ case GENERIC_ON_OFF_SET_UNACK:
+ {
+ result = GenericClient_OnOff_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_OnOffParam_t) );
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_GENERIC_MODEL_CLIENT_ONOFF */
+/******************************************************************************/
- return MOBLE_RESULT_SUCCESS;
-}
+/******************************************************************************/
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_LEVEL
+/******************************************************************************/
+ case GENERIC_LEVEL_GET:
+ {
+ result = GenericClient_Level_Get(elementIndex);
+ break;
+ }
+ case GENERIC_LEVEL_SET_ACK:
+ {
+ result = GenericClient_Level_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_LevelParam_t));
+ break;
+ }
+ case GENERIC_LEVEL_SET_UNACK:
+ {
+ result = GenericClient_Level_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_LevelParam_t));
+ break;
+ }
+ case GENERIC_DELTA_SET:
+ {
+
+ result = GenericClient_Delta_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_DeltaLevelParam_t));
+ break;
+ }
+ case GENERIC_DELTA_SET_UNACK:
+ {
+ result = GenericClient_Delta_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_DeltaLevelParam_t));
+ break;
+ }
+ case GENERIC_MOVE_SET:
+ {
+ result = GenericClient_Move_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_LevelMoveParam_t));
+ break;
+ }
+ case GENERIC_MOVE_SET_UNACK:
+ {
+ result = GenericClient_Move_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_LevelMoveParam_t));
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_GENERIC_MODEL_CLIENT_LEVEL */
+/******************************************************************************/
/******************************************************************************/
-#endif /* #ifdef ENABLE_GENERIC_MODEL_CLIENT_LEVEL */
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_POWER_ONOFF
/******************************************************************************/
+ case GENERIC_POWER_ON_OFF_GET:
+ {
+ GenericClient_PowerOnOff_Get(elementIndex);
+ break;
+ }
+ case GENERIC_POWER_ON_OFF_SET:
+ {
+ result = GenericClient_PowerOnOff_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_PowerOnOffParam_t));
+ break;
+ }
+ case GENERIC_POWER_ON_OFF_SET_UNACK:
+ {
+ result = GenericClient_PowerOnOff_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_PowerOnOffParam_t));
+ break;
+ }
+
+/******************************************************************************/
+#endif /* #ifdef ENABLE_GENERIC_MODEL_CLIENT_POWER_ONOFF */
+/******************************************************************************/
+
+/******************************************************************************/
+#ifdef ENABLE_GENERIC_MODEL_CLIENT_DEFAULT_TRANSITION_TIME
+/******************************************************************************/
+ case GENERIC_DEFAULT_TRANSITION_TIME_GET:
+ {
+ result = GenericClient_DefaultTransitionTime_Get(elementIndex);
+ break;
+ }
+
+ case GENERIC_DEFAULT_TRANSITION_TIME_SET:
+ {
+ result = GenericClient_DefaultTransitionTime_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Generic_DefaultTransitionParam_t));
+ break;
+ }
+
+ case GENERIC_DEFAULT_TRANSITION_TIME_SET_UNACK:
+ {
+ result = GenericClient_DefaultTransitionTime_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Generic_DefaultTransitionParam_t));
+ break;
+ }
+
+/******************************************************************************/
+#endif /* #ifdef ENABLE_GENERIC_MODEL_CLIENT_DEFAULT_TRANSITION_TIME */
+/******************************************************************************/
+
+ default:
+ {
+ TRACE_M(TF_GENERIC, "OpCode value invalid %d \r\n", msg_opcode);
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+ return result;
+}
/**
* @}
@@ -102,5 +210,5 @@ MOBLE_RESULT Appli_GenericClient_Level_Set_Unack(void)
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 742fd1e68..c56fd5a9e 100644
--- 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
@@ -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
@@ -32,12 +32,12 @@
/* 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);
+MOBLE_RESULT Appli_GenericClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8 *msg_params);
+
#endif /* __APPLI_GENERIC_CLIENT_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 318929ffc..19face0da 100644
--- 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
@@ -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
@@ -41,7 +41,9 @@
* @{
*/
-MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState);
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
@@ -55,9 +57,8 @@ 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;
+Appli_Light_lightnessSet ApplilightnessSet[APPLICATION_NUMBER_OF_ELEMENTS] = {{1,0,0,0,0,0}};
+Appli_Light_lightnessLinearSet ApplilightnessLinearSet[APPLICATION_NUMBER_OF_ELEMENTS];
/******************************************************************************/
#endif /* #ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS */
@@ -70,10 +71,9 @@ 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;
+ Appli_Light_CtlSet AppliCtlSet[APPLICATION_NUMBER_OF_ELEMENTS];
+ Appli_Light_CtlTemperatureRangeSet AppliCtlTemperatureRangeSet[APPLICATION_NUMBER_OF_ELEMENTS];
+ Appli_Light_CtlDefaultSet AppliCtlDefaultSet[APPLICATION_NUMBER_OF_ELEMENTS];
/******************************************************************************/
#endif /* #ifdef ENABLE_LIGHT_MODEL_SERVER_CTL */
@@ -83,14 +83,11 @@ Appli_Light_CtlDefaultSet AppliCtlDefaultSet;
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;
+ Appli_Light_HslSet AppliHslSet[APPLICATION_NUMBER_OF_ELEMENTS];
+ Appli_Light_HslDefaultSet Appli_HslDefaultSet[APPLICATION_NUMBER_OF_ELEMENTS] = {{0x7FFF,0x7FFF,0x7FFF}};
+ Appli_Light_RGBSet Appli_RGBParam[APPLICATION_NUMBER_OF_ELEMENTS];
+ Appli_Light_HslRangeSet AppliHslRangeSet[APPLICATION_NUMBER_OF_ELEMENTS];
/*******************************************************************************/
#endif /*End of the LIGHTING HSL MODEL variables */
@@ -117,22 +114,28 @@ extern MOBLEUINT16 IntensityValue;
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_LightnessParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
MOBLEUINT16 duty;
static MOBLEUINT16 previousIntensity = 0;
- TRACE_M(TF_SERIAL_CTRL,"#824C!\n\r");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#824C!\r\n");
- ApplilightnessSet.PresentState16 = pLight_LightnessParam->LightnessPresentValue16;
- ApplilightnessSet.LastLightness16 = pLight_LightnessParam->LightnessLastStatus;
+ ApplilightnessSet[elementIndex].PresentState16 = pLight_LightnessParam->LightnessPresentValue16;
+ ApplilightnessSet[elementIndex].LastLightness16 = pLight_LightnessParam->LightnessLastStatus;
if(pLight_LightnessParam->LightnessPresentValue16 != 0x00)
{
- ApplilightnessSet.LastLightness16 = pLight_LightnessParam->LightnessPresentValue16;
+ ApplilightnessSet[elementIndex].LastLightness16 = pLight_LightnessParam->LightnessPresentValue16;
}
if(((IntensityValue > previousIntensity) && (IntensityValue <PWM_TIME_PERIOD)) ||
@@ -146,6 +149,7 @@ MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_Lightness
}
previousIntensity = IntensityValue;
+#if 0
/* For demo, if Level is more than 100, switch ON the LED */
if(pLight_LightnessParam->LightnessPresentValue16 >= 0x8000)
{
@@ -155,16 +159,17 @@ MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_Lightness
{
BSP_LED_Off(LED_BLUE);
}
- TRACE_M(TF_SERIAL_CTRL,"#8206%04hx!\n\r",ApplilightnessSet.PresentState16);
+#endif
+
+ TRACE_M(TF_SERIAL_CTRL,"#8206%04hx!\n\r",
+ ApplilightnessSet[elementIndex].PresentState16);
- duty = PwmValueMapping(ApplilightnessSet.PresentState16 , 0xfFFF ,0);
+ duty = PwmValueMapping(ApplilightnessSet[elementIndex].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();
+ NvmStatePowerFlag_Set(LIGHT_LIGHTNESS_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
@@ -181,18 +186,18 @@ MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t* pLight_Lightness
* @param pLength: length of data
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_Lightness_Status callback received \r\n");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#824E!\r\n");
- TRACE_M(TF_SERIAL_CTRL,"#824E! \n\r");
-
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2))
@@ -201,28 +206,33 @@ MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, M
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present Lightness: %d \r\n",
- value << 8 | pLightness_status[i]);
+ TRACE_M(TF_LIGHT,"Present Lightness: 0x%x (%d)\r\n",
+ value | pLightness_status[i] << 8,
+ value | pLightness_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Target Lightness: %d \r\n",
- value << 8 | pLightness_status[i]);
+ TRACE_M(TF_LIGHT,"Target Lightness: 0x%x (%d)\r\n",
+ value | pLightness_status[i] << 8,
+ value | pLightness_status[i] << 8);
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\r\n",
+ pLightness_status[i],
pLightness_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#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
@@ -231,11 +241,13 @@ MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, M
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Lightness_Linear_Set(Light_LightnessStatus_t* pLight_LightnessLinearParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- ApplilightnessLinearSet.PresentState16 = pLight_LightnessLinearParam->LinearPresentValue16;
+ ApplilightnessLinearSet[elementIndex].PresentState16 = pLight_LightnessLinearParam->LinearPresentValue16;
- TRACE_M(TF_SERIAL_CTRL,"#8250!\n\r");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Linear_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8250!\r\n");
return MOBLE_RESULT_SUCCESS;
}
@@ -248,20 +260,25 @@ MOBLE_RESULT Appli_Light_Lightness_Linear_Set(Light_LightnessStatus_t* pLight_Li
* @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 dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @param pLength: length of data
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_Lightness_Linear_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8252! \n\r");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Linear_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8252!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2))
@@ -270,24 +287,29 @@ MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLin
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present Lightness: %d \r\n",
- value << 8 | pLightnessLinear_status[i]);
+ TRACE_M(TF_LIGHT,"Present Lightness: 0x%x (%d)\r\n",
+ value | pLightnessLinear_status[i] << 8,
+ value | pLightnessLinear_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Target Lightness: %d \r\n",
- value << 8 | pLightnessLinear_status[i]);
+ TRACE_M(TF_LIGHT,"Target Lightness: 0x%x (%d)\r\n",
+ value | pLightnessLinear_status[i] << 8,
+ value | pLightnessLinear_status[i] << 8);
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\r\n",
+ pLightnessLinear_status[i],
pLightnessLinear_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP
/******************************************************************************/
@@ -297,11 +319,17 @@ MOBLE_RESULT Appli_Light_Lightness_Linear_Status(MOBLEUINT8 const *pLightnessLin
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pLight_LightnessDefaultParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
+#if 0
if(pLight_LightnessDefaultParam->LightnessDefaultStatus > 0)
{
BSP_LED_On(LED_BLUE);
@@ -310,14 +338,16 @@ MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pL
{
BSP_LED_Off(LED_BLUE);
}
- ApplilightnessSet.LightnessDefault = pLight_LightnessDefaultParam->LightnessDefaultStatus;
+#endif
+
+ ApplilightnessSet[elementIndex].LightnessDefault =
+ pLight_LightnessDefaultParam->LightnessDefaultStatus;
+
+ TRACE_M(TF_LIGHT,"Light_Lightness_Default_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8259! \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8259!\n\r");
-
/* set the flag value for NVM store */
- RestoreFlag = LIGHT_LIGHTNESS_NVM_FLAG;
-
- AppliNvm_SaveMessageParam();
+ NvmStatePowerFlag_Set(LIGHT_LIGHTNESS_NVM_FLAG,elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -331,19 +361,25 @@ MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pL
* when Light Lightness Default status message is received
* @param pLightnessDefault_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDefault_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDefault_status, MOBLEUINT32 pLength
+ , MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
- MOBLEUINT16 value = 0;
- #endif
- TRACE_M(TF_LIGHT,"Light_Lightness_Default_Status callback received \r\n");
+ MOBLEUINT16 value;
+#endif
- TRACE_M(TF_SERIAL_CTRL,"#8256! \n\r");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Default_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8256!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if(i == 0)
@@ -352,14 +388,61 @@ MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDe
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Lightness: %d \r\n",
- value << 8 | pLightnessDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Lightness Default: 0x%x (%d)\r\n",
+ value | pLightnessDefault_status[i] << 8,
+ value | pLightnessDefault_status[i] << 8);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
+/**
+* @brief Appli_Light_Lightness_Last_Status: This function is callback for Application
+* when Light Lightness Last status message is received
+* @param pLightnessDefault_status: Pointer to the parameters received for message
+* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_Lightness_Last_Status(MOBLEUINT8 const *pLightnessLast_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+#if ( CFG_DEBUG_TRACE != 0 )
+ MOBLEUINT32 i;
+ MOBLEUINT16 value;
+#endif
+
+ TRACE_M(TF_LIGHT,"Light_Lightness_Last_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8256!\r\n");
+
+#if ( CFG_DEBUG_TRACE != 0 )
+ for(i = 0; i < pLength; i++)
+ {
+ if(i == 0)
+ {
+ value = pLightnessLast_status[i];
+ }
+ else if(i == 1)
+ {
+ TRACE_M(TF_LIGHT,"Lightness Last: 0x%x (%d)\r\n",
+ value | pLightnessLast_status[i] << 8,
+ value | pLightnessLast_status[i] << 8);
+ }
+ }
+#endif
+
+ return MOBLE_RESULT_SUCCESS;
+}
+
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP
/******************************************************************************/
@@ -369,16 +452,22 @@ MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessDe
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Lightness_Range_Set(Light_LightnessRangeParam_t* pLight_LightnessRangeParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- ApplilightnessSet.StatusCode = pLight_LightnessRangeParam->StatusCode;
- ApplilightnessSet.RangeMin = pLight_LightnessRangeParam->MinRangeStatus;
- ApplilightnessSet.RangeMax = pLight_LightnessRangeParam->MaxRangeStatus;
+ ApplilightnessSet[elementIndex].StatusCode = pLight_LightnessRangeParam->StatusCode;
+ ApplilightnessSet[elementIndex].RangeMin = pLight_LightnessRangeParam->MinRangeStatus;
+ ApplilightnessSet[elementIndex].RangeMax = pLight_LightnessRangeParam->MaxRangeStatus;
- TRACE_M(TF_SERIAL_CTRL,"#825B! \n\r");
+ TRACE_M(TF_LIGHT,"Light_Lightness_Range_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#825B!\r\n");
return MOBLE_RESULT_SUCCESS;
}
@@ -392,45 +481,56 @@ MOBLE_RESULT Appli_Light_Lightness_Range_Set(Light_LightnessRangeParam_t* pLight
* when Light Lightness range ststus message is received
* @param pLightnessRange_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status, MOBLEUINT32 pLength
+ , MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
- MOBLEUINT16 value = 0;
+ MOBLEUINT16 value;
#endif
- TRACE_M(TF_LIGHT,"Light_Lightness_Range_Status callback received \r\n");
-
- TRACE_M(TF_SERIAL_CTRL,"#8258! \n\r");
-#ifdef CFG_DEBUG_TRACE
+ TRACE_M(TF_LIGHT,"Light_Lightness_Range_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8258!\r\n");
+
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if(i == 0)
{
- TRACE_M(TF_LIGHT,"Status Code: %d \r\n",
- value << 8 | pLightnessRange_status[i]);
+ TRACE_M(TF_LIGHT,"Status Code: 0x%x (%d)\r\n",
+ pLightnessRange_status[i],
+ pLightnessRange_status[i]);
}
else if((i == 1) || (i == 3))
{
value = pLightnessRange_status[i];
}
- else if(i == 1)
+ else if(i == 2)
{
- TRACE_M(TF_LIGHT,"Range Min: %d \r\n",
- value << 8 | pLightnessRange_status[i]);
+ TRACE_M(TF_LIGHT,"Range Min: 0x%x (%d)\r\n",
+ value | pLightnessRange_status[i] << 8,
+ value | pLightnessRange_status[i] << 8);
}
- else if(i == 3)
+ else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Range Max: %d \r\n",
- value << 8 | pLightnessRange_status[i]);
+ TRACE_M(TF_LIGHT,"Range Max: 0x%x (%d)\r\n",
+ value | pLightnessRange_status[i] << 8,
+ value | pLightnessRange_status[i] << 8);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL
/******************************************************************************/
@@ -440,22 +540,34 @@ MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRang
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Ctl_Set(Light_CtlStatus_t* pLight_CtlParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
float colourRatio;
float brightRatio;
- TRACE_M(TF_SERIAL_CTRL,"#825E! \n\r");
+ TRACE_M(TF_LIGHT,"Appli_Light_Ctl_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#825E!\r\n");
- 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);
+ AppliCtlSet[elementIndex].PresentLightness16 = pLight_CtlParam->PresentCtlLightness16;
+ AppliCtlSet[elementIndex].PresentTemperature16 = pLight_CtlParam->PresentCtlTemperature16;
+ AppliCtlSet[elementIndex].PresentCtlDelta16 = pLight_CtlParam->PresentCtlDelta16;
- brightRatio = Ratio_CalculateValue(AppliCtlSet.PresentLightness16 ,0XFFFF ,0);
+ /* Save target parameters if transition is available */
+ AppliCtlSet[elementIndex].TargetLightness16 = pLight_CtlParam->TargetCtlLightness16;
+ AppliCtlSet[elementIndex].TargetTemperature16 = pLight_CtlParam->TargetCtlTemperature16;
+ AppliCtlSet[elementIndex].TargetCtlDelta16 = pLight_CtlParam->TargetCtlDeltaUv16;
+
+ colourRatio = Ratio_CalculateValue(AppliCtlSet[elementIndex].PresentTemperature16 ,MAX_CTL_TEMP_RANGE ,MIN_CTL_TEMP_RANGE);
+
+ brightRatio = Ratio_CalculateValue(AppliCtlSet[elementIndex].PresentLightness16 ,0XFFFF ,0);
Appli_LightPwmValue.PwmCoolValue = PWM_CoolValue(colourRatio , brightRatio);
Appli_LightPwmValue.PwmWarmValue = PWM_WarmValue(colourRatio , brightRatio);
@@ -464,15 +576,8 @@ MOBLE_RESULT Appli_Light_Ctl_Set(Light_CtlStatus_t* pLight_CtlParam,
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();
+ NvmStatePowerFlag_Set(LIGHT_CTL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -488,18 +593,18 @@ MOBLE_RESULT Appli_Light_Ctl_Set(Light_CtlStatus_t* pLight_CtlParam,
* @param pLength: length of data
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status,
- MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_Ctl_Status callback received \r\n");
-
- TRACE_M(TF_SERIAL_CTRL,"#8260! \n\r");
+
+ TRACE_M(TF_LIGHT,"Light_Ctl_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8260!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2) || (i == 4) || (i == 6))
@@ -508,34 +613,41 @@ MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status,
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present CTL Lightness: %d \r\n",
- value << 8 | pLightCtl_status[i]);
+ TRACE_M(TF_LIGHT,"Present CTL Lightness: 0x%x (%d)\r\n",
+ value | pLightCtl_status[i] << 8,
+ value | pLightCtl_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Present CTL Temperature: %d \r\n",
- value << 8 | pLightCtl_status[i]);
+ TRACE_M(TF_LIGHT,"Present CTL Temperature: 0x%x (%d)\r\n",
+ value | pLightCtl_status[i] << 8,
+ value | pLightCtl_status[i] << 8);
}
else if(i == 5)
{
- TRACE_M(TF_LIGHT,"Target CTL Lightness: %d \r\n",
- value << 8 | pLightCtl_status[i]);
+ TRACE_M(TF_LIGHT,"Target CTL Lightness: 0x%x (%d)\r\n",
+ value | pLightCtl_status[i] << 8,
+ value | pLightCtl_status[i] << 8);
}
else if(i == 7)
{
- TRACE_M(TF_LIGHT,"Target CTL Temperature: %d \r\n",
- value << 8 | pLightCtl_status[i]);
+ TRACE_M(TF_LIGHT,"Target CTL Temperature: 0x%x (%d)\r\n",
+ value | pLightCtl_status[i] << 8,
+ value | pLightCtl_status[i] << 8);
}
else if(i == 8)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time:0x%x (%d)\r\n",
+ pLightCtl_status[i],
pLightCtl_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE
/******************************************************************************/
@@ -545,21 +657,32 @@ MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status,
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_CtlTemperature_Set(Light_CtlStatus_t* pLight_CtltempParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
float colourRatio;
float brightRatio;
- TRACE_M(TF_SERIAL_CTRL,"#8264!\n\r");
- AppliCtlSet.PresentTemperature16 = pLight_CtltempParam->PresentCtlTemperature16;
- AppliCtlSet.PresentCtlDelta16 = pLight_CtltempParam->PresentCtlDelta16;
+ TRACE_M(TF_LIGHT,"Appli_Light_CtlTemperature_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8264!\r\n");
+
+ AppliCtlSet[elementIndex].PresentTemperature16 = pLight_CtltempParam->PresentCtlTemperature16;
+ AppliCtlSet[elementIndex].PresentCtlDelta16 = pLight_CtltempParam->PresentCtlDelta16;
- colourRatio = Ratio_CalculateValue(AppliCtlSet.PresentTemperature16 ,MAX_CTL_TEMP_RANGE ,MIN_CTL_TEMP_RANGE);
+ /* Made a copy of target in case of transition values change */
+ AppliCtlSet[elementIndex].TargetTemperature16 = pLight_CtltempParam->TargetCtlTemperature16;
+ AppliCtlSet[elementIndex].TargetCtlDelta16 = pLight_CtltempParam->TargetCtlDeltaUv16;
- brightRatio = Ratio_CalculateValue(AppliCtlSet.PresentLightness16 ,0XFFFF ,0);
+ colourRatio = Ratio_CalculateValue(AppliCtlSet[elementIndex].PresentTemperature16 ,MAX_CTL_TEMP_RANGE ,MIN_CTL_TEMP_RANGE);
+
+ brightRatio = Ratio_CalculateValue(AppliCtlSet[elementIndex].PresentLightness16 ,0XFFFF ,0);
Appli_LightPwmValue.PwmCoolValue = PWM_CoolValue(colourRatio , brightRatio);
Appli_LightPwmValue.PwmWarmValue = PWM_WarmValue(colourRatio , brightRatio);
@@ -568,9 +691,7 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Set(Light_CtlStatus_t* pLight_CtltempPar
Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
/* set the flag value for NVM store */
- RestoreFlag = LIGHT_CTL_NVM_FLAG;
-
- AppliNvm_SaveMessageParam();
+ NvmStatePowerFlag_Set(LIGHT_CTL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -584,19 +705,25 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Set(Light_CtlStatus_t* pLight_CtltempPar
* when Light CTL temperature status message is received
* @param pLightCtlTemp_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status, MOBLEUINT32 pLength
+ , MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_CtlTemperature_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8266! \n\r");
+ TRACE_M(TF_LIGHT,"Light_CtlTemperature_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8266!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2) || (i == 4) || (i == 6))
@@ -605,35 +732,42 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_s
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present CTL Temperature: %d \r\n",
- value << 8 | pLightCtlTemp_status[i]);
+ TRACE_M(TF_LIGHT,"Present CTL Temperature: 0x%x (%d)\r\n",
+ value | pLightCtlTemp_status[i] << 8,
+ value | pLightCtlTemp_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Present CTL Delta UV: %d \r\n",
- value << 8 | pLightCtlTemp_status[i]);
+ TRACE_M(TF_LIGHT,"Present CTL Delta UV: 0x%x (%d)\r\n",
+ value | pLightCtlTemp_status[i] << 8,
+ value | pLightCtlTemp_status[i] << 8);
}
else if(i == 5)
{
- TRACE_M(TF_LIGHT,"Target CTL Temperature: %d \r\n",
- value << 8 | pLightCtlTemp_status[i]);
+ TRACE_M(TF_LIGHT,"Target CTL Temperature: 0x%x (%d)\r\n",
+ value | pLightCtlTemp_status[i] << 8,
+ value | pLightCtlTemp_status[i] << 8);
}
else if(i == 7)
{
- TRACE_M(TF_LIGHT,"Target CTL Delta UV: %d \r\n",
- value << 8 | pLightCtlTemp_status[i]);
+ TRACE_M(TF_LIGHT,"Target CTL Delta UV: 0x%x (%d)\r\n",
+ value | pLightCtlTemp_status[i] << 8,
+ value | pLightCtlTemp_status[i] << 8);
}
else if(i == 8)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\r\n",
+ pLightCtlTemp_status[i],
pLightCtlTemp_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP
/******************************************************************************/
@@ -643,16 +777,22 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_s
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_CtlTemperature_Range_Set(Light_CtlTemperatureRangeParam_t* pLight_CtlTempRangeParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- AppliCtlTemperatureRangeSet.RangeMin = pLight_CtlTempRangeParam->MinRangeStatus;
- AppliCtlTemperatureRangeSet.RangeMax = pLight_CtlTempRangeParam->MaxRangeStatus;
- AppliCtlTemperatureRangeSet.StatusCode = pLight_CtlTempRangeParam->StatusCode;
+ AppliCtlTemperatureRangeSet[elementIndex].RangeMin = pLight_CtlTempRangeParam->MinRangeStatus;
+ AppliCtlTemperatureRangeSet[elementIndex].RangeMax = pLight_CtlTempRangeParam->MaxRangeStatus;
+ AppliCtlTemperatureRangeSet[elementIndex].StatusCode = pLight_CtlTempRangeParam->StatusCode;
- TRACE_M(TF_SERIAL_CTRL,"#826B!\n\r");
+ TRACE_M(TF_LIGHT,"Light_CtlTemperature_Range_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#826B!\r\n");
return MOBLE_RESULT_SUCCESS;
}
@@ -667,28 +807,34 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Range_Set(Light_CtlTemperatureRangeParam
* when Light CTL temperature range status message is received
* @param pCtlTempRange_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
- MOBLEUINT16 value = 0;
+ MOBLEUINT16 value;
#endif
- TRACE_M(TF_LIGHT,"Light_CtlTemperature_Range_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8263! \n\r");
+ TRACE_M(TF_LIGHT,"Light_CtlTemperature_Range_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8263!\r\n");
- RestoreFlag = LIGHT_CTL_NVM_FLAG;
+ RestoreFlag = LIGHT_CTL_NVM_FLAG;
AppliNvm_SaveMessageParam();
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if(i == 0)
{
- TRACE_M(TF_LIGHT,"Status Code: %d \r\n",
+ TRACE_M(TF_LIGHT,"Status Code: 0x%x (%d)\r\n",
+ pCtlTempRange_status[i],
pCtlTempRange_status[i]);
}
else if((i == 1) || (i == 3))
@@ -697,19 +843,23 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempR
}
else if(i == 2)
{
- TRACE_M(TF_LIGHT,"Range Min: %d \r\n",
- value << 8 | pCtlTempRange_status[i]);
+ TRACE_M(TF_LIGHT,"Range Min: 0x%x (%d)\r\n",
+ value | pCtlTempRange_status[i] << 8,
+ value | pCtlTempRange_status[i] << 8 );
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Range Max: %d \r\n",
- value << 8 | pCtlTempRange_status[i]);
+ TRACE_M(TF_LIGHT,"Range Max: 0x%x (%d)\r\n",
+ value | pCtlTempRange_status[i] << 8,
+ value | pCtlTempRange_status[i] << 8 );
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP
/******************************************************************************/
@@ -719,16 +869,22 @@ MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempR
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_CtlDefault_Set(Light_CtlDefaultParam_t* pLight_CtlDefaultParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- AppliCtlDefaultSet.CtlDefaultLightness16 = pLight_CtlDefaultParam->CtlDefaultLightness16;
- AppliCtlDefaultSet.CtlDefaultTemperature16 = pLight_CtlDefaultParam->CtlDefaultTemperature16;
- AppliCtlDefaultSet.CtlDefaultDeltaUv = pLight_CtlDefaultParam->CtlDefaultDeltaUv;
+ AppliCtlDefaultSet[elementIndex].CtlDefaultLightness16 = pLight_CtlDefaultParam->CtlDefaultLightness16;
+ AppliCtlDefaultSet[elementIndex].CtlDefaultTemperature16 = pLight_CtlDefaultParam->CtlDefaultTemperature16;
+ AppliCtlDefaultSet[elementIndex].CtlDefaultDeltaUv = pLight_CtlDefaultParam->CtlDefaultDeltaUv;
- TRACE_M(TF_SERIAL_CTRL,"#8269!\n\r");
+ TRACE_M(TF_LIGHT,"Light_CtlDefault_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8269!\r\n");
return MOBLE_RESULT_SUCCESS;
}
@@ -742,19 +898,24 @@ MOBLE_RESULT Appli_Light_CtlDefault_Set(Light_CtlDefaultParam_t* pLight_CtlDefau
* when Light CTL Default status message is received
* @param pCtlDefault_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_Ctl_DefaultStatus callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8268! \n\r");
+ TRACE_M(TF_LIGHT,"Light_Ctl_DefaultStatus callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8268!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2) || (i == 4))
@@ -763,24 +924,29 @@ MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status,
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Lightness: %d \r\n",
- value << 8 | pCtlDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Lightness: 0x%x (%d)\n\r",
+ value | pCtlDefault_status[i] << 8,
+ value | pCtlDefault_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Temperature: %d \r\n",
- value << 8 | pCtlDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Temperature: 0x%x (%d)\n\r",
+ value | pCtlDefault_status[i] << 8,
+ value | pCtlDefault_status[i] << 8);
}
else if(i == 5)
{
- TRACE_M(TF_LIGHT,"Delta UV: %d \r\n",
- value << 8 | pCtlDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Delta UV: 0x%x (%d)\n\r",
+ value | pCtlDefault_status[i] << 8,
+ value | pCtlDefault_status[i] << 8);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL
/******************************************************************************/
@@ -790,32 +956,41 @@ MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status,
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_Hsl_Set(Light_HslStatus_t* pLight_HslParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_SERIAL_CTRL,"#8276!\n\r");
+ TRACE_M(TF_LIGHT,"Appli_Light_Hsl_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8276!\r\n");
- AppliHslSet.HslLightness16 = pLight_HslParam->PresentHslLightness16;
- AppliHslSet.HslHueLightness16 = pLight_HslParam->PresentHslHueLightness16;
- AppliHslSet.HslSaturation16 = pLight_HslParam->PresentHslSaturation16;
+ AppliHslSet[elementIndex].HslLightness16 = pLight_HslParam->PresentHslLightness16;
+ AppliHslSet[elementIndex].HslHueLightness16 = pLight_HslParam->PresentHslHueLightness16;
+ AppliHslSet[elementIndex].HslSaturation16 = pLight_HslParam->PresentHslSaturation16;
+ /* Save target parameters if transition is available */
+ AppliHslSet[elementIndex].TargetHslLightness16 = pLight_HslParam->TargetHslLightness16;
+ AppliHslSet[elementIndex].TargetHslHueLightness16 = pLight_HslParam->TargetHslHueLightness16;
+ AppliHslSet[elementIndex].TargetHslSaturation16 = pLight_HslParam->TargetHslSaturation16;
+
/* Function to convert HSL values in RGB values */
- HSL2RGB_Conversion();
+ HSL2RGB_Conversion(elementIndex);
- 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);
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam[elementIndex].Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam[elementIndex].Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam[elementIndex].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();
+ NvmStatePowerFlag_Set(LIGHT_HSL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -829,19 +1004,24 @@ MOBLE_RESULT Appli_Light_Hsl_Set(Light_HslStatus_t* pLight_HslParam,
* when Light HSL status message is received
* @param pHsl_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_Hsl_Status callback received \r\n");
-
- TRACE_M(TF_SERIAL_CTRL,"#8278! \n\r");
+
+ TRACE_M(TF_LIGHT,"Light_Hsl_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8278!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2) || (i == 4))
@@ -850,29 +1030,35 @@ MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 p
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"HSL Lightness: %d \r\n",
- value << 8 | pHsl_status[i]);
+ TRACE_M(TF_LIGHT,"HSL Lightness: 0x%x (%d)\n\r",
+ value | pHsl_status[i] << 8,
+ value | pHsl_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"HSL Hue: %d \r\n",
- value << 8 | pHsl_status[i]);
+ TRACE_M(TF_LIGHT,"HSL Hue: 0x%x (%d)\n\r",
+ value | pHsl_status[i] << 8,
+ value | pHsl_status[i] << 8);
}
else if(i == 5)
{
- TRACE_M(TF_LIGHT,"HSL Saturation: %d \r\n",
- value << 8 | pHsl_status[i]);
+ TRACE_M(TF_LIGHT,"HSL Saturation: 0x%x (%d)\n\r",
+ value | pHsl_status[i] << 8,
+ value | pHsl_status[i] << 8);
}
else if(i == 6)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\n\r",
+ pHsl_status[i],
pHsl_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_HUE
/******************************************************************************/
@@ -882,28 +1068,32 @@ MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status, MOBLEUINT32 p
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_HslHue_Set(Light_HslStatus_t* pLight_HslHueParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_SERIAL_CTRL,"#826F! \n\r");
+ TRACE_M(TF_LIGHT,"Light_HslHue_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#826F!\r\n");
- AppliHslSet.HslHueLightness16 = pLight_HslHueParam->PresentHslHueLightness16;
+ AppliHslSet[elementIndex].HslHueLightness16 = pLight_HslHueParam->PresentHslHueLightness16;
- HSL2RGB_Conversion();
+ HSL2RGB_Conversion(elementIndex);
- 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);
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam[elementIndex].Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam[elementIndex].Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam[elementIndex].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();
+ NvmStatePowerFlag_Set(LIGHT_HSL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
@@ -918,19 +1108,24 @@ MOBLE_RESULT Appli_Light_HslHue_Set(Light_HslStatus_t* pLight_HslHueParam,
* when Light HSL HUE status message is received
* @param pHslHue_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_HslHue_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8271! \n\r");
+ TRACE_M(TF_LIGHT,"Light_HslHue_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8271!\r\n");
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2))
@@ -939,24 +1134,29 @@ MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUI
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present Hue: %d \r\n",
- value << 8 | pHslHue_status[i]);
+ TRACE_M(TF_LIGHT,"Present Hue: 0x%x (%d)\n\r",
+ value | pHslHue_status[i] << 8,
+ value | pHslHue_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Target Hue: %d \r\n",
- value << 8 | pHslHue_status[i]);
+ TRACE_M(TF_LIGHT,"Target Hue: 0x%x (%d)\n\r",
+ value | pHslHue_status[i] << 8,
+ value | pHslHue_status[i] << 8);
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\n\r",
+ pHslHue_status[i],
pHslHue_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION
/******************************************************************************/
@@ -966,28 +1166,32 @@ MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status, MOBLEUI
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_HslSaturation_Set(Light_HslStatus_t* pLight_HslSaturationParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_SERIAL_CTRL,"#8273! \n\r");
+ TRACE_M(TF_LIGHT,"Appli_Light_HslSaturation_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8273!\r\n");
- AppliHslSet.HslSaturation16 = pLight_HslSaturationParam->PresentHslSaturation16;
+ AppliHslSet[elementIndex].HslSaturation16 = pLight_HslSaturationParam->PresentHslSaturation16;
- HSL2RGB_Conversion();
+ HSL2RGB_Conversion(elementIndex);
- 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);
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam[elementIndex].Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam[elementIndex].Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam[elementIndex].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();
+ NvmStatePowerFlag_Set(LIGHT_HSL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -1001,19 +1205,24 @@ MOBLE_RESULT Appli_Light_HslSaturation_Set(Light_HslStatus_t* pLight_HslSaturati
* when Light HSL Saturation status message is received
* @param pHslSaturation_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_HslSaturation_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#8275! \n\r");
-
-#ifdef CFG_DEBUG_TRACE
+ TRACE_M(TF_LIGHT,"Light_HslSaturation_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8275!\r\n");
+
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2))
@@ -1022,24 +1231,29 @@ MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_s
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Present Saturation: %d \r\n",
- value << 8 | pHslSaturation_status[i]);
+ TRACE_M(TF_LIGHT,"Present Saturation: 0x%x (%d)\n\r",
+ value | pHslSaturation_status[i] << 8,
+ value | pHslSaturation_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Target Saturation: %d \r\n",
- value << 8 | pHslSaturation_status[i]);
+ TRACE_M(TF_LIGHT,"Target Saturation: 0x%x (%d)\n\r",
+ value | pHslSaturation_status[i] << 8,
+ value | pHslSaturation_status[i] << 8);
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Remaining Time: %d \r\n",
+ TRACE_M(TF_LIGHT,"Remaining Time: 0x%x (%d)\n\r",
+ pHslSaturation_status[i],
pHslSaturation_status[i]);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP
/******************************************************************************/
@@ -1049,34 +1263,38 @@ MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_s
* 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_HslDefault_Set(Light_HslStatus_t* pLight_HslDefaultParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_SERIAL_CTRL,"#827F! \n\r");
+ TRACE_M(TF_LIGHT,"Appli_Light_HslDefault_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#827F!\r\n");
- Appli_HslDefaultSet.HslDefaultLightness16 = pLight_HslDefaultParam->PresentHslLightness16;
- Appli_HslDefaultSet.HslDefaultHueLightness16 = pLight_HslDefaultParam->PresentHslHueLightness16;
- Appli_HslDefaultSet.HslDefaultSaturation16 = pLight_HslDefaultParam->PresentHslSaturation16;
+ Appli_HslDefaultSet[elementIndex].HslDefaultLightness16 = pLight_HslDefaultParam->PresentHslLightness16;
+ Appli_HslDefaultSet[elementIndex].HslDefaultHueLightness16 = pLight_HslDefaultParam->PresentHslHueLightness16;
+ Appli_HslDefaultSet[elementIndex].HslDefaultSaturation16 = pLight_HslDefaultParam->PresentHslSaturation16;
- AppliHslSet.HslLightness16 = Appli_HslDefaultSet.HslDefaultLightness16;
- AppliHslSet.HslHueLightness16 = Appli_HslDefaultSet.HslDefaultHueLightness16;
- AppliHslSet.HslSaturation16 = Appli_HslDefaultSet.HslDefaultSaturation16;
+ AppliHslSet[elementIndex].HslLightness16 = Appli_HslDefaultSet[elementIndex].HslDefaultLightness16;
+ AppliHslSet[elementIndex].HslHueLightness16 = Appli_HslDefaultSet[elementIndex].HslDefaultHueLightness16;
+ AppliHslSet[elementIndex].HslSaturation16 = Appli_HslDefaultSet[elementIndex].HslDefaultSaturation16;
- HSL2RGB_Conversion();
+ HSL2RGB_Conversion(elementIndex);
- 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);
+ Appli_LightPwmValue.PwmRedValue = PwmValueMapping(Appli_RGBParam[elementIndex].Red_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmGreenValue = PwmValueMapping(Appli_RGBParam[elementIndex].Green_Value ,0xFFFF ,0x00);
+ Appli_LightPwmValue.PwmBlueValue = PwmValueMapping(Appli_RGBParam[elementIndex].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();
+ NvmStatePowerFlag_Set(LIGHT_HSL_NVM_FLAG, elementIndex);
return MOBLE_RESULT_SUCCESS;
}
@@ -1092,17 +1310,18 @@ MOBLE_RESULT Appli_Light_HslDefault_Set(Light_HslStatus_t* pLight_HslDefaultPara
* @param pLength: length of data
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_HslDefault_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#827C! \n\r");
-
-#ifdef CFG_DEBUG_TRACE
+ TRACE_M(TF_LIGHT,"Light_HslDefault_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#827C!\r\n");
+
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if((i == 0) || (i == 2) || (i == 4))
@@ -1111,24 +1330,29 @@ MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status,
}
else if(i == 1)
{
- TRACE_M(TF_LIGHT,"Lightness: %d \r\n",
- value << 8 | pHslDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Lightness: 0x%x (%d)\n\r",
+ value | pHslDefault_status[i] << 8,
+ value | pHslDefault_status[i] << 8);
}
else if(i == 3)
{
- TRACE_M(TF_LIGHT,"Hue: %d \r\n",
- value << 8 | pHslDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Hue: 0x%x (%d)\n\r",
+ value | pHslDefault_status[i] << 8,
+ value | pHslDefault_status[i] << 8);
}
- else if(i == 4)
+ else if(i == 5)
{
- TRACE_M(TF_LIGHT,"Saturation: %d \r\n",
- value << 8 | pHslDefault_status[i]);
+ TRACE_M(TF_LIGHT,"Saturation: 0x%x (%d)\n\r",
+ value | pHslDefault_status[i] << 8,
+ value | pHslDefault_status[i] << 8);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/******************************************************************************/
#ifdef ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP
/******************************************************************************/
@@ -1141,14 +1365,16 @@ MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status,
* @retval MOBLE_RESULT
*/
MOBLE_RESULT Appli_Light_HslRange_Set(Light_HslRangeParam_t* pLight_HslRangeParam,
- MOBLEUINT8 OptionalValid)
+ MOBLEUINT8 OptionalValid, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- TRACE_M(TF_SERIAL_CTRL,"#8281! \n\r");
+ TRACE_M(TF_LIGHT,"Light_HslRange_Set callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8281!\r\n");
- AppliHslRangeSet.HslHueMinRange16 = pLight_HslRangeParam->HslHueMinRange16;
- AppliHslRangeSet.HslHueMaxRange16 = pLight_HslRangeParam->HslHueMaxRange16;
- AppliHslRangeSet.HslMinSaturation16 = pLight_HslRangeParam->HslMinSaturation16;
- AppliHslRangeSet.HslMaxSaturation16 = pLight_HslRangeParam->HslMaxSaturation16;
+ AppliHslRangeSet[elementIndex].HslHueMinRange16 = pLight_HslRangeParam->HslHueMinRange16;
+ AppliHslRangeSet[elementIndex].HslHueMaxRange16 = pLight_HslRangeParam->HslHueMaxRange16;
+ AppliHslRangeSet[elementIndex].HslMinSaturation16 = pLight_HslRangeParam->HslMinSaturation16;
+ AppliHslRangeSet[elementIndex].HslMaxSaturation16 = pLight_HslRangeParam->HslMaxSaturation16;
return MOBLE_RESULT_SUCCESS;
}
@@ -1162,24 +1388,31 @@ MOBLE_RESULT Appli_Light_HslRange_Set(Light_HslRangeParam_t* pLight_HslRangePara
* when Light HSL range status message is received
* @param pHslRange_status: Pointer to the parameters received for message
* @param pLength: length of data
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status, MOBLEUINT32 pLength)
+MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status, MOBLEUINT32 pLength, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
MOBLEUINT32 i;
MOBLEUINT16 value = 0;
#endif
- TRACE_M(TF_LIGHT,"Light_HslRange_Status callback received \r\n");
- TRACE_M(TF_SERIAL_CTRL,"#827E! \n\r");
+ TRACE_M(TF_LIGHT,"Light_HslRange_Status callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#827E!\r\n");
+
-#ifdef CFG_DEBUG_TRACE
+#if ( CFG_DEBUG_TRACE != 0 )
for(i = 0; i < pLength; i++)
{
if(i == 0)
{
- TRACE_M(TF_LIGHT,"Status Code: %d \r\n",
+ TRACE_M(TF_LIGHT,"Status Code: 0x%x (%d)\n\r",
+ pHslRange_status[i],
pHslRange_status[i]);
}
else if((i == 1) || (i == 3) || (i == 5) || (i == 7))
@@ -1188,30 +1421,36 @@ MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status, MOB
}
else if(i == 2)
{
- TRACE_M(TF_LIGHT,"Hue Range Min: %d \r\n",
- value << 8 | pHslRange_status[i]);
+ TRACE_M(TF_LIGHT,"Hue Range Min: 0x%x (%d)\n\r",
+ value | pHslRange_status[i] << 8,
+ value | pHslRange_status[i] << 8);
}
else if(i == 4)
{
- TRACE_M(TF_LIGHT,"Hue Range Max: %d \r\n",
- value << 8 | pHslRange_status[i]);
+ TRACE_M(TF_LIGHT,"Hue Range Max: 0x%x (%d)\n\r",
+ value | pHslRange_status[i] << 8,
+ value | pHslRange_status[i] << 8);
}
else if(i == 6)
{
- TRACE_M(TF_LIGHT,"Saturation Range Min: %d \r\n",
- value << 8 | pHslRange_status[i]);
+ TRACE_M(TF_LIGHT,"Saturation Range Min: 0x%x (%d)\n\r",
+ value | pHslRange_status[i] << 8,
+ value | pHslRange_status[i] << 8);
}
else if(i == 8)
{
- TRACE_M(TF_LIGHT,"Saturation Range Max: %d \r\n",
- value << 8 | pHslRange_status[i]);
+ TRACE_M(TF_LIGHT,"Saturation Range Max: 0x%x (%d)\n\r",
+ value | pHslRange_status[i] << 8,
+ value | pHslRange_status[i] << 8);
}
}
#endif
+
return MOBLE_RESULT_SUCCESS;
}
+
/*******************************************************************************
Following Functions are used for the LIGHTING Lightness MODEL
*******************************************************************************/
@@ -1224,14 +1463,19 @@ Following Functions are used for the LIGHTING Lightness MODEL
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState)
+MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(lLightnessState) = ApplilightnessSet.PresentState16;
- *(lLightnessState+1) = ApplilightnessSet.PresentState16 >> 8;
- *(lLightnessState+2) = ApplilightnessSet.LastLightness16 ;
- *(lLightnessState+3) = ApplilightnessSet.LastLightness16 >> 8;
+ *(lLightnessState) = ApplilightnessSet[elementIndex].PresentState16;
+ *(lLightnessState+1) = ApplilightnessSet[elementIndex].PresentState16 >> 8;
+ *(lLightnessState+2) = ApplilightnessSet[elementIndex].LastLightness16 ;
+ *(lLightnessState+3) = ApplilightnessSet[elementIndex].LastLightness16 >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1241,17 +1485,19 @@ MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState)
+MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lLightnessState) = ApplilightnessLinearSet[elementIndex].PresentState16;
+ *(lLightnessState+1) = ApplilightnessLinearSet[elementIndex].PresentState16 >> 8;
+ *(lLightnessState+2) = ApplilightnessSet[elementIndex].LastLightness16 ;
+ *(lLightnessState+3) = ApplilightnessSet[elementIndex].LastLightness16 >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1261,14 +1507,17 @@ MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState)
+MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(lDefaultState) = ApplilightnessSet.LightnessDefault;
- *(lDefaultState+1) = ApplilightnessSet.LightnessDefault >> 8;
- TRACE_M(TF_SERIAL_CTRL,"Get Lighness Default Status: %d\n\r",
- ApplilightnessSet.LightnessDefault);
+ *(lDefaultState) = ApplilightnessSet[elementIndex].LightnessDefault;
+ *(lDefaultState+1) = ApplilightnessSet[elementIndex].LightnessDefault >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1280,13 +1529,11 @@ MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState)
* @param lLastState: Pointer to the status message
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState)
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(lLastState) = ApplilightnessSet.LastLightness16;
- *(lLastState+1) = ApplilightnessSet.LastLightness16 >> 8;
-
- TRACE_M(TF_SERIAL_CTRL,"Get Lighness Last Status: status: %d \n\r",
- ApplilightnessSet.LastLightness16);
+ *(lLastState) = ApplilightnessSet[elementIndex].LastLightness16;
+ *(lLastState+1) = ApplilightnessSet[elementIndex].LastLightness16 >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1295,19 +1542,20 @@ MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetLightnessRangeStatus(MOBLEUINT8* lRangeState)
+MOBLE_RESULT Appli_Light_GetLightnessRangeStatus(MOBLEUINT8* lRangeState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lRangeState) = ApplilightnessSet[elementIndex].StatusCode;
+ *(lRangeState+1) = ApplilightnessSet[elementIndex].RangeMin;
+ *(lRangeState+2) = ApplilightnessSet[elementIndex].RangeMin >> 8;
+ *(lRangeState+3) = ApplilightnessSet[elementIndex].RangeMax;
+ *(lRangeState+4) = ApplilightnessSet[elementIndex].RangeMax >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1328,40 +1576,67 @@ Following Functions are used for the LIGHTING CTL MODEL
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetCtlLightStatus(MOBLEUINT8* lCtlLightState)
+MOBLE_RESULT Appli_Light_GetCtlLightStatus(MOBLEUINT8* lCtlLightState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lCtlLightState) = AppliCtlSet[elementIndex].PresentLightness16;
+ *(lCtlLightState+1) = AppliCtlSet[elementIndex].PresentLightness16 >> 8;
+ *(lCtlLightState+2) = AppliCtlSet[elementIndex].PresentTemperature16;
+ *(lCtlLightState+3) = AppliCtlSet[elementIndex].PresentTemperature16 >>8;
+ *(lCtlLightState+4) = AppliCtlSet[elementIndex].PresentCtlDelta16;
+ *(lCtlLightState+5) = AppliCtlSet[elementIndex].PresentCtlDelta16 >>8;
return MOBLE_RESULT_SUCCESS;
}
/**
+* @brief Appli_Light_GetCtlTargetStatus: This function is callback for Application
+* to get the application values in middleware used for target state.
+* @param lCtlLightState: Pointer to the status message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetCtlTargetStatus(MOBLEUINT8* lCtlLightState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ *(lCtlLightState) = AppliCtlSet[elementIndex].TargetLightness16;
+ *(lCtlLightState+1) = AppliCtlSet[elementIndex].TargetLightness16 >> 8;
+ *(lCtlLightState+2) = AppliCtlSet[elementIndex].TargetTemperature16;
+ *(lCtlLightState+3) = AppliCtlSet[elementIndex].TargetTemperature16 >>8;
+ *(lCtlLightState+4) = AppliCtlSet[elementIndex].TargetCtlDelta16;
+ *(lCtlLightState+5) = AppliCtlSet[elementIndex].TargetCtlDelta16 >>8;
+
+ 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState)
+MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lCtlTempState) = AppliCtlSet[elementIndex].PresentTemperature16;
+ *(lCtlTempState+1) = AppliCtlSet[elementIndex].PresentTemperature16 >> 8;
+ *(lCtlTempState+2) = AppliCtlSet[elementIndex].PresentCtlDelta16;
+ *(lCtlTempState+3) = AppliCtlSet[elementIndex].PresentCtlDelta16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1371,19 +1646,20 @@ MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange)
+MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lCtlTempRange) = AppliCtlTemperatureRangeSet[elementIndex].StatusCode;
+ *(lCtlTempRange+1) = AppliCtlTemperatureRangeSet[elementIndex].RangeMin;
+ *(lCtlTempRange+2) = AppliCtlTemperatureRangeSet[elementIndex].RangeMin >> 8;
+ *(lCtlTempRange+3) = AppliCtlTemperatureRangeSet[elementIndex].RangeMax;
+ *(lCtlTempRange+4) = AppliCtlTemperatureRangeSet[elementIndex].RangeMax >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1393,20 +1669,21 @@ MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetCtlDefaultStatus(MOBLEUINT8* lCtlDefaultState)
+MOBLE_RESULT Appli_Light_GetCtlDefaultStatus(MOBLEUINT8* lCtlDefaultState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lCtlDefaultState) = AppliCtlDefaultSet[elementIndex].CtlDefaultLightness16;
+ *(lCtlDefaultState+1) = AppliCtlDefaultSet[elementIndex].CtlDefaultLightness16 >> 8;
+ *(lCtlDefaultState+2) = AppliCtlDefaultSet[elementIndex].CtlDefaultTemperature16;
+ *(lCtlDefaultState+3) = AppliCtlDefaultSet[elementIndex].CtlDefaultTemperature16 >>8;
+ *(lCtlDefaultState+4) = AppliCtlDefaultSet[elementIndex].CtlDefaultDeltaUv;
+ *(lCtlDefaultState+5) = AppliCtlDefaultSet[elementIndex].CtlDefaultDeltaUv >> 8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1427,36 +1704,65 @@ Following Functions are used for the LIGHTING HSL MODEL
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslStatus(MOBLEUINT8* lHslState)
+MOBLE_RESULT Appli_Light_GetHslStatus(MOBLEUINT8* lHslState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lHslState) = AppliHslSet[elementIndex].HslLightness16;
+ *(lHslState+1) = AppliHslSet[elementIndex].HslLightness16 >> 8;
+ *(lHslState+2) = AppliHslSet[elementIndex].HslHueLightness16;
+ *(lHslState+3) = AppliHslSet[elementIndex].HslHueLightness16 >>8;
+ *(lHslState+4) = AppliHslSet[elementIndex].HslSaturation16;
+ *(lHslState+5) = AppliHslSet[elementIndex].HslSaturation16 >>8;
return MOBLE_RESULT_SUCCESS;
}
+
+/**
+* @brief Appli_Light_GetHslTargetStatus: This function is callback for Application
+* to get the application values in middleware used for target state.
+* @param lHslState: Pointer to the status message
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_Light_GetHslTargetStatus(MOBLEUINT8* lHslState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ *(lHslState) = AppliHslSet[elementIndex].TargetHslLightness16;
+ *(lHslState+1) = AppliHslSet[elementIndex].TargetHslLightness16 >> 8;
+ *(lHslState+2) = AppliHslSet[elementIndex].TargetHslHueLightness16;
+ *(lHslState+3) = AppliHslSet[elementIndex].TargetHslHueLightness16 >>8;
+ *(lHslState+4) = AppliHslSet[elementIndex].TargetHslSaturation16;
+ *(lHslState+5) = AppliHslSet[elementIndex].TargetHslSaturation16 >>8;
+
+ 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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState)
+MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(lHslHueState) = AppliHslSet.HslHueLightness16;
- *(lHslHueState+1) = AppliHslSet.HslHueLightness16 >>8;
- TRACE_M(TF_SERIAL_CTRL,"Get Hsl Hue Status: %d\n\r",
- AppliHslSet.HslHueLightness16);
+ *(lHslHueState) = AppliHslSet[elementIndex].HslHueLightness16;
+ *(lHslHueState+1) = AppliHslSet[elementIndex].HslHueLightness16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1466,14 +1772,17 @@ MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState)
+MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(lHslSaturationState) = AppliHslSet.HslSaturation16;
- *(lHslSaturationState+1) = AppliHslSet.HslSaturation16 >>8;
- TRACE_M(TF_SERIAL_CTRL,"Get Hsl Saturation Status: %d\n\r",
- AppliHslSet.HslSaturation16);
+ *(lHslSaturationState) = AppliHslSet[elementIndex].HslSaturation16;
+ *(lHslSaturationState+1) = AppliHslSet[elementIndex].HslSaturation16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1482,16 +1791,21 @@ MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState)
+MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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;
+ *(lHslDefaultState) = Appli_HslDefaultSet[elementIndex].HslDefaultLightness16;
+ *(lHslDefaultState+1) = Appli_HslDefaultSet[elementIndex].HslDefaultLightness16 >> 8;
+ *(lHslDefaultState+2) = Appli_HslDefaultSet[elementIndex].HslDefaultHueLightness16;
+ *(lHslDefaultState+3) = Appli_HslDefaultSet[elementIndex].HslDefaultHueLightness16 >>8;
+ *(lHslDefaultState+4) = Appli_HslDefaultSet[elementIndex].HslDefaultSaturation16;
+ *(lHslDefaultState+5) = Appli_HslDefaultSet[elementIndex].HslDefaultSaturation16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1500,19 +1814,20 @@ MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange)
+MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lHslSatRange) = AppliHslRangeSet[elementIndex].StatusCode;
+ *(lHslSatRange+1) = AppliHslRangeSet[elementIndex].HslMinSaturation16;
+ *(lHslSatRange+2) = AppliHslRangeSet[elementIndex].HslMinSaturation16 >> 8;
+ *(lHslSatRange+3) = AppliHslRangeSet[elementIndex].HslMaxSaturation16;
+ *(lHslSatRange+4) = AppliHslRangeSet[elementIndex].HslMaxSaturation16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1521,19 +1836,20 @@ MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange)
* @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
+* @param dstPeer: destination send by peer for this node. It can be a
+* unicast or group address
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_Light_GetHslHueRange(MOBLEUINT8* lHslHueRange)
+MOBLE_RESULT Appli_Light_GetHslHueRange(MOBLEUINT8* lHslHueRange, MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
{
- *(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);
+ *(lHslHueRange) = AppliHslRangeSet[elementIndex].StatusCode;
+ *(lHslHueRange+1) = AppliHslRangeSet[elementIndex].HslHueMinRange16;
+ *(lHslHueRange+2) = AppliHslRangeSet[elementIndex].HslHueMinRange16 >> 8;
+ *(lHslHueRange+3) = AppliHslRangeSet[elementIndex].HslHueMaxRange16;
+ *(lHslHueRange+4) = AppliHslRangeSet[elementIndex].HslHueMaxRange16 >>8;
return MOBLE_RESULT_SUCCESS;
}
@@ -1563,21 +1879,24 @@ void Appli_Light_PwmInit()
* @param value1: This value corresponds to red led.
* @param value2: This value corresponds to green led .
* @param value3: This value corresponds to blue led .
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval void
*/
-void RgbF_Create(MOBLEUINT16 value1, MOBLEUINT16 value2, MOBLEUINT16 value3)
+void RgbF_Create(MOBLEUINT16 value1, MOBLEUINT16 value2, MOBLEUINT16 value3, MOBLEUINT8 elementIndex)
{
- Appli_RGBParam.Red_Value = (MOBLEUINT16)(65535 * value1/1000);
- Appli_RGBParam.Green_Value = (MOBLEUINT16)(65535 * value2/1000);
- Appli_RGBParam.Blue_Value = (MOBLEUINT16)(65535 * value3/1000);
+ Appli_RGBParam[elementIndex].Red_Value = (MOBLEUINT16)(65535 * value1/1000);
+ Appli_RGBParam[elementIndex].Green_Value = (MOBLEUINT16)(65535 * value2/1000);
+ Appli_RGBParam[elementIndex].Blue_Value = (MOBLEUINT16)(65535 * value3/1000);
}
/**
* @brief Function to convert the HSL values in RGB values.
-* @param void
+* @param elementIndex: index of the element received from peer for this node which
+* is elementNumber-1
* @retval void
*/
-void HSL2RGB_Conversion(void)
+void HSL2RGB_Conversion(MOBLEUINT8 elementIndex)
{
MOBLEUINT16 hueValue;
@@ -1587,24 +1906,24 @@ void HSL2RGB_Conversion(void)
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)
+ if(AppliHslSet[elementIndex].HslSaturation16 == 0)
{
- Appli_RGBParam.Red_Value = AppliHslSet.HslLightness16 ;
- Appli_RGBParam.Green_Value = AppliHslSet.HslLightness16 ;
- Appli_RGBParam.Blue_Value = AppliHslSet.HslLightness16 ;
+ Appli_RGBParam[elementIndex].Red_Value = AppliHslSet[elementIndex].HslLightness16 ;
+ Appli_RGBParam[elementIndex].Green_Value = AppliHslSet[elementIndex].HslLightness16 ;
+ Appli_RGBParam[elementIndex].Blue_Value = AppliHslSet[elementIndex].HslLightness16 ;
}
- else if((AppliHslSet.HslLightness16 == 0xFFFF) || (AppliHslSet.HslLightness16 == 0x00))
+ else if((AppliHslSet[elementIndex].HslLightness16 == 0xFFFF) || (AppliHslSet[elementIndex].HslLightness16 == 0x00))
{
- Appli_RGBParam.Red_Value = AppliHslSet.HslLightness16 ;
- Appli_RGBParam.Green_Value = AppliHslSet.HslLightness16 ;
- Appli_RGBParam.Blue_Value = AppliHslSet.HslLightness16 ;
+ Appli_RGBParam[elementIndex].Red_Value = AppliHslSet[elementIndex].HslLightness16 ;
+ Appli_RGBParam[elementIndex].Green_Value = AppliHslSet[elementIndex].HslLightness16 ;
+ Appli_RGBParam[elementIndex].Blue_Value = AppliHslSet[elementIndex].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;
+ hueValue = (MOBLEUINT16)(360 * (float)AppliHslSet[elementIndex].HslHueLightness16/65535);
+ lightnessvalue = (float)AppliHslSet[elementIndex].HslLightness16/65535;
+ saturationValue = (float)AppliHslSet[elementIndex].HslSaturation16/65535;
/* Formula to get the values used for RGB conversion */
cValue = (MOBLEUINT16)(((1- fabs(2 * lightnessvalue-1))*saturationValue) * 1000);
@@ -1614,33 +1933,33 @@ void HSL2RGB_Conversion(void)
/* Conditons applied for the different angle of hue value */
if (hueValue > 0 && hueValue < (HUE_UPPER_LIMIT / 6))
{
- RgbF_Create(cValue + mValue, xValue + mValue, mValue);
+ RgbF_Create(cValue + mValue, xValue + mValue, mValue, elementIndex);
}
else if (hueValue >= (HUE_UPPER_LIMIT / 6) && hueValue < (HUE_UPPER_LIMIT / 3))
{
- RgbF_Create(xValue + mValue, cValue + mValue, mValue);
+ RgbF_Create(xValue + mValue, cValue + mValue, mValue, elementIndex);
}
else if (hueValue >= (HUE_UPPER_LIMIT / 3) && hueValue < (HUE_UPPER_LIMIT / 2))
{
- RgbF_Create(mValue, cValue + mValue, xValue + mValue);
+ RgbF_Create(mValue, cValue + mValue, xValue + mValue, elementIndex);
}
else if (hueValue >= (HUE_UPPER_LIMIT / 2)
&& hueValue < (2 * HUE_UPPER_LIMIT / 3))
{
- RgbF_Create(mValue, xValue + mValue, cValue + mValue);
+ RgbF_Create(mValue, xValue + mValue, cValue + mValue, elementIndex);
}
else if (hueValue >= (2 * HUE_UPPER_LIMIT / 3)
&& hueValue < (5 * HUE_UPPER_LIMIT / 6))
{
- RgbF_Create(xValue + mValue, mValue, cValue + mValue);
+ RgbF_Create(xValue + mValue, mValue, cValue + mValue, elementIndex);
}
else if ((hueValue >= (5 * HUE_UPPER_LIMIT / 6) && hueValue <= HUE_UPPER_LIMIT) || (hueValue == 0))
{
- RgbF_Create(cValue + mValue, mValue, xValue + mValue);
+ RgbF_Create(cValue + mValue, mValue, xValue + mValue, elementIndex);
}
else
{
- RgbF_Create(mValue, mValue, mValue);
+ RgbF_Create(mValue, mValue, mValue, elementIndex);
}
}
}
@@ -1778,5 +2097,5 @@ void Light_UpdateLedValue(MOBLEUINT8 state ,Appli_LightPwmValue_t light_state)
/**
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index aaa600146..c5bb76ec0 100644
--- 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
@@ -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
@@ -54,6 +54,9 @@ typedef struct
MOBLEUINT16 PresentLightness16;
MOBLEUINT16 PresentTemperature16;
MOBLEINT16 PresentCtlDelta16;
+ MOBLEUINT16 TargetLightness16;
+ MOBLEUINT16 TargetTemperature16;
+ MOBLEINT16 TargetCtlDelta16;
}Appli_Light_CtlSet;
/* Light Ctl Temperature Range Set */
@@ -78,6 +81,9 @@ typedef struct
MOBLEUINT16 HslLightness16;
MOBLEUINT16 HslHueLightness16;
MOBLEUINT16 HslSaturation16;
+ MOBLEUINT16 TargetHslLightness16;
+ MOBLEUINT16 TargetHslHueLightness16;
+ MOBLEUINT16 TargetHslSaturation16;
}Appli_Light_HslSet;
/* Light Hsl Hue set */
@@ -117,80 +123,225 @@ typedef struct
/* Exported Functions Prototypes ---------------------------------------------*/
-MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t*, MOBLEUINT8 OptionalValid);
+MOBLE_RESULT Appli_Light_Lightness_Set(Light_LightnessStatus_t*,
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
-MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status, MOBLEUINT32 pLength);
+MOBLE_RESULT Appli_Light_Lightness_Status(MOBLEUINT8 const *pLightness_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
-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_Linear_Status(MOBLEUINT8 const *pLightnessLinear_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Light_Lightness_Default_Set(Light_LightnessDefaultParam_t* pLight_LightnessDefaultParam,
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Lightness_Last_Status(MOBLEUINT8 const *pLightnessDefault_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Lightness_Default_Status(MOBLEUINT8 const *pLightnessLast_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Lightness_Last_Set(Light_LightnessStatus_t* pLight_LightnessParam,
+ MOBLEUINT8 elementIndex);
+
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Lightness_Range_Status(MOBLEUINT8 const *pLightnessRange_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Ctl_Status(MOBLEUINT8 const *pLightCtl_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_CtlTemperature_Status(MOBLEUINT8 const *pLightCtlTemp_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_CtlTemperature_Range_Status(MOBLEUINT8 const *pCtlTempRange_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_CtlDefault_Status(MOBLEUINT8 const *pCtlDefault_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_Hsl_Status(MOBLEUINT8 const *pHsl_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_HslHue_Status(MOBLEUINT8 const *pHslHue_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_HslSaturation_Status(MOBLEUINT8 const *pHslSaturation_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_HslDefault_Status(MOBLEUINT8 const *pHslDefault_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
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);
+ MOBLEUINT8 OptionalValid,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_HslRange_Status(MOBLEUINT8 const *pHslRange_status,
+ MOBLEUINT32 pLength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetLightnessStatus(MOBLEUINT8* lLightnessState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetLightnessLinearStatus(MOBLEUINT8* lLightnessState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetLightnessDefaultStatus(MOBLEUINT8* lDefaultState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetLightnessLastStatus(MOBLEUINT8* lLastState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetLightnessRangeStatus(MOBLEUINT8* lRangeState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetCtlLightStatus(MOBLEUINT8* lCtlLightState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetCtlTargetStatus(MOBLEUINT8* lCtlLightState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetCtlTemperatureStatus(MOBLEUINT8* lCtlTempState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetCtlTemperatureRange(MOBLEUINT8* lCtlTempRange,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetCtlDefaultStatus(MOBLEUINT8* lCtlDefaultState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslStatus(MOBLEUINT8* lHslState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslTargetStatus(MOBLEUINT8* lHslState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslHueStatus(MOBLEUINT8* lHslHueState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslSaturationStatus(MOBLEUINT8* lHslSaturationState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslHueRange(MOBLEUINT8* lHslHueRange,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslSatRange(MOBLEUINT8* lHslSatRange,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+
+MOBLE_RESULT Appli_Light_GetHslDefaultStatus(MOBLEUINT8* lHslDefaultState,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
void Appli_Light_PwmInit(void);
-void HSL2RGB_Conversion(void);
+void HSL2RGB_Conversion(MOBLEUINT8 elementIndex);
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);
+void RgbF_Create(MOBLEUINT16 value1,
+ MOBLEUINT16 value2,
+ MOBLEUINT16 value3,
+ MOBLEUINT8 elementIndex);
+void Light_UpdateLedValue(MOBLEUINT8 state,
+ Appli_LightPwmValue_t light_state);
+
+/******************************************************************************/
#endif /* __APPLI_LIGHT_H */
+/******************************************************************************/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index d7982080a..8556233b3 100644
--- 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
@@ -6,7 +6,8 @@
******************************************************************************
* @attention
*
-* <h2><center>&copy; COPYRIGHT(c) 20120 STMicroelectronics</center></h2>
+* <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
@@ -21,6 +22,7 @@
#include "types.h"
#include "appli_generic.h"
#include "appli_light.h"
+#include "appli_light_lc.h"
#include "common.h"
#include "mesh_cfg_usr.h"
#include "appli_nvm.h"
@@ -46,26 +48,392 @@
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
+* @brief Appli_LightClient_API: This function is a Wrapper to call Light Client API depending on opcode received in input
+* @param elementIndex: Index of the element
+* @param msg_opcode: opcode of the desired API
+* @param msg_params: buffer containing the desired API parameters
* @retval MOBLE_RESULT
*/
-MOBLE_RESULT Appli_LightClient_Lightness_Set(void)
+MOBLE_RESULT Appli_LightClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8 *msg_params)
{
- MOBLE_ADDRESS elementAddr = 0;
- MOBLEUINT8 pLightnessParam[3];
-
- Appli_IntensityControlPublishing(pLightnessParam);
- LightClient_Lightness_Set_Unack(elementAddr,
- (_Light_LightnessParam*) pLightnessParam,
- sizeof(pLightnessParam) );
-
- return MOBLE_RESULT_SUCCESS;
-}
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+
+ switch(msg_opcode){
+/******************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS
+/******************************************************************************/
+ case LIGHT_LIGHTNESS_GET:
+ {
+ result = LightClient_Lightness_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LIGHTNESS_SET:
+ {
+ result = LightClient_Lightness_Set_Ack(elementIndex,
+ msg_params,
+ (sizeof(Light_LightnessParam_t)-2)); //Remove the size of Linear Lightness params
+ break;
+ }
+ case LIGHT_LIGHTNESS_SET_UNACK:
+ {
+ result = LightClient_Lightness_Set_Unack(elementIndex,
+ msg_params,
+ (sizeof(Light_LightnessParam_t)-2)); //Remove the size of Linear Lightness params
+ break;
+ }
+
+ case LIGHT_LIGHTNESS_LINEAR_GET:
+ {
+ result = LightClient_Lightness_Linear_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LIGHTNESS_LINEAR_SET:
+ {
+ result = LightClient_Lightness_Linear_Set_Ack(elementIndex,
+ msg_params,
+ (sizeof(Light_LightnessParam_t)-2)); //Remove the size of Lightness params
+ break;
+ }
+ case LIGHT_LIGHTNESS_LINEAR_SET_UNACK:
+ {
+ result = LightClient_Lightness_Linear_Set_Unack(elementIndex,
+ msg_params,
+ (sizeof(Light_LightnessParam_t)-2)); //Remove the size of Lightness params
+ break;
+ }
+
+ case LIGHT_LIGHTNESS_DEFAULT_GET:
+ {
+ result = LightClient_Lightness_Default_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LIGHTNESS_DEFAULT_SET:
+ {
+ result = LightClient_Lightness_Default_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_LightnessDefaultParam_t));
+ break;
+ }
+ case LIGHT_LIGHTNESS_DEFAULT_SET_UNACK:
+ {
+ result = LightClient_Lightness_Default_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_LightnessDefaultParam_t));
+ break;
+ }
+
+
+ case LIGHT_LIGHTNESS_RANGE_GET:
+ {
+ result = LightClient_Lightness_Range_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LIGHTNESS_RANGE_SET:
+ {
+ result = LightClient_Lightness_Range_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_LightnessRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+ case LIGHT_LIGHTNESS_RANGE_SET_UNACK:
+ {
+ result = LightClient_Lightness_Range_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_LightnessRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+
+
+/******************************************************************************/
+#endif /* #ifdef ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS */
+/******************************************************************************/
+
+/******************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_CTL
+/******************************************************************************/
+ case LIGHT_CTL_GET:
+ {
+ result = LightClient_Ctl_Get(elementIndex);
+ break;
+ }
+ case LIGHT_CTL_SET:
+ {
+ result = LightClient_Ctl_Set_Ack(elementIndex,
+ msg_params,
+ (sizeof(Light_CtlParam_t)-4) ); //Remove the size of Last_Lightness and Last_Temperature
+ break;
+ }
+ case LIGHT_CTL_SET_UNACK:
+ {
+ result = LightClient_Ctl_Set_Unack(elementIndex,
+ msg_params,
+ (sizeof(Light_CtlParam_t)-4) ); //Remove the size of Last_Lightness and Last_Temperature
+ break;
+ }
+
+ case LIGHT_CTL_TEMPERATURE_GET:
+ {
+ result = LightClient_Ctl_Temperature_Get(elementIndex);
+ break;
+ }
+ case LIGHT_CTL_TEMPERATURE_SET:
+ {
+ result = LightClient_Ctl_Temperature_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlTemperatureParam_t));
+ break;
+ }
+ case LIGHT_CTL_TEMPERATURE_SET_UNACK:
+ {
+ result = LightClient_Ctl_Temperature_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlTemperatureParam_t));
+ break;
+ }
+
+ case LIGHT_CTL_TEMPERATURE_RANGE_GET:
+ {
+ result = LightClient_Ctl_Temperature_Range_Get(elementIndex);
+ break;
+ }
+ case LIGHT_CTL_TEMPERATURE_RANGE_SET:
+ {
+ result = LightClient_Ctl_Temperature_Range_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlTemperatureRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+ case LIGHT_CTL_TEMPERATURE_RANGE_SET_UNACK:
+ {
+ result = LightClient_Ctl_Temperature_Range_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlTemperatureRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+
+ case LIGHT_CTL_DEFAULT_GET:
+ {
+ result = LightClient_Ctl_Default_Get(elementIndex);
+ break;
+ }
+ case LIGHT_CTL_DEFAULT_SET:
+ {
+ result = LightClient_Ctl_Default_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlDefaultParam_t));
+ break;
+ }
+ case LIGHT_CTL_DEFAULT_SET_UNACK:
+ {
+ result = LightClient_Ctl_Default_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_CtlDefaultParam_t));
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_LIGHT_MODEL_CLIENT_CTL */
+/******************************************************************************/
+/******************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_HSL
+/******************************************************************************/
+ case LIGHT_HSL_GET:
+ {
+ result = LightClient_Hsl_Get(elementIndex);
+ break;
+ }
+ case LIGHT_HSL_SET:
+ {
+ result = LightClient_Hsl_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_HslParam_t) );
+ break;
+ }
+ case LIGHT_HSL_SET_UNACK:
+ {
+ result = LightClient_Hsl_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_HslParam_t) );
+ break;
+ }
+
+ case LIGHT_HSL_DEFAULT_GET:
+ {
+ result = LightClient_Hsl_Default_Get(elementIndex);
+ break;
+ }
+ case LIGHT_HSL_DEFAULT_SET:
+ {
+ result = LightClient_Hsl_Default_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_HslDefault_t) );
+ break;
+ }
+ case LIGHT_HSL_DEFAULT_SET_UNACK:
+ {
+ result = LightClient_Hsl_Default_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_HslDefault_t) );
+ break;
+ }
+
+ case LIGHT_HSL_RANGE_GET:
+ {
+ result = LightClient_Hsl_Range_Get(elementIndex);
+ break;
+ }
+ case LIGHT_HSL_RANGE_SET:
+ {
+ result = LightClient_Hsl_Range_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_HslRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+ case LIGHT_HSL_RANGE_SET_UNACK:
+ {
+ result = LightClient_Hsl_Range_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_HslRangeParam_t)-1); //Remove the size of StatusCode
+ break;
+ }
+
+ case LIGHT_HSL_HUE_GET:
+ {
+ result = LightClient_Hsl_Hue_Get(elementIndex);
+ break;
+ }
+ case LIGHT_HSL_HUE_SET:
+ {
+ result = LightClient_Hsl_Hue_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_HslHueParam_t));
+ break;
+ }
+ case LIGHT_HSL_HUE_SET_UNACK:
+ {
+ result = LightClient_Hsl_Hue_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_HslHueParam_t));
+ break;
+ }
+
+ case LIGHT_HSL_SATURATION_GET:
+ {
+ result = LightClient_Hsl_Saturation_Get(elementIndex);
+ break;
+ }
+ case LIGHT_HSL_SATURATION_SET:
+ {
+ result = LightClient_Hsl_Saturation_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_HslSaturationParam_t));
+ break;
+ }
+ case LIGHT_HSL_SATURATION_SET_UNACK:
+ {
+ result = LightClient_Hsl_Saturation_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_HslSaturationParam_t));
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_LIGHT_MODEL_CLIENT_HSL */
+/******************************************************************************/
+
+/******************************************************************************/
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_LC
+/******************************************************************************/
+ case LIGHT_LC_MODE_GET:
+ {
+ result = LightClient_LC_Mode_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LC_MODE_SET:
+ {
+ result = LightClient_LC_Mode_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_ModeParam_t));
+ break;
+ }
+ case LIGHT_LC_MODE_SET_UNACK:
+ {
+ result = LightClient_LC_Mode_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_ModeParam_t));
+ break;
+ }
+ case LIGHT_LC_OM_GET:
+ {
+ result = LightClient_LC_OM_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LC_OM_SET:
+ {
+ result = LightClient_LC_OM_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_OccupancyModeParam_t));
+ break;
+ }
+ case LIGHT_LC_OM_SET_UNACK:
+ {
+ result = LightClient_LC_OM_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_OccupancyModeParam_t));
+ break;
+ }
+ case LIGHT_LC_ON_OFF_GET:
+ {
+ result = LightClient_LC_OnOff_Get(elementIndex);
+ break;
+ }
+ case LIGHT_LC_ON_OFF_SET:
+ {
+ result = LightClient_LC_OnOff_Set_Ack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_OnOffParam_t));
+ break;
+ }
+ case LIGHT_LC_ON_OFF_SET_UNACK:
+ {
+ result = LightClient_LC_OnOff_Set_Unack(elementIndex,
+ msg_params,
+ sizeof(Light_LC_OnOffParam_t));
+ break;
+ }
+
+ case LIGHT_LC_PROPERTY_GET:
+ {
+ result = LightClient_LC_Property_Get(elementIndex, msg_params);
+ break;
+ }
+ case LIGHT_LC_PROPERTY_SET:
+ {
+ //TODO: Set dynamic data size depending on Property DATA LENTGH: length = 2 + PropertyDataLength
+ result = LightClient_LC_Property_Set_Ack(elementIndex,
+ msg_params,
+ 5);
+ break;
+ }
+ case LIGHT_LC_PROPERTY_SET_UNACK:
+ {
+ //TODO: Set dynamic data size depending on Property DATA LENTGH: length = 2 + PropertyDataLength
+ result = LightClient_LC_Property_Set_Unack(elementIndex,
+ msg_params,
+ 5);
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_LIGHT_MODEL_CLIENT_LC */
+/******************************************************************************/
+ default:
+ {
+ TRACE_M(TF_LIGHT, "OpCode value invalid %d \r\n", msg_opcode);
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+ return result;
+}
/**
* @}
@@ -75,5 +443,5 @@ MOBLE_RESULT Appli_LightClient_Lightness_Set(void)
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index a9e0fa708..ba977f2c8 100644
--- 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
@@ -31,10 +31,10 @@
/* Exported variables ------------------------------------------------------- */
/* Application Variable-------------------------------------------------------*/
/* Exported Functions Prototypes ---------------------------------------------*/
-MOBLE_RESULT Appli_LightClient_Lightness_Set(void);
+MOBLE_RESULT Appli_LightClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8* msg_params);
#endif /* __APPLI_LIGHT_CLIENT_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index a7d123c91..953e880bd 100644
--- 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
@@ -39,138 +39,407 @@
/* Private macro -------------------------------------------------------------*/
/* Private variable ----------------------------------------------------------*/
-Appli_LightLC_Set_t Appli_LightLC_set;
-Appli_Light_LC_PropertySet_t Appli_LightLC_PropertySet;
+__attribute__((aligned(4)))const light_lc_cb_t AppliLightLc_cb =
+{
+ Appli_LightLCs_ModeGet,
+ Appli_LightLCs_ModeSet,
+ Appli_LightLCs_ModeSetUnack,
+ Appli_LightLCs_ModeStatus,
+ Appli_LightLCs_OmGet,
+ Appli_LightLCs_OmSet,
+ Appli_LightLCs_OmSetUnack,
+ Appli_LightLCs_OmStatus,
+ Appli_LightLCs_OnOffGet,
+ Appli_LightLCs_OnOffSet,
+ Appli_LightLCs_OnOffSetUnack,
+ Appli_LightLCs_OnOffStatus,
+ Appli_LightLCs_PropertyGet,
+ Appli_LightLCs_PropertySet,
+ Appli_LightLCs_PropertySetUnack,
+ Appli_LightLCs_PropertyStatus
+};
-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
+ * @brief Callback corresponding to LightLCs_ModeGet_cb
+ * @param Message parameters
+ * @retval None
*/
-MOBLE_RESULT Appli_LightLC_Mode_Set(Light_LC_Param_t* pLight_LC_Param,
- MOBLEUINT8 OptionalValid)
+void Appli_LightLCs_ModeGet(MODEL_MessageHeader_t *pmsgParam)
{
- 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;
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
}
+
/**
-* @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
+ * @brief Callback corresponding to LightLCs_ModeSet_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
*/
-MOBLE_RESULT Appli_LightLC_OM_Set(Light_LC_Param_t* pLight_LC_Param,
- MOBLEUINT8 OptionalValid)
+void Appli_LightLCs_ModeSet(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
{
- 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;
-}
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
+
/**
-* @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
+ * @brief Callback corresponding to LightLCs_ModeSetUnack_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
*/
-MOBLE_RESULT Appli_LightLC_OnOff_Set(Light_LC_Param_t* pLight_LC_Param,
- MOBLEUINT8 OptionalValid)
+void Appli_LightLCs_ModeSetUnack(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
{
- 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;
-}
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
+
/**
-* @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)
+ * @brief Callback corresponding to LightLCs_ModeSatus_cb
+ * @param Message parameters
+ * @retval None
+*/
+void Appli_LightLCs_ModeStatus(MOBLEUINT8 const* pLightLCMode_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+ TRACE_M(TF_LIGHT_LC,"LightLCs_ModeStatus callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8294!\r\n");
+
+ for(i = 0; i < plength; i++)
+ {
+ if(i == 0)
+ TRACE_M(TF_SERIAL_CTRL,"Light LC Mode value: %d\n\r",
+ pLightLCMode_status[i]);
+ }
+}
+
+
+/**
+ * @brief Callback corresponding to LightLCs_OmGet_cb
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_OmGet(MODEL_MessageHeader_t *pmsgParam)
{
- /* 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.
- */
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
- return AmbientLuxLevel;
+
+/**
+ * @brief Callback corresponding to LightLCs_OmSet_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_OmSet(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
+{
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
}
+
/**
-* @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)
+ * @brief Callback corresponding to LightLCs_OmSetUnack_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_OmSetUnack(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
{
- MOBLEUINT16 luxLevel = 0;
- /* User can write their code for the calculation */
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
+
+/**
+ * @brief Callback corresponding to LightLCs_OmStatus_cb
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_OmStatus(MOBLEUINT8 const* pLightLCOccupancyMode_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+ TRACE_M(TF_LIGHT_LC,"LightLCs_OmStatus callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#8298!\r\n");
- return luxLevel;
+ for(i = 0; i < plength; i++)
+ {
+ if(i == 0)
+ TRACE_M(TF_SERIAL_CTRL,"Light LC OM value: %d\n\r",
+ pLightLCOccupancyMode_status[i]);
+ }
+}
+
+
+/**
+ * @brief Callback corresponding to LightLCs_OnOffGet_cb
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_OnOffGet(MODEL_MessageHeader_t *pmsgParam)
+{
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
}
+
/**
-* @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
+ * @brief Callback corresponding to LightLC_OnOffSet_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
*/
-MOBLE_RESULT Appli_LightLC_Get_ModeStatus(MOBLEUINT8* plcModeState)
+void Appli_LightLCs_OnOffSet(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
{
- *(plcModeState) = Appli_LightLC_set.LC_mode;
- TRACE_M(TF_SERIAL_CTRL,"Get Mode Status: %d\n\r",
- Appli_LightLC_set.LC_mode);
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
- return MOBLE_RESULT_SUCCESS;
+
+/**
+ * @brief Callback corresponding to LightLCs_OnOffSetUnack_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+*/
+void Appli_LightLCs_OnOffSetUnack(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
+{
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
}
+
/**
-* @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
+ * @brief Callback corresponding to LightLCs_OnOffStatus_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
*/
-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);
+void Appli_LightLCs_OnOffStatus(MOBLEUINT8 const* pLightLCOnOff_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+ TRACE_M(TF_LIGHT_LC,"LightLCs_OnOffStatus callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#829C!\r\n");
- return MOBLE_RESULT_SUCCESS;
+ for(i = 0; i < plength; i++)
+ {
+ if(i == 0)
+ TRACE_M(TF_SERIAL_CTRL,"Light LC OnOff status: %d\n\r",
+ pLightLCOnOff_status[i]);
+ }
+}
+
+
+/**
+ * @brief Callback corresponding to LightLCs_PropertyGet_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+*/
+void Appli_LightLCs_PropertyGet(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
+{
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
}
+
+/**
+ * @brief Callback corresponding to LightLCs_PropertySet_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_PropertySet(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
+{
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+}
+
+
+/**
+ * @brief Callback corresponding to LightLCs_PropertySetUnack_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
+ */
+void Appli_LightLCs_PropertySetUnack(MOBLEUINT8 const* pRxData, MODEL_MessageHeader_t *pmsgParam)
+ {
+ TRACE_M(TF_LIGHT_LC, "Element index %d peer addr %X dst peer %X\r\n",
+ pmsgParam->elementIndex, pmsgParam->peer_addr, pmsgParam->dst_peer);
+ }
+
+
/**
-* @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
+ * @brief Callback corresponding to LightLCs_PropertyStatus_cb
+ * @param Data
+ * @param Message parameters
+ * @retval None
*/
-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);
+void Appli_LightLCs_PropertyStatus(MOBLEUINT8 const* pLightLCProperty_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+ TRACE_M(TF_LIGHT_LC,"LightLCs_PropertyStatus callback received for element %d \r\n", elementIndex);
+ TRACE_M(TF_SERIAL_CTRL,"#64!\r\n");
- return MOBLE_RESULT_SUCCESS;
-}
+ for(i = 0; i < plength; i++)
+ {
+ if(i == 0)
+ TRACE_M(TF_SERIAL_CTRL,"Light LC Property status: %d\n\r",
+ pLightLCProperty_status[i]);
+ }
+}
+
+
+/**
+ * @brief
+ * @param
+ * @retval
+ */
+__weak MOBLE_RESULT Appli_Light_LCs_Init(void)
+ {
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+ MOBLEUINT8 lcsElementIndex = 0;
+
+ /* Extract element index of LC server */
+ result = ExtractLcServerElementIndex(&lcsElementIndex,
+#ifdef APPLICATION_NUMBER_OF_ELEMENTS
+ APPLICATION_NUMBER_OF_ELEMENTS,
+#else
+ 0,
+#endif
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+ ENABLE_LIGHT_MODEL_SERVER_LC,
+ ENABLE_LIGHT_MODEL_SERVER_LC_SETUP,
+#else
+ 0,
+ 0,
+#endif
+#ifdef ENABLE_GENERIC_MODEL_SERVER_ONOFF
+ ENABLE_GENERIC_MODEL_SERVER_ONOFF,
+#else
+ 0,
+#endif
+#ifdef ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF
+ ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF,
+#else
+ 0,
+#endif
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS
+ ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS);
+#else
+ 0);
+#endif
+
+ if(MOBLE_SUCCEEDED(result))
+ {
+ result = Light_LCs_Init(&BufferLcServer, lcsElementIndex, &AppliLightLc_cb, SIZE_OF_LC_SERVER_T);
+ }
+
+ if(MOBLE_FAILED(result))
+ {
+ TRACE_M(TF_LIGHT_LC, "Light LC Server init failed\r\n");
+ }
+
+ return result;
+}
+
+
+/**
+ * @brief
+ * @param
+ * @retval
+ */
+__weak MOBLE_RESULT Appli_Light_LC_SensorPropertyUpdate(MOBLEUINT8 elementIndex,
+ MOBLEUINT16 propertyId,
+ MOBLEUINT32 value)
+{
+ return Light_LC_SensorPropertyUpdate(elementIndex,
+ propertyId,
+ value);
+}
+
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+/**
+ * @brief Handling of serial inputs to LC model
+ * @param serial string
+ * @param serial string size
+ * @retval void
+ */
+void Appli_Light_LC_SerialCmd(char *rcvdStringBuff, uint16_t rcvdStringSize)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_INVALIDARG;
+
+ if (!strncmp(rcvdStringBuff+6, "TR0", 3))
+ {
+ if (rcvdStringSize == 9)
+ {
+ /* call to function corresponding MMDL/SR/LLC/BV-03-C */
+ result = Light_LC_SetTransitionTimeZero(1);
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ BLEMesh_PrintStringCb("Invalid size of string\r\n");
+ }
+ }
+ else if (!strncmp(rcvdStringBuff+6, "OCCUPANCY", 9)) /* occupancy detect */
+ {
+ if (rcvdStringSize == 15)
+ {
+ /* occupancy detected for element index 0 */
+ Appli_Light_LC_SensorPropertyUpdate(0,
+ PRESENCE_DETECTED_PID,
+ 1);
+ result = MOBLE_RESULT_SUCCESS;
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ BLEMesh_PrintStringCb("Invalid size of string\r\n");
+ }
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ /* Check the result of command processing */
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ BLEMesh_PrintStringCb("Success\r\n");
+ }
+ else if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ BLEMesh_PrintStringCb("Fail Out of memory\r\n");
+ }
+ else if(result == MOBLE_RESULT_INVALIDARG)
+ {
+ BLEMesh_PrintStringCb("Fail Invalid Argument\r\n");
+ }
+ else
+ {
+ BLEMesh_PrintStringCb("Fail\r\n");
+ }
+}
+#endif
/**
@@ -181,5 +450,5 @@ MOBLE_RESULT Appli_LightLC_Get_OnOffStatus(MOBLEUINT8* plcOnOffState)
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index e9893c5e8..7691992ed 100644
--- 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
@@ -25,43 +25,55 @@
#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);
+void Appli_LightLCs_ModeGet(MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_ModeSet(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_ModeSetUnack(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_ModeStatus(MOBLEUINT8 const* pLightLCMode_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_LightLCs_OmGet(MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OmSet(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OmSetUnack(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OmStatus(MOBLEUINT8 const* pLightLCOccupancyMode_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_LightLCs_OnOffGet(MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OnOffSet(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OnOffSetUnack(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_OnOffStatus(MOBLEUINT8 const* pLightLCOnOff_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_LightLCs_PropertyGet(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_PropertySet(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_PropertySetUnack(MOBLEUINT8 const* pRxData,
+ MODEL_MessageHeader_t *pmsgParam);
+void Appli_LightLCs_PropertyStatus(MOBLEUINT8 const* pLightLCOccupancyMode_status,
+ MOBLEUINT32 plength,
+ MOBLEUINT16 dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Light_LCs_Init(void);
+MOBLE_RESULT Appli_Light_LC_SensorPropertyUpdate(MOBLEUINT8 elementIndex,
+ MOBLEUINT16 propertyId,
+ MOBLEUINT32 value);
+void Appli_Light_LC_SerialCmd(char *rcvdStringBuff,
+ uint16_t rcvdStringSize);
#endif /* __APPLI_LIGHT_LC_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index bec2dd222..e4b7c3590 100644
--- 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
@@ -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
@@ -20,15 +20,18 @@
#include "ble_common.h"
#include "app_conf.h"
#include "hal_common.h"
+#include "ble_mesh.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 "light.h"
+#include "light_lc.h"
+#include "sensors.h"
#include "common.h"
#include "serial_if.h"
#include "appli_nvm.h"
@@ -36,9 +39,16 @@
#include "appli_config_client.h"
#include "appli_generic_client.h"
#include "appli_light_client.h"
+#if ((ENABLE_SENSOR_MODEL_SERVER != 0)||(ENABLE_SENSOR_MODEL_CLIENT != 0))
+#include "appli_sensor.h"
+#include "appli_sensors_client.h"
+#endif
#include "stm32_seq.h"
+#if (( CFG_LPM_SUPPORTED == 0) && (ENABLE_PWM_SUPPORT == 1))
#include "PWM_config.h"
+#include "PWM_handlers.h"
+#endif
#include "mesh_cfg_usr.h"
/** @addtogroup ST_BLE_Mesh
@@ -90,6 +100,7 @@
/* Private variables ---------------------------------------------------------*/
+
enum ButtonState
{
BS_OFF,
@@ -100,12 +111,13 @@ enum ButtonState
enum ButtonState buttonState = BS_OFF;
tClockTime tBounce = 0;
+/*Will be an array aligned with number of elements*/
MOBLEUINT8 Appli_LedState = 0;
MOBLEUINT16 IntensityValue = INTENSITY_LEVEL_ZERO;
MOBLEUINT8 IntensityFlag = FALSE;
MOBLEUINT8 ProxyFlag = 0;
MOBLEUINT8 ProvisionFlag = 0;
-
+MOBLEUINT8 UnprovisionInProgress = 0;
#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
static MOBLEUINT8 PrvngInProcess = 0;
@@ -123,7 +135,7 @@ 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,
+const MOBLEUINT8 StaticOobBuff[SIZE_STATIC_OOB] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
#else
const MOBLEUINT8 StaticOobBuff[] = {0};
@@ -182,6 +194,8 @@ volatile uint8_t BleProcessInit = 0;
MOBLEUINT8 lowPowerNodeApiTimer_Id;
#endif
+MOBLEUINT8 pPropertyId[4];
+
/********************* Application configuration **************************/
#if defined(__GNUC__) || defined(__IAR_SYSTEMS_ICC__) || defined(__CC_ARM)
MOBLEUINT8 bdaddr[8];
@@ -198,7 +212,7 @@ const void *prvsnr_data;
#endif /* __GNUC__ || defined(__IAR_SYSTEMS_ICC__) || defined(__CC_ARM) */
/* Private function prototypes -----------------------------------------------*/
-//static void Appli_LongButtonPress(void);
+static void Appli_LongButtonPress(void);
static void Appli_ShortButtonPress(void);
#if USER_OUTPUT_OOB_APPLI_PROCESS
void Appli_OobAuthenticationProcess(void);
@@ -208,6 +222,9 @@ void Appli_LowPowerProcess(void);
#if (APPLI_OPTIM == 1)
static void AppliMeshTask(void);
#endif
+void Appli_GetPublicationParamsCb(model_publicationparams_t* pPubParameters);
+WEAK_FUNCTION (void SerialPrvn_ProvisioningStatusUpdateCb(uint8_t flagPrvningInProcess,
+ MOBLEUINT16 nodeAddress));
/* Private functions ---------------------------------------------------------*/
@@ -222,7 +239,7 @@ static void Appli_ShortButtonPress(void)
BLEMesh_ModelsCommand();
}
-#if 0
+
/**
* @brief Function calls when a button is pressed for Long duration
* @param void
@@ -230,9 +247,137 @@ static void Appli_ShortButtonPress(void)
*/
static void Appli_LongButtonPress(void)
{
- /* User Implementation */
-}
+ /** GENERIC ONOFF **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API ONOFF GET ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_ON_OFF_GET, NULL);
+
+ /** GENERIC LEVEL **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API LEVEL GET ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_LEVEL_GET, NULL);
+
+ /** GENERIC POWER ONOFF **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API POWER ON OFF GET ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_POWER_ON_OFF_GET, NULL);
+
+ /** GENERIC TRANSITION TIME **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API DEFAULT TRANSITION TIME GET ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_DEFAULT_TRANSITION_TIME_GET, NULL);
+
+ /** LIGHT LIGHTNESS **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_GET, NULL);
+
+ /** LIGHT LIGHTNESS LINEAR **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS LINEAR GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_LINEAR_GET, NULL);
+
+ /** LIGHT LIGHTNESS DEFAULT **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS DEFAULT GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_DEFAULT_GET, NULL);
+
+ /** LIGHT LIGHTNESS RANGE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS RANGE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_RANGE_GET, NULL);
+
+ /** LIGHT LIGHTNESS CTL **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_GET, NULL);
+
+ /** LIGHT LIGHTNESS CTL TEMPERATURE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_GET, NULL);
+
+ /** LIGHT LIGHTNESS CTL TEMPERATURE RANGE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE RANGE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_RANGE_GET, NULL);
+
+ /** LIGHT LIGHTNESS CTL DEFAULT **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL DEFAULT GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_DEFAULT_GET, NULL);
+
+ /** LIGHT LIGHTNESS HSL **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_GET, NULL);
+
+ /** LIGHT LIGHTNESS HSL DEFAULT **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL DEFAULT GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_DEFAULT_GET, NULL);
+
+ /** LIGHT LIGHTNESS HSL RANGE**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL RANGE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_RANGE_GET, NULL);
+
+ /** LIGHT LIGHTNESS HSL HUE**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL HUE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_HUE_GET, NULL);
+
+ /** LIGHT LIGHTNESS HSL SATURATION**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL SATURATION GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_SATURATION_GET, NULL);
+
+ /** LIGHT LC MODE**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC MODE GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_MODE_GET, NULL);
+
+ /** LIGHT LC OM**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC OM GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_OM_GET, NULL);
+
+ /** LIGHT LC ON OFF**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC ON OFF GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_ON_OFF_GET, NULL);
+
+ /** LIGHT LC PROPERTY **/
+ //LIGHT_CONTROL_LUX_LEVEL_ON_ID : 0x202B
+ pPropertyId[0]= 0x2B; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pPropertyId[1]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC PROPERTY GET ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_PROPERTY_GET, pPropertyId);
+
+#if 1 /* Sensor APIs */
+ //PRESENT_AMBIENT_TEMPERATURE_PID : 0x004F
+ pPropertyId[0]= 0x4F; // Property ID byte 0 : Property ID for the sensor
+ pPropertyId[1]= 0x00; // Property ID byte 1 : Property ID for the sensor
+
+ /** SENSOR DESCRIPTOR**/
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR DESCRIPTOR GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_DESCRIPTOR_GET, pPropertyId);
+
+ /** SENSOR CADENCE**/
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR CADENCE GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_CADENCE_GET, pPropertyId);
+
+ /** SENSOR SETTINGS **/
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR SETTINGS GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_SETTINGS_GET, pPropertyId);
+
+ /** SENSOR SETTING **/
+ pPropertyId[2]= 0xAD; // Sensor Setting Property ID byte 0 : Property ID for the sensor setting
+ pPropertyId[3]= 0x00; // Sensor Setting Property ID byte 1 : Property ID for the sensor setting
+
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR SETTING GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_SETTING_GET, pPropertyId);
+
+ /** SENSOR GET **/
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_GET, pPropertyId);
+
+ /** SENSOR COLUMN **/
+// pPropertyId[2]= 0x01; // Raw Value X byte 0 : Raw value identifying a column
+// pPropertyId[3]= 0x00; // Raw Value X byte 1 : Raw value identifying a column
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR COLUMN GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_COLUMN_GET, pPropertyId);
+
+ /** SENSOR SERIES **/
+// pPropertyId[2]= 0x01; // Raw Value X1 byte 0 : Raw value identifying a starting column.
+// pPropertyId[3]= 0x02; // Raw Value X2 byte 0 : Raw value identifying an ending column.
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR SERIES GET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_SERIES_GET, pPropertyId);
#endif
+
+ IntensityPublish();
+
+}
/**
* @brief Updates the button status
@@ -250,7 +395,7 @@ static void Appli_UpdateButtonState(int isPressed)
if((t1 - t0) > LONG_PRESS_THRESHOLD)
{
- IntensityPublish();
+ Appli_LongButtonPress();
}
else if((t1 - t0) > BOUNCE_THRESHOLD)
{
@@ -269,6 +414,25 @@ static void Mesh_Task()
BLEMesh_Process();
BLEMesh_ModelsProcess(); /* Models Processing */
+ if((UnprovisionInProgress > 0) &&
+ (!LL_FLASH_IsActiveFlag_OperationSuspended()))
+ {
+ UnprovisionInProgress = 0;
+ AppliNvm_ClearModelState();
+ PalNvmErase(NVM_BASE, 0);
+ PalNvmErase(NVM_BASE, 0x1000);
+ PalNvmErase(APP_NVM_BASE, 0);
+ PalNvmErase(PRVN_NVM_BASE_OFFSET, 0);
+ TRACE_M(TF_PROVISION,"NVM erased\r\n");
+ BLEMesh_Unprovision();
+ AppliNvm_ClearModelState();
+ TRACE_M(TF_PROVISION,"Device is unprovisioned by application \r\n");
+
+ BLEMesh_Process();
+
+ NVIC_SystemReset();
+ }
+
#if (APPLI_OPTIM == 0)
/* Set the task in the scheduler for the next execution */
#if (LOW_POWER_FEATURE == 0)
@@ -501,10 +665,10 @@ void Appli_BleUnprovisionedIdentifyCb(MOBLEUINT8 data)
*/
MOBLEUINT8 Appli_BleSetNumberOfElementsCb(void)
{
- if(NumberOfElements > MAX_NUMB_ELEMENTS)
+ if(NumberOfElements > BLEMesh_GetNumberOfElements())
{
- TRACE_M(TF_MISC,"In version 1.11.00x one Element per node is supported!\r\n");
- return MAX_NUMB_ELEMENTS;
+ TRACE_M(TF_MISC, "Number of Elements enabled in application exceeding from Library Capability!\r\n");
+ return BLEMesh_GetNumberOfElements();
}
else if(NumberOfElements == 0)
@@ -515,7 +679,7 @@ MOBLEUINT8 Appli_BleSetNumberOfElementsCb(void)
else
{
- return NumberOfElements;
+ return NumberOfElements;
}
}
@@ -593,6 +757,8 @@ MOBLEUINT8* Appli_BleInputOOBAuthCb(MOBLEUINT8 size)
while(1)
{
Serial_InterfaceProcess();
+ /* Enable Mesh process working in while loop */
+ BTLE_StackTick();
/* Check if input is completed or timeout */
if((inputOOBDataReady != 0x00) | (inputTimer > INPUT_OOB_TIMEOUT))
{
@@ -715,7 +881,7 @@ void Appli_Unprovision(void)
if(!ProxyFlag)
{
/* No GATT connection */
- BLEMesh_Unprovision();
+ BLEMesh_StopAdvScan();
PalNvmErase(NVM_BASE, 0);
PalNvmErase(NVM_BASE, 0x1000);
@@ -723,6 +889,7 @@ void Appli_Unprovision(void)
PalNvmErase(PRVN_NVM_BASE_OFFSET, 0);
TRACE_M(TF_PROVISION,"NVM erased\r\n");
+ BLEMesh_Unprovision();
AppliNvm_ClearModelState();
TRACE_M(TF_PROVISION,"Device is unprovisioned by application \r\n");
@@ -861,11 +1028,13 @@ SleepModes App_SleepMode_Check(SleepModes sleepMode)
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();
+ BLEMesh_StopAdvScan();
+ UnprovisionInProgress = 1; /* Wait release on FLASH PESD bit */
}
/**
@@ -981,7 +1150,7 @@ void BLEMesh_ConfigurationCallback(void)
/* Call API LPN_API_TIMER_INTERVAL after LPN provisioning */
if(LPN_scan_enabled == MOBLE_FALSE)
{
- HW_TS_Start(lowPowerNodeApiTimer_Id, LPN_API_TIMER_INTERVAL);
+ HW_TS_Start(lowPowerNodeApiTimer_Id, LPN_API_TIMER_INTERVAL);
LPN_scan_enabled = MOBLE_TRUE;
}
#endif
@@ -1233,28 +1402,19 @@ void BLEMesh_CustomBeaconReceivedCallback(const MOBLEUINT8* bdAddr,
if (result == MOBLE_RESULT_SUCCESS)
{
- if ((length-1) < data[0])
+ if (data[1] == CUSTOM_BEACON_AD_TYPE)
{
- result = MOBLE_RESULT_FAIL;
- TRACE_M(TF_BEACON, "Length field does not match with message length \r\n");
- }
- }
+ TRACE_M(TF_BEACON, "Message length(%d), rssi(%d) \r\n", length, rssi);
- if (result == MOBLE_RESULT_SUCCESS)
+ if (TF_BEACON == 1)
{
- MOBLEUINT8 adType = data[1];
- MOBLEUINT8 i;
-
- if (adType == CUSTOM_BEACON_AD_TYPE)
+ TRACE_I(TF_BEACON, "Data: ");
+ for (MOBLEUINT8 count=0; count<length; count++)
{
- 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]);
+ TRACE_I(TF_BEACON, "%.2x ", data[count]);
+ }
+ TRACE_I(TF_BEACON, " \r\n");
}
- else
- {
- /* Discard, Ad type mismatch */
}
}
}
@@ -1367,12 +1527,22 @@ void IntensityPublish(void)
{
#ifdef LIGHT_CLIENT_MODEL_PUBLISH
- Appli_LightClient_Lightness_Set();
+#ifdef ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS
+ MOBLEUINT8 elementIndex = 0;
+ MOBLEUINT8 pLightnessParam[3];
+ Appli_IntensityControlPublishing(pLightnessParam);
+ Appli_LightClient_API(elementIndex, LIGHT_LIGHTNESS_SET, pLightnessParam);
#endif
+#else
#ifdef GENERIC_CLIENT_MODEL_PUBLISH
- Appli_GenericClient_Level_Set_Unack();
+ MOBLEUINT8 elementIndex = 0;
+ MOBLEUINT8 pGeneric_LevelParam[3];
+
+ Appli_IntensityControlPublishing(pGeneric_LevelParam);
+ Appli_GenericClient_API(elementIndex, GENERIC_LEVEL_SET_ACK, pGeneric_LevelParam);
#endif
+#endif
}
/**
@@ -1387,7 +1557,6 @@ void Appli_Process(void)
AppliNvm_Process();
#endif
- Appli_LowPowerProcess();
#ifdef ENABLE_AUTH_TYPE_OUTPUT_OOB
if(PrvngInProcess)
{
@@ -1445,6 +1614,17 @@ static void AppliMeshSW1Task(void)
return;
}
+#if (ENABLE_SENSOR_MODEL_SERVER != 0)
+static void AppliMeshSW3Task(void)
+{
+ Sensor_UpdatePublishState(0, 1);
+
+ Appli_Sensor_Update(0, 1);
+
+ return;
+}
+#endif
+
#if (LOW_POWER_FEATURE == 1)
static void LowPowerNodeApiApp(void)
{
@@ -1497,7 +1677,7 @@ void Appli_Init(MOBLEUINT8 *flag)
{
#if 0
#ifdef ENABLE_UNPROVISIONING_BY_POWER_ONOFF_CYCLE
- /* Hardware Factory Restore implementation */
+/* Hardware Factory Restore implementation */
AppliNvm_FactorySettingReset();
#endif
#endif
@@ -1524,6 +1704,18 @@ void Appli_Init(MOBLEUINT8 *flag)
__HAL_RCC_TIM1_CLK_ENABLE();
__HAL_RCC_TIM2_CLK_ENABLE();
PWM_Init();
+#ifdef USER_BOARD_1LED
+ Modify_PWM(SINGLE_LED, 1);
+#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, 1);
+ Modify_PWM(GREEN_LED, 1);
+ Modify_PWM(BLUE_LED, 1);
+#endif
#endif
UTIL_SEQ_RegTask( 1<< CFG_TASK_MESH_SW1_REQ_ID, UTIL_SEQ_RFU, AppliMeshSW1Task );
@@ -1542,6 +1734,31 @@ void Appli_Init(MOBLEUINT8 *flag)
#endif
}
+/*****************************Config Model Callbacks***************************/
+/**
+* @brief Callback from Config Model to receive the Publication Parameters
+* @param Structure Pointer having parameters - modelID, elementAddress,
+* Publish Address, PublishPeriod, PublishTTL, Credential Flag,
+* Publish AppKeyIndex, Retransmit Count & Restransmit Interval Steps
+* @retval none
+*/
+void Appli_GetPublicationParamsCb(model_publicationparams_t* pPubParameters)
+{
+ if(pPubParameters->modelID == SENSOR_SERVER_MODEL_ID)
+ {
+ Sensor_ModelPublishSet(pPubParameters);
+ }
+}
+
+
+/************************************ Weak linking ***********************************
+If implemented in application, linker would replace weak linking in library */
+WEAK_FUNCTION (void SerialPrvn_ProvisioningStatusUpdateCb(uint8_t flagPrvningInProcess, MOBLEUINT16 nodeAddress))
+{
+
+}
+
+
/**
* @}
*/
@@ -1549,4 +1766,4 @@ void Appli_Init(MOBLEUINT8 *flag)
/**
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index ad831f2cd..e37bf2ffa 100644
--- 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
@@ -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
@@ -114,13 +114,15 @@ 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);
+void Appli_GetPublicationParamsCb(model_publicationparams_t*);
+MOBLE_RESULT BLEMesh_ScanDevices(neighbor_params_t *unprovDeviceArray, MOBLEUINT8 *noOfUnprovDevices);
+MOBLE_RESULT BLEMesh_ProvisionDevice(neighbor_params_t *unprovDeviceArray, MOBLEUINT16 index);
#endif /* __APPLI_MESH_H */
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 9e0d28c75..a96a27bc5 100644
--- 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
@@ -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
@@ -77,6 +77,8 @@ extern const void* appNvmBase;
#define FLASH_EMPTY_SIGNATURE 0xFFFFFFFF
+#define RADIO_OFF_DELAY 1000
+
/* Private variables ---------------------------------------------------------*/
typedef struct
@@ -88,6 +90,7 @@ typedef struct
/* ALIGN(4) */
__attribute__((aligned(4))) APPLI_NVM_REQS AppliNvm_Reqs;
+MOBLEUINT16 StopRadioInProgress;
MOBLE_RESULT AppliNvm_EraseRestoreResvNvm(void);
MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
@@ -95,7 +98,8 @@ MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
MOBLEUINT32 totalSubPage,
MOBLEUINT32 nvmBaseOffset);
MOBLE_RESULT AppliNvm_MarkSubpageInvalid(void);
-MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size);
+MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset,
+ void const *buf, MOBLEUINT32 size);
#if 0
/**
@@ -133,7 +137,9 @@ MOBLE_RESULT AppliNvm_FlashErase(uint16_t PageNumber)
* @param Data: word to write
* @retval MOBLE_RESULT_SUCCESS on success
*/
-MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size)
+MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset,
+ void const *buf,
+ MOBLEUINT32 size)
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
@@ -159,7 +165,10 @@ MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUIN
}
else
{
- result = PalNvmWrite(APP_NVM_BASE, offset, buf, size);
+ result = PalNvmWrite(APP_NVM_BASE,
+ offset,
+ buf,
+ size);
}
return result;
@@ -296,8 +305,8 @@ MOBLE_RESULT AppliNvm_FactorySettingReset(void)
/* Load model data copy from nvm */
memcpy((void*)AppliNvm_Reqs.modelData,
- (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(currSubPageIdx) + APP_NVM_GENERIC_MODEL_OFFSET),
- APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE);
+ (void*)(APP_NVM_SUBPAGE_OFFSET(currSubPageIdx)+APP_NVM_GENERIC_MODEL_OFFSET),
+ APP_NVM_MODELDATA_PER_ELEMENT_SIZE);
result = AppliNvm_MarkSubpageInvalid();
@@ -341,7 +350,8 @@ MOBLE_RESULT AppliNvm_FactorySettingReset(void)
* @param model state buff size
* @retval MOBLE_RESULT_SUCCESS on success
*/
-MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state, uint8_t size)
+MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state,
+ uint16_t size)
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS; /* if save model state not defined, return MOBLE_RESULT_FAIL */
@@ -354,7 +364,9 @@ MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state, uint8_t size)
}
else
{
- memcpy(AppliNvm_Reqs.modelData, state, size);
+ memcpy(AppliNvm_Reqs.modelData,
+ state,
+ size);
AppliNvm_Reqs.writeReq = MOBLE_TRUE;
AppliNvm_Reqs.erasePageReq = MOBLE_FALSE;
@@ -379,13 +391,13 @@ MOBLE_RESULT AppliNvm_ClearModelState(void)
#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};
+ MOBLEUINT8 clearBuff[APP_NVM_MODELDATA_PER_ELEMENT_SIZE] = {0};
MOBLEUINT32 valid = 0;
result = AppliNvm_FindFirstEmptyPage(&subPageIdx,
APP_NVM_SUBPAGE_SIZE,
APP_NVM_MAX_SUBPAGE,
- (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
if (MOBLE_FAILED(result))
{
@@ -434,7 +446,8 @@ MOBLE_RESULT AppliNvm_ClearModelState(void)
* @param model state buff size
* @retval MOBLE_RESULT_SUCCESS on success
*/
-MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint8_t* size)
+MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[],
+ uint16_t* size)
{
#if (SAVE_MODEL_STATE_NVM == 1)
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
@@ -463,8 +476,10 @@ MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint8_t* size)
memcpy((void*)AppliNvm_Reqs.modelData,
(void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(currSubPageIdx-1) + APP_NVM_GENERIC_MODEL_OFFSET),
APP_NVM_GENERIC_MODEL_SIZE + APP_NVM_LIGHT_MODEL_SIZE);
- memcpy((void*)state, (void*)(AppliNvm_Reqs.modelData), APP_NVM_MODEL_SIZE);
- *size = APP_NVM_MODEL_SIZE;
+ memcpy((void*)state,
+ (void*)(AppliNvm_Reqs.modelData),
+ APP_NVM_MODEL_SIZE);
+ *size = APP_NVM_MODEL_SIZE;
}
}
return result;
@@ -487,41 +502,47 @@ void AppliNvm_Process(void)
uint8_t reserveAreaCopy[APP_NVM_RESERVED_SIZE];
/* Erase if required */
- if (AppliNvm_Reqs.erasePageReq == MOBLE_TRUE)
+ if ((AppliNvm_Reqs.erasePageReq == MOBLE_TRUE) &&
+ (!LL_FLASH_IsActiveFlag_OperationSuspended()))
{
- /* save reserve flash area */
- memcpy((void*)reserveAreaCopy, (void*)APP_NVM_BASE, APP_NVM_RESERVED_SIZE);
-
- result = PalNvmErase(APP_NVM_BASE, 0);
-
- if(result == MOBLE_RESULT_OUTOFMEMORY)
+ if(StopRadioInProgress == 0)
{
- AppliNvm_Reqs.erasePageReq = MOBLE_TRUE;
+ /* save reserve flash area */
+ memcpy((void*)reserveAreaCopy,
+ (void*)APP_NVM_BASE,
+ APP_NVM_RESERVED_SIZE);
+
+ TRACE_M(TF_PROVISION,"Erase flash page\r\n");
+ result = PalNvmErase(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);
+ 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;
+ }
+ 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);
+ 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;
+ result = AppliNvm_FlashProgram(0,
+ (uint32_t*)&reserveAreaCopy,
+ APP_NVM_RESERVED_SIZE);
+ BLEMesh_ResumeAdvScan();
}
}
+ else
+ StopRadioInProgress--;
}
- if (AppliNvm_Reqs.erasePageReq == MOBLE_FALSE
- && AppliNvm_Reqs.writeReq == MOBLE_TRUE)
+ if (AppliNvm_Reqs.erasePageReq == MOBLE_FALSE &&
+ AppliNvm_Reqs.writeReq == MOBLE_TRUE)
{
result = AppliNvm_FindFirstEmptyPage(&subPageIdx,
APP_NVM_SUBPAGE_SIZE,
@@ -530,11 +551,14 @@ void AppliNvm_Process(void)
if(result == MOBLE_RESULT_OUTOFMEMORY)
{
+ BLEMesh_SuspendAdvScan();
+ StopRadioInProgress = RADIO_OFF_DELAY;
+
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;
+ result = MOBLE_RESULT_SUCCESS;
}
else
{
@@ -637,6 +661,85 @@ MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
return result;
}
+#if 0
+MOBLE_RESULT AppliNVM_Save_FlashTesting(MOBLEUINT8 *buffer,
+ MOBLEUINT16 buffer_size)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+ uint8_t reserveAreaCopy[APP_NVM_RESERVED_SIZE];
+ MOBLEINT16 subPageIdx;
+
+ for(MOBLEUINT8 count = 0;count <= buffer_size;count++)
+ {
+ buffer[count] = count;
+ }
+
+ /* save reserve flash area */
+ memcpy((void*)reserveAreaCopy,
+ (void*)APP_NVM_BASE,
+ APP_NVM_RESERVED_SIZE);
+
+ result = AppliNvm_FlashErase((uint16_t)((APP_NVM_BASE - RESET_MANAGER_FLASH_BASE_ADDRESS) / PAGE_SIZE));
+
+ if (result == MOBLE_RESULT_SUCCESS)
+ {
+ /* restore reserve area */
+// FLASH_ProgramWordBurst(APP_NVM_BASE, (uint32_t*)reserveAreaCopy);
+ result = AppliNvm_FlashProgram(0,
+ (uint32_t*)&reserveAreaCopy,
+ APP_NVM_RESERVED_SIZE);
+ }
+
+ result = AppliNvm_FindFirstEmptyPage(&subPageIdx,
+ APP_NVM_SUBPAGE_SIZE,
+ APP_NVM_MAX_SUBPAGE,
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
+
+ if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ TRACE_M(TF_PROVISION, "Flash sub page is full, preparing new subpage\r\n");
+ }
+ else
+ {
+ result = AppliNvm_FlashProgram(APP_NVM_SUBPAGE_OFFSET(subPageIdx)+APP_NVM_GENERIC_MODEL_OFFSET,
+ buffer,
+ buffer_size);
+ }
+ return result;
+}
+
+MOBLE_RESULT AppliNVM_Retrieve_FlashTesting(MOBLEUINT8 *buffer,
+ MOBLEUINT16 buffer_size)
+{
+ MOBLEINT16 currSubPageIdx;
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+
+ result = AppliNvm_FindFirstEmptyPage(&currSubPageIdx,
+ APP_NVM_SUBPAGE_SIZE,
+ APP_NVM_MAX_SUBPAGE,
+ (APP_NVM_BASE+APP_NVM_RESERVED_SIZE));
+
+ if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ TRACE_M(TF_PROVISION," Can not find the empty page for testing flash \r\n");
+ }
+ else
+ {
+ memcpy((void*)buffer,
+ (void*)(APP_NVM_SUBPAGE_OFFSET(currSubPageIdx)+APP_NVM_GENERIC_MODEL_OFFSET),
+ buffer_size);
+
+ result = AppliNvm_MarkSubpageInvalid();
+
+ if (MOBLE_FAILED(result))
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+
+ return result;
+}
+#endif
/**
* @}
@@ -645,4 +748,4 @@ MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
/**
* @}
*/
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 34667f26c..65fd789d7 100644
--- 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
@@ -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
@@ -55,9 +55,9 @@ typedef struct
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_SaveModelState(uint8_t* state, uint16_t size);
MOBLE_RESULT AppliNvm_ClearModelState(void);
-MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint8_t* size);
+MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint16_t* size);
void AppliNvm_Process(void);
void AppliNvm_SaveMessageParam (void);
MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex,
@@ -85,8 +85,13 @@ void AppliPrvnNvm_SaveProvisionerDevKey(MOBLEUINT8 *data ,
void AppliPrvnNvm_SaveKeys (MOBLEUINT8 status);
+MOBLE_RESULT AppliNVM_Save_FlashTesting(MOBLEUINT8 *buffer,
+ MOBLEUINT16 buffer_size);
+MOBLE_RESULT AppliNVM_Retrieve_FlashTesting(MOBLEUINT8 *buffer,
+ MOBLEUINT16 buffer_size);
+
#endif /* __APPLI_NVM_H */
-/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 7c164b49e..c6bed93c0 100644
--- 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
@@ -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
@@ -21,9 +21,10 @@
#include "hal_common.h"
#include "types.h"
+#include "sensor_cfg_usr.h"
#include "sensors.h"
-#include "light_lc.h"
#include "appli_sensor.h"
+#include "appli_light_lc.h"
#include "mesh_cfg.h"
//#include "LPS25HB.h"
#include "string.h"
@@ -38,13 +39,49 @@
* @{
*/
-/* Private typedef -----------------------------------------------------------*/
-/* Private define ------------------------------------------------------------*/
+MOBLE_RESULT Appli_Sensor_ValueSet(MOBLEUINT8 sensorOffset,
+ MOBLEUINT32 value);
+
+/* Private variables ---------------------------------------------------------*/
+
+/* ALIGN(4) */
+__attribute__((aligned(4)))const sensor_server_init_params_t SensorServerInitParams = SENSOR_SERVER_INIT_PARAMS;
+
+/* ALIGN(4) */
+__attribute__((aligned(4)))const sensor_server_cb_t AppliSensor_cb =
+{
+ /* Sensor Model callbacks */
+ Appli_Sensor_CadenceGet,
+ Appli_Sensor_CadenceSet,
+ Appli_Sensor_CadenceSetUnack,
+ Appli_Sensor_SettingsGet,
+ Appli_Sensor_SettingGet,
+ Appli_Sensor_SettingSet,
+ Appli_Sensor_SettingSetUnack,
+ Appli_Sensor_DescriptorGet,
+ Appli_Sensor_Get,
+ Appli_Sensor_ColumnGet,
+ Appli_Sensor_SeriesGet,
+ Appli_Sensor_ReadDescriptor,
+ Appli_Sensor_ReadValue,
+ Appli_Sensor_ReadColumn,
+ Appli_Sensor_ReadSeries,
+ Appli_Sensor_IsFastCadence,
+ Appli_Sensor_IsStatusTrigger,
+ Appli_Sensor_Descriptor_Status,
+ Appli_Sensor_Cadence_Status,
+ Appli_Sensor_Settings_Status,
+ Appli_Sensor_Setting_Status,
+ Appli_Sensor_Status,
+ Appli_Sensor_Column_Status,
+ Appli_Sensor_Series_Status
+};
+
#if 0
/**
-* @brief PRESSURE init structure definition
-*/
-PRESSURE_InitTypeDef InitStructure =
+ * @brief Pressure sensor init
+ */
+__attribute__((aligned(4)))const PRESSURE_InitTypeDef Lps25InitParams =
{
LPS25HB_ODR_1Hz,
LPS25HB_BDU_READ,
@@ -55,44 +92,19 @@ PRESSURE_InitTypeDef InitStructure =
};
#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[3];
-
-/* By Default value used for cadence set for testing. */
-Sensor_CadenceSet_t Sensor_CadenceSet[NUMBER_OF_SENSOR];
-
-/*
-{
- {0x0071 , 0x2 , 2 , 2 ,2 ,1 ,0X05 , 0x64},
- {0x2A6D , 0x2 , 1 , 1 , 1, 1, 0X258 , 0x3ED},
- {0X2A7F ,0x2,1,1,1,0,0x10, 0x20}
-};*/
-
-
-#endif
-
-MODEL_Property_IDTableParam_t Property_ID_Table[NUMBER_OF_SENSOR] =
-{
- {TEMPERATURE_PID},
- {PRESSURE_PID},
- {TIME_OF_FLIGHT_PID}
-};
+/**
+ * @brief Variables for people
+ */
+MOBLEUINT8 AppliSensorReadFromSensor = 0; /* Used for PTS testing */
+MOBLEUINT8 PresentTemperatureValue = 0;
+MOBLEUINT8 PreviousTemperatureValue = 0;
MOBLEUINT8 Occupancy_Flag = MOBLE_FALSE;
extern MOBLEUINT8 NumberOfElements;
extern MOBLEUINT8 ProvisionFlag;
MOBLEUINT8 Sensor_Setting_Access = 0x01 ;
+MOBLEUINT32 PresentPeopleCount = 0;
+MOBLEUINT32 PreviousPeopleCount = 0;
-
-
-/* Temperature and Pressure init structure*/
-#if 0
- PRESSURE_DrvTypeDef* xLPS25HBDrv = &LPS25HBDrv;
-#endif
-
-/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/******************************************************************************/
@@ -101,792 +113,909 @@ MOBLEUINT8 Sensor_Setting_Access = 0x01 ;
/**
-* @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
+ * @brief Callback corresponding to Sensor_CadenceGet_cb
+ * @param Cadence parameters
+* @retval None
*/
-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 if( property_ID == (MOBLEUINT16) TIME_OF_FLIGHT_PID)
- {
- Sensor_CadenceSet[2].Property_ID = pCadence_param->Property_ID;
- Sensor_CadenceSet[2].FastCadenceDevisor = pCadence_param->FastCadenceDevisor ;
- Sensor_CadenceSet[2].StatusTriggerType = pCadence_param->StatusTriggerType ;
- Sensor_CadenceSet[2].triggerDeltaDown = pCadence_param->triggerDeltaDown;
- Sensor_CadenceSet[2].triggerDeltaUp = pCadence_param->triggerDeltaUp;
- Sensor_CadenceSet[2].StatusMinInterval = pCadence_param->StatusMinInterval;
- Sensor_CadenceSet[2].FastCadenceLow = pCadence_param->FastCadenceLow;
- Sensor_CadenceSet[2].FastCadenceHigh = pCadence_param->FastCadenceHigh;
- }
-
- return MOBLE_RESULT_SUCCESS;
+void Appli_Sensor_CadenceGet(sensor_CadenceCbParam_t* pCadenceParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pCadenceParam->property_ID, elementIndex, peerAddr, dstPeer);
}
+
/**
-* @brief Appli_Sensor_Cadence_Get: This function is callback for Application
-* when sensor cadence Set message is received
-* @param pCadence_get: 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
+ * @brief Callback corresponding to Sensor_CadenceSet_cb
+ * @param Cadence parameters
+* @retval None
*/
-
-MOBLE_RESULT Appli_Sensor_Cadence_Get(MOBLEUINT8* sensor_DataCadence,
- MOBLEUINT16 property_ID, MOBLEUINT32 length)
+void Appli_Sensor_CadenceSet(sensor_CadenceCbParam_t* pCadenceParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
- return MOBLE_RESULT_SUCCESS;
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pCadenceParam->property_ID, elementIndex, peerAddr, dstPeer);
}
-/**
-* @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,MOBLEUINT16 prop_ID)
-{
-
- for(int i=0;i< NUMBER_OF_SENSOR;i++)
- {
- if(prop_ID == Property_ID_Table[i].Property_ID)
- {
- Appli_Sensor_SettingSet[i].Property_ID = pSensor_SettingParam->Property_ID;
-
- Appli_Sensor_SettingSet[i].Sensor_Setting_ID = pSensor_SettingParam->Sensor_Setting_ID;
- Appli_Sensor_SettingSet[i].Sensor_Setting_Access = Sensor_Setting_Access;
- Appli_Sensor_SettingSet[i].Sensor_Setting_Value = pSensor_SettingParam->Sensor_Setting_Value;
- }
- }
- return MOBLE_RESULT_SUCCESS;
+/**
+ * @brief Callback corresponding to Sensor_CadenceSetUnack_cb
+ * @param Cadence parameters
+* @retval None
+*/
+void Appli_Sensor_CadenceSetUnack(sensor_CadenceCbParam_t* pCadenceParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pCadenceParam->property_ID, elementIndex, peerAddr, dstPeer);
}
-
/**
-* @brief Appli_Sensor_Data_Status: This function is callback for Application
-* when Sensor Get message is received
-* @param sensor_Data: Pointer to buffer to be updated with parameters
-* @param pLength: Length of the parameters to be sent in response
-* @param prop_ID: Property Id of requested sensor (optional)
-* @param length: Received data length
-* @retval MOBLE_RESULT
+ * @brief Callback corresponding to Sensor_SettingsGet_cb
+ * @param Setting parameters
+* @retval None
*/
-MOBLE_RESULT Appli_Sensor_Data_Status(MOBLEUINT8* sensor_Data ,
- MOBLEUINT32* pLength,
- MOBLEUINT16 prop_ID ,
- MOBLEUINT32 length)
+void Appli_Sensor_SettingsGet(sensor_SettingsCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
- MOBLE_RESULT result = MOBLE_RESULT_FALSE;
- MOBLEUINT32 temperatureData = 0;
- MOBLEUINT32 pressureData = 0;
- MOBLEUINT8 data_Length = 0x03;
- MOBLEUINT32 distance = 0x000000C8; // 200 cm
- MOBLEUINT8 data_Length_UnknownID;
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pSettingParam->propertyId, elementIndex, peerAddr, dstPeer);
+}
-#if 0
- LPS25HB_GetTemperature((float*)&temperatureData);
-
- LPS25HB_GetPressure((float*)&pressureData);
-#endif
-
- result = Check_Property_ID(Property_ID_Table , prop_ID);
-
- if(result == MOBLE_RESULT_SUCCESS && length > 0)
- {
- if((prop_ID == TEMPERATURE_PID )) /* format A */
- {
- /*(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))
- {
- /* 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))
- {
- /* 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(length == 0)
- {
- /*(prop_Id_Temp & 0x07) << 5) | (Len <<1) Format A
- Property calculation is done like above line
+/**
+ * @brief Callback corresponding to Sensor_SettingGet_cb
+ * @param Setting parameters
+* @retval None
*/
- *(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);
+void Appli_Sensor_SettingGet(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pSettingParam->property_ID, elementIndex, peerAddr, dstPeer);
+}
- *pLength =20;
- }
- else
- {
-// *(sensor_Data+0) = (MOBLEUINT8)prop_ID ;
-// *(sensor_Data+1) = (MOBLEUINT8)(prop_ID >> 8);
-//
-// *pLength =2;
-
- data_Length_UnknownID = 0x0F;
- if(prop_ID < 0x0800)
- {
- *(sensor_Data) = ((prop_ID & 0x07) << 5) | (data_Length_UnknownID << 1) ;
- *(sensor_Data+1) = (prop_ID >> 3) & 0xFF;
-
- *pLength=2;
- }
- else
- {
- *(sensor_Data+0) = 0xFF; //((data_Length <<1) | 0x01) & 0x00;
- *(sensor_Data+1) = (MOBLEUINT8)prop_ID ;
- *(sensor_Data+2) = (MOBLEUINT8)(prop_ID >> 8);
+/**
+ * @brief Callback corresponding to Sensor_SettingSet_cb
+ * @param Setting parameters
+* @retval None
+*/
+void Appli_Sensor_SettingSet(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pSettingParam->property_ID, elementIndex, peerAddr, dstPeer);
+}
- *pLength = 3;
- }
- }
- //*plength=0;
- }
-
- 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 Callback corresponding to Sensor_SettingSetUnack_cb
+ * @param Setting parameters
+* @retval None
+*/
+void Appli_Sensor_SettingSetUnack(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pSettingParam->property_ID, elementIndex, peerAddr, dstPeer);
}
/**
-* @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
+ * @brief Callback corresponding to Sensor_DescriptorGet_cb
+ * @param Descriptor parameters
+* @retval None
*/
-MOBLE_RESULT Appli_Sensor_Descriptor_Status(MOBLEUINT8* sensor_Descriptor ,
- MOBLEUINT32* pLength,MOBLEUINT16 prop_ID ,
- MOBLEUINT32 length)
+void Appli_Sensor_DescriptorGet(MOBLEUINT8 prop_ID,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
- Appli_Sensor_DescriptorStatus_t Appli_Sensor_DescriptorStatus1[] =
+ if(length == 0)
{
- {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;
- MOBLE_RESULT result = MOBLE_RESULT_FALSE;
- result = Check_Property_ID(Property_ID_Table , prop_ID);
-
- if (result != MOBLE_RESULT_FALSE )
+ TRACE_M(TF_SENSOR, "Sensor Descriptor data for all sensors on element index %X peer addr %X, dst peer %X\r\n",
+ elementIndex, peerAddr, dstPeer);
+ }
+ else
{
- if(prop_ID == TEMPERATURE_PID)
- {
- 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;
- *pLength = 8;
- }
- else if(prop_ID == PRESSURE_PID)
- {
- tolerance = Appli_Sensor_DescriptorStatus1[1].NegativeTolerance;
- tolerance = (tolerance << 12 ) | Appli_Sensor_DescriptorStatus1[1].PositiveTolerance ;
-
- *(sensor_Descriptor) = Appli_Sensor_DescriptorStatus1[1].Prop_ID;
- *(sensor_Descriptor+1) = Appli_Sensor_DescriptorStatus1[1].Prop_ID >> 8;
- *(sensor_Descriptor+2) = tolerance;
- *(sensor_Descriptor+3) = tolerance >> 8;
- *(sensor_Descriptor+4) = tolerance >> 16;
- *(sensor_Descriptor+5) = Appli_Sensor_DescriptorStatus1[1].SamplingFunction;
- *(sensor_Descriptor+6) = Appli_Sensor_DescriptorStatus1[1].MeasurementPeriod;
- *(sensor_Descriptor+7) = Appli_Sensor_DescriptorStatus1[1].UpdateInterval;
- *pLength =8;
- }
- else if(prop_ID == TIME_OF_FLIGHT_PID)
- {
- tolerance = Appli_Sensor_DescriptorStatus1[2].NegativeTolerance;
- tolerance = (tolerance << 12 ) | Appli_Sensor_DescriptorStatus1[2].PositiveTolerance ;
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X, dst peer %X\r\n",
+ prop_ID, elementIndex, peerAddr, dstPeer);
+ }
+}
- *(sensor_Descriptor) = Appli_Sensor_DescriptorStatus1[2].Prop_ID;
- *(sensor_Descriptor+1) = Appli_Sensor_DescriptorStatus1[2].Prop_ID >> 8;
- *(sensor_Descriptor+2) = tolerance;
- *(sensor_Descriptor+3) = tolerance >> 8;
- *(sensor_Descriptor+4) = tolerance >> 16;
- *(sensor_Descriptor+5) = Appli_Sensor_DescriptorStatus1[2].SamplingFunction;
- *(sensor_Descriptor+6) = Appli_Sensor_DescriptorStatus1[2].MeasurementPeriod;
- *(sensor_Descriptor+7) = Appli_Sensor_DescriptorStatus1[2].UpdateInterval;
- *pLength =8;
- }
+/**
+ * @brief Callback corresponding to Sensor_Get_cb
+ * @param Get parameters
+* @retval None
+*/
+void Appli_Sensor_Get(MOBLEUINT16 prop_ID,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ if(length == 0)
+ {
+ TRACE_M(TF_SENSOR, "Sensor Data for all sensors on element index %X peer addr %X dst peer %X\r\n",
+ elementIndex, peerAddr, dstPeer);
}
- else
+ else
{
- if(length ==0 )
- {
- 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;
- }
- else if(prop_ID != 0x0000)
- {
- *(sensor_Descriptor) = prop_ID >> 8;
- *(sensor_Descriptor+1) = prop_ID;
- *pLength = 2;
- }
- else
- {
-
- }
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X \r\n",
+ prop_ID, elementIndex, peerAddr, dstPeer);
}
+}
+
- // }
- //else if(result == MOBLE_RESULT_FALSE && length >0)
- //{
- // *(sensor_Descriptor) = prop_ID >> 8;
- // *(sensor_Descriptor+1) = prop_ID;
- // *pLength = 2;
- //}
- //else
- //{
- //
- //}
- return MOBLE_RESULT_SUCCESS;
+/**
+ * @brief Callback corresponding to Sensor_ColumnGet_cb
+ * @param Column parameters
+* @retval None
+*/
+void Appli_Sensor_ColumnGet(sensor_ColumnCbParams_t* pColumnParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ TRACE_M(TF_SENSOR, "Property ID %X element index %X peer addr %X dst peer %X\r\n",
+ pColumnParam->propertyId, elementIndex, peerAddr, dstPeer);
}
-MOBLE_RESULT Appli_Sensor_Column_Status(MOBLEUINT8* sensor_Column , MOBLEUINT32* pLength,MOBLEUINT16 prop_ID , MOBLEUINT32 length)
+/**
+ * @brief Callback corresponding to Sensor_SeriesGet_cb
+ * @param Series parameters
+* @retval None
+*/
+void Appli_Sensor_SeriesGet(sensor_SeriesCbParams_t* pSeriesParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
+ TRACE_M(TF_SENSOR, "Property ID %X Raw Value X1 %d Raw Value X2 %d\r\n",
+ pSeriesParam->propertyId,
+ pSeriesParam->rawValueX1,
+ pSeriesParam->rawValueX2);
+}
+
+
+/**
+ * @brief Callback corresponding to Sensor_ReadDescriptor_cb
+ * Update SENSORX descriptor identified by sensorOffset
+ * Read from application to optimize RAM
+ * @param Sensor offset in sensor init structure
+ * @param descriptor parameters
+ * @retval Fail if sensor doesn't exist or property ID mismatch occurrs
+ * else Success
+ */
+MOBLE_RESULT Appli_Sensor_ReadDescriptor(MOBLEUINT8 sensorOffset,
+ sensor_DescriptorCbParams_t* pDescriptorParams)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ const sensor_init_params_t* pSensorInitParams = NULL;
- Sensor_Column_param_t Appli_Sensor_ColumnStatus[]=
- {
- {PRESSURE_PID,0xD9AF,0xDE03,0x0405},
- {TEMPERATURE_PID,0xacd2,0x3456,0x6537},
- {TIME_OF_FLIGHT_PID,0x8248,0xDE03,0x0405}
- };
-
- MOBLEUINT8 flag = 0;
-
- for(int i=0;i< NUMBER_OF_SENSOR ;i++)
+ if (sensorOffset < SensorServerInitParams.sensorsCount)
{
- if(prop_ID == Appli_Sensor_ColumnStatus[i].Property_ID)
+ pSensorInitParams = &(SensorServerInitParams.sensorInitParams[sensorOffset]);
+
+ if (pSensorInitParams->propertyId != pDescriptorParams->propertyId)
{
- flag = 1;
- *sensor_Column= Appli_Sensor_ColumnStatus[i].Property_ID;
- *(sensor_Column+1) = Appli_Sensor_ColumnStatus[i].Property_ID>>8;
-
- *(sensor_Column+2)=Appli_Sensor_ColumnStatus[i].RawValueX;
- *(sensor_Column+3)=Appli_Sensor_ColumnStatus[i].RawValueX;
-
-
- *(sensor_Column+4)=Appli_Sensor_ColumnStatus[i].RawValueWidth;
- *(sensor_Column+5)=Appli_Sensor_ColumnStatus[i].RawValueWidth;
-
- *(sensor_Column+6)=Appli_Sensor_ColumnStatus[i].RawValueY;
- *(sensor_Column+7)=Appli_Sensor_ColumnStatus[i].RawValueY;
- *pLength = 8;
- break;
+ result = MOBLE_RESULT_FAIL;
+ }
+ else
+ {
+ /* */
}
}
-
- if(flag == 0)
+ else
{
- *pLength =4;
+ result = MOBLE_RESULT_FAIL;
}
- return MOBLE_RESULT_SUCCESS;
+ if (pSensorInitParams != NULL &&
+ pDescriptorParams != NULL)
+ {
+ pDescriptorParams->positiveTolerance = pSensorInitParams->positiveTolerance;
+ pDescriptorParams->negativeTolerance = pSensorInitParams->negativeTolerance;
+ pDescriptorParams->samplingFunction = pSensorInitParams->samplingFunction;
+ pDescriptorParams->measurementPeriod = pSensorInitParams->measurementPeriod;
+ pDescriptorParams->updateInterval = pSensorInitParams->updateInterval;
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ return result;
}
-MOBLE_RESULT Appli_Sensor_Series_Status(MOBLEUINT8* sensor_Series , MOBLEUINT32* pLength,MOBLEUINT16 prop_ID , MOBLEUINT32 length)
+/**
+ * @brief Callback corresponding to Sensor_ReadValue_cb
+ * Read sensor value and update buffer
+ * data length <= 128
+ * PreviousTemperatureValue, PresentTemperatureValue to be updated
+ * everytime sensor value is changed and call to Sensor_UpdateCadence
+ * @param Sensor offset in sensor init structure
+ * @param Value parameters
+ * @retval Fail if sensor doesn't exist
+ * else Success
+ */
+MOBLE_RESULT Appli_Sensor_ReadValue(MOBLEUINT8 sensorOffset,
+ sensor_ValueCbParams_t* pValueParams)
{
- Sensor_Series_param_t Appli_Sensor_SeriesStatus[NUMBER_OF_SENSOR]=
- {
- {PRESSURE_PID,{{0xabcd,0x73ac,0xcdef},{0xacd2,0x2345,0x1234}}},
- {TEMPERATURE_PID,{{0x00C1,0x0071,0x00DE},{0x0003,0x0004,0x0005}}},
- {TIME_OF_FLIGHT_PID,{{0x4528,0xbad3,0xdc12},{0xacd2,0x2345,0x1234}}}
- };
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+// PRESSURE_StatusTypeDef tempStatus = PRESSURE_OK;
+ MOBLEINT16 temp = 0;
+ MOBLEINT8 temperature8 = 0;
+ float pressure = 0;
- for(int i=0;i<NUMBER_OF_SENSOR;i++)
+ /* sensor offset exist */
+ if (sensorOffset < SensorServerInitParams.sensorsCount)
{
- if( prop_ID == Appli_Sensor_SeriesStatus[i].Property_ID )
+ if (sensorOffset == 0) /* Present Ambient Temperature */
{
+ if(AppliSensorReadFromSensor == 0) /* Normal mode */
+ {
+ /* Temperature, Temperature8 format, M=1, d=0, b=-1 */
+// tempStatus = LPS25HB_I2C_ReadRawTemperature(&temp);
+// if (tempStatus == PRESSURE_OK)
+ {
+ TRACE_M(TF_SENSOR, "Temperature sensor raw value %d\r\n" , temp);
+
+ /* Convert temperature raw value to Temperature8 format */
+ temp = (temp/240) + 85;
+
+ if (temp < -64*2)
+ {
+ temp = -64*2;
+ }
+ else if (temp > 63.5*2)
+ {
+ temp = 63.5*2;
+ }
+
+ temperature8 = temp;
+
+ pValueParams->data[0] = (MOBLEUINT8)temperature8;
+
+ if (pValueParams->data[0] == 0xFF)
+ {
+ /* 0xFF is unknown but here it is -1
+ -1 is approximated to 0 */
+ pValueParams->data[0] = 0x00;
+ }
+
+ TRACE_M(TF_SENSOR, "Temperature8 raw value %d, actual value %f\r\n",
+ temperature8, (float)temperature8/2);
+ }
+#if 0
+ else /* error */
+ {
+ pValueParams->data[0] = 0xFF;
+ }
+#endif
+ }
+ else /* Value not to be read from sensor */
+ {
+ pValueParams->data[0] = PresentTemperatureValue;
+ }
+ }
+ else if (sensorOffset == 1) /* Pressure */
+ {
+// tempStatus = LPS25HB_GetPressure(&pressure);
+// if (tempStatus == PRESSURE_OK)
+ {
+ TRACE_M(TF_SENSOR, "Pressure sensor value %f mbar\r\n" , pressure);
- *sensor_Series= Appli_Sensor_SeriesStatus[i].Property_ID;
- *(sensor_Series+1) = Appli_Sensor_SeriesStatus[i].Property_ID>>8;
- for(int y=0 ;y < SENSOR_SERIES_VALUE ;y++)
+ memcpy(pValueParams->data, (void*)&pressure, 4);
+ }
+#if 0
+ else /* error */
{
- *(sensor_Series+2+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawValueX>>8;
- *(sensor_Series+3+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawValueX;
- *(sensor_Series+4+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawColumnWidth>>8;
- *(sensor_Series+5+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawColumnWidth;
- *(sensor_Series+6+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawValueY>>8;
- *(sensor_Series+7+6*y) =Appli_Sensor_SeriesStatus[i].SeriesData[y].RawValueY;
+ memset(pValueParams->data, 0, 4);
}
- *pLength = 2 + 6*SENSOR_SERIES_VALUE ;
- break;
+#endif
}
}
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
-return MOBLE_RESULT_SUCCESS ;
-
+ return result;
}
-
+
#endif
+
/**
-* @brief Sensor Process Function will continuously monitor the sensors.
-* Function used for the Publishing, data monitoring..
-* @param void
-* @retval void
+ * @brief Callback corresponding to Appli_Sensor_Cadence_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
*/
-void Sensor_Process(void)
+void Appli_Sensor_Cadence_Status(const MOBLEUINT8 *pCadence,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
+ MOBLEUINT8 i;
-#ifdef ENABLE_SENSOR_PUBLICATION
- float sensorValue[NUMBER_OF_SENSOR];
- if(ProvisionFlag == 1)
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Cadence_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_CADENCE_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
{
- Read_Sensor_Data(&sensorValue[0]);
- Sensor_Publication_Process(&sensorValue[0], &Property_ID_Table[0]);
+ TRACE_M(TF_SERIAL_CTRL,"Cadence value: %d\n\r", pCadence[i]);
}
-#endif
+}
+
+
+/**
+ * @brief Callback corresponding to Appli_Sensor_Settings_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
+*/
+void Appli_Sensor_Settings_Status(const MOBLEUINT8 *pSettings,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Settings_Status callback received \r\n");
- /* 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)
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_SETTINGS_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
{
- 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;
- }
- }
+ TRACE_M(TF_SERIAL_CTRL,"Settings value: %d\n\r", pSettings[i]);
+ }
}
-
+
+
/**
-* @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)
+ * @brief Callback corresponding to Appli_Sensor_Setting_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
+*/
+void Appli_Sensor_Setting_Status(const MOBLEUINT8 *pSetting,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
- MOBLEUINT8 occupancyData = 0x1;
- MOBLEUINT8 sensor_Data[5];
- MOBLE_ADDRESS srcAdd;
- MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 i;
- sensor_Data[1] = (MOBLEUINT8)(PRESENCE_DETECTED_PROPERTY << 8);
- sensor_Data[0] = (MOBLEUINT8)PRESENCE_DETECTED_PROPERTY;
- sensor_Data[2] = occupancyData;
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Setting_Status callback received \r\n");
- srcAdd = BLEMesh_GetAddress();
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_SETTING_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
+ {
+ TRACE_M(TF_SERIAL_CTRL,"Setting value: %d\n\r", pSetting[i]);
+ }
+}
+
+
+/**
+ * @brief Callback corresponding to Appli_Sensor_Descriptor_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
+*/
+void Appli_Sensor_Descriptor_Status(const MOBLEUINT8 *pDescriptor,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
- result = BLEMesh_SetRemotePublication(SENSOR_SERVER_MODEL_ID, srcAdd ,
- SENSOR_STATUS ,
- sensor_Data,3,
- MOBLE_FALSE, MOBLE_FALSE);
-
- if(result)
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Descriptor_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_DESCRIPTOR_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
{
- TRACE_M(TF_LIGHT_LC,"Publication Error \r\n");
+ TRACE_M(TF_SERIAL_CTRL,"Descriptor value: %d\n\r", pDescriptor[i]);
}
-
}
-
-#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
+ * @brief Callback corresponding to Appli_Sensor_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
*/
-void Read_Sensor_Data(float *pSensorValue)
+void Appli_Sensor_Status(const MOBLEUINT8 *pStatus,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
-#if 0
- float temp,press;
- LPS25HB_GetTemperature(&temp);
- pSensorValue[0] = temp;
- LPS25HB_GetPressure(&press);
- pSensorValue[1] = press;
-#endif
+ MOBLEUINT8 i;
+
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
+ {
+ TRACE_M(TF_SERIAL_CTRL,"Status value: %d\n\r", pStatus[i]);
+ }
+#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
+ Appli_Light_LC_SensorPropertyUpdate(elementIndex,
+ PRESENCE_DETECTED_PID,
+ (MOBLEUINT32) pStatus[length-1]);
+#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)
+ * @brief Callback corresponding to Appli_Sensor_Column_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
+*/
+void Appli_Sensor_Column_Status(const MOBLEUINT8 *pColumn,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
{
- 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};
+ MOBLEUINT8 i;
- floatToInt(pSensorData[sensor_Count], &out_value, 2);
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Column_Status callback received \r\n");
- /* Taking the timestamp for the cadence publication and making flag high */
- if(PublishingDataFlag[sensor_Count].CadenceDurationFlag == MOBLE_FALSE)
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_COLUMN_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
{
- cadenceDurationTick[sensor_Count] = Clock_Time();
- PublishingDataFlag[sensor_Count].CadenceDurationFlag = MOBLE_TRUE;
+ TRACE_M(TF_SERIAL_CTRL,"Column Status value: %d\n\r", pColumn[i]);
}
- /* 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))
+}
+
+
+/**
+ * @brief Callback corresponding to Appli_Sensor_Series_Status
+ * @param Descriptor parameters
+ * @param
+* @retval None
+*/
+void Appli_Sensor_Series_Status(const MOBLEUINT8 *pSeries,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex)
+{
+ MOBLEUINT8 i;
+
+ TRACE_M(TF_SENSOR,"Appli_Sensor_Series_Status callback received \r\n");
+
+ TRACE_M(TF_SERIAL_CTRL,"#%d! for element %d \r\n",
+ SENSOR_SERIES_STATUS,
+ elementIndex);
+ for(i = 0; i < length; i++)
{
- 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++;
- }
+ TRACE_M(TF_SERIAL_CTRL,"Series Status value: %d\n\r", pSeries[i]);
}
- else
+}
+
+
+/**
+ * @brief Callback corresponding to Sensor_ReadColumn_cb
+ * Fill column width and raw valye Y in data buffer
+ * data length <= 8
+ * @param Sensor offset in sensor init structure
+ * @param Series column parameters
+ * @retval Fail if sensor doesn't exist
+ * else Success
+*/
+MOBLE_RESULT Appli_Sensor_ReadColumn(MOBLEUINT8 sensorOffset,
+ MOBLEUINT8 columnOffset,
+ sensor_ColumnCbParams_t* pColumnParams)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ const sensor_init_params_t* pSensorInitParams = NULL;
+ MOBLEUINT8 dataLength = 0;
+ MOBLEUINT8* data = pColumnParams->data;
+
+ if (sensorOffset < SensorServerInitParams.sensorsCount)
{
- publishTime = SENSOR_PUBLISH_PERIOD ;
+ pSensorInitParams = &(SensorServerInitParams.sensorInitParams[sensorOffset]);
- 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)
+ /* fill sensor column data */
+ memcpy(data+dataLength,
+ &(pSensorInitParams->seriesColumn[columnOffset].columnWidth),
+ pSensorInitParams->dataLength);
+ dataLength = pSensorInitParams->dataLength;
+
+ memset(data+dataLength, 0xAA, pSensorInitParams->dataLength);
+ dataLength += pSensorInitParams->dataLength;
+
+ pColumnParams->dataLength = dataLength;
+ }
+ else
{
- sensor_Count = 0;
+ result = MOBLE_RESULT_FAIL;
}
-
+
+ return result;
}
+
/**
-* @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)
+ * @brief Callback corresponding to Sensor_ReadSeries_cb
+ * Fill sensor series state for all columns between and including X1 and X2
+ * Series data to be concatenated in triplet of raw value X, column width and raw value Y
+ * X[n] CW[n] Y[n] X[n+1] CW[n+1] Y[n+1] ...
+ * data length should be less than minimum of 379 or max application packet length supported
+ * @param Sensor offset in sensor init structure
+ * @param Series parameters
+ * @retval Fail if sensor doesn't exist
+ * else Success
+ */
+MOBLE_RESULT Appli_Sensor_ReadSeries(MOBLEUINT8 sensorOffset,
+ sensor_SeriesCbParams_t* pSeriesParams)
{
- MOBLEUINT32 length;
- MOBLEUINT8 sensor_Data[8];
- MOBLE_ADDRESS srcAdd;
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+ const sensor_init_params_t* pSensorInitParams = NULL;
+ MOBLEUINT16 dataLength = 0;
+ MOBLEUINT8* data = pSeriesParams->data;
- srcAdd = BLEMesh_GetAddress();
-
- switch(*pProp_ID)
+ if (sensorOffset < SensorServerInitParams.sensorsCount)
{
- 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:
+ pSensorInitParams = &(SensorServerInitParams.sensorInitParams[sensorOffset]);
+
+ for (MOBLEUINT8 count=0; count<pSensorInitParams->seriesCount; count++)
+ {
+ /* fill sensor series data */
+ if (pSensorInitParams->seriesColumn[count].rawX >= pSeriesParams->rawValueX1 &&
+ pSensorInitParams->seriesColumn[count].rawX <= pSeriesParams->rawValueX2)
{
- /* 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(data+dataLength,
+ &(pSensorInitParams->seriesColumn[count].rawX),
+ pSensorInitParams->dataLength);
+ dataLength += pSensorInitParams->dataLength;
+ memcpy(data+dataLength,
+ &(pSensorInitParams->seriesColumn[count].columnWidth),
+ pSensorInitParams->dataLength);
+ dataLength += pSensorInitParams->dataLength;
+ memset(data+dataLength, 0xAA, pSensorInitParams->dataLength);
+ dataLength += pSensorInitParams->dataLength;
- memcpy(&sensor_Data[3],(void*)&pSensor_Value[0],4);
- length =7;
- break;
+ pSeriesParams->dataLength = dataLength;
}
- case TIME_OF_FLIGHT_PID:
+ else
{
- sensor_Data[0] = ((0x03 <<1) | 0x01);
- sensor_Data[1] = (MOBLEUINT8)TIME_OF_FLIGHT_PID ;
- sensor_Data[2] = (MOBLEUINT8)(TIME_OF_FLIGHT_PID >> 8);
-
- memcpy(&sensor_Data[3],(void*)&pSensor_Value[0],4);
- length =7;
- break;
+ /* */
}
- default:
- break;
+ }
}
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ return result;
+}
- result = BLEMesh_SetRemotePublication(SENSOR_SERVER_MODEL_ID, srcAdd,
- SENSOR_STATUS ,
- sensor_Data,length,
- MOBLE_FALSE, MOBLE_FALSE);
- if(result)
+/**
+ * @brief Callback corresponding to Sensor_IsFastCadence_cb
+ * To check if fast cadence to be used for current sensor state
+ * @param Sensor offset in sensor init structure
+ * @param Fast Cadence Low
+ * @param Fast Cadence High
+ * @retval Trigger status
+ */
+MOBLEUINT8 Appli_Sensor_IsFastCadence(MOBLEUINT8 sensorOffset,
+ void* pFastCadenceLow,
+ void* pFastCadenceHigh)
+{
+ MOBLEUINT8 fastCadenceStatus = 0;
+ MOBLEUINT32 fastCadenceLow = *((MOBLEUINT32*)pFastCadenceLow);
+ MOBLEUINT32 fastCadenceHigh = *((MOBLEUINT32*)pFastCadenceHigh);
+ MOBLEUINT32 sensorValue = PresentTemperatureValue;
+
+ if (sensorOffset == 0)
+ {
+ if (fastCadenceLow <= fastCadenceHigh)
+ {
+ fastCadenceStatus = sensorValue >= fastCadenceLow &&
+ sensorValue <= fastCadenceHigh;
+ }
+ else
+ {
+ fastCadenceStatus = sensorValue > fastCadenceLow ||
+ sensorValue < fastCadenceHigh;
+ }
+}
+ else
{
- TRACE_M(TF_SENSOR,"Publication Error \r\n");
+ /* Implmented only for sensor at offset 0 */
}
+ return fastCadenceStatus;
}
-#endif
-#ifdef ENABLE_SENSOR_MODEL_SERVER
-#if 0
/**
-* @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
+ * @brief Callback corresponding to Sensor_IsStatusTrigger_cb
+ * To check if sensor change in sensor state (delta) is more than
+ * given trigger state value
+ * delta up values
+ * @param Sensor offset in sensor init structure
+ * @param Trigger type -> value or percent change
+ * @param Status trigger delta down
+ * @param Status trigger delta up
+ * @retval Trigger status
*/
-/*
-MOBLE_RESULT Appli_Sensor_GetSettingStatus(MOBLEUINT8* pSetting_Status)
+MOBLEUINT8 Appli_Sensor_IsStatusTrigger(MOBLEUINT8 sensorOffset,
+ status_trigger_type_e triggerType,
+ void* pDeltaDown,
+ void* pDeltaUp)
{
+ const sensor_init_params_t* pSensorInitParams = NULL;
+ MOBLEUINT8 triggerStatus = 0;
+ MOBLEUINT32 deltaDown = *((MOBLEUINT32*)pDeltaDown);
+ MOBLEUINT32 deltaUp = *((MOBLEUINT32*)pDeltaUp);
+ status_trigger_delta_e statusTriggerDelta;
+ MOBLEUINT32 delta;
- *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;
-}*/
-#endif
+ if (sensorOffset == 0)
+ {
+ if (PresentTemperatureValue < PreviousTemperatureValue)
+ {
+ /* status trigger delta down */
+ statusTriggerDelta = STATUS_TRIGGER_DELTA_DOWN;
+ delta = PreviousTemperatureValue - PresentTemperatureValue;
-/**
-* @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
-*/
+ TRACE_M(TF_SENSOR, "Delta down value %ld\r\n", delta);
+ }
+ else
+ {
+ /* status trigger delta up */
+ statusTriggerDelta = STATUS_TRIGGER_DELTA_UP;
+ delta = PresentTemperatureValue - PreviousTemperatureValue;
-MOBLE_RESULT Appli_Sensor_GetSetting_IDStatus(MOBLEUINT8* pSetting_Status , MOBLEUINT16 prop_ID)
-{
- for(int i=0 ;i<NUMBER_OF_SENSOR;i++)
- {
- if(prop_ID == Appli_Sensor_SettingSet[i].Property_ID)
+ TRACE_M(TF_SENSOR, "Delta up value %ld\r\n", delta);
+ }
+
+ if (triggerType == STATUS_TRIGGER_TYPE_PC)
{
- *pSetting_Status = Appli_Sensor_SettingSet[i].Property_ID;
- *(pSetting_Status+1) = Appli_Sensor_SettingSet[i].Property_ID >> 8;
- *(pSetting_Status+2) = Appli_Sensor_SettingSet[i].Sensor_Setting_ID;
- *(pSetting_Status+3) = Appli_Sensor_SettingSet[i].Sensor_Setting_ID >> 8;
- *(pSetting_Status+4) = Appli_Sensor_SettingSet[i].Sensor_Setting_Access;
-
- if(Appli_Sensor_SettingSet[i].Sensor_Setting_Access == 0x03)
+ pSensorInitParams = &(SensorServerInitParams.sensorInitParams[sensorOffset]);
+
+ if (pSensorInitParams->valuesRange != 0)
{
- *(pSetting_Status+5) = Appli_Sensor_SettingSet[i].Sensor_Setting_Value;
- *(pSetting_Status+6) = Appli_Sensor_SettingSet[i].Sensor_Setting_Value >> 8;
+ /* change delta to percentage change (of 0.01 % steps) */
+ delta = (MOBLEUINT32)((delta*10000)/pSensorInitParams->valuesRange);
}
else
{
-
+ triggerStatus = 0;
}
}
- }
- return MOBLE_RESULT_SUCCESS;
+ if ((statusTriggerDelta == STATUS_TRIGGER_DELTA_DOWN && delta >= deltaDown) ||
+ (statusTriggerDelta == STATUS_TRIGGER_DELTA_UP && delta >= deltaUp))
+ {
+ triggerStatus = 1;
+ }
+ else
+ {
+ triggerStatus = 0;
+ }
+ }
+
+ return triggerStatus;
}
+
+
+/**
+* @brief Initialize hardware interfaces for sensors and mesh sensor model structures
+* Sensor init parameters to be defined in sensor_cfg_usr.h
+* Sensors are initialized in the order as defined in sensor_cfg_usr.h
+ * LPS25HB supports pressure and temperature sensor
+* @param void
+ * @retval
+ */
+MOBLE_RESULT Appli_Sensor_Init(void)
+ {
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+// PRESSURE_StatusTypeDef lps25Status;
+
+ /* Hardware interface initialization */
+#ifndef CUSTOM_BOARD_PWM_SELECTION
+// PRESSURE_StatusTypeDef tempStatus;
+// PRESSURE_StatusTypeDef pressStatus;
+// int16_t temperature;
+// int32_t pressure;
+
+#if 0
+ /* Initiallization of sensors */
+ lps25Status = LPS25HB_Init((PRESSURE_InitTypeDef*)(&Lps25InitParams));
+
+ if (lps25Status != PRESSURE_OK)
+ {
+ TRACE_M(TF_SENSOR, "Error initializing LPS25HB. status (%d)\r\n", lps25Status);
+ }
+
+ tempStatus = LPS25HB_I2C_ReadRawTemperature(&temperature);
+ pressStatus = LPS25HB_I2C_ReadRawPressure(&pressure);
+ if (tempStatus == PRESSURE_OK &&
+ pressStatus == PRESSURE_OK)
+ {
+ /* TRACE_M(TF_SENSOR, "Raw temperature (%d) and raw pressure (%d)\r\n",
+ temperature, pressure); */
+ }
+ else
+ {
+ TRACE_M(TF_SENSOR, "Error reading LPS25HB at init\r\n");
+ }
+#endif
+
+#else
+ TRACE_M(TF_SENSOR, "LPS25HB not initialized\r\n");
#endif
+ /* initialize sensor server model */
+ result = SensorServer_Init(&BufferSensorServer,
+ &AppliSensor_cb,
+ TOTAL_SENSOR_SERVER_BUFF_SIZE,
+ &SensorServerInitParams);
+
+ if(MOBLE_FAILED(result))
+ {
+ TRACE_M(TF_SENSOR, "Sensor Server init failed\r\n");
+ }
+
+ return result;
+ }
+
+
/**
-* @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)
+ * @brief Handling of serial inputs to sensor model
+ * @param Sensor offset in sensor init structure
+ * @param Sensor value
+ * @retval void
+ */
+MOBLE_RESULT Appli_Sensor_Update(MOBLEUINT8 sensorOffset, MOBLEUINT32 value)
{
- MOBLE_RESULT result = MOBLE_RESULT_FALSE;
+ MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
+
+ AppliSensorReadFromSensor = 1;
+
+ /* Update previous with current and current with new */
+ PreviousTemperatureValue = PresentTemperatureValue;
+ PresentTemperatureValue = (MOBLEUINT8)value;
- for(MOBLEUINT8 i=0; i<NUMBER_OF_SENSOR; i++)
+ /* To update cadence parameters
+ results in either status trigger or (and) fast cadence based on change and present
+ Application may decide not to update cadence parameters if senosr value is changing
+ very frequently in some cases to save bandwidth */
+ if (PresentTemperatureValue != PreviousTemperatureValue)
{
- if(prop_ID_Table[i].Property_ID == prop_ID)
- {
- result = MOBLE_RESULT_SUCCESS;
- break;
- }
- }
+ result = Sensor_UpdateCadence(sensorOffset,
+ SensorServerInitParams.sensorInitParams[0].elementIdx,
+ SensorServerInitParams.sensorInitParams[0].propertyId);
+ }
return result;
-}
+ }
+
/**
-* @brief Appli_Sensor_Init: This function is callback for Initialisation of
-* Application interface
-* @param void
-* @retval MOBLE_RESULT
-*/
-MOBLE_RESULT Appli_Sensor_Init(void)
+ * @brief Handling of serial inputs to sensor model
+ * Appli_Sensor_SerialCmd can be used for testing periodic publishing and
+ * triggered publishing with PTS
+ * @param serial string
+ * @param serial string size
+ * @retval void
+ */
+void Appli_Sensor_SerialCmd(char *rcvdStringBuff, uint16_t rcvdStringSize)
{
-#if 0
- LPS25HB_Init(&InitStructure);
-#endif
- return MOBLE_RESULT_SUCCESS;
+ MOBLE_RESULT result = MOBLE_RESULT_INVALIDARG;
+ MOBLEUINT16 value = 0;
+ MOBLEUINT8 sensorOffset = 0;
+
+ if (!strncmp(rcvdStringBuff+6, "SETV", 4))
+ {
+ if (rcvdStringSize == 15)
+ {
+ sscanf(rcvdStringBuff+11, "%4hx", &value);
+
+ /* Set SENSOR1 value at offset 0 */
+ result = Appli_Sensor_Update(sensorOffset, value);
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ BLEMesh_PrintStringCb("Invalid size of string\r\n");
+ }
+ }
+ else if (!strncmp(rcvdStringBuff+6, "PUBLISH", 7))
+ {
+ if (rcvdStringSize == 17)
+ {
+ sscanf(rcvdStringBuff+14, "%1hx", &value);
+
+ sensorOffset = value;
+
+ sscanf(rcvdStringBuff+16, "%1hx", &value);
+
+ /* Enable / Disable publishing of sensor as identified by sensor offset */
+ if(value == 0) /* Disable */
+ {
+ result = Sensor_UpdatePublishState(sensorOffset, 0);
+ }
+ else /* Enable */
+ {
+ result = Sensor_UpdatePublishState(sensorOffset, 1);
+ }
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ BLEMesh_PrintStringCb("Invalid size of string\r\n");
+ }
+ }
+ else
+ {
+ result = MOBLE_RESULT_FAIL;
+ }
+
+ /* Check the result of command processing */
+ if(result == MOBLE_RESULT_SUCCESS)
+ {
+ BLEMesh_PrintStringCb("Success\r\n");
+ }
+ else if(result == MOBLE_RESULT_OUTOFMEMORY)
+ {
+ BLEMesh_PrintStringCb("Fail Out of memory\r\n");
+ }
+ else if(result == MOBLE_RESULT_INVALIDARG)
+ {
+ BLEMesh_PrintStringCb("Fail Invalid Argument\r\n");
+ }
+ else
+ {
+ BLEMesh_PrintStringCb("Fail\r\n");
+ }
}
@@ -898,5 +1027,5 @@ MOBLE_RESULT Appli_Sensor_Init(void)
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 18f060d82..613d14df5 100644
--- 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
@@ -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
@@ -23,118 +23,118 @@
/* 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;
- MOBLEUINT8 FastCadenceLow;
- MOBLEUINT8 FastCadenceHigh;
- // float FastCadenceLow;
-// float FastCadenceHigh;
-}Sensor_CadenceSet_t;
-
-typedef struct
-{
- MOBLEUINT16 Property_ID;
- MOBLEUINT16 RawValueX;
- MOBLEUINT16 RawValueWidth;
- MOBLEUINT16 RawValueY;
-}Sensor_Column_param_t;
-
-/* Sensor Series */
-struct Sensor_SeriesData
-{
- MOBLEUINT16 RawValueX;
- MOBLEUINT16 RawColumnWidth;
- MOBLEUINT16 RawValueY;
-};
-
-typedef struct
-{
- MOBLEUINT16 Property_ID;
- struct Sensor_SeriesData SeriesData[SENSOR_SERIES_VALUE];
-}Sensor_Series_param_t ;
-
-#pragma pack(4)
-
-MOBLE_RESULT Appli_Sensor_Cadence_Set(Sensor_CadenceParam_t* pCadence_param,
- MOBLEUINT16 property_ID,
- MOBLEUINT32 length);
-MOBLE_RESULT Appli_Sensor_Cadence_Get(MOBLEUINT8* sensor_DataCadence,
- 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,
- MOBLEUINT16 prop_ID,
- MOBLEUINT32 length);
-MOBLE_RESULT Appli_Sensor_Setting_Set(Sensor_SettingParam_t* pSensor_SettingParam,
- MOBLEUINT8 OptionalValid,
- MOBLEUINT16 prop_ID);
-MOBLE_RESULT Appli_Sensor_Series_Status(MOBLEUINT8* sensor_Series,
- MOBLEUINT32* pLength,
- MOBLEUINT16 prop_ID,
- MOBLEUINT32 length);
-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,
- MOBLEUINT16 prop_ID);
+#include "sensors.h"
+#include "mesh_cfg.h"
+
+/* Exported functions ------------------------------------------------------- */
+void Appli_Sensor_CadenceGet(sensor_CadenceCbParam_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_CadenceSet(sensor_CadenceCbParam_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_CadenceSetUnack(sensor_CadenceCbParam_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_SettingsGet(sensor_SettingsCbParams_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_SettingGet(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_SettingSet(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_SettingSetUnack(sensor_SettingCbParams_t* pSettingParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_DescriptorGet(MOBLEUINT8 pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Get (MOBLEUINT16 prop_ID,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_ColumnGet(sensor_ColumnCbParams_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_SeriesGet(sensor_SeriesCbParams_t* pDescriptorParam,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS peerAddr,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Sensor_ReadDescriptor(MOBLEUINT8 sensorOffset,
+ sensor_DescriptorCbParams_t* pDescriptorParams);
+MOBLE_RESULT Appli_Sensor_ReadValue(MOBLEUINT8 sensorOffset,
+ sensor_ValueCbParams_t* pValueParams);
+MOBLE_RESULT Appli_Sensor_ReadColumn(MOBLEUINT8 sensorOffset,
+ MOBLEUINT8 columnOffset,
+ sensor_ColumnCbParams_t* pColumnParams);
+MOBLE_RESULT Appli_Sensor_ReadSeries(MOBLEUINT8 sensorOffset,
+ sensor_SeriesCbParams_t* pSeriesParams);
+MOBLEUINT8 Appli_Sensor_IsFastCadence(MOBLEUINT8 sensorOffset,
+ void* pFastCadenceLow,
+ void* pFastCadenceHigh);
+MOBLEUINT8 Appli_Sensor_IsStatusTrigger(MOBLEUINT8 sensorOffset,
+ status_trigger_type_e triggerType,
+ void* pDeltaDown,
+ void* pDeltaUp);
MOBLE_RESULT Appli_Sensor_Init(void);
-void Sensor_Process(void);
-void Sensor_LC_Light_Publish(void);
-
+//void Appli_Sensor_SerialCmd(char *rcvdStringBuff, uint16_t rcvdStringSize);
+MOBLE_RESULT Appli_Sensor_Update(MOBLEUINT8 sensorOffset, MOBLEUINT32 value);
+
+void Appli_Sensor_Descriptor_Status(const MOBLEUINT8 *pDescriptor,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Cadence_Status(const MOBLEUINT8 *pCadence,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Settings_Status(const MOBLEUINT8 *pSettings,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Setting_Status(const MOBLEUINT8 *pSetting,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Status(const MOBLEUINT8 *pStatus,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Column_Status(const MOBLEUINT8 *pColumn,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+void Appli_Sensor_Series_Status(const MOBLEUINT8 *pSeries,
+ MOBLEUINT32 length,
+ MOBLE_ADDRESS dstPeer,
+ MOBLEUINT8 elementIndex);
+MOBLE_RESULT Appli_Sensor_Update(MOBLEUINT8 sensorOffset,
+ MOBLEUINT32 value);
+void Appli_Sensor_SerialCmd(char *rcvdStringBuff,
+ uint16_t rcvdStringSize);
#endif /* __APPLI_SENSOR_H */
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensors_client.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensors_client.c
new file mode 100644
index 000000000..aecf584d4
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensors_client.c
@@ -0,0 +1,153 @@
+/**
+******************************************************************************
+* @file appli_sensors_client.c
+* @author BLE Mesh Team
+* @brief Application interface for Generic Mesh Models
+******************************************************************************
+* @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 "hal_common.h"
+#include "types.h"
+#include "appli_sensor.h"
+#include "appli_light.h"
+#include "common.h"
+#include "mesh_cfg_usr.h"
+#include "appli_nvm.h"
+#include "appli_mesh.h"
+#include "sensors_client.h"
+#include "appli_sensors_client.h"
+
+/** @addtogroup ST_BLE_Mesh
+* @{
+*/
+
+/** @addtogroup Application_Mesh_Models
+* @{
+*/
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+
+
+/* Private functions ---------------------------------------------------------*/
+/**
+* @brief Appli_SensorsClient_API: This function is a Wrapper to call Sensors Client API depending on opcode received in input
+* @param elementIndex: Index of the element
+* @param msg_opcode: opcode of the desired API
+* @param msg_params: buffer containing the desired API parameters
+* @retval MOBLE_RESULT
+*/
+MOBLE_RESULT Appli_SensorsClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8 *msg_params)
+{
+ MOBLE_RESULT result = MOBLE_RESULT_FAIL;
+ switch(msg_opcode){
+/******************************************************************************/
+#ifdef ENABLE_SENSOR_MODEL_CLIENT
+/******************************************************************************/
+ case SENSOR_DESCRIPTOR_GET:
+ {
+ result = SensorsClient_Descriptor_Get(elementIndex, msg_params);
+ break;
+ }
+ case SENSOR_CADENCE_GET:
+ {
+ result = SensorsClient_Cadence_Get(elementIndex, msg_params);
+ break;
+ }
+ case SENSOR_CADENCE_SET:
+ {
+ //TODO: Set dynamic data size depending on Sensor DATA LENTGH: length = 4 + 4 + 2* SensorDataLength
+ result = SensorsClient_Cadence_Set(elementIndex,
+ msg_params,
+ 10); //(sizeof(sensor_CadenceCbParam_t)-3));
+ break;
+ }
+ case SENSOR_CADENCE_SET_UNACK:
+ {
+ //TODO: Set dynamic data size depending on Sensor DATA LENTGH: length = 4 + 4 + 2 * SensorDataLength
+ result = SensorsClient_Cadence_Set_Unack(elementIndex,
+ msg_params,
+ 10); //(sizeof(sensor_CadenceCbParam_t)-3));
+ break;
+ }
+ case SENSOR_SETTINGS_GET:
+ {
+ result = SensorsClient_Settings_Get(elementIndex, msg_params);
+ break;
+ }
+
+ case SENSOR_SETTING_GET:
+ {
+ result = SensorsClient_Setting_Get(elementIndex, msg_params, sizeof(sensor_SettingsCbParams_t));
+ break;
+ }
+ case SENSOR_SETTING_SET:
+ {
+ //TODO: Set dynamic data size depending on Sensor DATA LENTGH: length = 4 + SensorDataLength
+ result = SensorsClient_Setting_Set(elementIndex,
+ msg_params,
+ 6);
+ break;
+ }
+ case SENSOR_SETTING_SET_UNACK:
+ {
+ //TODO: Set dynamic data size depending on Sensor DATA LENTGH: length = 4 + SensorDataLength
+ result = SensorsClient_Setting_Set_Unack(elementIndex,
+ msg_params,
+ 6);
+ break;
+ }
+ case SENSOR_GET:
+ {
+ result = SensorsClient_Get(elementIndex, msg_params);
+ break;
+ }
+ case SENSOR_COLUMN_GET:
+ {
+ result = SensorsClient_Column_Get(elementIndex, msg_params, 4);
+ break;
+ }
+ case SENSOR_SERIES_GET:
+ {
+ result = SensorsClient_Series_Get(elementIndex, msg_params, 4);
+ break;
+ }
+/******************************************************************************/
+#endif /* #ifdef ENABLE_SENSOR_MODEL_CLIENT */
+/******************************************************************************/
+
+
+ default:
+ {
+ TRACE_M(TF_SENSOR, "OpCode value invalid %d \r\n", msg_opcode);
+ result = MOBLE_RESULT_FAIL;
+ }
+ }
+ return result;
+}
+
+/**
+* @}
+*/
+
+/**
+* @}
+*/
+
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
+
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensors_client.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensors_client.h
new file mode 100644
index 000000000..431b5c691
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_sensors_client.h
@@ -0,0 +1,42 @@
+/**
+******************************************************************************
+* @file appli_sensor_client.h
+* @author BLE Mesh Team
+* @brief Application interface for Sensor Mesh Models
+******************************************************************************
+* @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 __APPLI_SENSOR_CLIENT_H
+#define __APPLI_SENSOR_CLIENT_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "types.h"
+#include "sensors.h"
+#include "mesh_cfg.h"
+
+
+/* Exported macro ------------------------------------------------------------*/
+/* Exported variables ------------------------------------------------------- */
+/* Application Variable-------------------------------------------------------*/
+/* Exported Functions Prototypes ---------------------------------------------*/
+MOBLE_RESULT Appli_ConfigClient_Set(void);
+MOBLE_RESULT Appli_SensorsClient_API(MOBLEUINT8 elementIndex, MOBLEUINT16 msg_opcode, MOBLEUINT8 *msg_params);
+
+
+
+
+#endif /* __APPLI_SENSOR_CLIENT_H */
+
+/******************* (C) COPYRIGHT 2020 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
index 38004a61d..55a67d8a2 100644
--- 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
@@ -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
@@ -30,23 +30,34 @@
#include "mesh_cfg.h"
#include <string.h>
-
-/** @addtogroup MODEL_VENDOR
+/** @addtogroup ST_BLE_Mesh
* @{
*/
-/** @addtogroup Vendor_Model_Callbacks
+/** @addtogroup Application_Mesh_Models
* @{
*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
+typedef struct
+{
+ MOBLE_ADDRESS dst;
+ MOBLEUINT8 data[VENDOR_DATA_BUFFER_SIZE];
+ MOBLEUINT32 length;
+ MOBLEUINT8 elementIndex;
+} APPLI_SEND_BIG_DATA_PACKET;
+
/* Private variables ---------------------------------------------------------*/
-MOBLEUINT8 ResponseBuffer[VENDOR_DATA_BYTE];
+MOBLEUINT8 ResponseBuffer[VENDOR_DATA_BUFFER_SIZE];
MOBLEUINT16 BuffLength;
+APPLI_SEND_BIG_DATA_PACKET Appli_VendorBigData;
+
+/*Variable to enable OTA for received vendor command*/
extern MOBLEUINT8 Appli_LedState;
extern uint16_t DUTY;
+extern MOBLEUINT8 NumberOfElements;
MOBLEUINT32 TestHitCounter = 0;
extern Appli_LightPwmValue_t Appli_LightPwmValue;
@@ -268,18 +279,17 @@ MOBLE_RESULT Appli_Vendor_Test(MOBLEUINT8 const *data, MOBLEUINT32 length)
* @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
+* @param elementIndex : selected element where '0' is first element
* @retval MOBLE_RESULT status of result
*/
MOBLE_RESULT Appli_Vendor_LEDControl( MOBLEUINT8 const *data, MOBLEUINT32 length,
- MOBLEUINT8 elementNumber , MOBLE_ADDRESS dst_peer)
+ MOBLEUINT8 elementIndex , 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,"#03-%02hx!\n\r",data[0]);
switch(subCommand)
@@ -291,139 +301,102 @@ MOBLE_RESULT Appli_Vendor_LEDControl( MOBLEUINT8 const *data, MOBLEUINT32 length
*/
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 Need to write the commands as per the element selected*/
+
+ TRACE_M(TF_VENDOR,"Appli_LED_Control callback received for elementIndex %d \r\n", elementIndex);
+ Appli_LedState = *(data+1); /* Toggle the state of the Blue LED */
+ if( Appli_LedState == 1)
{
- /* user application code */
+ BSP_LED_On(LED_BLUE);
}
- else if(elementNumber == THIRD_ELEMENT)
+ else
{
- /* user application code */
- }
+ BSP_LED_Off(LED_BLUE);
+ }
break;
}
/* Toggle Command */
case APPLI_CMD_TOGGLE:
{
- if(elementNumber == FIRST_ELEMENT)
+ /*User Need to write the commands as per the element selected*/
+
+ TRACE_M(TF_VENDOR,"Appli_LED_Toggle callback received for elementIndex %d \r\n", elementIndex);
+ if(Appli_LedState == 1)
{
- if(Appli_LedState == 1)
- {
- Appli_LightPwmValue.IntensityValue = LED_OFF_VALUE;
+ 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) */
+ 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) */
+ 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 */
+ Appli_LedState = 0;
+ BSP_LED_Off(LED_BLUE);
}
- else if(elementNumber == THIRD_ELEMENT)
+ else
{
- /* user application code */
+ Appli_LightPwmValue.IntensityValue = PWM_TIME_PERIOD;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ Appli_LedState = 1;
+ BSP_LED_On(LED_BLUE);
}
+
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 */
- }
+ /*User Need to write the commands as per the element selected*/
+
+ TRACE_M(TF_VENDOR,"Appli_LED_ON callback received for elementIndex %d \r\n", elementIndex);
+ 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;
+
break;
}
/* Off Command */
case APPLI_CMD_OFF:
{
- if(elementNumber == FIRST_ELEMENT)
- {
- Appli_LightPwmValue.IntensityValue = LED_OFF_VALUE;
+ /*User Need to write the commands as per the element selected*/
+
+ TRACE_M(TF_VENDOR,"Appli_LED_OFF callback received for elementIndex %d \r\n", elementIndex);
+ 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) */
+ 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) */
+ 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 */
- }
+ Appli_LedState = 0;
+ BSP_LED_Off(LED_BLUE);
break;
}
/* intensity command */
case APPLI_CMD_LED_INTENSITY:
{
- if(elementNumber == FIRST_ELEMENT)
- {
- intensityValue = data[2] << 8;
- intensityValue |= data[1];
+ /*User Need to write the commands as per the element selected*/
+
+ TRACE_M(TF_VENDOR,"Appli_LED_Intensity callback received for elementIndex %d \r\n", elementIndex);
+ 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)
+ duty = PwmValueMapping(intensityValue , 0x7FFF ,0);
+ Appli_LightPwmValue.IntensityValue = duty;
+ Light_UpdateLedValue(LOAD_STATE , Appli_LightPwmValue);
+ if(duty > 16000)
{
- /* user application code */
+ BSP_LED_On(LED_BLUE);
}
- else if(elementNumber == THIRD_ELEMENT)
+ else
{
- /* user application code */
+ BSP_LED_Off(LED_BLUE);
}
- break;
- }
+ break;
+ }
/* Default case - Not valid command */
default:
{
@@ -457,26 +430,32 @@ MOBLE_RESULT Appli_Vendor_LEDControl( MOBLEUINT8 const *data, MOBLEUINT32 length
*/
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,"#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;
+ MOBLE_RESULT status = MOBLE_RESULT_SUCCESS;
+ MOBLEUINT8 subCmd = data[0];
+ /*First Byte is sending the Sub Command*/
+ ResponseBuffer[0]=subCmd;
+
+ TRACE_M(TF_VENDOR, "#0E-%02hx %02lx! \n\r",data[0], length);
+ for(MOBLEUINT16 i=0; i<length; i++)
+ {
+ TRACE_I(TF_VENDOR,"%02hx ",data[i]);
+ }
+ TRACE_I(TF_VENDOR,"\n\r");
+ switch(subCmd)
+ {
+ case APPLI_STRING_WRITE:
+ {
+ memcpy(&ResponseBuffer,data,length);
+ BuffLength = length;
+ break;
+ }
+ default:
+ {
+ status = MOBLE_RESULT_FALSE;
+ break;
+ }
+ }
+ return status;
}
/**
@@ -494,6 +473,58 @@ void Appli_GetTestValue (MOBLEUINT8 *responseValue)
TestHitCounter = 0;
}
/**
+* @brief Process the Vendor LED Control Command
+* @param data: Pointer to the data received from peer_addr
+* @param length: Length of the data
+* @param elementIndex : selected element where '0' is first element
+* @param dst_peer : Destination address
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_Vendor_SetBigDataPacket(MOBLEUINT8 *data, MOBLEUINT32 length,
+ MOBLEUINT8 elementIndex , MOBLE_ADDRESS dst_peer)
+{
+ MOBLE_RESULT status = MOBLE_RESULT_SUCCESS;
+
+ if (length > VENDOR_DATA_BUFFER_SIZE)
+ {
+ status = MOBLE_RESULT_INVALIDARG;
+ }
+ memmove(Appli_VendorBigData.data, data, length);
+ Appli_VendorBigData.dst = dst_peer;
+ Appli_VendorBigData.length = length;
+ Appli_VendorBigData.elementIndex = elementIndex;
+ return status;
+}
+/**
+* @brief Send Vendor big data packet
+* @param void
+* @retval MOBLE_RESULT status of result
+*/
+MOBLE_RESULT Appli_Vendor_SendBigDataPacket(void)
+{
+ MOBLE_RESULT status = MOBLE_RESULT_SUCCESS;
+
+ if(BLEMesh_TrsptIsBusyState())
+ {
+ BSP_LED_On(LED_BLUE);
+ status = MOBLE_RESULT_FALSE;
+ }
+ else
+ {
+ BSP_LED_Off(LED_BLUE);
+ status = BLEMesh_SetRemoteData(Appli_VendorBigData.dst,
+ Appli_VendorBigData.elementIndex,
+ 0x000E,
+ Appli_VendorBigData.data,
+ Appli_VendorBigData.length,
+ MOBLE_FALSE,
+ MOBLE_TRUE);
+
+ }
+ return status;
+}
+
+/**
* @}
*/
@@ -501,5 +532,5 @@ void Appli_GetTestValue (MOBLEUINT8 *responseValue)
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 2b9390099..8b8e60aa6 100644
--- 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
@@ -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
@@ -36,8 +36,10 @@ 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);
-
+MOBLE_RESULT Appli_Vendor_SendBigDataPacket(void);
+MOBLE_RESULT Appli_Vendor_SetBigDataPacket(MOBLEUINT8 *data, MOBLEUINT32 length,
+ MOBLEUINT8 elementIndex , MOBLE_ADDRESS dst_peer);
#endif /* __APPLI_VENDOR_H */
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 730c40219..704a08d80 100644
--- 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
@@ -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
@@ -44,12 +44,10 @@
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****/
+/******************* (C) COPYRIGHT 2020 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
deleted file mode 100644
index d668eae80..000000000
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/mesh_cfg.h
+++ /dev/null
@@ -1,273 +0,0 @@
-/**
- ******************************************************************************
- * @file mesh_cfg.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_H
-#define __MESH_CFG_H
-
-/* Includes ------------------------------------------------------------------*/
-#include "mesh_cfg_usr.h"
-#include "app_conf.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
-
-/*
-* TRACE_M includes function name and clock
-*/
-void TraceHeader(const char* func_name, int mode);
-#define TraceB0(func_name, ...)
-#if ( CFG_DEBUG_TRACE != 0 )
-#define TraceB1(func_name, ...) do {TraceHeader(func_name, 0); printf( __VA_ARGS__);} while(0)
-#else
-#define TraceB1(func_name, ...)
-#endif
-#define TraceBX(flags, func_name, ...) TraceB ##flags(func_name, ##__VA_ARGS__)
-#define TRACE_M(flag, ...) TraceBX(flag, __func__, ##__VA_ARGS__)
-
-/*
-* TRACE_I does not include function name and clock
-*/
-#define TraceC0(...)
-#if ( CFG_DEBUG_TRACE != 0 )
-#define TraceC1(...) do { printf( __VA_ARGS__);} while(0)
-#else
-#define TraceC1(...)
-#endif
-//#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 DEVICE_NAME_PARAMS \
-{ \
- DEVICE_NAME_SIZE, \
- Device_Name \
-}
-
-#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 device_name_params_t DeviceNameParams;
-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_MeshLightingPRFNode/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 e06640aa3..425dec922 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/mesh_cfg_usr.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/mesh_cfg_usr.h
@@ -3,11 +3,11 @@
******************************************************************************
* @file mesh_cfg_usr.h
* @author BLE Mesh Team
- * @brief Header file for mesh_usr_cfg.c
+ * @brief user configurable settings
******************************************************************************
* @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
@@ -36,7 +36,84 @@
#define ENABLE_PROXY_FEATURE
#define ENABLE_FRIEND_FEATURE
//#define ENABLE_LOW_POWER_FEATURE
+//#define ENABLE_PROVISIONER_FEATURE
+//#define DYNAMIC_PROVISIONER
+/*
+* 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_NO_OOB
+//#define ENABLE_AUTH_TYPE_STATIC_OOB
+//#define ENABLE_AUTH_TYPE_OUTPUT_OOB
+//#define ENABLE_AUTH_TYPE_INPUT_OOB
+
+/* Static OOB Configurations */
+#define STATIC_OOB_SIZE 16U
+
+/* Output OOB Configurations */
+#define OUTPUT_OOB_SIZE 1U
+#define OUTPUT_OOB_ACTION OUTPUT_OOB_ACTION_BIT_BLINK
+
+/* Input OOB Configurations */
+#define INPUT_OOB_SIZE 1U
+#define INPUT_OOB_ACTION INPUT_OOB_ACTION_BIT_PUSH
+
+/******************************************************************************/
+/* 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_SIG_MODELS_AT_COMMANDS 1
+#define ENABLE_VENDOR_MODELS_AT_COMMANDS 0
+#define ENABLE_UT 1
+
+/* Provisioner feature related configuration */
+#if defined (ENABLE_PROVISIONER_FEATURE) || defined(DYNAMIC_PROVISIONER)
+#define PROVISIONER_ROOT_ADDR_DEFAULT 0x0001
+
+/*
+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
+
+/* Enables the UUID saving per Node - Currenly Not Supported */
+#define ENABLE_SAVE_UUID_PER_NODE 0
+
+//#define ENABLE_SERIAL_PRVN 1
+//#define ENABLE_CONFIG_MODEL_CLIENT (1)
+
+#define CLIENT_MAX_SIG_MODELS_PER_ELEMENT 12 /* Number of SIG Models for Node under provisioning */
+#define CLIENT_MAX_VENDOR_MODELS_PER_ELEMENT 1 /* Number of Vendor Models for Node under provisioning */
+#define CLIENT_MAX_ELEMENTS_PER_NODE 1 /* Number of Elements per Node */
+
+/*
+* 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
+
+#endif
+
+/* Macro to test the Flash saving data and retrieval process */
+#define ENABLE_NVM_TEST
+
/* Macros Used for user defined serial print data for models.
Either use 0 to disable or 1 to enable
@ TF_GENERIC -> Generic server
@@ -66,6 +143,7 @@ Either use 0 to disable or 1 to enable
@ TF_BEACON -> Beacons
@ TF_SERIAL_CTRL
*/
+/* Enabled by default */
#ifndef ENABLE_LOW_POWER_FEATURE
#define TF_GENERIC 1
#define TF_GENERIC_CLIENT 1
@@ -80,20 +158,22 @@ Either use 0 to disable or 1 to enable
#define TF_HANDLER 1
#define TF_INIT 1
#define TF_MISC 1
+#define TF_SERIAL_CTRL 1
/* Disabled by default */
#define TF_COMMON 0
#define TF_GENERIC_M 0
-#define TF_GENERIC_CLIENT_M 0
-#define TF_SENSOR_M 0
+#define TF_GENERIC_CLIENT_M 1
+#define TF_SENSOR_M 1
+#define TF_SENSOR_CLIENT_M 1
#define TF_LIGHT_M 0
-#define TF_LIGHT_CLIENT_M 0
+#define TF_LIGHT_CLIENT_M 1
#define TF_LIGHT_LC_M 0
#define TF_VENDOR_M 0
#define TF_CONFIG_CLIENT_M 0
#define TF_NEIGHBOUR 0
#define TF_MEMORY 0
#define TF_BEACON 0
-#define TF_SERIAL_CTRL 0
+#define TF_VENDOR_APPLI_TEST 0 /* Vendor commands testing */
#endif
/*******************************************************************************
@@ -117,12 +197,11 @@ Either use 0 to disable or 1 to enable
/* Define the following Macros to enable the usage of the Server Generic Models */
#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
+//#define ENABLE_GENERIC_MODEL_SERVER_LEVEL (1)
+//#define ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF (1)
+//#define ENABLE_GENERIC_MODEL_SERVER_POWER_ONOFF_SETUP (1)
+//#define ENABLE_GENERIC_MODEL_SERVER_DEFAULT_TRANSITION_TIME (1)
-/* 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_GENERIC_MODEL_CLIENT_POWER_ONOFF (1)
@@ -153,14 +232,14 @@ Either use 0 to disable or 1 to enable
/******************************************************************************/
#define ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS (1)
-//#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
+//#define ENABLE_LIGHT_MODEL_SERVER_LIGHTNESS_SETUP (1)
+//#define ENABLE_LIGHT_MODEL_SERVER_CTL (1)
+//#define ENABLE_LIGHT_MODEL_SERVER_CTL_SETUP (1)
+//#define ENABLE_LIGHT_MODEL_SERVER_CTL_TEMPERATURE (1)
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL (1)
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL_SETUP (1)
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL_HUE (1)
+//#define ENABLE_LIGHT_MODEL_SERVER_HSL_SATURATION (1)
//#define ENABLE_LIGHT_MODEL_CLIENT_LIGHTNESS (1)
//#define ENABLE_LIGHT_MODEL_CLIENT_CTL (1)
@@ -169,8 +248,7 @@ Either use 0 to disable or 1 to enable
/*
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 ENABLE_LIGHT_MODEL_SERVER_LC (1)
//#define ENABLE_LIGHT_MODEL_CLIENT_LC (1)
@@ -182,8 +260,7 @@ Either use 0 to disable or 1 to enable
/* 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 (1)
//#define ENABLE_SENSOR_MODEL_CLIENT (1)
@@ -208,29 +285,26 @@ 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 (1)
#define GENERIC_SERVER_MODEL_PUBLISH
/* Define the following Macros to enable the usage of the Client Generic Models */
-//#define ENABLE_CONFIG_MODEL_CLIENT (1)
+//#define ENABLE_CONFIG_MODEL_CLIENT (1)
/******************************************************************************/
/*
-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 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
-//#define ENABLE_MODEL_BINDING
-
/* Define the macros for the numbers of sensor present.*/
-#define NUMBER_OF_SENSOR 3
+//#define NUMBER_OF_SENSOR 1
//#define ENABLE_OCCUPANCY_SENSOR
/*
Macro is responsible for enabling and desabling the sensor publication.
@@ -242,7 +316,7 @@ Comment this macro to disable the publication
/* Maximum Time period value of PWM */
-#define PWM_TIME_PERIOD 31990U
+#define PWM_TIME_PERIOD 31990U
/******************************************************************************/
/***** MACROS for POWER ON-OFF CYCLE BASED UNPROVISIONING *********************/
@@ -254,11 +328,11 @@ Define the following Macro to check the Power-OnOff Cycles
*/
//#define ENABLE_UNPROVISIONING_BY_POWER_ONOFF_CYCLE
-#define POWER_ON_OFF_CYCLES_FOR_UNPROVISIONING 5
+#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 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
@@ -271,12 +345,16 @@ this should be avoided to ensure flash longevity
//#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.
+
+/* Macros defined for the number of bytes saved, number of bytes dedicated for ganeric
+ model and light model.
*/
-#define APP_NVM_GENERIC_MODEL_SIZE 16U
-#define APP_NVM_LIGHT_MODEL_SIZE 32U
-#define APP_NVM_MODEL_SIZE 50U
+#define APP_NVM_GENERIC_MODEL_SIZE 16U
+#define APP_NVM_LIGHT_MODEL_SIZE 48U/*32U*/
+#define APP_NVM_MODELDATA_PER_ELEMENT_SIZE (APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE)
+//#define APP_NVM_MODEL_SIZE 50U
+#define APP_NVM_MODEL_SIZE (APP_NVM_MODELDATA_PER_ELEMENT_SIZE * APPLICATION_NUMBER_OF_ELEMENTS)
+//#define APP_NVM_MODEL_ALL_ELEMENTS_SIZE
/*Macros are defined for the selection of the number of led and type of lighting
@@ -298,23 +376,15 @@ this should be avoided to ensure flash longevity
/* 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
+/* Max SIG Models per element */
+#define USER_SIG_MODELS_MAX_COUNT 17
+/* Max Vendor Models per element */
+#define USER_VENDOR_MODELS_MAX_COUNT 1
/* Contains a 16-bit company identifier assigned by the Bluetooth SIG
@@ -331,7 +401,7 @@ For STMicroelectronics : it is 0x0030 */
#define MAX_APPLICATION_PACKET_SIZE 160
-#define TPT_SEGMENT_COUNT (((MAX_APPLICATION_PACKET_SIZE)/12)+2)
+#define TPT_SEGMENT_COUNT (((MAX_APPLICATION_PACKET_SIZE)/12)+2)
/*******************************************************************************
********** MAC Address Configuration *******************************************
@@ -365,43 +435,6 @@ For STMicroelectronics : it is 0x0030 */
/*
-* 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
*/
@@ -480,7 +513,7 @@ For STMicroelectronics : it is 0x0030 */
* 0x0A -> 10ms
* 0xFF -> 255ms
*/
-#define LPN_RECEIVE_WINDOW_SIZE 255U/*55U*/
+#define LPN_RECEIVE_WINDOW_SIZE 255U/*55U*/
/*
* Minimum friend's subscription list size capability required by lpn
@@ -552,14 +585,14 @@ For STMicroelectronics : it is 0x0030 */
* 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
+#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
+#define NEIGHBOR_SECURE_NET_BEACON_NTU 0U
/*
* Enable/disable neighbor table update with TTL 0 message
@@ -567,115 +600,21 @@ For STMicroelectronics : it is 0x0030 */
* 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
+#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
+ #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_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
-
-#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 ---------------------------------------------*/
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
index ce2370722..58846f4c5 100644
--- 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
@@ -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
@@ -42,7 +42,9 @@
#include "config_client.h"
#include "generic_client.h"
#include "light_client.h"
+#include "sensors_client.h"
#include "appli_light_client.h"
+#include "appli_sensors_client.h"
/** @addtogroup ST_BLE_Mesh
* @{
@@ -59,6 +61,9 @@ typedef struct
MOBLE_ADDRESS peer;
MOBLE_ADDRESS dst;
MOBLEUINT8 command;
+ MOBLEUINT8 elementIndex;
+ MOBLEUINT8 appKeyOffset;
+ MOBLEUINT8 netKeyOffset;
MOBLEUINT8 data[DATA_BUFFER_LENGTH]; /* 8-Bytes response packet */
MOBLEUINT32 length;
} APPLI_SEND_RESPONSE_MODULE;
@@ -78,18 +83,48 @@ typedef struct
/* Private variables ---------------------------------------------------------*/
+MOBLEUINT8 Led_Value = 0;
+
+MOBLEUINT8 ButtonIndex_Value = 0;
+
APPLI_PENDING_PACKETS Appli_PendingPackets = {0};
-__attribute__((aligned(4)))
-const MOBLE_VENDOR_CB_MAP vendor_cb =
+MOBLEUINT8 pGeneric_OnOffParam[sizeof(Generic_OnOffParam_t)];
+MOBLEUINT8 pGeneric_LevelParam[sizeof(Generic_LevelParam_t)];
+MOBLEUINT8 pGeneric_DeltaLevelParam[sizeof(Generic_DeltaLevelParam_t)];
+MOBLEUINT8 pGeneric_MoveLevelParam[sizeof(Generic_LevelMoveParam_t)];
+MOBLEUINT8 pGeneric_PowerOnOffParam[sizeof(Generic_PowerOnOffParam_t)];
+MOBLEUINT8 pGeneric_DefaultTransitionTimeParam[sizeof(Generic_DefaultTransitionParam_t)];
+
+MOBLEUINT8 pLightnessParam[sizeof(Light_LightnessParam_t)];
+MOBLEUINT8 pLightnessRangeParam[sizeof(Light_LightnessRangeParam_t)];
+
+MOBLEUINT8 pLightCtlParam[sizeof(Light_CtlParam_t)];
+MOBLEUINT8 pLightCtlTemperatureParam[sizeof(Light_CtlTemperatureParam_t)];
+MOBLEUINT8 pLightCtlTemperatureRangeParam[sizeof(Light_CtlTemperatureRangeParam_t)];
+MOBLEUINT8 pLightCtlDefaultParam[sizeof(Light_CtlDefaultParam_t)];
+
+MOBLEUINT8 pLightHslParam[sizeof(Light_HslParam_t)];
+MOBLEUINT8 pLightHslRangeParam[sizeof(Light_HslRangeParam_t)];
+MOBLEUINT8 pLightHslHueParam[sizeof(Light_HslHueParam_t)];
+MOBLEUINT8 pLightHslSaturationParam[sizeof(Light_HslSaturationParam_t)];
+
+MOBLEUINT8 pLightLCModeParam[sizeof(Light_LC_ModeParam_t)];
+MOBLEUINT8 pLightLCOccupancyModeParam[sizeof(Light_LC_ModeParam_t)];
+MOBLEUINT8 pLightLCOnOffParam[sizeof(Light_LC_OnOffParam_t)];
+MOBLEUINT8 pLightLCPropertyParam[6];
+
+MOBLEUINT8 pSensorsCadenceParam[sizeof(sensor_CadenceCbParam_t)];
+MOBLEUINT8 pSensorsSettingParam[sizeof(sensor_SettingCbParams_t)];
+
+__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 =
+__attribute__((aligned(4)))const Appli_Vendor_cb_t VendorAppli_cb =
{
/*Vendor Commads*/
Appli_Vendor_LEDControl,
@@ -100,8 +135,7 @@ const Appli_Vendor_cb_t VendorAppli_cb =
Appli_Vendor_Data_write
};
-__attribute__((aligned(4)))
-const Appli_Generic_cb_t GenericAppli_cb =
+__attribute__((aligned(4)))const Appli_Generic_cb_t GenericAppli_cb =
{
/* Generic OnOff callbacks */
Appli_Generic_OnOff_Set,
@@ -124,8 +158,7 @@ const Appli_Generic_cb_t GenericAppli_cb =
Appli_Generic_DefaultTransitionTime_Status
};
-__attribute__((aligned(4)))
-const Appli_Generic_State_cb_t Appli_GenericState_cb =
+__attribute__((aligned(4)))const Appli_Generic_State_cb_t Appli_GenericState_cb =
{
/* Generic Get On Off status */
@@ -139,8 +172,7 @@ const Appli_Generic_State_cb_t Appli_GenericState_cb =
Appli_Generic_GetDefaultTransitionStatus
};
-__attribute__((aligned(4)))
-const Appli_Light_GetStatus_cb_t Appli_Light_GetStatus_cb =
+__attribute__((aligned(4)))const Appli_Light_GetStatus_cb_t Appli_Light_GetStatus_cb =
{
Appli_Light_GetLightnessStatus,
Appli_Light_GetLightnessLinearStatus,
@@ -148,10 +180,12 @@ const Appli_Light_GetStatus_cb_t Appli_Light_GetStatus_cb =
Appli_Light_GetLightnessLastStatus,
Appli_Light_GetLightnessRangeStatus,
Appli_Light_GetCtlLightStatus,
+ Appli_Light_GetCtlTargetStatus,
Appli_Light_GetCtlTemperatureStatus,
Appli_Light_GetCtlTemperatureRange,
Appli_Light_GetCtlDefaultStatus,
Appli_Light_GetHslStatus,
+ Appli_Light_GetHslTargetStatus,
Appli_Light_GetHslHueStatus,
Appli_Light_GetHslSaturationStatus,
Appli_Light_GetHslHueRange,
@@ -160,8 +194,7 @@ const Appli_Light_GetStatus_cb_t Appli_Light_GetStatus_cb =
};
-__attribute__((aligned(4)))
-const Appli_Light_cb_t LightAppli_cb =
+__attribute__((aligned(4)))const Appli_Light_cb_t LightAppli_cb =
{
/* Light Lightness callbacks */
Appli_Light_Lightness_Set,
@@ -173,6 +206,9 @@ const Appli_Light_cb_t LightAppli_cb =
Appli_Light_Lightness_Default_Set,
Appli_Light_Lightness_Default_Status,
+ Appli_Light_Lightness_Last_Set,
+ Appli_Light_Lightness_Last_Status,
+
Appli_Light_Lightness_Range_Set,
Appli_Light_Lightness_Range_Status,
@@ -205,17 +241,19 @@ const Appli_Light_cb_t LightAppli_cb =
};
-__attribute__((aligned(4)))
-const Appli_Light_Ctrl_cb_t LightLCAppli_cb =
+#if 0
+__attribute__((aligned(4)))const Appli_Light_Ctrl_cb_t LightLCAppli_cb =
{
/* Light LC mode set callbacks */
Appli_LightLC_Mode_Set,
+ Appli_LightLC_Mode_Status,
Appli_LightLC_OM_Set,
+ Appli_LightLC_OM_Status,
Appli_LightLC_OnOff_Set,
+ Appli_LightLC_OnOff_Status,
};
-__attribute__((aligned(4)))
-const Appli_LightLC_GetStatus_cb_t Appli_LightLC_GetStatus_cb =
+__attribute__((aligned(4)))const Appli_LightLC_GetStatus_cb_t Appli_LightLC_GetStatus_cb =
{
Appli_LightLC_Get_ModeStatus,
Appli_LightLC_Get_OMModeStatus,
@@ -223,33 +261,44 @@ const Appli_LightLC_GetStatus_cb_t Appli_LightLC_GetStatus_cb =
Appli_LightLC_Get_AmbientLuxLevelOutput,
Appli_Light_LC_PIRegulatorOutput,
};
+#endif
-#ifdef ENABLE_SENSOR_MODEL_SERVER
-
-__attribute__((aligned(4)))
-const Appli_Sensor_cb_t SensorAppli_cb =
+__attribute__((aligned(4)))const sensor_server_cb_t SensorAppli_cb =
{
- /* Sensor Model callbacks */
- Appli_Sensor_Cadence_Set,
- Appli_Sensor_Data_Status,
- Appli_Sensor_Descriptor_Status ,
- Appli_Sensor_Setting_Set,
+ Appli_Sensor_CadenceGet,
+ Appli_Sensor_CadenceSet,
+ Appli_Sensor_CadenceSetUnack,
+ Appli_Sensor_SettingsGet,
+ Appli_Sensor_SettingGet,
+ Appli_Sensor_SettingSet,
+ Appli_Sensor_SettingSetUnack,
+ Appli_Sensor_DescriptorGet,
+ Appli_Sensor_Get,
+ Appli_Sensor_ColumnGet,
+ Appli_Sensor_SeriesGet,
+ Appli_Sensor_ReadDescriptor,
+ Appli_Sensor_ReadValue,
+ Appli_Sensor_ReadColumn,
+ Appli_Sensor_ReadSeries,
+ Appli_Sensor_IsFastCadence,
+ Appli_Sensor_IsStatusTrigger,
+ Appli_Sensor_Descriptor_Status,
+ Appli_Sensor_Cadence_Status,
+ Appli_Sensor_Settings_Status,
+ Appli_Sensor_Setting_Status,
+ Appli_Sensor_Status,
Appli_Sensor_Column_Status,
Appli_Sensor_Series_Status
};
-__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 Appli_Sensor_GetStatus_cb_t Appli_Sensor_GetStatus_cb =
+//{
+// // Appli_Sensor_GetSettingStatus,
+// Appli_Sensor_GetSetting_IDStatus,
+//};
-__attribute__((aligned(4)))
-const MODEL_SIG_cb_t Model_SIG_cb[] =
+__attribute__((aligned(4)))const MODEL_SIG_cb_t Model_SIG_cb[] =
{
#ifdef ENABLE_GENERIC_MODEL_SERVER
{
@@ -266,6 +315,7 @@ const MODEL_SIG_cb_t Model_SIG_cb[] =
LightModelServer_ProcessMessageCb
},
#endif
+
#ifdef ENABLE_SENSOR_MODEL_SERVER
{
SensorModelServer_GetOpcodeTableCb,
@@ -273,6 +323,7 @@ const MODEL_SIG_cb_t Model_SIG_cb[] =
SensorModelServer_ProcessMessageCb
},
#endif
+
#ifdef ENABLE_TIME_SCENE_MODEL_SERVER
{
Time_SceneModelServer_GetOpcodeTableCb,
@@ -280,13 +331,15 @@ const MODEL_SIG_cb_t Model_SIG_cb[] =
Time_SceneModelServer_ProcessMessageCb
},
#endif
+
#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
{
- Light_LC_ModelServer_GetOpcodeTableCb,
- Light_LC_ModelServer_GetStatusRequestCb,
- Light_LC_ModelServer_ProcessMessageCb
+ LightLcServer_GetOpcodeTableCb,
+ LightLcServer_GetStatusRequestCb,
+ LightLcServer_ProcessMessageCb
},
#endif
+
#ifdef ENABLE_GENERIC_MODEL_CLIENT
{
GenericModelClient_GetOpcodeTableCb,
@@ -294,6 +347,7 @@ const MODEL_SIG_cb_t Model_SIG_cb[] =
GenericModelClient_ProcessMessageCb
},
#endif
+
#ifdef ENABLE_CONFIG_MODEL_CLIENT
{
ConfigClientModel_GetOpcodeTableCb,
@@ -309,15 +363,29 @@ const MODEL_SIG_cb_t Model_SIG_cb[] =
},
#endif
- { 0, 0,0 }
+#ifdef ENABLE_SENSOR_MODEL_CLIENT
+ {
+ SensorsModelClient_GetOpcodeTableCb,
+ SensorsModelClient_GetStatusRequestCb,
+ SensorsModelClient_ProcessMessageCb
+ },
+#endif
+
+ {
+ 0, 0, 0
+ }
};
__attribute__((aligned(4))) const APPLI_SAVE_MODEL_STATE_CB SaveModelState_cb = AppliNvm_SaveModelState;
+#if 0
+__attribute__((aligned(4))) const APPLI_SAVE_MODEL_TEST_STATE_CB SaveModelTestState_cb = AppliNVM_Save_FlashTesting;
+__attribute__((aligned(4))) const APPLI_RETRIEVE_MODEL_TEST_STATE_CB RetrieveModelTestState_cb = AppliNVM_Retrieve_FlashTesting;
+#endif
+
#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[] =
+__attribute__((aligned(4))) const MODEL_Vendor_cb_t Model_Vendor_cb[] =
{
#ifdef ENABLE_VENDOR_MODEL_SERVER
{
@@ -341,7 +409,7 @@ void GetApplicationVendorModels(const MODEL_Vendor_cb_t** pModelsTable, MOBLEUIN
*pModelsTable = Model_Vendor_cb ;
*VendorModelscount = MODEL_VENDOR_COUNT;
- TRACE_M(TF_VENDOR,"GetApplicationVendorModels \r\n");
+ TRACE_M(TF_VENDOR_M, "GetApplicationVendorModels \r\n");
}
/**
@@ -354,7 +422,7 @@ void BLEMesh_ModelsInit(void)
#ifdef ENABLE_SAVE_MODEL_STATE_NVM
- MOBLEUINT8 modelStateLoad_Size;
+ MOBLEUINT16 modelStateLoad_Size;
MOBLEUINT8 modelStateLoadBuff[APP_NVM_MODEL_SIZE];
#ifdef CLIENT
@@ -362,28 +430,39 @@ void BLEMesh_ModelsInit(void)
MOBLEUINT8 PrvnlStateLoadBuff[16];
#endif
+#if 0
+#ifdef ENABLE_NVM_TEST
+ /* Testing of flash code */
+ Device_FlashTesting();
+#endif
+#endif
+
+ /* Inintialise the light model range states with default values */
+ Light_ModelRangeInit();
+
/* 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);
+#if defined ENABLE_SENSOR_MODEL_SERVER && !defined CUSTOM_BOARD_PWM_SELECTION
+ /* Initialization of sensors */
+ Appli_Sensor_Init();
+#endif
+
+ Appli_Light_LCs_Init();
#endif
+ /* Load generic model states from nvm */
+ AppliNvm_LoadModelState(modelStateLoadBuff, &modelStateLoad_Size);
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
+#ifdef CLIENT
+ AppliPrvnNvm_LoadData(PrvnlStateLoadBuff,&PrvnStateLoad_Size);
+#endif
+
}
/**
@@ -418,7 +497,7 @@ void BLEMesh_ModelsProcess(void)
#endif
#ifdef ENABLE_LIGHT_MODEL_SERVER_LC
- Light_control_Process();
+ Light_LC_Process();
#endif
}
@@ -433,23 +512,498 @@ void BLEMesh_ModelsCommand(void)
Vendor_Publish(BLEMesh_GetAddress());
#endif
+#if defined(GENERIC_CLIENT_MODEL_PUBLISH) || defined(LIGHT_CLIENT_MODEL_PUBLISH)
+ Led_Value ^= APPLI_LED_ON;
+ pGeneric_OnOffParam[0] = Led_Value; // OnOff parameter byte 0 : The target value of the Generic Onoff state
+
+ pLightLCModeParam[0] = Led_Value;
+ pLightLCOccupancyModeParam[0] = Led_Value;
+ pLightLCOnOffParam[0] = Led_Value;
+
+ //This Switch-case allows to quickly set the different Models Messages parameters in order to demonstrate Client APIs functionning
+ switch (ButtonIndex_Value){
+ case 0:
+ ButtonIndex_Value=0x1;
+
+ pGeneric_LevelParam[0]= 0xE8; // Level parameter byte 0 : The target value of the Generic Level state
+ pGeneric_LevelParam[1]= 0x03; // Level parameter byte 1 : The target value of the Generic Level state
+
+ pGeneric_DeltaLevelParam[0]= 0xE8; // Delta Level parameter byte 0 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[1]= 0x03; // Delta Level parameter byte 1 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[2]= 0x00; // Delta Level parameter byte 2 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[3]= 0x00; // Delta Level parameter byte 3 : The Delta change of the Generic Level state
+
+ pGeneric_MoveLevelParam[0]= 0xE8; //Move Delta Level parameter byte 0 : The Delta Level step to calculate Move speed for the Generic Level state
+ pGeneric_MoveLevelParam[1]= 0x03; //Move Delta Level parameter byte 1 : The Delta Level step to calculate Move speed for the Generic Level state
+
+ pGeneric_DefaultTransitionTimeParam[0]=0x0F; //Transition time parameter byte 0 : The value of the Generic Default Transition Time state
+
+ pGeneric_PowerOnOffParam[0]=0x1; //OnPowerUp parameter byte 0 : The value of the Generic OnPowerUp state.
+
+ pLightnessParam[0] = 0xE8; //Lightness parameter byte 0 : The target value of the Light Lightness Actual/Linear/Default state
+ pLightnessParam[1] = 0x03; //Lightness parameter byte 1 : The target value of the Light Lightness Actual/Linear/Default state
+
+ pLightnessRangeParam[0] = 0xE8; //Lightness Range Min parameter byte 0 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[1] = 0x03; //Lightness Range Min parameter byte 1 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[2] = 0x88; //Lightness Range Max parameter byte 0 : The value of the Lightness Range Max field of the Light Lightness Range state
+ pLightnessRangeParam[3] = 0x13; //Lightness Range Max parameter byte 1 : The value of the Lightness Range Max field of the Light Lightness Range state
+
+ pLightCtlParam[0] = 0xE8; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness state
+ pLightCtlParam[1] = 0x03; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness state
+ pLightCtlParam[2] = 0xE8; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlParam[3] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlParam[4] = 0xE8; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlParam[5] = 0x03; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureParam[0] = 0xE8; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[1] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[2] = 0xE8; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlTemperatureParam[3] = 0x03; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureRangeParam[0] = 0xE8; //Temperature Range Min parameter byte 0 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[1] = 0x03; //Temperature Range Min parameter byte 1 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[2] = 0x88; //Temperature Range Max parameter byte 0 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[3] = 0x13; //Temperature Range Max parameter byte 1 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+
+ pLightCtlDefaultParam[0] = 0xE8; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[1] = 0x03; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[2] = 0xE8; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[3] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[4] = 0xE8; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV Default state
+ pLightCtlDefaultParam[5] = 0x03; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV Default state
+
+ pLightHslParam[0] = 0xE8; //HSL Lightness parameter byte 0 : The target value of the Light HSL Lightness state
+ pLightHslParam[1] = 0x03; //HSL Lightness parameter byte 1 : The target value of the Light HSL Lightness state
+ pLightHslParam[2] = 0xE8; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslParam[3] = 0x03; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+ pLightHslParam[4] = 0xE8; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslParam[5] = 0x03; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ pLightHslRangeParam[0] = 0xE8; //HSL Hue Range Min parameter byte 0 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[1] = 0x03; //HSL Hue Range Min parameter byte 1 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[2] = 0x88; //HSL Hue Range Max parameter byte 0 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[3] = 0x13; //HSL Hue Range Max parameter byte 1 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[4] = 0x88; //HSL Saturation Min parameter byte 0 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[5] = 0x13; //HSL Saturation Min parameter byte 1 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[6] = 0x70; //HSL Saturation Max parameter byte 0 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+ pLightHslRangeParam[7] = 0x17; //HSL Saturation Max parameter byte 1 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+
+ pLightHslHueParam[0] = 0xE8; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslHueParam[1] = 0x03; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+
+ pLightHslSaturationParam[0] = 0xE8; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslSaturationParam[1] = 0x03; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ //LIGHT_CONTROL_LUX_LEVEL_ON_ID : 0x202B
+ pLightLCPropertyParam[0]= 0x2B; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[1]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[2]= 0x44; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[3]= 0x44; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[4]= 0x44; // Property ID byte 2 : Property ID identifying a Light LC Property.
+ break;
+
+ case 1:
+ ButtonIndex_Value=0x2;
+
+ pGeneric_LevelParam[0]= 0xff; // Level parameter byte 0 : The target value of the Generic Level state
+ pGeneric_LevelParam[1]= 0x7f; // Level parameter byte 1 : The target value of the Generic Level state
+
+ pGeneric_DeltaLevelParam[0]= 0x10; // Delta Level parameter byte 0 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[1]= 0x27; // Delta Level parameter byte 1 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[2]= 0x00; // Delta Level parameter byte 2 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[3]= 0x00; // Delta Level parameter byte 3 : The Delta change of the Generic Level state
+
+ pGeneric_MoveLevelParam[0]= 0xff; //Move Delta Level parameter byte 0 : The Delta Level step to calculate Move speed for the Generic Level state
+ pGeneric_MoveLevelParam[1]= 0x7f; //Move Delta Level parameter byte 1 : The Delta Level step to calculate Move speed for the Generic Level state
+
+ pGeneric_DefaultTransitionTimeParam[0]=0x10; //Transition time parameter byte 0 : The value of the Generic Default Transition Time state
+
+ pGeneric_PowerOnOffParam[0]=0x2; //OnPowerUp parameter byte 0 : The value of the Generic OnPowerUp state.
+
+ pLightnessParam[0] = 0xff; //Lightness parameter byte 0 : The target value of the Light Lightness Actual/Linear/Default state
+ pLightnessParam[1] = 0xff; //Lightness parameter byte 1 : The target value of the Light Lightness Actual/Linear/Default state
+
+ pLightnessRangeParam[0] = 0x00; //Lightness Range Min parameter byte 0 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[1] = 0x00; //Lightness Range Min parameter byte 1 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[2] = 0xff; //Lightness Range Max parameter byte 0 : The value of the Lightness Range Max field of the Light Lightness Range state
+ pLightnessRangeParam[3] = 0xff; //Lightness Range Max parameter byte 1 : The value of the Lightness Range Max field of the Light Lightness Range state
+
+ pLightCtlParam[0] = 0xff; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness state
+ pLightCtlParam[1] = 0xff; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness state
+ pLightCtlParam[2] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlParam[3] = 0x4e; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlParam[4] = 0xff; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlParam[5] = 0x7f; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureParam[0] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[1] = 0x4e; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[2] = 0xff; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlTemperatureParam[3] = 0x7f; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureRangeParam[0] = 0x19; //Temperature Range Min parameter byte 0 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[1] = 0x4e; //Temperature Range Min parameter byte 1 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[2] = 0x20; //Temperature Range Max parameter byte 0 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[3] = 0x4e; //Temperature Range Max parameter byte 1 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+
+ pLightCtlDefaultParam[0] = 0xff; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[1] = 0xff; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[2] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[3] = 0x4e; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[4] = 0xff; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV Default state
+ pLightCtlDefaultParam[5] = 0x7f; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV Default state
+
+ pLightHslParam[0] = 0xff; //HSL Lightness parameter byte 0 : The target value of the Light HSL Lightness state
+ pLightHslParam[1] = 0xff; //HSL Lightness parameter byte 1 : The target value of the Light HSL Lightness state
+ pLightHslParam[2] = 0xee; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslParam[3] = 0xee; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+ pLightHslParam[4] = 0xdd; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslParam[5] = 0xdd; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ pLightHslRangeParam[0] = 0x00; //HSL Hue Range Min parameter byte 0 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[1] = 0xf0; //HSL Hue Range Min parameter byte 1 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[2] = 0xff; //HSL Hue Range Max parameter byte 0 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[3] = 0xff; //HSL Hue Range Max parameter byte 1 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[4] = 0x00; //HSL Saturation Min parameter byte 0 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[5] = 0xe0; //HSL Saturation Min parameter byte 1 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[6] = 0xff; //HSL Saturation Max parameter byte 0 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+ pLightHslRangeParam[7] = 0xef; //HSL Saturation Max parameter byte 1 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+
+ pLightHslHueParam[0] = 0xff; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslHueParam[1] = 0xff; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+
+ pLightHslSaturationParam[0] = 0xff; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslSaturationParam[1] = 0xff; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ //LIGHT_CONTROL_LUX_LEVEL_ON_ID : 0x202B
+ pLightLCPropertyParam[0]= 0x2B; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[1]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[2]= 0x01; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[3]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[4]= 0x10; // Property ID byte 2 : Property ID identifying a Light LC Property.
+ break;
+
+ case 2:
+ ButtonIndex_Value=0x0;
+
+ pGeneric_LevelParam[0]= 0x00; // Level parameter byte 0 : The target value of the Generic Level state
+ pGeneric_LevelParam[1]= 0x00; // Level parameter byte 1 : The target value of the Generic Level state
+
+ pGeneric_DeltaLevelParam[0]= 0x00; // Delta Level parameter byte 0 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[1]= 0x00; // Delta Level parameter byte 1 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[2]= 0x00; // Delta Level parameter byte 2 : The Delta change of the Generic Level state
+ pGeneric_DeltaLevelParam[3]= 0x00; // Delta Level parameter byte 3 : The Delta change of the Generic Level state
+
+ pGeneric_MoveLevelParam[0]= 0x00; //Move Delta Level parameter byte 0 : The Delta Level step to calculate Move speed for the Generic Level state
+ pGeneric_MoveLevelParam[1]= 0x00; //Move Delta Level parameter byte 1 : The Delta Level step to calculate Move speed for the Generic Level state
+
+ pGeneric_DefaultTransitionTimeParam[0]=0x00; //Transition time parameter byte 0 : The value of the Generic Default Transition Time state
+
+ pGeneric_PowerOnOffParam[0]=0x0; //OnPowerUp parameter byte 0 : The value of the Generic OnPowerUp state.
+
+ pLightnessParam[0] = 0x00; //Lightness parameter byte 0 : The target value of the Light Lightness Actual/Linear/Default state
+ pLightnessParam[1] = 0x00; //Lightness parameter byte 1 : The target value of the Light Lightness Actual/Linear/Default state
+
+ pLightnessRangeParam[0] = 0x00; //Lightness Range Min parameter byte 0 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[1] = 0x00; //Lightness Range Min parameter byte 1 : The value of the Lightness Range Min field of the Light Lightness Range state
+ pLightnessRangeParam[2] = 0x00; //Lightness Range Max parameter byte 0 : The value of the Lightness Range Max field of the Light Lightness Range state
+ pLightnessRangeParam[3] = 0x10; //Lightness Range Max parameter byte 1 : The value of the Lightness Range Max field of the Light Lightness Range state
+
+ pLightCtlParam[0] = 0x00; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness state
+ pLightCtlParam[1] = 0x00; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness state
+ pLightCtlParam[2] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlParam[3] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlParam[4] = 0x00; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlParam[5] = 0x00; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureParam[0] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[1] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature state
+ pLightCtlTemperatureParam[2] = 0x00; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV state
+ pLightCtlTemperatureParam[3] = 0x00; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV state
+
+ pLightCtlTemperatureRangeParam[0] = 0x20; //Temperature Range Min parameter byte 0 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[1] = 0x03; //Temperature Range Min parameter byte 1 : The value of the Temperature Range Min field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[2] = 0x21; //Temperature Range Max parameter byte 0 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+ pLightCtlTemperatureRangeParam[3] = 0x03; //Temperature Range Max parameter byte 1 : The value of the Temperature Range Max field of the Light CTL Temperature Range state
+
+ pLightCtlDefaultParam[0] = 0x00; //CTL Lightness parameter byte 0 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[1] = 0x00; //CTL Lightness parameter byte 1 : The target value of the Light CTL Lightness Default state
+ pLightCtlDefaultParam[2] = 0x20; //CTL Temperature parameter byte 0 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[3] = 0x03; //CTL Temperature parameter byte 1 : The target value of the Light CTL Temperature Default state
+ pLightCtlDefaultParam[4] = 0x00; //CTL Delta UV parameter byte 0 : The target value of the Light CTL Delta UV Default state
+ pLightCtlDefaultParam[5] = 0x00; //CTL Delta UV parameter byte 1 : The target value of the Light CTL Delta UV Default state
+
+ pLightHslParam[0] = 0x00; //HSL Lightness parameter byte 0 : The target value of the Light HSL Lightness state
+ pLightHslParam[1] = 0x00; //HSL Lightness parameter byte 1 : The target value of the Light HSL Lightness state
+ pLightHslParam[2] = 0x00; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslParam[3] = 0x00; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+ pLightHslParam[4] = 0x00; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslParam[5] = 0x00; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ pLightHslRangeParam[0] = 0x00; //HSL Hue Range Min parameter byte 0 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[1] = 0x00; //HSL Hue Range Min parameter byte 1 : The value of the Hue Range Min field of the Light HSL Hue Range state
+ pLightHslRangeParam[2] = 0x00; //HSL Hue Range Max parameter byte 0 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[3] = 0x10; //HSL Hue Range Max parameter byte 1 : The value of the Hue Range Max field of the Light HSL Hue Range state
+ pLightHslRangeParam[4] = 0x00; //HSL Saturation Min parameter byte 0 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[5] = 0x00; //HSL Saturation Min parameter byte 1 : The value of the Saturation Range Min field of the Light HSL Saturation Range state
+ pLightHslRangeParam[6] = 0x00; //HSL Saturation Max parameter byte 0 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+ pLightHslRangeParam[7] = 0x20; //HSL Saturation Max parameter byte 1 : The value of the Saturation Range Max field of the Light HSL Saturation Range state
+
+ pLightHslHueParam[0] = 0x00; //HSL Hue parameter byte 0 : The target value of the Light HSL Hue state
+ pLightHslHueParam[1] = 0x00; //HSL Hue parameter byte 1 : The target value of the Light HSL Hue state
+
+ pLightHslSaturationParam[0] = 0x00; //HSL Saturation parameter byte 0 : The target value of the Light HSL Saturation state
+ pLightHslSaturationParam[1] = 0x00; //HSL Saturation parameter byte 1 : The target value of the Light HSL Saturation state
+
+ //LIGHT_CONTROL_LUX_LEVEL_ON_ID : 0x202B
+ pLightLCPropertyParam[0]= 0x2B; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[1]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[2]= 0x00; // Property ID byte 0 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[3]= 0x00; // Property ID byte 1 : Property ID identifying a Light LC Property.
+ pLightLCPropertyParam[4]= 0x00; // Property ID byte 2 : Property ID identifying a Light LC Property.
+ break;
+
+ default:
+ break;
+ }
+
+
#ifdef GENERIC_CLIENT_MODEL_PUBLISH
- Appli_GenericClient_OnOff_Set();
+ /** GENERIC ONOFF **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API ONOFF SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_ON_OFF_SET_ACK, pGeneric_OnOffParam);
+
+ TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API ONOFF SET UNACK ------------- \r\n");
+ Appli_GenericClient_API(0, GENERIC_ON_OFF_SET_UNACK, pGeneric_OnOffParam);
+
+ /** GENERIC LEVEL **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API LEVEL SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_LEVEL_SET_ACK, pGeneric_LevelParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API LEVEL SET UNACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_LEVEL_SET_UNACK, pGeneric_LevelParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API DELTA LEVEL SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_DELTA_SET, pGeneric_DeltaLevelParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API DELTA LEVEL SET UNACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_DELTA_SET_UNACK, pGeneric_DeltaLevelParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API MOVE DELTA LEVEL SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_MOVE_SET, pGeneric_MoveLevelParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API MOVE DELTA LEVEL SET UNACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_MOVE_SET_UNACK, pGeneric_MoveLevelParam);
+
+ /** GENERIC POWER ONOFF **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API POWER ON OFF SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_POWER_ON_OFF_SET, pGeneric_PowerOnOffParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API POWER ON OFF SET UNACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_POWER_ON_OFF_SET_UNACK, pGeneric_PowerOnOffParam);
+
+ /** GENERIC TRANSITION TIME **/
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API DEFAULT TRANSITION TIME SET ACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_DEFAULT_TRANSITION_TIME_SET, pGeneric_DefaultTransitionTimeParam);
+//
+// TRACE_M(TF_GENERIC_CLIENT_M, "----------- Generic API DEFAULT TRANSITION TIME SET UNACK ------------- \r\n");
+// Appli_GenericClient_API(0, GENERIC_DEFAULT_TRANSITION_TIME_SET_UNACK, pGeneric_DefaultTransitionTimeParam);
+
+
+
+#if 1 /* TODO FAGOTV: Initialize Present Ambient Temparature Sensor in sensor_cfg_usr.h */
+ //PRESENT_AMBIENT_TEMPERATURE_PID : 0x004F
+ pSensorsCadenceParam[0]= 0x4F; // Property ID byte 0 : Property ID for the sensor.
+ pSensorsCadenceParam[1]= 0x00; // Property ID byte 1 : Property ID for the sensor.
+
+ pSensorsCadenceParam[2]= 0x81; // Fast Cadence Period Divisor bits 0-7: Divisor for the Publish Period.
+ // Status Trigger Type bit 8 : Defines the unit and format of the Status Trigger Delta fields.
+ pSensorsCadenceParam[3]= 0x11; // Status Trigger Delta Down byte 0 : Delta down value that triggers a status message.
+ pSensorsCadenceParam[4]= 0x11; // Status Trigger Delta Down byte 1 : Delta down value that triggers a status message.
+
+ pSensorsCadenceParam[5]= 0x22; // Status Trigger Delta Up byte 0 : Delta down value that triggers a status message.
+ pSensorsCadenceParam[6]= 0x22; // Status Trigger Delta Up byte 1 : Delta down value that triggers a status message.
+
+ pSensorsCadenceParam[7]= 0x10; // Status Min Interval byte 0 : Minimum interval between two consecutive Status messages.
+
+ pSensorsCadenceParam[8]= 0x33; // Fast Cadence Low byte 0 : Low value for the fast cadence range.
+
+ pSensorsCadenceParam[9]= 0x44; // Fast Cadence High byte 0 : High value for the fast cadence range.
+
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR CADENCE SET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_CADENCE_SET, pSensorsCadenceParam);
+
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR CADENCE SET UNACK ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_CADENCE_SET_UNACK, pSensorsCadenceParam);
+
+ /** SENSOR SETTING**/
+ /*
+ PRESENT_AMBIENT_TEMPERATURE_PID : 0x004F
+ Second Property PID : 0x00AD
+ */
+ pSensorsSettingParam[0]= 0x4F; // Property ID byte 0 : Property ID for the sensor
+ pSensorsSettingParam[1]= 0x00; // Property ID byte 1 : Property ID for the sensor
+ pSensorsSettingParam[2]= 0xAD; // Sensor Setting Property ID byte 0 : Property ID for the sensor setting
+ pSensorsSettingParam[3]= 0x00; // Sensor Setting Property ID byte 1 : Property ID for the sensor setting
+
+ switch (ButtonIndex_Value){
+ case 0:
+ pSensorsSettingParam[4]= 0x10; // Sensor Setting Property ID byte 0 : Property ID for the sensor setting
+ //pSensorsSettingParam[5]= 0x10; // Sensor Setting Property ID byte 1 : Property ID for the sensor setting
+ break;
+ case 1:
+ pSensorsSettingParam[4]= 0x20; // Sensor Setting Property ID byte 0 : Property ID for the sensor setting
+ //pSensorsSettingParam[5]= 0x20; // Sensor Setting Property ID byte 1 : Property ID for the sensor setting
+ break;
+ case 2:
+ pSensorsSettingParam[4]= 0x0F; // Sensor Setting Property ID byte 0 : Property ID for the sensor setting
+ //pSensorsSettingParam[5]= 0x00; // Sensor Setting Property ID byte 1 : Property ID for the sensor setting
+ break;
+ default:
+ break;
+ }
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR SETTING SET ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_SETTING_SET, pSensorsSettingParam);
+
+// TRACE_M(TF_SENSOR_CLIENT_M, "----------- API SENSOR SETTING SET UNACK ------------- \r\n");
+// Appli_SensorsClient_API(0, SENSOR_SETTING_SET_UNACK, pSensorsSettingParam);
+#endif
+
+#endif
+
+#ifdef LIGHT_CLIENT_MODEL_PUBLISH
+ /** LIGHT LIGHTNESS **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_SET, pLightnessParam);
+//
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_SET_UNACK, pLightnessParam);
+
+ /** LIGHT LIGHTNESS LINEAR **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS SET LINEAR ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_LINEAR_SET, pLightnessParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS SET LINEAR UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_LINEAR_SET_UNACK, pLightnessParam);
+
+ /** LIGHT LIGHTNESS DEFAULT **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS DEFAULT SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_DEFAULT_SET, pLightnessParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS DEFAULT SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_DEFAULT_SET_UNACK, pLightnessParam);
+
+ /** LIGHT LIGHTNESS RANGE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS RANGE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_RANGE_SET, pLightnessRangeParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LIGHTNESS RANGE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LIGHTNESS_RANGE_SET_UNACK, pLightnessRangeParam);
+
+ /** LIGHT LIGHTNESS CTL **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_SET, pLightCtlParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_SET_UNACK, pLightCtlParam);
+
+ /** LIGHT LIGHTNESS CTL TEMPERATURE**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_SET, pLightCtlTemperatureParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_SET_UNACK, pLightCtlTemperatureParam);
+
+ /** LIGHT LIGHTNESS CTL TEMPERATURE RANGE**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE RANGE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_RANGE_SET, pLightCtlTemperatureRangeParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL TEMPERATURE RANGE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_TEMPERATURE_RANGE_SET_UNACK, pLightCtlTemperatureRangeParam);
+
+ /** LIGHT LIGHTNESS CTL DEFAULT**/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL DEFAULT SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_DEFAULT_SET, pLightCtlDefaultParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT CTL DEFAULT SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_CTL_DEFAULT_SET_UNACK, pLightCtlDefaultParam);
+
+ /** LIGHT LIGHTNESS HSL **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_SET, pLightHslParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_SET_UNACK, pLightHslParam);
+
+ /** LIGHT LIGHTNESS HSL DEFAULT **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL DEFAULT SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_DEFAULT_SET, pLightHslParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL DEFAULT SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_DEFAULT_SET_UNACK, pLightHslParam);
+
+ /** LIGHT LIGHTNESS HSL RANGE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL RANGE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_RANGE_SET, pLightHslRangeParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL RANGE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_RANGE_SET_UNACK, pLightHslRangeParam);
+
+ /** LIGHT LIGHTNESS HSL HUE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL HUE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_HUE_SET, pLightHslHueParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL HUE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_HUE_SET_UNACK, pLightHslHueParam);
+
+ /** LIGHT LIGHTNESS HSL SATURATION **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL SATURATION SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_SATURATION_SET, pLightHslSaturationParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT HSL SATURATION SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_HSL_SATURATION_SET_UNACK, pLightHslSaturationParam);
+
+ /** LIGHT LC MODE **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC MODE SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_MODE_SET, pLightLCModeParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC MODE SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_MODE_SET_UNACK, pLightLCModeParam);
+
+ /** LIGHT LC OM **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC OM SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_OM_SET, pLightLCOccupancyModeParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC OM SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_OM_SET_UNACK, pLightLCOccupancyModeParam);
+
+ /** LIGHT LC ONOFF **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC ONOFF SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_ON_OFF_SET, pLightLCOnOffParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC ONOFF SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_ON_OFF_SET_UNACK, pLightLCOnOffParam);
+
+ /** LIGHT LC PROPERTY **/
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC PROPERTY SET ACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_PROPERTY_SET, pLightLCPropertyParam);
+
+// TRACE_M(TF_LIGHT_CLIENT_M, "----------- API LIGHT LC PROPERTY SET UNACK ------------- \r\n");
+// Appli_LightClient_API(0, LIGHT_LC_PROPERTY_SET_UNACK, pLightLCPropertyParam);
+#endif
#endif
-#ifndef CLIENT
/* if CLIENT and SERVER => Publish is already done in CLIENT */
#ifdef GENERIC_SERVER_MODEL_PUBLISH
+#ifndef GENERIC_CLIENT_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
+* @retval MOBLEUINT8 : elementNumber
*/
MOBLEUINT8 BLEMesh_ModelsGetElementNumber(MOBLE_ADDRESS dst_peer)
{
@@ -464,46 +1018,35 @@ MOBLEUINT8 BLEMesh_ModelsGetElementNumber(MOBLE_ADDRESS dst_peer)
}
/**
-* @brief Check Subscription of Elements for Group Address for selected Model
+* @brief Get the Element Index for selected Model
* @param dst_peer : Destination Address received
-* @param elementNumber : Number of element to check Subscription
-* @retval MOBLE_RESULT status of result
+* @retval MOBLEUINT8 : elementIndex
*/
-MOBLE_RESULT BLEMesh_ModelsCheckSubscription(MOBLE_ADDRESS dst_peer, \
- MOBLEUINT8 elementNumber)
+MOBLEUINT8 BLEMesh_ModelsGetElementIndex(MOBLE_ADDRESS dst_peer)
{
- 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);
+ MOBLE_ADDRESS nodeAddress;
+ MOBLEUINT8 elementIndex;
- for(uint8_t list=0; list<length; list++)
- {
- if(dst_peer == subscriptionList[list])
- {
- status = MOBLE_RESULT_SUCCESS;
- break;
- }
- }
+ nodeAddress = BLEMesh_GetAddress();
+ elementIndex =(dst_peer - nodeAddress);
- return status;
+ return elementIndex;
}
+
/**
* @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 *pmsgParam Pointer to structure of message header for parameters:
+* elementIndex, src, dst addresses, TTL, RSSI, NetKey & AppKey Offset
* @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,
+void BLEMesh_ModelsDelayPacket(MODEL_MessageHeader_t *pmsgParams,
MOBLEUINT8 command,
MOBLEUINT8 const * data,
MOBLEUINT32 length)
@@ -541,8 +1084,11 @@ void BLEMesh_ModelsDelayPacket(MOBLE_ADDRESS peer,
}
}
- Appli_PendingPackets.head->peer = peer;
- Appli_PendingPackets.head->dst = dst;
+ Appli_PendingPackets.head->peer = pmsgParams->peer_addr;
+ Appli_PendingPackets.head->dst = pmsgParams->dst_peer;
+ Appli_PendingPackets.head->elementIndex = pmsgParams->elementIndex;
+ Appli_PendingPackets.head->appKeyOffset = pmsgParams->rcvdAppKeyOffset;
+ Appli_PendingPackets.head->netKeyOffset = pmsgParams->rcvdNetKeyOffset;
Appli_PendingPackets.head->command = command;
Appli_PendingPackets.head->length = length;
for (MOBLEUINT8 count=0; count<length; count++)
@@ -558,6 +1104,7 @@ void BLEMesh_ModelsDelayPacket(MOBLE_ADDRESS peer,
void BLEMesh_ModelsSendDelayedPacket(void)
{
APPLI_SEND_RESPONSE_MODULE* ptr;
+ MODEL_MessageHeader_t msgParam;
MOBLEUINT8 temp_index;
if ((Appli_PendingPackets.packet_count != 0) &&
@@ -571,9 +1118,17 @@ void BLEMesh_ModelsSendDelayedPacket(void)
-count)%MAX_PENDING_PACKETS_QUE_SIZE;
ptr = Appli_PendingPackets.packet + temp_index;
+ /* Initialize the messageParam*/
+ msgParam.dst_peer = ptr->dst;
+ msgParam.peer_addr = ptr->peer;
+ msgParam.elementIndex = 0;
+ msgParam.rcvdAppKeyOffset = 0;
+ msgParam.rcvdNetKeyOffset = 0;
+ msgParam.rssi = 0;
+ msgParam.ttl = 0;
+
VendorModel_SendResponse(VENDOR_STMICRO_CID,
- ptr->peer,
- ptr->dst,
+ &msgParam,
ptr->command,
ptr->data,
ptr->length);
@@ -587,14 +1142,14 @@ void BLEMesh_ModelsSendDelayedPacket(void)
* 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 elementIdx element index
* @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,
+MOBLE_RESULT MeshClient_SetRemotePublication(MOBLEUINT32 modelId, MOBLEUINT8 elementIdx,
MOBLEUINT16 msg_opcode, MOBLEUINT8 const *msg_buff,
MOBLEUINT32 length, MOBLEBOOL ack_flag,
MOBLEUINT8 isVendor)
@@ -604,7 +1159,7 @@ MOBLE_RESULT MeshClient_SetRemotePublication(MOBLEUINT32 modelId, MOBLEUINT16 el
srcAddress = BLEMesh_GetAddress();
srcAddress += elementIdx; /* Get the Address to send in the message */
- return BLEMesh_SetRemotePublication(GENERIC_MODEL_SERVER_ONOFF_MODEL_ID,
+ return BLEMesh_SetRemotePublication(modelId,
srcAddress ,
msg_opcode ,
msg_buff, length,
@@ -634,4 +1189,4 @@ __weak void Test_Process(void)
* @}
*/
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 486e0bcec..f00d2d28d 100644
--- 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
@@ -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
@@ -33,18 +33,19 @@
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 BLEMesh_ModelsGetElementIndex(MOBLE_ADDRESS dst_peer);
+void BLEMesh_ModelsDelayPacket(MODEL_MessageHeader_t *pmsgParams, 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,
+MOBLE_RESULT MeshClient_SetRemotePublication(MOBLEUINT32 modelId, MOBLEUINT8 elementIdx,
MOBLEUINT16 msg_opcode, MOBLEUINT8 const *msg_buff,
MOBLEUINT32 length, MOBLEBOOL ack_flag,
MOBLEUINT8 isVendor);
#endif /* __MODELS_H */
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 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
index 60ae48e6d..12df6a87f 100644
--- 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
@@ -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
@@ -30,7 +30,7 @@
#include "hw_flash.h"
/* Private define ------------------------------------------------------------*/
-#define FLASH_SECTOR_SIZE 0x1000
+#define FLASH_SECTOR_SIZE 0x1000
/* Private variables ---------------------------------------------------------*/
@@ -168,7 +168,7 @@ MOBLE_RESULT PalNvmCompare(MOBLEUINT32 address,
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
MOBLEUINT32 i;
-
+
#ifdef ENABLE_SAVE_MODEL_STATE_NVM
// printf("MoblePalNvmCompare >>>\r\n");
@@ -272,9 +272,9 @@ MOBLE_RESULT PalNvmErase(MOBLEUINT32 address,
* @retval Result
*/
MOBLE_RESULT PalNvmWrite(MOBLEUINT32 address,
- MOBLEUINT32 offset,
- void const *buf,
- MOBLEUINT32 size)
+ MOBLEUINT32 offset,
+ void const *buf,
+ MOBLEUINT32 size)
{
MOBLE_RESULT result = MOBLE_RESULT_SUCCESS;
@@ -436,8 +436,8 @@ static MOBLE_RESULT PalNvmBackupProcess(void)
*/
MOBLE_RESULT PalNvmProcess(void)
{
- /* do nothing */
- return MOBLE_RESULT_SUCCESS;
+ /* do nothing */
+ return MOBLE_RESULT_SUCCESS;
}
-/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/sensor_cfg_usr.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/sensor_cfg_usr.h
new file mode 100644
index 000000000..e7a4df96a
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/sensor_cfg_usr.h
@@ -0,0 +1,685 @@
+/**
+******************************************************************************
+* @file sensor_cfg_usr.h
+* @author BLE Mesh Team
+* @brief sensor server initialization parameters
+******************************************************************************
+* @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 __SENSOR_USR_CFG_H
+#define __SENSOR_USR_CFG_H
+
+/**
+* Maximum count of settings that can be supported by a sensor
+* E.g., 5 sensors
+* 1st sensor has 2 settings
+* 2nd sensor has 3 settings
+* 3rd sensor has 2 settings
+* 4th sensor has 1 setting
+* 5th sensor has 2 settings
+* This value is max(2, 3, 2, 1, 2) = 3
+* value is >=1
+*/
+#define SENSOR_MAX_SETTINGS_COUNT 2
+
+/**
+* Maximum count of series column that is supported by a sensor
+* E.g., 2 sensors supporting series column
+* One sensor supports 2 columns while other sensor supports 20 columns
+* This value is max(2, 20) = 20
+* value is >=1
+*/
+#define SENSOR_MAX_SERIES_COUNT 1
+
+/**
+* Total sensors count on all elements
+* It is sum of sensors count on all elements
+* Sensor init fails in case of mismatch with sensor server initialization parameters
+*/
+#define TOTAL_SENSORS_COUNT 2
+
+/**
+* Sum of sensor settings on all sensors on all elements
+* Sensor init fails in case of mismatch with sensor server initialization parameters
+*/
+#define TOTAL_SENSOR_SETTINGS_COUNT 4
+
+/**
+* Sum of sensor series columns on all sensors on all elements
+* Sensor init fails in case of mismatch with sensor server initialization parameters
+*/
+#define TOTAL_SENSOR_SERIES_COLUMN_COUNT 0
+
+
+/**
+* This structure contains sensor setting initialization parameters
+*/
+typedef struct
+{
+ uint16_t settingPropertyId;
+ uint8_t settingAccess;
+ uint32_t settingRaw;
+}sensor_settings_init_params_t;
+
+
+/**
+* This structure contains sensor series column initialization parameters
+*/
+typedef struct
+{
+ uint32_t rawX;
+ uint32_t columnWidth;
+}sensor_series_column_init_params_t;
+
+
+/**
+* This structure contains sensor initialization parameters
+*/
+typedef struct
+{
+ uint8_t elementIdx;
+ uint16_t propertyId;
+ uint16_t positiveTolerance;
+ uint16_t negativeTolerance;
+ uint8_t samplingFunction;
+ uint8_t measurementPeriod;
+ uint8_t updateInterval;
+ uint8_t dataLength;
+ uint8_t cadenceState;
+ uint32_t valuesRange;
+ uint8_t settingsCount;
+ sensor_settings_init_params_t settings[SENSOR_MAX_SETTINGS_COUNT];
+ uint16_t seriesCount;
+ sensor_series_column_init_params_t seriesColumn[SENSOR_MAX_SERIES_COUNT];
+}sensor_init_params_t;
+
+
+/**
+* This structure contains sensor server initialization parameters
+*/
+typedef struct
+{
+ uint8_t sensorsCount;
+ sensor_init_params_t sensorInitParams[TOTAL_SENSORS_COUNT];
+} sensor_server_init_params_t;
+
+
+/**
+* Below section represents initialization parameters of sensors supported
+* Define sensors in ascending order of element index followed by ascending
+* order of Property IDs else initialization of sensor structure would fail
+* Single element can support one instance of sensor PID, there can't be multiple
+* instances of same PID on same element
+* For e.g. 10 sensors with PID (PID1 < PIDn ... < PID7) supported on 3 elements
+* with element index (0, 1 and 2) in below fashion
+* Element index 0 supports sensors corresponding to PID3, PID4, PID6 and PID7
+* Element index 1 supports sensors corresponding to PID2, PID4, PID5 and PID6
+* Element index 2 supports sensors corresponding to PID1, PID5
+* Corrector order of naming sensors (SENSORX) is
+* Element index 0 -> SENSOR1(PID3), SENSOR2(PID4), SENSOR3(PID6) and SENSOR4(PID7)
+* Element index 1 -> SENSOR5(PID2), SENSOR6(PID4), SENSOR7(PID5), and SENSOR8(PID6)
+* Element index 2 -> SENSOR9(PID1), and SENSOR10(PID5)
+*/
+
+/* Sensor 1 initialization */
+
+#define SENSOR1_ELEMENT_IDX 0
+#define SENSOR1_PROPERTY_ID PRESENT_AMBIENT_TEMPERATURE_PID
+#define SENSOR1_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR1_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR1_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR1_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR1_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR1_DATA_LENGTH 1
+#define SENSOR1_CADENCE_STATE SENSOR_CADENCE_SUPPORTED
+#define SENSOR1_VALUES_RANGE 254
+#define SENSOR1_SETTINGS_COUNT 2
+#define SENSOR1_SETTING1_PROPERTY_ID 0x00BB
+#define SENSOR1_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR1_SETTING1_RAW 0
+#define SENSOR1_SETTING2_PROPERTY_ID 0x00AD
+#define SENSOR1_SETTING2_ACCESS SENSOR_SETTING_ACCESS_READ_WRITE
+#define SENSOR1_SETTING2_RAW 0
+#define SENSOR1_SERIES_COUNT 0
+
+#define SENSOR1_SETTINGS1_INIT_PARAMS \
+{\
+ SENSOR1_SETTING1_PROPERTY_ID,\
+ SENSOR1_SETTING1_ACCESS,\
+ SENSOR1_SETTING1_RAW \
+}
+
+#define SENSOR1_SETTINGS2_INIT_PARAMS \
+{\
+ SENSOR1_SETTING2_PROPERTY_ID,\
+ SENSOR1_SETTING2_ACCESS,\
+ SENSOR1_SETTING2_RAW \
+}
+
+#define SENSOR1_INIT_PARAMS \
+{\
+ SENSOR1_ELEMENT_IDX,\
+ SENSOR1_PROPERTY_ID,\
+ SENSOR1_POSITIVE_TOLERANCE,\
+ SENSOR1_NEGATIVE_TOLERANCE,\
+ SENSOR1_SAMPLING_FUNCTION,\
+ SENSOR1_MEASUREMENT_PERIOD,\
+ SENSOR1_UPDATE_INTERVAL,\
+ SENSOR1_DATA_LENGTH,\
+ SENSOR1_CADENCE_STATE,\
+ SENSOR1_VALUES_RANGE,\
+ SENSOR1_SETTINGS_COUNT,\
+ {\
+ SENSOR1_SETTINGS1_INIT_PARAMS,\
+ SENSOR1_SETTINGS2_INIT_PARAMS\
+ },\
+ SENSOR1_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+/* Sensor 2 initialization */
+
+#define SENSOR2_ELEMENT_IDX 0
+#define SENSOR2_PROPERTY_ID PRESSURE_PID
+#define SENSOR2_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR2_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR2_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR2_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR2_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR2_DATA_LENGTH 4
+#define SENSOR2_CADENCE_STATE SENSOR_CADENCE_NOT_SUPPORTED
+#define SENSOR2_VALUES_RANGE 500
+#define SENSOR2_SETTINGS_COUNT 2
+#define SENSOR2_SETTING1_PROPERTY_ID 0x0AAA
+#define SENSOR2_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR2_SETTING1_RAW 35666
+#define SENSOR2_SETTING2_PROPERTY_ID 0x0AAC
+#define SENSOR2_SETTING2_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR2_SETTING2_RAW 33666
+#define SENSOR2_SERIES_COUNT 0
+
+#define SENSOR2_SETTINGS1_INIT_PARAMS \
+{\
+ SENSOR2_SETTING1_PROPERTY_ID,\
+ SENSOR2_SETTING1_ACCESS,\
+ SENSOR2_SETTING1_RAW\
+}
+
+#define SENSOR2_SETTINGS2_INIT_PARAMS \
+{\
+ SENSOR2_SETTING2_PROPERTY_ID,\
+ SENSOR2_SETTING2_ACCESS,\
+ SENSOR2_SETTING2_RAW\
+}
+
+#define SENSOR2_INIT_PARAMS \
+{\
+ SENSOR2_ELEMENT_IDX,\
+ SENSOR2_PROPERTY_ID,\
+ SENSOR2_POSITIVE_TOLERANCE,\
+ SENSOR2_NEGATIVE_TOLERANCE,\
+ SENSOR2_SAMPLING_FUNCTION,\
+ SENSOR2_MEASUREMENT_PERIOD,\
+ SENSOR2_UPDATE_INTERVAL,\
+ SENSOR2_DATA_LENGTH,\
+ SENSOR2_CADENCE_STATE,\
+ SENSOR2_VALUES_RANGE,\
+ SENSOR2_SETTINGS_COUNT,\
+ {\
+ SENSOR2_SETTINGS1_INIT_PARAMS,\
+ SENSOR2_SETTINGS2_INIT_PARAMS\
+ },\
+ SENSOR2_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+/**
+* Combined defined of all sensors intialization parameters
+*/
+
+#define SENSOR_SERVER_INIT_PARAMS \
+{\
+ TOTAL_SENSORS_COUNT,\
+ {\
+ SENSOR1_INIT_PARAMS,\
+ SENSOR2_INIT_PARAMS,\
+ }\
+}
+#endif /* __SENSOR_USR_CFG_H */
+
+/*
+
+Example for multiple sensors with series column support
+
+#define SENSOR_MAX_SETTINGS_COUNT 3
+#define SENSOR_MAX_SERIES_COUNT 20
+#define TOTAL_SENSORS_COUNT 5
+#define TOTAL_SENSOR_SETTINGS_COUNT 9
+#define TOTAL_SENSOR_SERIES_COLUMN_COUNT 22
+
+#define SENSOR1_ELEMENT_IDX 0
+#define SENSOR1_PROPERTY_ID PEOPLE_COUNT_PID
+#define SENSOR1_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR1_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR1_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR1_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR1_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR1_DATA_LENGTH 2
+#define SENSOR1_CADENCE_STATE SENSOR_CADENCE_SUPPORTED
+#define SENSOR1_VALUES_RANGE 1000
+#define SENSOR1_SETTINGS_COUNT 3
+#define SENSOR1_SETTING1_PROPERTY_ID 0x000A
+#define SENSOR1_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR1_SETTING1_RAW 234
+#define SENSOR1_SETTING2_PROPERTY_ID 0x000C
+#define SENSOR1_SETTING2_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR1_SETTING2_RAW 246
+#define SENSOR1_SETTING3_PROPERTY_ID 0x0010
+#define SENSOR1_SETTING3_ACCESS SENSOR_SETTING_ACCESS_READ_WRITE
+#define SENSOR1_SETTING3_RAW 278
+#define SENSOR1_SERIES_COUNT 0
+
+#define SENSOR1_SETTINGS1_INIT_PARAMS \
+{\
+ SENSOR1_SETTING1_PROPERTY_ID,\
+ SENSOR1_SETTING1_ACCESS,\
+ SENSOR1_SETTING1_RAW\
+}
+
+#define SENSOR1_SETTINGS2_INIT_PARAMS \
+{\
+ SENSOR1_SETTING2_PROPERTY_ID,\
+ SENSOR1_SETTING2_ACCESS,\
+ SENSOR1_SETTING2_RAW\
+}
+
+#define SENSOR1_SETTINGS3_INIT_PARAMS \
+{\
+ SENSOR1_SETTING3_PROPERTY_ID,\
+ SENSOR1_SETTING3_ACCESS,\
+ SENSOR1_SETTING3_RAW\
+}
+
+#define SENSOR1_INIT_PARAMS \
+{\
+ SENSOR1_ELEMENT_IDX,\
+ SENSOR1_PROPERTY_ID,\
+ SENSOR1_POSITIVE_TOLERANCE,\
+ SENSOR1_NEGATIVE_TOLERANCE,\
+ SENSOR1_SAMPLING_FUNCTION,\
+ SENSOR1_MEASUREMENT_PERIOD,\
+ SENSOR1_UPDATE_INTERVAL,\
+ SENSOR1_DATA_LENGTH,\
+ SENSOR1_CADENCE_STATE,\
+ SENSOR1_VALUES_RANGE,\
+ SENSOR1_SETTINGS_COUNT,\
+ {\
+ SENSOR1_SETTINGS1_INIT_PARAMS,\
+ SENSOR1_SETTINGS2_INIT_PARAMS,\
+ SENSOR1_SETTINGS3_INIT_PARAMS\
+ },\
+ SENSOR1_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+#define SENSOR2_ELEMENT_IDX 0
+#define SENSOR2_PROPERTY_ID DESIRED_AMBIENT_TEMPERATURE_PID
+#define SENSOR2_POSITIVE_TOLERANCE 0xabc
+#define SENSOR2_NEGATIVE_TOLERANCE 0xdef
+#define SENSOR2_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_RMS
+#define SENSOR2_MEASUREMENT_PERIOD 0x04
+#define SENSOR2_UPDATE_INTERVAL 0x05
+#define SENSOR2_DATA_LENGTH 1
+#define SENSOR2_CADENCE_STATE SENSOR_CADENCE_SUPPORTED
+#define SENSOR2_VALUES_RANGE 100
+#define SENSOR2_SETTINGS_COUNT 2
+#define SENSOR2_SETTING1_PROPERTY_ID 0x00BB
+#define SENSOR2_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR2_SETTING1_RAW 345
+#define SENSOR2_SETTING2_PROPERTY_ID 0x00AD
+#define SENSOR2_SETTING2_ACCESS SENSOR_SETTING_ACCESS_READ_WRITE
+#define SENSOR2_SETTING2_RAW 435
+#define SENSOR2_SERIES_COUNT 0
+
+#define SENSOR2_SETTINGS1_INIT_PARAMS \
+{\
+ SENSOR2_SETTING1_PROPERTY_ID,\
+ SENSOR2_SETTING1_ACCESS,\
+ SENSOR2_SETTING1_RAW\
+}
+
+#define SENSOR2_SETTINGS2_INIT_PARAMS \
+{\
+ SENSOR2_SETTING2_PROPERTY_ID,\
+ SENSOR2_SETTING2_ACCESS,\
+ SENSOR2_SETTING2_RAW \
+}
+
+#define SENSOR2_INIT_PARAMS \
+{\
+ SENSOR2_ELEMENT_IDX,\
+ SENSOR2_PROPERTY_ID,\
+ SENSOR2_POSITIVE_TOLERANCE,\
+ SENSOR2_NEGATIVE_TOLERANCE,\
+ SENSOR2_SAMPLING_FUNCTION,\
+ SENSOR2_MEASUREMENT_PERIOD,\
+ SENSOR2_UPDATE_INTERVAL,\
+ SENSOR2_DATA_LENGTH,\
+ SENSOR2_CADENCE_STATE,\
+ SENSOR2_VALUES_RANGE,\
+ SENSOR2_SETTINGS_COUNT,\
+ {\
+ SENSOR2_SETTINGS1_INIT_PARAMS,\
+ SENSOR2_SETTINGS2_INIT_PARAMS\
+ },\
+ SENSOR2_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+#define SENSOR3_ELEMENT_IDX 0
+#define SENSOR3_PROPERTY_ID PRESSURE_PID
+#define SENSOR3_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR3_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR3_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR3_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR3_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR3_DATA_LENGTH 2
+#define SENSOR3_CADENCE_STATE SENSOR_CADENCE_NOT_SUPPORTED
+#define SENSOR3_VALUES_RANGE 500
+#define SENSOR3_SETTINGS_COUNT 2
+#define SENSOR3_SETTING1_PROPERTY_ID 0x0AAA
+#define SENSOR3_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR3_SETTING1_RAW 35666
+#define SENSOR3_SETTING2_PROPERTY_ID 0x0AAC
+#define SENSOR3_SETTING2_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR3_SETTING2_RAW 33666
+#define SENSOR3_SERIES_COUNT 20
+#define SENSOR3_SERIES1_RAWX 0
+#define SENSOR3_SERIES1_CW 10
+#define SENSOR3_SERIES2_RAWX 23
+#define SENSOR3_SERIES2_CW 10
+#define SENSOR3_SERIES3_RAWX 34
+#define SENSOR3_SERIES3_CW 10
+#define SENSOR3_SERIES4_RAWX 35
+#define SENSOR3_SERIES4_CW 10
+#define SENSOR3_SERIES5_RAWX 36
+#define SENSOR3_SERIES5_CW 10
+#define SENSOR3_SERIES6_RAWX 40
+#define SENSOR3_SERIES6_CW 10
+#define SENSOR3_SERIES7_RAWX 41
+#define SENSOR3_SERIES7_CW 10
+#define SENSOR3_SERIES8_RAWX 42
+#define SENSOR3_SERIES8_CW 10
+#define SENSOR3_SERIES9_RAWX 43
+#define SENSOR3_SERIES9_CW 10
+#define SENSOR3_SERIES10_RAWX 45
+#define SENSOR3_SERIES10_CW 10
+#define SENSOR3_SERIES11_RAWX 46
+#define SENSOR3_SERIES11_CW 10
+#define SENSOR3_SERIES12_RAWX 47
+#define SENSOR3_SERIES12_CW 10
+#define SENSOR3_SERIES13_RAWX 48
+#define SENSOR3_SERIES13_CW 10
+#define SENSOR3_SERIES14_RAWX 49
+#define SENSOR3_SERIES14_CW 10
+#define SENSOR3_SERIES15_RAWX 50
+#define SENSOR3_SERIES15_CW 10
+#define SENSOR3_SERIES16_RAWX 51
+#define SENSOR3_SERIES16_CW 10
+#define SENSOR3_SERIES17_RAWX 52
+#define SENSOR3_SERIES17_CW 10
+#define SENSOR3_SERIES18_RAWX 53
+#define SENSOR3_SERIES18_CW 10
+#define SENSOR3_SERIES19_RAWX 55
+#define SENSOR3_SERIES19_CW 10
+#define SENSOR3_SERIES20_RAWX 89
+#define SENSOR3_SERIES20_CW 10
+
+#define SENSOR3_SETTINGS1_INIT_PARAMS \
+{\
+ SENSOR3_SETTING1_PROPERTY_ID,\
+ SENSOR3_SETTING1_ACCESS,\
+ SENSOR3_SETTING1_RAW\
+}
+
+#define SENSOR3_SETTINGS2_INIT_PARAMS \
+{\
+ SENSOR3_SETTING2_PROPERTY_ID,\
+ SENSOR3_SETTING2_ACCESS,\
+ SENSOR3_SETTING2_RAW\
+}
+
+#define SENSOR3_COLUMN1_INIT_PARAMS {SENSOR3_SERIES1_RAWX,SENSOR3_SERIES1_CW}
+#define SENSOR3_COLUMN2_INIT_PARAMS {SENSOR3_SERIES2_RAWX,SENSOR3_SERIES2_CW}
+#define SENSOR3_COLUMN3_INIT_PARAMS {SENSOR3_SERIES3_RAWX,SENSOR3_SERIES3_CW}
+#define SENSOR3_COLUMN4_INIT_PARAMS {SENSOR3_SERIES4_RAWX,SENSOR3_SERIES4_CW}
+#define SENSOR3_COLUMN5_INIT_PARAMS {SENSOR3_SERIES5_RAWX,SENSOR3_SERIES5_CW}
+#define SENSOR3_COLUMN6_INIT_PARAMS {SENSOR3_SERIES6_RAWX,SENSOR3_SERIES6_CW}
+#define SENSOR3_COLUMN7_INIT_PARAMS {SENSOR3_SERIES7_RAWX,SENSOR3_SERIES7_CW}
+#define SENSOR3_COLUMN8_INIT_PARAMS {SENSOR3_SERIES8_RAWX,SENSOR3_SERIES8_CW}
+#define SENSOR3_COLUMN9_INIT_PARAMS {SENSOR3_SERIES9_RAWX,SENSOR3_SERIES9_CW}
+#define SENSOR3_COLUMN10_INIT_PARAMS {SENSOR3_SERIES10_RAWX,SENSOR3_SERIES10_CW}
+#define SENSOR3_COLUMN11_INIT_PARAMS {SENSOR3_SERIES11_RAWX,SENSOR3_SERIES11_CW}
+#define SENSOR3_COLUMN12_INIT_PARAMS {SENSOR3_SERIES12_RAWX,SENSOR3_SERIES12_CW}
+#define SENSOR3_COLUMN13_INIT_PARAMS {SENSOR3_SERIES13_RAWX,SENSOR3_SERIES13_CW}
+#define SENSOR3_COLUMN14_INIT_PARAMS {SENSOR3_SERIES14_RAWX,SENSOR3_SERIES14_CW}
+#define SENSOR3_COLUMN15_INIT_PARAMS {SENSOR3_SERIES15_RAWX,SENSOR3_SERIES15_CW}
+#define SENSOR3_COLUMN16_INIT_PARAMS {SENSOR3_SERIES16_RAWX,SENSOR3_SERIES16_CW}
+#define SENSOR3_COLUMN17_INIT_PARAMS {SENSOR3_SERIES17_RAWX,SENSOR3_SERIES17_CW}
+#define SENSOR3_COLUMN18_INIT_PARAMS {SENSOR3_SERIES18_RAWX,SENSOR3_SERIES18_CW}
+#define SENSOR3_COLUMN19_INIT_PARAMS {SENSOR3_SERIES19_RAWX,SENSOR3_SERIES19_CW}
+#define SENSOR3_COLUMN20_INIT_PARAMS {SENSOR3_SERIES20_RAWX,SENSOR3_SERIES20_CW}
+
+#define SENSOR3_INIT_PARAMS \
+{\
+ SENSOR3_ELEMENT_IDX,\
+ SENSOR3_PROPERTY_ID,\
+ SENSOR3_POSITIVE_TOLERANCE,\
+ SENSOR3_NEGATIVE_TOLERANCE,\
+ SENSOR3_SAMPLING_FUNCTION,\
+ SENSOR3_MEASUREMENT_PERIOD,\
+ SENSOR3_UPDATE_INTERVAL,\
+ SENSOR3_DATA_LENGTH,\
+ SENSOR3_CADENCE_STATE,\
+ SENSOR3_VALUES_RANGE,\
+ SENSOR3_SETTINGS_COUNT,\
+ {\
+ SENSOR3_SETTINGS1_INIT_PARAMS,\
+ SENSOR3_SETTINGS2_INIT_PARAMS\
+ },\
+ SENSOR3_SERIES_COUNT,\
+ {\
+ SENSOR3_COLUMN1_INIT_PARAMS,\
+ SENSOR3_COLUMN2_INIT_PARAMS,\
+ SENSOR3_COLUMN3_INIT_PARAMS,\
+ SENSOR3_COLUMN4_INIT_PARAMS,\
+ SENSOR3_COLUMN5_INIT_PARAMS,\
+ SENSOR3_COLUMN6_INIT_PARAMS,\
+ SENSOR3_COLUMN7_INIT_PARAMS,\
+ SENSOR3_COLUMN8_INIT_PARAMS,\
+ SENSOR3_COLUMN9_INIT_PARAMS,\
+ SENSOR3_COLUMN10_INIT_PARAMS,\
+ SENSOR3_COLUMN11_INIT_PARAMS,\
+ SENSOR3_COLUMN12_INIT_PARAMS,\
+ SENSOR3_COLUMN13_INIT_PARAMS,\
+ SENSOR3_COLUMN14_INIT_PARAMS,\
+ SENSOR3_COLUMN15_INIT_PARAMS,\
+ SENSOR3_COLUMN16_INIT_PARAMS,\
+ SENSOR3_COLUMN17_INIT_PARAMS,\
+ SENSOR3_COLUMN18_INIT_PARAMS,\
+ SENSOR3_COLUMN19_INIT_PARAMS,\
+ SENSOR3_COLUMN20_INIT_PARAMS}\
+}
+
+#define SENSOR4_ELEMENT_IDX 0
+#define SENSOR4_PROPERTY_ID HUMIDITY_PID
+#define SENSOR4_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR4_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR4_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR4_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR4_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR4_DATA_LENGTH 2
+#define SENSOR4_CADENCE_STATE SENSOR_CADENCE_SUPPORTED
+#define SENSOR4_VALUES_RANGE 200
+#define SENSOR4_SETTINGS_COUNT 1
+#define SENSOR4_SETTING1_PROPERTY_ID 0xAAAA
+#define SENSOR4_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ_WRITE
+#define SENSOR4_SETTING1_RAW 35666
+#define SENSOR4_SERIES_COUNT 0
+
+#define SENSOR4_SETTINGS_INIT_PARAMS \
+{\
+ SENSOR4_SETTING1_PROPERTY_ID,\
+ SENSOR4_SETTING1_ACCESS,\
+ SENSOR4_SETTING1_RAW\
+}
+
+#define SENSOR4_INIT_PARAMS \
+{\
+ SENSOR4_ELEMENT_IDX,\
+ SENSOR4_PROPERTY_ID,\
+ SENSOR4_POSITIVE_TOLERANCE,\
+ SENSOR4_NEGATIVE_TOLERANCE,\
+ SENSOR4_SAMPLING_FUNCTION,\
+ SENSOR4_MEASUREMENT_PERIOD,\
+ SENSOR4_UPDATE_INTERVAL,\
+ SENSOR4_DATA_LENGTH,\
+ SENSOR4_CADENCE_STATE,\
+ SENSOR4_VALUES_RANGE,\
+ SENSOR4_SETTINGS_COUNT,\
+ {\
+ SENSOR4_SETTINGS_INIT_PARAMS\
+ },\
+ SENSOR4_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+#define SENSOR5_ELEMENT_IDX 0
+#define SENSOR5_PROPERTY_ID TIME_OF_FLIGHT_PID
+#define SENSOR5_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR5_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR5_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR5_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR5_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR5_DATA_LENGTH 2
+#define SENSOR5_CADENCE_STATE SENSOR_CADENCE_NOT_SUPPORTED
+#define SENSOR5_VALUES_RANGE 0
+#define SENSOR5_SETTINGS_COUNT 1
+#define SENSOR5_SETTING1_PROPERTY_ID 0xAAFA
+#define SENSOR5_SETTING1_ACCESS SENSOR_SETTING_ACCESS_READ
+#define SENSOR5_SETTING1_RAW 35666
+#define SENSOR5_SERIES_COUNT 2
+#define SENSOR5_SERIES1_RAWX 20
+#define SENSOR5_SERIES1_CW 30
+#define SENSOR5_SERIES2_RAWX 50
+#define SENSOR5_SERIES2_CW 40
+
+#define SENSOR5_SETTINGS_INIT_PARAMS \
+{\
+ SENSOR5_SETTING1_PROPERTY_ID,\
+ SENSOR5_SETTING1_ACCESS,\
+ SENSOR5_SETTING1_RAW\
+}
+
+#define SENSOR5_COLUMN1_INIT_PARAMS {SENSOR5_SERIES1_RAWX,SENSOR5_SERIES1_CW}
+#define SENSOR5_COLUMN2_INIT_PARAMS {SENSOR5_SERIES2_RAWX,SENSOR5_SERIES2_CW}
+
+#define SENSOR5_INIT_PARAMS \
+{\
+ SENSOR5_ELEMENT_IDX,\
+ SENSOR5_PROPERTY_ID,\
+ SENSOR5_POSITIVE_TOLERANCE,\
+ SENSOR5_NEGATIVE_TOLERANCE,\
+ SENSOR5_SAMPLING_FUNCTION,\
+ SENSOR5_MEASUREMENT_PERIOD,\
+ SENSOR5_UPDATE_INTERVAL,\
+ SENSOR5_DATA_LENGTH,\
+ SENSOR5_CADENCE_STATE,\
+ SENSOR5_VALUES_RANGE,\
+ SENSOR5_SETTINGS_COUNT,\
+ {\
+ SENSOR5_SETTINGS_INIT_PARAMS\
+ },\
+ SENSOR5_SERIES_COUNT,\
+ {\
+ SENSOR5_COLUMN1_INIT_PARAMS,\
+ SENSOR5_COLUMN2_INIT_PARAMS\
+ }\
+}
+
+#define SENSOR6_ELEMENT_IDX 0
+#define SENSOR6_PROPERTY_ID PRESENCE_PID
+#define SENSOR6_POSITIVE_TOLERANCE SENSOR_POSITIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR6_NEGATIVE_TOLERANCE SENSOR_NEGATIVE_TOLERANCE_UNSPECIFIED
+#define SENSOR6_SAMPLING_FUNCTION SENSOR_SAMPLING_FUNC_UNSPECIFIED
+#define SENSOR6_MEASUREMENT_PERIOD SENSOR_MEASUREMENT_PERIOD_NA
+#define SENSOR6_UPDATE_INTERVAL SENSOR_UPDATE_INTERVAL_NA
+#define SENSOR6_DATA_LENGTH 1
+#define SENSOR6_CADENCE_STATE SENSOR_CADENCE_NOT_SUPPORTED
+#define SENSOR6_VALUES_RANGE 0
+#define SENSOR6_SETTINGS_COUNT 0
+#define SENSOR6_SERIES_COUNT 0
+
+#define SENSOR6_SETTINGS_INIT_PARAMS \
+{\
+ {\
+ {0}\
+ }\
+}
+
+#define SENSOR6_INIT_PARAMS \
+{\
+ SENSOR6_ELEMENT_IDX,\
+ SENSOR6_PROPERTY_ID,\
+ SENSOR6_POSITIVE_TOLERANCE,\
+ SENSOR6_NEGATIVE_TOLERANCE,\
+ SENSOR6_SAMPLING_FUNCTION,\
+ SENSOR6_MEASUREMENT_PERIOD,\
+ SENSOR6_UPDATE_INTERVAL,\
+ SENSOR6_DATA_LENGTH,\
+ SENSOR6_CADENCE_STATE,\
+ SENSOR6_VALUES_RANGE,\
+ SENSOR6_SETTINGS_COUNT,\
+ {\
+ {0}\
+ },\
+ SENSOR6_SERIES_COUNT,\
+ {\
+ {0}\
+ }\
+}
+
+#define SENSOR_SERVER_INIT_PARAMS \
+{\
+ TOTAL_SENSORS_COUNT,\
+ {\
+ SENSOR1_INIT_PARAMS,\
+ SENSOR2_INIT_PARAMS,\
+ SENSOR3_INIT_PARAMS,\
+ SENSOR4_INIT_PARAMS,\
+ SENSOR5_INIT_PARAMS\
+ }\
+}
+*/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/tl_dbg_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/tl_dbg_conf.h
new file mode 100644
index 000000000..b468b2863
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/tl_dbg_conf.h
@@ -0,0 +1,126 @@
+/**
+ ******************************************************************************
+ * File Name : tl_dbg_conf.h
+ * Description : Debug configuration file for stm32wpan transport layer 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
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __TL_DBG_CONF_H
+#define __TL_DBG_CONF_H
+
+/* USER CODE BEGIN Tl_Conf */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_conf.h" /* required as some configuration used in dbg_trace.h are set there */
+#include "dbg_trace.h"
+#include "hw_if.h"
+
+/**
+ * Enable or Disable traces
+ * The raw data output is the hci binary packet format as specified by the BT specification *
+ */
+#define TL_SHCI_CMD_DBG_EN 0 /* Reports System commands sent to CPU2 and the command response */
+#define TL_SHCI_CMD_DBG_RAW_EN 0 /* Reports raw data System commands sent to CPU2 and the command response */
+#define TL_SHCI_EVT_DBG_EN 0 /* Reports System Asynchronous Events received from CPU2 */
+#define TL_SHCI_EVT_DBG_RAW_EN 0 /* Reports raw data System Asynchronous Events received from CPU2 */
+
+#define TL_HCI_CMD_DBG_EN 0 /* Reports BLE command sent to CPU2 and the command response */
+#define TL_HCI_CMD_DBG_RAW_EN 0 /* Reports raw data BLE command sent to CPU2 and the command response */
+#define TL_HCI_EVT_DBG_EN 0 /* Reports BLE Asynchronous Events received from CPU2 */
+#define TL_HCI_EVT_DBG_RAW_EN 0 /* Reports raw data BLE Asynchronous Events received from CPU2 */
+
+#define TL_MM_DBG_EN 0 /* Reports the informations of the buffer released to CPU2 */
+
+/**
+ * Macro definition
+ */
+
+/**
+ * System Transport Layer
+ */
+#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_CMD_DBG_RAW_EN != 0)
+#define TL_SHCI_CMD_DBG_RAW(_PDATA_, _SIZE_) HW_UART_Transmit(hw_uart1, (uint8_t*)_PDATA_, _SIZE_, (~0))
+#else
+#define TL_SHCI_CMD_DBG_RAW(...)
+#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
+
+#if (TL_SHCI_EVT_DBG_RAW_EN != 0)
+#define TL_SHCI_EVT_DBG_RAW(_PDATA_, _SIZE_) HW_UART_Transmit(hw_uart1, (uint8_t*)_PDATA_, _SIZE_, (~0))
+#else
+#define TL_SHCI_EVT_DBG_RAW(...)
+#endif
+
+/**
+ * BLE Transport Layer
+ */
+#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_CMD_DBG_RAW_EN != 0)
+#define TL_HCI_CMD_DBG_RAW(_PDATA_, _SIZE_) HW_UART_Transmit(hw_uart1, (uint8_t*)_PDATA_, _SIZE_, (~0))
+#else
+#define TL_HCI_CMD_DBG_RAW(...)
+#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
+
+#if (TL_HCI_EVT_DBG_RAW_EN != 0)
+#define TL_HCI_EVT_DBG_RAW(_PDATA_, _SIZE_) HW_UART_Transmit(hw_uart1, (uint8_t*)_PDATA_, _SIZE_, (~0))
+#else
+#define TL_HCI_EVT_DBG_RAW(...)
+#endif
+
+/**
+ * Memory Manager - Released buffer tracing
+ */
+#if (TL_MM_DBG_EN != 0)
+#define TL_MM_DBG_MSG PRINT_MESG_DBG
+#else
+#define TL_MM_DBG_MSG(...)
+#endif
+
+/* USER CODE END Tl_Conf */
+
+#endif /*__TL_DBG_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
index a58b95cad..e7049681d 100644
--- 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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_TransparentModeVCP/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_TransparentModeVCP/Core/Inc/app_common.h
index 9dbfbba05..7e66ee35a 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_TransparentModeVCP/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_TransparentModeVCP/Core/Inc/app_common.h
@@ -67,9 +67,13 @@ extern "C"
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_TransparentModeVCP/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_TransparentModeVCP/Core/Inc/app_conf.h
index a1c460c05..873e544af 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_TransparentModeVCP/Core/Inc/app_conf.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_TransparentModeVCP/Core/Inc/app_conf.h
@@ -75,7 +75,7 @@
* Maximum number of simultaneous connections that the device will support.
* Valid values are from 1 to 8
*/
-#define CFG_BLE_NUM_LINK 8
+#define CFG_BLE_NUM_LINK 2
/**
* Maximum number of Services that can be stored in the GATT database.
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_TransparentModeVCP/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_TransparentModeVCP/Core/Inc/hw_conf.h
index 45a76a173..1cac11889 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_TransparentModeVCP/Core/Inc/hw_conf.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_TransparentModeVCP/Core/Inc/hw_conf.h
@@ -1,36 +1,39 @@
+/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file hw_conf.h
* @author MCD Application Team
* @brief Configuration of hardware interface
- ******************************************************************************
- * @attention
- *
+ ******************************************************************************
+ * @attention
+ *
* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under Ultimate Liberty license
- * SLA0044, the "License"; You may not use this file except in compliance with
- * the License. You may obtain a copy of the License at:
- * www.st.com/SLA0044
- *
- ******************************************************************************
- */
-
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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
+#ifndef HW_CONF_H
+#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
* 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.
+* Once the Semaphore has been released, there shall be at least 1us before it can be taken again. This is required
+* to give the opportunity to CPU2 to take it.
* 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()
@@ -69,7 +72,6 @@
/* Index of the semaphore used to access the RNG */
#define CFG_HW_RNG_SEMID 0
-
/******************************************************************************
* HW TIMER SERVER
*****************************************************************************/
@@ -84,7 +86,7 @@
* wakeup timer.
* This setting is the preemptpriority part of the NVIC.
*/
-#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+#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
@@ -92,7 +94,7 @@
* 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 CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
/**
* Define a critical section in the Timer server
@@ -108,32 +110,32 @@
* 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
+#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
- */
+ * 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_LPUART1_ENABLED 0
+#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 0
#define CFG_HW_USART1_ENABLED 0
#define CFG_HW_USART1_DMA_TX_SUPPORTED 0
@@ -242,6 +244,6 @@
#define CFG_HW_USART1_TX_DMA_IRQn DMA2_Channel4_IRQn
#define CFG_HW_USART1_DMA_TX_IRQHandler DMA2_Channel4_IRQHandler
-#endif /*__HW_CONF_H */
+#endif /*HW_CONF_H */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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 a58b95cad..e7049681d 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/Core/Inc/app_common.h
index 9dbfbba05..7e66ee35a 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/Core/Inc/app_common.h
@@ -67,9 +67,13 @@ extern "C"
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/Core/Inc/app_conf.h
index 9fb081aa7..e5f21138e 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/Core/Inc/app_conf.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/Core/Inc/app_conf.h
@@ -47,7 +47,7 @@
*/
#define CFG_BONDING_MODE (1)
#define CFG_FIXED_PIN (111111)
-#define CFG_USED_FIXED_PIN (0)
+#define CFG_USED_FIXED_PIN (1)
#define CFG_ENCRYPTION_KEY_SIZE_MAX (16)
#define CFG_ENCRYPTION_KEY_SIZE_MIN (8)
@@ -71,6 +71,29 @@
#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_NOT_SUPPORTED
+
+/**
+ * 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)
+
+/**
* 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}
@@ -119,7 +142,7 @@
* Maximum number of simultaneous connections that the device will support.
* Valid values are from 1 to 8
*/
-#define CFG_BLE_NUM_LINK 8
+#define CFG_BLE_NUM_LINK 2
/**
* Maximum number of Services that can be stored in the GATT database.
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/Core/Inc/hw_conf.h
index 45a76a173..1cac11889 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/Core/Inc/hw_conf.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/Core/Inc/hw_conf.h
@@ -1,36 +1,39 @@
+/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file hw_conf.h
* @author MCD Application Team
* @brief Configuration of hardware interface
- ******************************************************************************
- * @attention
- *
+ ******************************************************************************
+ * @attention
+ *
* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under Ultimate Liberty license
- * SLA0044, the "License"; You may not use this file except in compliance with
- * the License. You may obtain a copy of the License at:
- * www.st.com/SLA0044
- *
- ******************************************************************************
- */
-
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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
+#ifndef HW_CONF_H
+#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
* 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.
+* Once the Semaphore has been released, there shall be at least 1us before it can be taken again. This is required
+* to give the opportunity to CPU2 to take it.
* 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()
@@ -69,7 +72,6 @@
/* Index of the semaphore used to access the RNG */
#define CFG_HW_RNG_SEMID 0
-
/******************************************************************************
* HW TIMER SERVER
*****************************************************************************/
@@ -84,7 +86,7 @@
* wakeup timer.
* This setting is the preemptpriority part of the NVIC.
*/
-#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+#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
@@ -92,7 +94,7 @@
* 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 CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
/**
* Define a critical section in the Timer server
@@ -108,32 +110,32 @@
* 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
+#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
- */
+ * 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_LPUART1_ENABLED 0
+#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 0
#define CFG_HW_USART1_ENABLED 0
#define CFG_HW_USART1_DMA_TX_SUPPORTED 0
@@ -242,6 +244,6 @@
#define CFG_HW_USART1_TX_DMA_IRQn DMA2_Channel4_IRQn
#define CFG_HW_USART1_DMA_TX_IRQHandler DMA2_Channel4_IRQHandler
-#endif /*__HW_CONF_H */
+#endif /*HW_CONF_H */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/Core/Inc/main.h
index bbe71a4da..d104dcb7e 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/Core/Inc/main.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/Core/Inc/main.h
@@ -32,6 +32,7 @@ extern RTC_HandleTypeDef hrtc; /**< RTC handler declaration */
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
+void Error_Handler(void);
#endif /* __MAIN_H */
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/Core/Src/app_entry.c
index 2b19faaba..ccc0d9013 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/Core/Src/app_entry.c
@@ -189,7 +189,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/Core/Src/main.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/Core/Src/main.c
index 1754a019a..89063b077 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/Core/Src/main.c
@@ -38,6 +38,8 @@
/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
#include "app_common.h"
#include "app_entry.h"
@@ -317,4 +319,12 @@ void HAL_Delay(uint32_t Delay)
}
}
+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 */
+}
+
/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/STM32_WPAN/App/app_ble.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/STM32_WPAN/App/app_ble.c
index 627536103..284a5c66f 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/STM32_WPAN/App/app_ble.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/STM32_WPAN/App/app_ble.c
@@ -19,6 +19,8 @@
/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
#include "app_common.h"
#include "dbg_trace.h"
@@ -58,18 +60,6 @@ uint8_t mitm_mode;
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
@@ -279,7 +269,10 @@ void APP_BLE_Init( void )
/**
* Starts the BLE Stack on CPU2
*/
- SHCI_C2_BLE_Init( &ble_init_cmd_packet );
+ if (SHCI_C2_BLE_Init( &ble_init_cmd_packet ) != SHCI_Success)
+ {
+ Error_Handler();
+ }
/**
* Initialization of HCI & GATT & GAP layer
@@ -596,7 +589,6 @@ static void Ble_Tl_Init( void )
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];
@@ -696,26 +688,21 @@ static void Ble_Hci_Gap_Gatt_Init(void){
* 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;
- }
+ 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;
aci_gap_set_authentication_requirement(BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode,
BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode,
- 0,
- 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
);
/**
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 a58b95cad..e7049681d 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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/readme.txt b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/readme.txt
index da1cce3f4..b513f397e 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/readme.txt
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pClient/readme.txt
@@ -20,7 +20,7 @@
@par Application Description
-This example is to demonstrate Point-to-Point communication using BLE component.
+How to demonstrate Point-to-Point communication using BLE component (as GATT client).
Two STM32WB55xx boards are used, one acting as GATT client, and one as GATT server.
For example, BLE_p2pClient application is downloaded in a USB DONGLE board (MB1293C) and BLE P2P_Server application in a Nucleo board (MB1355C).
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Inc/app_common.h
index 9dbfbba05..7e66ee35a 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Inc/app_common.h
@@ -67,9 +67,13 @@ extern "C"
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Inc/app_conf.h
index a43145e78..f1643a85e 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Inc/app_conf.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Inc/app_conf.h
@@ -49,7 +49,7 @@
*/
#define CFG_BONDING_MODE (1)
#define CFG_FIXED_PIN (111111)
-#define CFG_USED_FIXED_PIN (0)
+#define CFG_USED_FIXED_PIN (1)
#define CFG_ENCRYPTION_KEY_SIZE_MAX (16)
#define CFG_ENCRYPTION_KEY_SIZE_MIN (8)
@@ -73,6 +73,29 @@
#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_NOT_SUPPORTED
+
+/**
+ * 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)
+
+/**
* 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}
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Inc/hw_conf.h
index 45a76a173..1cac11889 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Inc/hw_conf.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Inc/hw_conf.h
@@ -1,36 +1,39 @@
+/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file hw_conf.h
* @author MCD Application Team
* @brief Configuration of hardware interface
- ******************************************************************************
- * @attention
- *
+ ******************************************************************************
+ * @attention
+ *
* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under Ultimate Liberty license
- * SLA0044, the "License"; You may not use this file except in compliance with
- * the License. You may obtain a copy of the License at:
- * www.st.com/SLA0044
- *
- ******************************************************************************
- */
-
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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
+#ifndef HW_CONF_H
+#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
* 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.
+* Once the Semaphore has been released, there shall be at least 1us before it can be taken again. This is required
+* to give the opportunity to CPU2 to take it.
* 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()
@@ -69,7 +72,6 @@
/* Index of the semaphore used to access the RNG */
#define CFG_HW_RNG_SEMID 0
-
/******************************************************************************
* HW TIMER SERVER
*****************************************************************************/
@@ -84,7 +86,7 @@
* wakeup timer.
* This setting is the preemptpriority part of the NVIC.
*/
-#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+#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
@@ -92,7 +94,7 @@
* 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 CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
/**
* Define a critical section in the Timer server
@@ -108,32 +110,32 @@
* 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
+#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
- */
+ * 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_LPUART1_ENABLED 0
+#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 0
#define CFG_HW_USART1_ENABLED 0
#define CFG_HW_USART1_DMA_TX_SUPPORTED 0
@@ -242,6 +244,6 @@
#define CFG_HW_USART1_TX_DMA_IRQn DMA2_Channel4_IRQn
#define CFG_HW_USART1_DMA_TX_IRQHandler DMA2_Channel4_IRQHandler
-#endif /*__HW_CONF_H */
+#endif /*HW_CONF_H */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Inc/main.h
index bbe71a4da..d104dcb7e 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Inc/main.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Inc/main.h
@@ -32,6 +32,7 @@ extern RTC_HandleTypeDef hrtc; /**< RTC handler declaration */
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
+void Error_Handler(void);
#endif /* __MAIN_H */
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Src/app_entry.c
index 11e02ac1b..b5e541b30 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Src/app_entry.c
@@ -188,7 +188,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Src/main.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Src/main.c
index 1754a019a..1ce1087a8 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/Core/Src/main.c
@@ -38,6 +38,7 @@
/* Includes ------------------------------------------------------------------*/
+#include "main.h"
#include "app_common.h"
#include "app_entry.h"
@@ -317,4 +318,12 @@ void HAL_Delay(uint32_t Delay)
}
}
+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 */
+}
+
/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/STM32_WPAN/App/app_ble.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/STM32_WPAN/App/app_ble.c
index bd299f79f..779743587 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/STM32_WPAN/App/app_ble.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pRouteur/STM32_WPAN/App/app_ble.c
@@ -19,6 +19,8 @@
/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
#include "app_common.h"
#include "dbg_trace.h"
@@ -58,18 +60,6 @@ typedef struct _tSecurityParams
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
@@ -409,7 +399,10 @@ void APP_BLE_Init( void )
/**
* Starts the BLE Stack on CPU2
*/
- SHCI_C2_BLE_Init( &ble_init_cmd_packet );
+ if (SHCI_C2_BLE_Init( &ble_init_cmd_packet ) != SHCI_Success)
+ {
+ Error_Handler();
+ }
/**
* Initialization of HCI & GATT & GAP layer
@@ -1069,7 +1062,6 @@ static void Ble_Tl_Init( void )
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];
@@ -1191,26 +1183,21 @@ static void Ble_Hci_Gap_Gatt_Init(void){
* 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;
- }
+ 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;
aci_gap_set_authentication_requirement(BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode,
BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode,
- 0,
- 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
);
/**
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 a58b95cad..e7049681d 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/Core/Inc/app_common.h
index 9dbfbba05..7e66ee35a 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/Core/Inc/app_common.h
@@ -67,9 +67,13 @@ extern "C"
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/Core/Inc/app_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/Core/Inc/app_conf.h
index 8ea341408..928062e45 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/Core/Inc/app_conf.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/Core/Inc/app_conf.h
@@ -51,7 +51,7 @@
*/
#define CFG_BONDING_MODE (1)
#define CFG_FIXED_PIN (111111)
-#define CFG_USED_FIXED_PIN (0)
+#define CFG_USED_FIXED_PIN (1)
#define CFG_ENCRYPTION_KEY_SIZE_MAX (16)
#define CFG_ENCRYPTION_KEY_SIZE_MIN (8)
@@ -74,6 +74,28 @@
#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_NOT_SUPPORTED
+
+/**
+ * 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)
/**
* Define PHY
@@ -158,7 +180,7 @@
* Maximum number of simultaneous connections that the device will support.
* Valid values are from 1 to 8
*/
-#define CFG_BLE_NUM_LINK 8
+#define CFG_BLE_NUM_LINK 2
/**
* Maximum number of Services that can be stored in the GATT database.
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/Core/Inc/hw_conf.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/Core/Inc/hw_conf.h
index 45a76a173..1cac11889 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/Core/Inc/hw_conf.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/Core/Inc/hw_conf.h
@@ -1,36 +1,39 @@
+/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file hw_conf.h
* @author MCD Application Team
* @brief Configuration of hardware interface
- ******************************************************************************
- * @attention
- *
+ ******************************************************************************
+ * @attention
+ *
* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under Ultimate Liberty license
- * SLA0044, the "License"; You may not use this file except in compliance with
- * the License. You may obtain a copy of the License at:
- * www.st.com/SLA0044
- *
- ******************************************************************************
- */
-
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You 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
+#ifndef HW_CONF_H
+#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
* 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.
+* Once the Semaphore has been released, there shall be at least 1us before it can be taken again. This is required
+* to give the opportunity to CPU2 to take it.
* 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()
@@ -69,7 +72,6 @@
/* Index of the semaphore used to access the RNG */
#define CFG_HW_RNG_SEMID 0
-
/******************************************************************************
* HW TIMER SERVER
*****************************************************************************/
@@ -84,7 +86,7 @@
* wakeup timer.
* This setting is the preemptpriority part of the NVIC.
*/
-#define CFG_HW_TS_NVIC_RTC_WAKEUP_IT_PREEMPTPRIO 3
+#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
@@ -92,7 +94,7 @@
* 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 CFG_HW_TS_NVIC_RTC_WAKEUP_IT_SUBPRIO 0
/**
* Define a critical section in the Timer server
@@ -108,32 +110,32 @@
* 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
+#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
- */
+ * 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_LPUART1_ENABLED 0
+#define CFG_HW_LPUART1_DMA_TX_SUPPORTED 0
#define CFG_HW_USART1_ENABLED 0
#define CFG_HW_USART1_DMA_TX_SUPPORTED 0
@@ -242,6 +244,6 @@
#define CFG_HW_USART1_TX_DMA_IRQn DMA2_Channel4_IRQn
#define CFG_HW_USART1_DMA_TX_IRQHandler DMA2_Channel4_IRQHandler
-#endif /*__HW_CONF_H */
+#endif /*HW_CONF_H */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/Core/Inc/main.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/Core/Inc/main.h
index bbe71a4da..d104dcb7e 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/Core/Inc/main.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/Core/Inc/main.h
@@ -32,6 +32,7 @@ extern RTC_HandleTypeDef hrtc; /**< RTC handler declaration */
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
+void Error_Handler(void);
#endif /* __MAIN_H */
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/Core/Src/app_entry.c
index 2b19faaba..ccc0d9013 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/Core/Src/app_entry.c
@@ -189,7 +189,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/Core/Src/main.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/Core/Src/main.c
index 1754a019a..89063b077 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/Core/Src/main.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/Core/Src/main.c
@@ -38,6 +38,8 @@
/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
#include "app_common.h"
#include "app_entry.h"
@@ -317,4 +319,12 @@ void HAL_Delay(uint32_t Delay)
}
}
+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 */
+}
+
/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/STM32_WPAN/App/app_ble.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/STM32_WPAN/App/app_ble.c
index 8d0a5600a..fd5310f1d 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/STM32_WPAN/App/app_ble.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/STM32_WPAN/App/app_ble.c
@@ -19,6 +19,8 @@
/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
#include "app_common.h"
#include "dbg_trace.h"
@@ -58,18 +60,6 @@ typedef struct _tSecurityParams
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
@@ -396,7 +386,10 @@ void APP_BLE_Init( void )
/**
* Starts the BLE Stack on CPU2
*/
- SHCI_C2_BLE_Init( &ble_init_cmd_packet );
+ if (SHCI_C2_BLE_Init( &ble_init_cmd_packet ) != SHCI_Success)
+ {
+ Error_Handler();
+ }
/**
* Initialization of HCI & GATT & GAP layer
@@ -611,7 +604,6 @@ static void Ble_Tl_Init( void )
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];
@@ -722,26 +714,21 @@ static void Ble_Hci_Gap_Gatt_Init(void){
* 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;
- }
+ 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;
aci_gap_set_authentication_requirement(BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode,
BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode,
- 0,
- 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
);
/**
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 a58b95cad..e7049681d 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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/readme.txt b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/readme.txt
index 445f6981c..883d78ff1 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/readme.txt
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/BLE/BLE_p2pServer/readme.txt
@@ -20,7 +20,7 @@
@par Application Description
-This example is to demonstrate Point-to-Point communication using BLE component.
+How to demonstrate Point-to-Point communication using BLE component (as GATT server).
Two STM32WB55xx boards are used, one acting as GATT client, and one as GATT server.
For example, BLE P2P_Client application is downloaded in a Nucleo board (MB1355C) and BLE P2P_Server application in a USB DONGLE board (MB1293C).
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Cli_Cmd/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Cli_Cmd/Core/Inc/app_common.h
index 35b82b282..486199914 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Cli_Cmd/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Cli_Cmd/Core/Inc/app_common.h
@@ -67,9 +67,13 @@ extern "C" {
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Cli_Cmd/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Cli_Cmd/Core/Src/app_entry.c
index 6a4f59ad5..cba595aa1 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Cli_Cmd/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Cli_Cmd/Core/Src/app_entry.c
@@ -17,6 +17,7 @@
******************************************************************************
*/
/* USER CODE END Header */
+
/* Includes ------------------------------------------------------------------*/
#include "app_common.h"
#include "main.h"
@@ -239,7 +240,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
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 a58b95cad..e7049681d 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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
index 35b82b282..486199914 100644
--- 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
@@ -67,9 +67,13 @@ extern "C" {
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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
index 71a37b153..fc3e88335 100644
--- 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
@@ -236,7 +236,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
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
index 2c26d2689..af8cad43f 100644
--- 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
@@ -71,35 +71,32 @@ static void RxCpltCallback(void);
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_CoapDataReqHandler(void * pContext,
+ 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 void APP_THREAD_ProvisioningReqHandler(void * pContext,
+ 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,
+static void APP_THREAD_ProvisioningRespHandler(
+ void * pContext,
+ 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_DataRespHandler(
+ void * pContext,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo,
+ otError Result);
static void APP_THREAD_AskProvisioning(void);
/* Private variables -----------------------------------------------*/
@@ -128,8 +125,8 @@ 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 otCoapResource OT_RessourceDataTransfer = {C_RESSOURCE_DATA_TRANSFER, APP_THREAD_CoapDataReqHandler, "myDataTransferCtx", NULL};
+static otCoapResource OT_RessourceProvisionning = {C_RESSOURCE_Provisioning, APP_THREAD_ProvisioningReqHandler,"myProvisionningCtx", NULL};
static otMessageInfo OT_MessageInfo = {0};
static otCoapHeader OT_Header = {0};
static uint8_t OT_Command = 0;
@@ -410,19 +407,6 @@ static void APP_THREAD_StateNotif(uint32_t NotifFlags, void *pContext)
}
/**
- * @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.
*
@@ -504,14 +488,16 @@ static void APP_THREAD_SendNextBuffer(void)
/**
* @brief Data request handler triggered at the reception of the COAP message
+ * @param pContext : Context
* @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)
+static void APP_THREAD_CoapDataReqHandler(void * pContext,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo)
{
do
{
@@ -581,14 +567,16 @@ static void APP_THREAD_SendDataResponse(otCoapHeader * pRequestHeader,
/**
* @brief This function is used to handle the APP_THREAD_AskProvisioning handler
*
+ * @param pContext : Context
* @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)
+static void APP_THREAD_ProvisioningReqHandler(void * pContext,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo)
{
(void)pMessage;
@@ -692,8 +680,8 @@ static void APP_THREAD_ProvisioningReqSend()
error = otCoapSendRequest(NULL,
pOT_Message,
&OT_MessageInfo,
- &APP_THREAD_DummyRespHandler,
- (void*)&APP_THREAD_ProvisioningRespHandler);
+ &APP_THREAD_ProvisioningRespHandler,
+ "myContext");
} while (false);
if (error != OT_ERROR_NONE && pOT_Message != NULL)
@@ -706,18 +694,22 @@ static void APP_THREAD_ProvisioningReqSend()
* @brief This function is used to manage the APP_THREAD_AskProvisioning response
* handler.
*
+ * @param pContext context
* @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,
+static void APP_THREAD_ProvisioningRespHandler(void * pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo,
otError Result)
{
- (void)pHeader;
+ UNUSED(pContext);
+ UNUSED(pHeader);
+
if (Result == OT_ERROR_NONE)
{
if ((otMessageRead(pMessage, otMessageGetOffset(pMessage), &OT_Command, sizeof(OT_Command)) == sizeof(OT_Command)))
@@ -791,8 +783,8 @@ static void APP_THREAD_SendCoapUnicastRequest()
error = otCoapSendRequest(NULL,
pOT_Message,
&OT_MessageInfo,
- &APP_THREAD_DummyRespHandler,
- (void*)&APP_THREAD_DataRespHandler);
+ &APP_THREAD_DataRespHandler,
+ "myCtx");
if (error != OT_ERROR_NONE && pOT_Message != NULL)
{
@@ -804,18 +796,21 @@ static void APP_THREAD_SendCoapUnicastRequest()
* @brief This function manages the data response handler
* and reschedules the sending of data.
*
+ * @param pContext context
* @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,
+static void APP_THREAD_DataRespHandler(void * pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo,
otError Result)
{
/* Prevent unused argument(s) compilation warning */
+ UNUSED(pContext);
UNUSED(pHeader);
UNUSED(pMessage);
UNUSED(pMessageInfo);
@@ -833,30 +828,6 @@ static void APP_THREAD_DataRespHandler(otCoapHeader * pHeader,
}
/**
- * @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
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
index a58b95cad..e7049681d 100644
--- 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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_Generic/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_Generic/Core/Inc/app_common.h
index 35b82b282..486199914 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_Generic/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_Generic/Core/Inc/app_common.h
@@ -67,9 +67,13 @@ extern "C" {
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_Generic/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_Generic/Core/Src/app_entry.c
index dfe03c4cc..8d5f25013 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_Generic/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_Generic/Core/Src/app_entry.c
@@ -236,7 +236,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_Generic/STM32_WPAN/App/app_thread.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_Generic/STM32_WPAN/App/app_thread.c
index 046e2a736..6f452e7a9 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_Generic/STM32_WPAN/App/app_thread.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_Coap_Generic/STM32_WPAN/App/app_thread.c
@@ -81,24 +81,18 @@ static void RxCpltCallback(void);
#endif /* (CFG_FULL_LOW_POWER == 0) */
#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
static void APP_THREAD_CoapSendRequest(otCoapResource* pCoapRessource, otCoapType CoapType, otCoapCode CoapCode, const char *Address, uint8_t* Payload, uint16_t Size);
-static void APP_THREAD_DummyReqHandler(void * p_context,
- otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo);
-static void APP_THREAD_CoapRequestHandler(otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo);
+static void APP_THREAD_CoapRequestHandler(void * pContext,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo);
static void APP_THREAD_CoapSendDataResponse(otCoapHeader * pRequestHeader,
const otMessageInfo * pMessageInfo);
-static void APP_THREAD_CoapDataRespHandler(otCoapHeader * pHeader,
+static void APP_THREAD_CoapDataRespHandler(
+ void * pContext,
+ otCoapHeader * pHeader,
otMessage * pMessage,
const otMessageInfo * pMessageInfo,
otError Result);
-static void APP_THREAD_CoapDummyRespHandler(void * p_context,
- otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo,
- otError Result);
/* USER CODE BEGIN PFP */
static void APP_THREAD_InitPayloadWrite(void);
@@ -131,7 +125,7 @@ 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_Ressource = {C_RESSOURCE, APP_THREAD_DummyReqHandler, (void*)APP_THREAD_CoapRequestHandler, NULL};
+static otCoapResource OT_Ressource = {C_RESSOURCE, APP_THREAD_CoapRequestHandler,"myCtx", NULL};
static otMessageInfo OT_MessageInfo = {0};
static otCoapHeader OT_Header = {0};
static otMessage* pOT_Message = NULL;
@@ -396,28 +390,18 @@ static void APP_THREAD_StateNotif(uint32_t NotifFlags, void *pContext)
}
/**
- * @brief Dummy request handler
- * @param
- * @retval None
- */
-static void APP_THREAD_DummyReqHandler(void * p_context,
- otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo)
-{
-}
-
-/**
* @brief Handler called when the server receives a COAP request.
*
+ * @param pContext : Context
* @param pHeader : Header
* @param pMessage : Message
* @param pMessageInfo : Message information
* @retval None
*/
-static void APP_THREAD_CoapRequestHandler(otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo)
+static void APP_THREAD_CoapRequestHandler(void * pContext,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo)
{
APP_DBG(" Received CoAP request");
@@ -499,8 +483,8 @@ static void APP_THREAD_CoapSendRequest(otCoapResource* pCoapRessource,
error = otCoapSendRequest(NULL,
pOT_Message,
&OT_MessageInfo,
- &APP_THREAD_CoapDummyRespHandler,
- (void*)&APP_THREAD_CoapDataRespHandler);
+ &APP_THREAD_CoapDataRespHandler,
+ "myContext");
}
@@ -550,18 +534,21 @@ static void APP_THREAD_CoapSendDataResponse(otCoapHeader * pRequestHeader,
/**
* @brief This function manages the data response handler.
*
+ * @param pContext context
* @param pHeader header
* @param pMessage message pointer
* @param pMessageInfo message info pointer
* @param Result error code
* @retval None
*/
-static void APP_THREAD_CoapDataRespHandler(otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo,
- otError Result)
+static void APP_THREAD_CoapDataRespHandler( void * pContext,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo,
+ otError Result)
{
/* Prevent unused argument(s) compilation warning */
+ UNUSED(pContext);
UNUSED(pHeader);
UNUSED(pMessage);
UNUSED(pMessageInfo);
@@ -577,30 +564,6 @@ static void APP_THREAD_CoapDataRespHandler(otCoapHeader * pHeader,
}
/**
- * @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_CoapDummyRespHandler(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 Used to report Error.
*
* @param Mess : Message associated to the error.
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 a58b95cad..e7049681d 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_FTD_Coap_Multicast/Core/Inc/app_common.h
index 35b82b282..486199914 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_FTD_Coap_Multicast/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_FTD_Coap_Multicast/Core/Inc/app_common.h
@@ -67,9 +67,13 @@ extern "C" {
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_FTD_Coap_Multicast/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_FTD_Coap_Multicast/Core/Src/app_entry.c
index c2994e345..d9b6fffd3 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_FTD_Coap_Multicast/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_FTD_Coap_Multicast/Core/Src/app_entry.c
@@ -236,7 +236,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_FTD_Coap_Multicast/STM32_WPAN/App/app_thread.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_FTD_Coap_Multicast/STM32_WPAN/App/app_thread.c
index 70e92e1bb..4d64c5c80 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_FTD_Coap_Multicast/STM32_WPAN/App/app_thread.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_FTD_Coap_Multicast/STM32_WPAN/App/app_thread.c
@@ -63,13 +63,10 @@ static void RxCpltCallback(void);
#endif /* (CFG_FULL_LOW_POWER == 0) */
#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
static void APP_THREAD_SendCoapMulticastRequest(uint8_t command);
-static void APP_THREAD_DummyReqHandler(void * p_context,
- otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo);
-static void APP_THREAD_CoapRequestHandler(otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo);
+static void APP_THREAD_CoapRequestHandler(void * pContext,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo);
static void APP_THREAD_SendCoapMsg(void);
/* Private variables -----------------------------------------------*/
@@ -97,7 +94,7 @@ 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_Ressource = {C_RESSOURCE, APP_THREAD_DummyReqHandler, (void*)APP_THREAD_CoapRequestHandler, NULL};
+static otCoapResource OT_Ressource = {C_RESSOURCE, APP_THREAD_CoapRequestHandler,"myCtx", NULL};
static otMessageInfo OT_MessageInfo = {0};
static uint8_t OT_Command = 0;
static otCoapHeader OT_Header = {0};
@@ -322,18 +319,6 @@ static void APP_THREAD_StateNotif(uint32_t NotifFlags, void *pContext)
}
/**
- * @brief Dummy request handler
- * @param
- * @retval None
- */
-static void APP_THREAD_DummyReqHandler(void * p_context,
- otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo)
-{
-}
-
-/**
* @brief Task associated to the push button.
* @param None
* @retval None
@@ -345,14 +330,16 @@ static void APP_THREAD_SendCoapMsg(void)
/**
* @brief Handler called when the server receives a COAP request.
+ * @param pContext : Context
* @param pHeader : Header
* @param pMessage : Message
* @param pMessageInfo : Message information
* @retval None
*/
-static void APP_THREAD_CoapRequestHandler(otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo)
+static void APP_THREAD_CoapRequestHandler(void * pContext,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo)
{
do
{
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 a58b95cad..e7049681d 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_SED_Coap_Multicast/Core/Inc/app_common.h
index 35b82b282..486199914 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_SED_Coap_Multicast/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_SED_Coap_Multicast/Core/Inc/app_common.h
@@ -67,9 +67,13 @@ extern "C" {
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_SED_Coap_Multicast/Core/Src/app_entry.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_SED_Coap_Multicast/Core/Src/app_entry.c
index 67053fd14..fbdf88b85 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_SED_Coap_Multicast/Core/Src/app_entry.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_SED_Coap_Multicast/Core/Src/app_entry.c
@@ -236,7 +236,7 @@ static void APPE_SysStatusNot( SHCI_TL_CmdStatus_t status )
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_SED_Coap_Multicast/STM32_WPAN/App/app_thread.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_SED_Coap_Multicast/STM32_WPAN/App/app_thread.c
index bd2ecb3f1..41cde4a36 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_SED_Coap_Multicast/STM32_WPAN/App/app_thread.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Thread/Thread_SED_Coap_Multicast/STM32_WPAN/App/app_thread.c
@@ -67,13 +67,10 @@ static void RxCpltCallback(void);
#endif /* (CFG_USB_INTERFACE_ENABLE != 0) */
static void APP_THREAD_SendCoapMsg(void);
static void APP_THREAD_SendCoapMulticastRequest(uint8_t command);
-static void APP_THREAD_DummyReqHandler(void * p_context,
- otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo);
-static void APP_THREAD_CoapRequestHandler(otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo);
+static void APP_THREAD_CoapRequestHandler(void * pContext,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo);
static void APP_THREAD_SetSleepyEndDeviceMode(void);
static void APP_THREAD_CoapTimingElapsed( void );
@@ -105,7 +102,7 @@ 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_Ressource = {C_RESSOURCE, APP_THREAD_DummyReqHandler, (void*)APP_THREAD_CoapRequestHandler, NULL};
+static otCoapResource OT_Ressource = {C_RESSOURCE, APP_THREAD_CoapRequestHandler,"myCtx", NULL};
static otMessageInfo OT_MessageInfo = {0};
static uint8_t OT_Command = 0;
static otCoapHeader OT_Header = {0};
@@ -264,18 +261,6 @@ static void APP_THREAD_SetThreadMode( void )
UTIL_SEQ_SetTask(TASK_SET_THREAD_MODE,CFG_SCH_PRIO_1);
}
-/**
- * @brief Dummy request handler
- * @param
- * @retval None
- */
-static void APP_THREAD_DummyReqHandler(void * p_context,
- otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo)
-{
-}
-
/*************************************************************
*
* LOCAL FUNCTIONS
@@ -414,14 +399,16 @@ static void APP_THREAD_SetSleepyEndDeviceMode(void)
/**
* @brief Handler called when the server receives a COAP request.
+ * @param pContext : Context
* @param pHeader : Header
* @param pMessage : Message
* @param pMessageInfo : Message information
* @retval None
*/
-static void APP_THREAD_CoapRequestHandler(otCoapHeader * pHeader,
- otMessage * pMessage,
- const otMessageInfo * pMessageInfo)
+static void APP_THREAD_CoapRequestHandler(void * pContext,
+ otCoapHeader * pHeader,
+ otMessage * pMessage,
+ const otMessageInfo * pMessageInfo)
{
do
{
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 a58b95cad..e7049681d 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
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -84,6 +93,26 @@ void HW_IPCC_Rx_Handler( void )
HW_IPCC_THREAD_CliNotEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,12 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
* 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 );
@@ -395,6 +433,126 @@ __weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
+/******************************************************************************
* ZIGBEE
******************************************************************************/
#ifdef ZIGBEE_WB
@@ -424,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_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/Inc/app_common.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_MeterId_Server_Coord/Core/Inc/app_common.h
index 200abb160..15efa6e2e 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_MeterId_Server_Coord/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_MeterId_Server_Coord/Core/Inc/app_common.h
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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 adbdc42a8..d57afbd99 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
@@ -237,7 +237,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_MeterId_Server_Coord/EWARM/Zigbee_MeterId_Server_Coord.ewp b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_MeterId_Server_Coord/EWARM/Zigbee_MeterId_Server_Coord.ewp
index e64972dd7..13da75f88 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_MeterId_Server_Coord/EWARM/Zigbee_MeterId_Server_Coord.ewp
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_MeterId_Server_Coord/EWARM/Zigbee_MeterId_Server_Coord.ewp
@@ -354,7 +354,6 @@
<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>
@@ -364,13 +363,12 @@
<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>
- <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$/../../../../../../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>
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 97e36869d..9dfdac7a6 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
@@ -200,7 +200,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
/* Initialization Complete */
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_MeterId_Server_Coord/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_MeterId_Server_Coord/STM32_WPAN/Target/hw_ipcc.c
index 56f220e4e..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_MeterId_Server_Coord/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_MeterId_Server_Coord/STM32_WPAN/Target/hw_ipcc.c
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/app_common.h
index 200abb160..15efa6e2e 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Client_Router/Core/Inc/app_common.h
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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 3f18cc1ff..3a59699e4 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
@@ -237,7 +237,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Client_Router/EWARM/Zigbee_OnOff_Client_Router.ewp b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Client_Router/EWARM/Zigbee_OnOff_Client_Router.ewp
index afacf2dd8..5838ec5d4 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Client_Router/EWARM/Zigbee_OnOff_Client_Router.ewp
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Client_Router/EWARM/Zigbee_OnOff_Client_Router.ewp
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
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 22427959c..803ea316d 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
@@ -140,7 +140,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
zigbee_app_info.startupControl = ZbStartTypeJoin;
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Client_Router/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Client_Router/STM32_WPAN/Target/hw_ipcc.c
index 56f220e4e..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Client_Router/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Client_Router/STM32_WPAN/Target/hw_ipcc.c
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/app_common.h
index 200abb160..15efa6e2e 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Server_Coord/Core/Inc/app_common.h
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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 adbdc42a8..d57afbd99 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
@@ -237,7 +237,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Server_Coord/EWARM/Zigbee_OnOff_Server_Coord.ewp b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Server_Coord/EWARM/Zigbee_OnOff_Server_Coord.ewp
index 22cb9c27f..30b47ead0 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Server_Coord/EWARM/Zigbee_OnOff_Server_Coord.ewp
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Server_Coord/EWARM/Zigbee_OnOff_Server_Coord.ewp
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
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 8be1398fb..c593cdb88 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
@@ -142,7 +142,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
zigbee_app_info.startupControl = ZbStartTypeJoin;
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Server_Coord/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Server_Coord/STM32_WPAN/Target/hw_ipcc.c
index 56f220e4e..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Server_Coord/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_OnOff_Server_Coord/STM32_WPAN/Target/hw_ipcc.c
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/Core/Inc/app_common.h b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/Core/Inc/app_common.h
index 200abb160..15efa6e2e 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/Core/Inc/app_common.h
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/Core/Inc/app_common.h
@@ -65,9 +65,13 @@ extern "C"{
* Some useful macro definitions *
* -------------------------------- */
+#ifndef MAX
#define MAX( x, y ) (((x)>(y))?(x):(y))
+#endif
+#ifndef MIN
#define MIN( x, y ) (((x)<(y))?(x):(y))
+#endif
#define MODINC( a, m ) M_BEGIN (a)++; if ((a)>=(m)) (a)=0; M_END
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 9aadf72e5..0990cea10 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
@@ -237,7 +237,7 @@ static void APPE_SysStatusNot(SHCI_TL_CmdStatus_t status)
* 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)
+ * - reported by the FUS (sysevt_ready_rsp == FUS_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
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/EWARM/Zigbee_PowerProfile_Server_Router.ewp b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/EWARM/Zigbee_PowerProfile_Server_Router.ewp
index 1329c6e93..e9ce59d0a 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/EWARM/Zigbee_PowerProfile_Server_Router.ewp
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/EWARM/Zigbee_PowerProfile_Server_Router.ewp
@@ -354,7 +354,6 @@
<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>
@@ -364,7 +363,6 @@
<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>
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 486cd42fe..c0614c131 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
@@ -505,7 +505,7 @@ static void APP_ZIGBEE_StackLayersInit(void)
BSP_LED_Off(LED_BLUE);
/* Configure the joining parameters */
- zigbee_app_info.join_status = 0x01; /* init to error status */
+ zigbee_app_info.join_status = (enum ZbStatusCodeT) 0x01; /* init to error status */
zigbee_app_info.join_delay = HAL_GetTick(); /* now */
/* Initialization Complete */
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/STM32_WPAN/Target/hw_ipcc.c b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/STM32_WPAN/Target/hw_ipcc.c
index 56f220e4e..e7049681d 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/STM32_WPAN/Target/hw_ipcc.c
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/STM32_WPAN/Target/hw_ipcc.c
@@ -4,18 +4,18 @@
* 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
- *
- ******************************************************************************
- */
+ * @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"
@@ -45,6 +45,16 @@ static void HW_IPCC_THREAD_NotEvtHandler( void );
static void HW_IPCC_THREAD_CliNotEvtHandler( void );
#endif
+#ifdef LLD_TESTS_WB
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void );
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void );
+#endif
+#ifdef LLD_BLE_WB
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void );*/
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void );
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( 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 );
@@ -54,7 +64,6 @@ static void HW_IPCC_MAC_802_15_4_NotEvtHandler( void );
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 -----------------------------------------------*/
@@ -83,7 +92,27 @@ void HW_IPCC_Rx_Handler( void )
{
HW_IPCC_THREAD_CliNotEvtHandler();
}
-#endif /* MAC_802_15_4_WB */
+#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveCliRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLDTESTS_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLDTESTS_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
+#ifdef LLD_BLE_WB
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_RSP_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveRspHandler();
+ }
+ else if (HW_IPCC_RX_PENDING( HW_IPCC_LLD_BLE_M0_CMD_CHANNEL ))
+ {
+ HW_IPCC_LLD_BLE_ReceiveM0CmdHandler();
+ }
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
else if (HW_IPCC_RX_PENDING( HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL ))
{
@@ -124,6 +153,9 @@ void HW_IPCC_Tx_Handler( void )
HW_IPCC_OT_CmdEvtHandler();
}
#endif /* THREAD_WB */
+#ifdef LLD_TESTS_WB
+// No TX handler for LLD tests
+#endif /* LLD_TESTS_WB */
#ifdef ZIGBEE_WB
if (HW_IPCC_TX_PENDING( HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL ))
{
@@ -151,6 +183,18 @@ void HW_IPCC_Tx_Handler( void )
void HW_IPCC_Enable( void )
{
/**
+ * Such as IPCC IP available to the CPU2, it is required to keep the IPCC clock running
+ when FUS is running on CPU2 and CPU1 enters deep sleep mode
+ */
+ LL_C2_AHB3_GRP1_EnableClock(LL_C2_AHB3_GRP1_PERIPH_IPCC);
+
+ /**
+ * 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.
@@ -265,6 +309,54 @@ __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
@@ -339,6 +431,127 @@ __weak void HW_IPCC_CLI_CmdEvtNot( void ){};
__weak void HW_IPCC_THREAD_EvtNot( void ){};
#endif /* THREAD_WB */
+
+/******************************************************************************
+ * LLD TESTS
+ ******************************************************************************/
+#ifdef LLD_TESTS_WB
+void HW_IPCC_LLDTESTS_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveCliRsp();
+ return;
+}
+
+void HW_IPCC_LLDTESTS_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLDTESTS_ReceiveM0CmdHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ HW_IPCC_LLDTESTS_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLDTESTS_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLDTESTS_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLDTESTS_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLDTESTS_ReceiveM0Cmd( void ){};
+#endif /* LLD_TESTS_WB */
+
+/******************************************************************************
+ * LLD BLE
+ ******************************************************************************/
+#ifdef LLD_BLE_WB
+void HW_IPCC_LLD_BLE_Init( void )
+{
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendCliCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_CMD_CHANNEL );
+ return;
+}
+
+/*static void HW_IPCC_LLD_BLE_ReceiveCliRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveCliRsp();
+ return;
+}*/
+
+void HW_IPCC_LLD_BLE_SendCliRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_CLI_RSP_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveM0CmdHandler( void )
+{
+ //LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveM0Cmd();
+ return;
+}
+
+
+void HW_IPCC_LLD_BLE_SendM0CmdAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ //LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_M0_CMD_CHANNEL );
+ return;
+}
+__weak void HW_IPCC_LLD_BLE_ReceiveCliRsp( void ){};
+__weak void HW_IPCC_LLD_BLE_ReceiveM0Cmd( void ){};
+
+/* Transparent Mode */
+void HW_IPCC_LLD_BLE_SendCmd( void )
+{
+ LL_C1_IPCC_SetFlag_CHx( IPCC, HW_IPCC_LLD_BLE_CMD_CHANNEL );
+ return;
+}
+
+static void HW_IPCC_LLD_BLE_ReceiveRspHandler( void )
+{
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ HW_IPCC_LLD_BLE_ReceiveRsp();
+ return;
+}
+
+void HW_IPCC_LLD_BLE_SendRspAck( void )
+{
+ LL_C1_IPCC_ClearFlag_CHx( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ LL_C1_IPCC_EnableReceiveChannel( IPCC, HW_IPCC_LLD_BLE_RSP_CHANNEL );
+ return;
+}
+
+#endif /* LLD_BLE_WB */
+
/******************************************************************************
* ZIGBEE
******************************************************************************/
@@ -369,46 +582,44 @@ void HW_IPCC_ZIGBEE_SendM4AckToM0Notify( void )
static void HW_IPCC_ZIGBEE_CmdEvtHandler( void )
{
- LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
+ LL_C1_IPCC_DisableTransmitChannel( IPCC, HW_IPCC_ZIGBEE_CMD_APPLI_CHANNEL );
- HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
+ HW_IPCC_ZIGBEE_RecvAppliAckFromM0();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackNotifEvtHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_APPLI_NOTIF_ACK_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
+ HW_IPCC_ZIGBEE_RecvM0NotifyToM4();
- return;
+ return;
}
static void HW_IPCC_ZIGBEE_StackM0RequestHandler( void )
{
- LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
+ LL_C1_IPCC_DisableReceiveChannel( IPCC, HW_IPCC_ZIGBEE_M0_REQUEST_CHANNEL );
- HW_IPCC_ZIGBEE_RecvM0RequestToM4();
+ HW_IPCC_ZIGBEE_RecvM0RequestToM4();
- return;
+ 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 );
+ 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_RecvAppliAckFromM0( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0NotifyToM4( void ){};
__weak void HW_IPCC_ZIGBEE_RecvM0RequestToM4( void ){};
#endif /* ZIGBEE_WB */
-
/******************************************************************************
* MEMORY MANAGER
******************************************************************************/
@@ -461,53 +672,4 @@ static void HW_IPCC_TRACES_EvtHandler( void )
__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 2020 STMicroelectronics *****END OF FILE****/
+/******************* (C) COPYRIGHT 2019 STMicroelectronics *****END OF FILE****/
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/readme.txt b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/readme.txt
index 902073a3a..8aac8b3c9 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/readme.txt
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Applications/Zigbee/Zigbee_PowerProfile_Server_Router/readme.txt
@@ -160,7 +160,7 @@ To setup the application :
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).
+ the device running Zigbee_PowerProfile_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 and will attached to the network created
by the coordinator. Do the same for the other boards if applicable.
diff --git a/Projects/P-NUCLEO-WB55.USBDongle/Release_Notes.html b/Projects/P-NUCLEO-WB55.USBDongle/Release_Notes.html
index 605d5c745..9858e6643 100644
--- a/Projects/P-NUCLEO-WB55.USBDongle/Release_Notes.html
+++ b/Projects/P-NUCLEO-WB55.USBDongle/Release_Notes.html
@@ -47,9 +47,16 @@
<div class="col-sm-12 col-lg-8">
<h1 id="update-history">Update History</h1>
<div class="collapse">
-<input type="checkbox" id="collapse-section8" checked aria-hidden="true"> <label for="collapse-section8" aria-hidden="true">V1.8.0 / 19-June-2020</label>
+<input type="checkbox" id="collapse-section9" checked aria-hidden="true"> <label for="collapse-section9" aria-hidden="true">V1.9.0 / 24-September-2020</label>
<div>
<h2 id="main-changes">Main Changes</h2>
+<h3 id="update-ble-and-thread-example">Update BLE and Thread example</h3>
+</div>
+</div>
+<div class="collapse">
+<input type="checkbox" id="collapse-section8" aria-hidden="true"> <label for="collapse-section8" aria-hidden="true">V1.8.0 / 19-June-2020</label>
+<div>
+<h2 id="main-changes-1">Main Changes</h2>
<h3 id="replace-sw4stm32-by-stm32cubeide-projects-files-for-all-examples-and-application">Replace SW4STM32 by STM32CubeIDE projects files for all examples and application</h3>
<ul>
<li>Compatibility with STM32CubeMX 6.0.0</li>
@@ -59,7 +66,7 @@
<div class="collapse">
<input type="checkbox" id="collapse-section7" aria-hidden="true"> <label for="collapse-section7" aria-hidden="true">V1.6.0 / 27-March-2020</label>
<div>
-<h2 id="main-changes-1">Main Changes</h2>
+<h2 id="main-changes-2">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>
@@ -70,7 +77,7 @@
<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-2">Main Changes</h2>
+<h2 id="main-changes-3">Main Changes</h2>
<h3 id="maintenance">Maintenance</h3>
<ul>
<li><strong>Zigbee</strong>:
@@ -88,7 +95,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-3">Main Changes</h2>
+<h2 id="main-changes-4">Main Changes</h2>
<h3 id="maintenance-1">Maintenance</h3>
<ul>
<li><strong>Zigbee</strong>:
@@ -105,7 +112,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-4">Main Changes</h2>
+<h2 id="main-changes-5">Main Changes</h2>
<h3 id="maintenance-2">Maintenance</h3>
<ul>
<li>Ensure compatibility with STM32CubeMX V5.4.</li>
@@ -116,7 +123,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-5">Main Changes</h2>
+<h2 id="main-changes-6">Main Changes</h2>
<h3 id="maintenance-3">Maintenance</h3>
<p>Adapt applications to new utility directory tree.</p>
</div>
@@ -124,7 +131,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-6">Main Changes</h2>
+<h2 id="main-changes-7">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>
@@ -137,7 +144,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-7">Main Changes</h2>
+<h2 id="main-changes-8">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 420fd0e50..5042b3e8d 100644
--- a/Projects/STM32CubeProjectsList.html
+++ b/Projects/STM32CubeProjectsList.html
@@ -64,8 +64,8 @@
<p>The provided examples can be tailored to run on any compatible hardware; user simply need to update the BSP drivers for his board, if it has the same hardware functions (LED, LCD display, pushbuttons...etc.). The BSP is based on a modular architecture that allows it to be ported easily to any hardware by just implementing the low level routines.</p>
<p>
- <div>The table below contains the list of examples provided within STM32CubeWB Firmware package.</div>
- <div>In this table, the label <b>CubeMX</b> means the projects have been created using <a href="https://www.st.com/en/development-tools/stm32cubemx.html" target="_blank">STM32CubeMX</a>, the STM32Cube initialization code generator. Those projects can be opened with this tools to modify the projects itself. The others projects are manually created to demonstrate the product features.</div>
+ <div>The table below contains the list of examples provided within STM32CubeWB Firmware package.</div>
+ <div>In this table, the label <b>CubeMX</b> means the projects have been created using <a href="https://www.st.com/en/development-tools/stm32cubemx.html" target="_blank">STM32CubeMX</a>, the STM32Cube initialization code generator. Those projects can be opened with this tools to modify the projects itself. The others projects are manually created to demonstrate the product features.</div>
</p>
<p id="STM32WBxxImportantLink">
@@ -79,8 +79,6 @@
<li>AN5289 : Building a Wireless application</li>
</ul>
</p>
-
-
<table border='1' bgcolor='#f0f0fF' >
<tr align=center style="background-repeat: no-repeat;background-position: right center;background-color: #39A9DC;color: #FFF;">
<td><b>Level</b></td>
@@ -2004,7 +2002,7 @@ the STM32WBxx UART HAL and LL API, the LL API being used for performance improve
<td>9</td>
</tr>
<tr align=center>
- <td style="background-repeat: no-repeat;background-position: right center;background-color: #39A9DC;color: #FFF;" rowspan=95><p id="Applications">Applications</p></td>
+ <td style="background-repeat: no-repeat;background-position: right center;background-color: #39A9DC;color: #FFF;" rowspan=101><p id="Applications">Applications</p></td>
<td align=left rowspan=26><p id="BLE">BLE</p></td>
<td align=left><p id="BLE_Beacon">BLE_Beacon</p></td>
<td align=left>
@@ -2064,7 +2062,7 @@ How to use the Heart Rate profile as specified by the BLE SIG.
<tr align=center>
<td align=left><p id="BLE_HeartRateFreeRTOS">BLE_HeartRateFreeRTOS</p></td>
<td align=left>
-How to use the Heart Rate profile as specified by the BLE SIG.
+How to use the Heart Rate profile as specified by the BLE SIG with FreeRTOS.
</td>
<td>-</td>
<td><font size="5" color=green>CubeMx</font></td>
@@ -2072,9 +2070,8 @@ How to use the Heart Rate profile as specified by the BLE SIG.
<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.
+How to read notifications from Apple Notification Center Service (ANCS) as specified by Apple specification
+and use the Heart Rate profile as specified by the BLE SIG with FreeRTOS.
</td>
<td>-</td>
<td><font size="5" color=green>X</font></td>
@@ -2082,9 +2079,8 @@ and also use the Heart Rate profile as specified by the BLE SIG.
<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.
+How to read notifications from Apple Notification Center Service (ANCS) as specified by Apple specification
+and use Heart Rate profile as specified by the BLE SIG.
</td>
<td>-</td>
<td><font size="5" color=green>X</font></td>
@@ -2092,7 +2088,7 @@ and also use the Heart Rate profile as specified by the BLE SIG.
<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.
+How to use the Heart Rate profile as specified by the BLE SIG to be downloaded with BLE OTA application.
</td>
<td>-</td>
<td><font size="5" color=green>X</font></td>
@@ -2161,7 +2157,7 @@ How to use the Proximity profile as specified by the BLE SIG.
<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.
+How 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>
@@ -2185,7 +2181,7 @@ How to communicate with the STM32CubeMonitor-RF Tool using the transparent mode.
<tr align=center>
<td align=left><p id="BLE_p2pClient">BLE_p2pClient</p></td>
<td align=left>
-This example is to demonstrate Point-to-Point communication using BLE component.
+How to demonstrate Point-to-Point communication using BLE component (as GATT client).
</td>
<td><font size="5" color=green>X</font></td>
<td><font size="5" color=green>CubeMx</font></td>
@@ -2200,7 +2196,7 @@ This example is to demonstrate Point-to-Point communication using BLE component.
<tr align=center>
<td align=left><p id="BLE_p2pServer">BLE_p2pServer</p></td>
<td align=left>
-This example is to demonstrate Point-to-Point communication using BLE component.
+How to demonstrate Point-to-Point communication using BLE component (as GATT server).
</td>
<td><font size="5" color=green>X</font></td>
<td><font size="5" color=green>CubeMx</font></td>
@@ -2208,13 +2204,29 @@ This example is to demonstrate Point-to-Point communication using BLE component.
<tr align=center>
<td align=left><p id="BLE_p2pServer_ota">BLE_p2pServer_ota</p></td>
<td align=left>
-This example is to demonstrate Point-to-Point communication using BLE component.
+How to demonstrate Point-to-Point communication using BLE component (peripherical as GATT server) to be downloaded with BLE OTA application.
+</td>
+ <td>-</td>
+ <td><font size="5" color=green>X</font></td>
+ </tr>
+ <tr align=center>
+ <td align=left rowspan=3><p id="BLE_Thread">BLE_Thread</p></td>
+ <td align=left><p id="Ble_Thread_Dyn">Ble_Thread_Dyn</p></td>
+ <td align=left>
+How to use BLE application and Thread application in dynamic concurrent mode.
+</td>
+ <td>-</td>
+ <td><font size="5" color=green>X</font></td>
+ </tr>
+ <tr align=center>
+ <td align=left><p id="Ble_Thread_Dyn_SED">Ble_Thread_Dyn_SED</p></td>
+ <td align=left>
+How to use BLE application and Thread application in dynamic concurrent mode.
</td>
<td>-</td>
<td><font size="5" color=green>X</font></td>
</tr>
<tr align=center>
- <td align=left rowspan=1><p id="BLE_Thread">BLE_Thread</p></td>
<td align=left><p id="Ble_Thread_Static">Ble_Thread_Static</p></td>
<td align=left>
How to use BLE application and Thread application in static concurrent mode.
@@ -2223,7 +2235,31 @@ How to use BLE application and Thread application in static concurrent mode.
<td><font size="5" color=green>X</font></td>
</tr>
<tr align=center>
- <td align=left rowspan=1><p id="BLE_Zigbee">BLE_Zigbee</p></td>
+ <td align=left rowspan=4><p id="BLE_Zigbee">BLE_Zigbee</p></td>
+ <td align=left><p id="BLE_Zigbee_Dyn">BLE_Zigbee_Dyn</p></td>
+ <td align=left>
+How to use BLE application and Zigbee application in dynamic concurrent mode.
+</td>
+ <td>-</td>
+ <td><font size="5" color=green>X</font></td>
+ </tr>
+ <tr align=center>
+ <td align=left><p id="BLE_Zigbee_Dyn_NVM">BLE_Zigbee_Dyn_NVM</p></td>
+ <td align=left>
+How to use BLE application and Zigbee application in dynamic concurent mode with Zigbee persistent data feature.
+</td>
+ <td>-</td>
+ <td><font size="5" color=green>X</font></td>
+ </tr>
+ <tr align=center>
+ <td align=left><p id="BLE_Zigbee_Dyn_SED">BLE_Zigbee_Dyn_SED</p></td>
+ <td align=left>
+How to use BLE application and Zigbee application in dynamic concurrent mode.
+</td>
+ <td>-</td>
+ <td><font size="5" color=green>X</font></td>
+ </tr>
+ <tr align=center>
<td align=left><p id="BLE_Zigbee_Static">BLE_Zigbee_Static</p></td>
<td align=left>
How to use BLE application and Zigbee application in static concurrent mode.
@@ -2328,7 +2364,7 @@ How to use timers of CMSIS RTOS API.
<td align=left rowspan=3><p id="LLD_BLE">LLD_BLE</p></td>
<td align=left><p id="LLD_BLE_Chat">LLD_BLE_Chat</p></td>
<td align=left>
-This example is to communicate Over The Air (OTA) using LLD_BLE between 2 boards in BLE Radio format not BLE Stack protocol.
+How to create a "Chat" talk between 2 STM32WB55xx boards using terminals.
</td>
<td>-</td>
<td><font size="5" color=green>X</font></td>
@@ -2336,8 +2372,7 @@ This example is to communicate Over The Air (OTA) using LLD_BLE between 2 boards
<tr align=center>
<td align=left><p id="LLD_BLE_Pressbutton">LLD_BLE_Pressbutton</p></td>
<td align=left>
-This example is to communicate Over The Air (OTA) using LLD_BLE between 2 boards (one send, other receive)
-in BLE Radio format not BLE Stack protocol.
+How to make blinking LED between 2 STM32WB55xx boards by pressing buttons.
</td>
<td>-</td>
<td><font size="5" color=green>X</font></td>
@@ -2345,7 +2380,7 @@ in BLE Radio format not BLE Stack protocol.
<tr align=center>
<td align=left><p id="LLD_BLE_Proximity">LLD_BLE_Proximity</p></td>
<td align=left>
-This example is to communicate Over The Air (OTA) using LLD_BLE between several boards in BLE Radio format not BLE Stack protocol.
+How to create a Proximity detection with all other boards that are running this same application.
</td>
<td>-</td>
<td><font size="5" color=green>X</font></td>
@@ -2376,6 +2411,15 @@ How to use MAC 802.15.4 Association and Data exchange.
<td><font size="5" color=green>X</font></td>
</tr>
<tr align=center>
+ <td align=left rowspan=1><p id="Phy_802_15_4">Phy_802_15_4</p></td>
+ <td align=left><p id="Phy_802_15_4_Cli">Phy_802_15_4_Cli</p></td>
+ <td align=left>
+How to create a "PHY_802.15.4 command line interface" application on STM32WB55xx boards using terminals.
+</td>
+ <td>-</td>
+ <td><font size="5" color=green>X</font></td>
+ </tr>
+ <tr align=center>
<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>
@@ -2743,7 +2787,7 @@ How to use Power Profile cluster as a server on a centralized Zigbee network.
<tr align=center>
<td align=left><p id="Zigbee_PressMeas_Client_Router">Zigbee_PressMeas_Client_Router</p></td>
<td align=left>
-How to use PressMeas cluster on a Centralized Zigbee network with device acting as router.
+How to use Pressure Measurement cluster on a Centralized Zigbee network with device acting as router.
</td>
<td>-</td>
<td><font size="5" color=green>X</font></td>
@@ -2773,9 +2817,9 @@ How to use SE Messaging cluster on a Centralized Zigbee network with device acti
<td><font size="5" color=green>X</font></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: 111</b></td>
+ <td colspan="3"><b>Total number of applications: 117</b></td>
<td>18</td>
- <td>93</td>
+ <td>99</td>
</tr>
<tr align=center>
<td style="background-repeat: no-repeat;background-position: right center;background-color: #39A9DC;color: #FFF;" rowspan=2><p id="Demonstrations">Demonstrations</p></td>
@@ -2794,9 +2838,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: 308</b></td>
+ <td colspan="4"><b>Total number of projects: 314</b></td>
<td>19</td>
- <td>289</td>
+ <td>295</td>
</tr>
</table>
</body>
diff --git a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/Release_Notes.html b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/Release_Notes.html
index 8e5140f5d..0098b15e7 100644
--- a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/Release_Notes.html
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/Release_Notes.html
@@ -37,6 +37,12 @@
<p>This release covers the delivery of STM32WB Coprocessor binaries.</p>
<p>Here is the list of the supported binaries:</p>
<ul>
+<li>stm32wb3x_BLE_HCI_AdvScan_fw.bin
+<ul>
+<li>HCI Layer only mode 5.0 certified : Link Layer, HCI</li>
+<li>BT SIG Certification listing : <a href="https://launchstudio.bluetooth.com/ListingDetails/70712">Declaration ID D042213</a></li>
+<li>To be used for advertising and scanning through HCI interface</li>
+</ul></li>
<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>
@@ -336,11 +342,125 @@
<div class="col-sm-12 col-lg-8">
<h1 id="update-history">Update History</h1>
<div class="collapse">
-<input type="checkbox" id="collapse-section3" checked aria-hidden="true"> <label for="collapse-section3" aria-hidden="true">V1.8.0 / 22-June-2020</label>
+<input type="checkbox" id="collapse-section4" checked aria-hidden="true"> <label for="collapse-section4" aria-hidden="true">V1.8.0 / 21-September-2020</label>
<div>
<h2 id="main-changes">Main Changes</h2>
<p><strong>Associated changes in Wireless Coprocessor Binary</strong>:</p>
<ul>
+<li>Introducing following new binary:</li>
+<li><p><strong>stm32wb3x_BLE_HCI_AdvScan_fw.bin</strong> : Ability to do advertising and scanning through HCI interface, <br/> Any connection canā€™t be done, numOfLinks can be set to 1 at the stack initialization call</p></li>
+<li>BLE:
+<ul>
+<li>ID 84973 : ACI_GAP_SET_DIRECT_CONNECTABLE command works for Directed_Advertising_Type in Low Duty Cycle Directed Advertising (0x01) <br/> only when Advertising_Interval_Min and Advertising_Interval_Max correctly set to 3.75 ms</li>
+<li>ID 86883 : remove NVM relative code and constants from M0 firmware regenerated binaries for HCI Layer only <br/> and beacon only (BLE_HCILayer_fw,BLE_HCI_AdvScan_fw)</li>
+<li>ID 86884 : remove const qualifier of NVM RAM emulation buffer in M0 firmware binaries to get in RAM not in ROM</li>
+<li>ID 89110 : ACI_HAL_SCAN_REQ_REPORT_EVENT routine optimized in M0 firmware regenerated binaries as it was writing <br/> more data in memory than the allowed event size</li>
+<li>ID 89430 : Integrate auto-generated DTM_cmd_db_xxx module in BLE stack libraries</li>
+<li>ID 89456 : ERR_BLE_INIT event is enum listed, kept but not really supported as not reported</li>
+<li>ID 90095 : Device Privacy Mode is now mandatory for BLE 5.0 and implemented to handle command HCI_LE_SET_PRIVACY_MODE command</li>
+<li>ID 90607 : Beacon Only certification needs LE Test commands and LE Read Buffer Size command as: <br/> HCI_LE_RECEIVER_TEST, HCI_LE_TEST_END,HCI_LE_TRANSMITTER_TEST and LE_READ_BUFFER_SIZE integrated commands</li>
+<li>ID 90891 : DEEPSLEEP mode on CPU2 not applied after aci_hal_stack_reset or hci_reset command is executed. <br/> A fix is to enable back the Stop Mode when the hci_reset() command is executed, included in all regenrated M0 firmware binaries</li>
+<li>ID 91134 : SHCI_SUB_EVT_BLE_NVM_RAM_UPDATE not implemented on the stack side. <br/> A fix has been implemented on CPU2 to receive expected events on CPU1</li>
+<li>ID 91157 : FLASH_SR_EOP flag remains set after the bonding info stored in NVM. <br/> A fix has been implemented to clear EOP flag after flash processing on CPU2</li>
+<li>ID 91309 : A bug identified in the Link Layer which not de-allocate the memory it has allocated for ACL packets <br/> to be sent to the upper layer memory used for previous ACL packets. <br/> A fix implemented to de-allocate packet not yet sent to upper layers at the disconnection time<br />
+</li>
+<li>ID 91351 : CPU2 gets stuck when EOP and EOPIE both set in CPU1 FLASH interface prior CPU2 booting. <br/> A fix in NVM arbitrer implemented as enable SYSCFG only when EOPIE is enabled</li>
+<li>ID 92458 : Replace the EOP polling by CFGBSY polling in CPU2 M0 firmware to get confirmation flash operation is completed <br/> to avoid unexpected interrupt on CPU1 side when its EOPIE bit is set</li>
+<li>ID 91576 : The feature flag LE Power Class 1 shall be set when the ExtPa is used</li>
+</ul></li>
+<li>THREAD:
+<ul>
+<li>ID 91267 : Fix CoAP OpenThread API exposed on application side: <br/> The CoAP API is now compliant with OpenThread definition and mContext parameter is then correctly returned to the application.</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/6ā€ via USB or 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_FUS_fw_1_0_2.bin</td>
+<td>0x080<strong>7A</strong>000</td>
+<td>v1.0.2</td>
+<td>04/10/2019</td>
+</tr>
+<tr class="even">
+<td>stm32wb3x_FUS_fw.bin</td>
+<td>0x080<strong>7A</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 7ā€ via USB or 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_HCI_AdvScan_fw.bin</td>
+<td>0x08076000</td>
+<td><strong>v1.9.0</strong></td>
+<td>09/21/2020</td>
+</tr>
+<tr class="even">
+<td>stm32wb3x_BLE_HCILayer_fw.bin</td>
+<td>0x0806c000</td>
+<td><strong>v1.9.0</strong></td>
+<td>09/21/2020</td>
+</tr>
+<tr class="odd">
+<td>stm32wb3x_BLE_Stack_full_fw.bin</td>
+<td>0x08057000</td>
+<td><strong>v1.9.0</strong></td>
+<td>09/21/2020</td>
+</tr>
+<tr class="even">
+<td>stm32wb3x_BLE_Stack_light_fw.bin</td>
+<td>0x08061000</td>
+<td><strong>v1.9.0</strong></td>
+<td>09/21/2020</td>
+</tr>
+<tr class="odd">
+<td>stm32wb3x_Mac_802_15_4_fw.bin</td>
+<td>0x0805C000</td>
+<td><strong>v1.9.0</strong></td>
+<td>09/21/2020</td>
+</tr>
+<tr class="even">
+<td>stm32wb3x_Thread_FTD_fw.bin</td>
+<td>0x0801B000</td>
+<td><strong>v1.9.0</strong></td>
+<td>09/21/2020</td>
+</tr>
+<tr class="odd">
+<td>stm32wb3x_Thread_MTD_fw.bin</td>
+<td>0x08031000</td>
+<td><strong>v1.9.0</strong></td>
+<td>09/21/2020</td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+<div class="collapse">
+<input type="checkbox" id="collapse-section3" aria-hidden="true"> <label for="collapse-section3" aria-hidden="true">V1.8.0 / 22-June-2020</label>
+<div>
+<h2 id="main-changes-1">Main Changes</h2>
+<p><strong>Associated changes in Wireless Coprocessor Binary</strong>:</p>
+<ul>
<li>BLE:
<ul>
<li>BLE Light Stack: Slave mode only, Secure connection, Privacy moe, and White list</li>
@@ -446,7 +566,7 @@
<div class="collapse">
<input type="checkbox" id="collapse-section2" aria-hidden="true"> <label for="collapse-section2" aria-hidden="true">V1.6.0 / 27-March-2020</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>MAC:
@@ -535,7 +655,7 @@
<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-2">Main Changes</h2>
+<h2 id="main-changes-3">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>
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 ac806debd..905664e65 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_HCI_AdvScan_fw.bin b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_BLE_HCI_AdvScan_fw.bin
new file mode 100644
index 000000000..e3921c8f3
--- /dev/null
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB3x/stm32wb3x_BLE_HCI_AdvScan_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 17bb07a25..485988b72 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 aa184dffb..82a2342db 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 c3259f662..2b2d16313 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 e82ca5036..72740ab79 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 4e0dc4e1c..fa73e46f1 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 a5a264a23..58debcaef 100644
--- a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/Release_Notes.html
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/Release_Notes.html
@@ -37,6 +37,17 @@
<p>This release covers the delivery of STM32WB Coprocessor binaries.</p>
<p>Here is the list of the supported binaries:</p>
<ul>
+<li>stm32wb5x_BLE_HCI_AdvScan_fw.bin
+<ul>
+<li>HCI Layer only mode 5.0 certified : Link Layer, HCI</li>
+<li>BT SIG Certification listing : <a href="https://launchstudio.bluetooth.com/ListingDetails/70712">Declaration ID D042213</a></li>
+<li>To be used for advertising and scanning through HCI interface</li>
+</ul></li>
+<li>stm32wb5x_BLE_LLD_fw.bin
+<ul>
+<li>LLD BLE Radio Transparent firmware</li>
+<li>To be used for direct access on LLD BLE features and API</li>
+</ul></li>
<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>
@@ -95,15 +106,22 @@
<li>Static Concurrent Mode BLE Thread</li>
<li>Supports Full BLE Stack 5.0 certified and Full Thread Device certified v1.1</li>
</ul></li>
+<li>stm32wb5x_BLE_Thread_dynamic_fw.bin
+<ul>
+<li>Dynamic Concurrent Mode BLE Thread</li>
+<li>Supports Full BLE Stack 5.0 certified and Full Thread Device certified v1.1</li>
+</ul></li>
<li>stm32wb5x_Mac_802_15_4_fw.bin
<ul>
<li>MAC API is based on latest official <a href="http://grouper.ieee.org/groups/802/15/pub/Download.html">IEEE Std 802.15.4-2011</a></li>
<li>To be used for MAC FFD and RFD devices</li>
</ul></li>
-<li>stm32wb5x_rfmonitor_phy802_15_4_fw.bin
+<li>stm32wb5x_Phy_802_15_4_fw.bin
<ul>
-<li>Dedicated firmware binary to be used with STM32CubeMonitor-RF application.</li>
-<li>Refer to STM32CubeMonitor-RF User Manual (UM2288) to get application details.</li>
+<li>802.15.4 Features exposed on application side</li>
+<li>Reduced number of commands called from application side to manage 802.15.4 API</li>
+<li>Not aĀ Transparent mode, 802.15.4 API not deployed on application side</li>
+<li>Can to used with STM32CubeMonitor-RF application or dedicated M4 Application.</li>
</ul></li>
<li>stm32wb5x_Zigbee_FFD_fw.bin
<ul>
@@ -116,11 +134,28 @@
<li>Zigbee Compliant Platform certified</li>
<li>To be used for End Device Zigbee role</li>
</ul></li>
-<li>stm32wb5x_BLE_Zigbee_static_fw.bin
+<li>stm32wb5x_BLE_Zigbee_FFD_static_fw.bin
<ul>
-<li>Static Concurrent Mode BLE Zigbee</li>
+<li>Static Concurrent Mode BLE Zigbee FFD</li>
<li>Supports Full BLE Stack 5.0 certified and Zigbee FFD(Full Function Device) Compliant Platform certified</li>
</ul></li>
+<li>stm32wb5x_BLE_Zigbee_RFD_static_fw.bin
+<ul>
+<li>Static Concurrent Mode BLE Zigbee RFD</li>
+<li>Supports Full BLE Stack 5.0 certified and Zigbee RFD(Reduced Function Device) Compliant Platform certified</li>
+<li>Optimized for Power consumption.</li>
+</ul></li>
+<li>stm32wb5x_BLE_Zigbee_FFD_dynamic_fw.bin
+<ul>
+<li>Dynamic Concurrent Mode BLE Zigbee FFD.</li>
+<li>Supports Full BLE Stack 5.0 certified and Zigbee FFD(Full Function Device) Compliant Platform certified</li>
+</ul></li>
+<li>stm32wb5x_BLE_Zigbee_RFD_dynamic_fw.bin
+<ul>
+<li>Dynamic Concurrent Mode BLE Zigbee RFD.</li>
+<li>Supports Full BLE Stack 5.0 certified and Zigbee RFD(Reduced Function Device) Compliant Platform certified.</li>
+<li>Optimized for Power consumption.</li>
+</ul></li>
<li>stm32wb5x_FUS_fw_1_0_2.bin
<ul>
<li>Firmware Upgrade Services (FUS)</li>
@@ -365,11 +400,300 @@
<div class="col-sm-12 col-lg-8">
<h1 id="update-history">Update History</h1>
<div class="collapse">
-<input type="checkbox" id="collapse-section9" checked aria-hidden="true"> <label for="collapse-section9" aria-hidden="false">V1.8.0 / 19-June-2020</label>
+<input type="checkbox" id="collapse-section12" checked aria-hidden="true"> <label for="collapse-section12" aria-hidden="false">V1.9.0 / 21-September-2020</label>
<div>
<h2 id="main-changes">Main Changes</h2>
<p><strong>Associated changes in Wireless Coprocessor Binary</strong>:</p>
<ul>
+<li>Introducing following new binaries:
+<ul>
+<li><strong>stm32wb5x_BLE_HCI_AdvScan_fw.bin</strong> : Ability to do advertising and scanning through HCI interface, <br/> Any connection canā€™t be done, numOfLinks can be set to 1 at the stack initialization call</li>
+<li><strong>stm32wb5x_BLE_LLD_fw.bin</strong> : LLD BLE Radio Transparent firmware</li>
+<li><strong>stm32wb5x_BLE_Thread_dynamic_fw.bin</strong> : BLE Thread Dynamic concurrent mode</li>
+<li><strong>stm32wb5x_BLE_Zigbee_FFD_dynamic_fw.bin</strong> : BLE Zigbee Full Function Device Dynamic concurrent mode</li>
+<li><strong>stm32wb5x_BLE_Zigbee_RFD_dynamic_fw.bin</strong> : BLE Zigbee Reduced Function Device Dynamic concurrent mode</li>
+<li><strong>stm32wb5x_phy802_15_4_fw.bin</strong> replaces stm32wb5x_rfmonitor_phy802_15_4_fw.bin</li>
+</ul></li>
+<li>BLE Zigbee static mode is now split in two binaries:
+<ul>
+<li><strong>stm32wb5x_BLE_Zigbee_FFD_static_fw.bin</strong> : BLE Zigbee Full Function Device Static concurrent mode
+<ul>
+<li>When using this static concurrent mode, the application can switch from BLE to Zigbee_FFD or from Zigbee_FFD to BLE on request. When in Zigbee mode, the device is acting as a Full Function Device</li>
+</ul></li>
+<li><strong>stm32wb5x_BLE_Zigbee_RFD_static_fw.bin</strong> : BLE Zigbee Reduced Function Device Static concurrent mode
+<ul>
+<li>When using this static concurrent mode, the application can switch from BLE to Zigbee_RFD or from Zigbee_RFD to BLE on request. When in Zigbee mode, the device is acting as a Reduced Function Device (End device or Sleepy End Device only)</li>
+</ul></li>
+</ul></li>
+<li>BLE:
+<ul>
+<li>ID 84973 : ACI_GAP_SET_DIRECT_CONNECTABLE command works for Directed_Advertising_Type in Low Duty Cycle Directed Advertising (0x01) <br/> only when Advertising_Interval_Min and Advertising_Interval_Max correctly set to 3.75 ms</li>
+<li>ID 86883 : remove NVM relative code and constants from M0 firmware regenerated binaries for HCI Layer only <br/> and beacon only (BLE_HCILayer_fw,BLE_HCI_AdvScan_fw)</li>
+<li>ID 86884 : remove const qualifier of NVM RAM emulation buffer in M0 firmware binaries to get in RAM not in ROM</li>
+<li>ID 89110 : ACI_HAL_SCAN_REQ_REPORT_EVENT routine optimized in M0 firmware regenerated binaries as it was writing <br/> more data in memory than the allowed event size</li>
+<li>ID 89430 : Integrate auto-generated DTM_cmd_db_xxx module in BLE stack libraries</li>
+<li>ID 89456 : ERR_BLE_INIT event is enum listed, kept but not really supported as not reported</li>
+<li>ID 90095 : Device Privacy Mode is now mandatory for BLE 5.0 and implemented to handle command HCI_LE_SET_PRIVACY_MODE command</li>
+<li>ID 90607 : Beacon Only certification needs LE Test commands and LE Read Buffer Size command as: <br/> HCI_LE_RECEIVER_TEST, HCI_LE_TEST_END,HCI_LE_TRANSMITTER_TEST and LE_READ_BUFFER_SIZE integrated commands</li>
+<li>ID 90891 : DEEPSLEEP mode on CPU2 not applied after aci_hal_stack_reset or hci_reset command is executed. <br/> A fix is to enable back the Stop Mode when the hci_reset() command is executed, included in all regenrated M0 firmware binaries</li>
+<li>ID 91134 : SHCI_SUB_EVT_BLE_NVM_RAM_UPDATE not implemented on the stack side. <br/> A fix has been implemented on CPU2 to receive expected events on CPU1</li>
+<li>ID 91157 : FLASH_SR_EOP flag remains set after the bonding info stored in NVM. <br/> A fix has been implemented to clear EOP flag after flash processing on CPU2</li>
+<li>ID 91309 : A bug identified in the Link Layer which not de-allocate the memory it has allocated for ACL packets <br/> to be sent to the upper layer memory used for previous ACL packets. <br/> A fix implemented to de-allocate packet not yet sent to upper layers at the disconnection time<br />
+</li>
+<li>ID 91351 : CPU2 gets stuck when EOP and EOPIE both set in CPU1 FLASH interface prior CPU2 booting. <br/> A fix in NVM arbitrer implemented as enable SYSCFG only when EOPIE is enabled</li>
+<li>ID 92458 : Replace the EOP polling by CFGBSY polling in CPU2 M0 firmware to get confirmation flash operation is completed <br/> to avoid unexpected interrupt on CPU1 side when its EOPIE bit is set</li>
+<li>ID 91576 : The feature flag LE Power Class 1 shall be set when the ExtPa is used</li>
+</ul></li>
+<li>THREAD:
+<ul>
+<li>ID 91267 : Fix CoAP OpenThread API exposed on application side: <br/> The CoAP API is now compliant with OpenThread definition and mContext parameter is then correctly returned to the application.</li>
+</ul></li>
+<li>ZIGBEE:
+<ul>
+<li>Storage of the APS binding table in RFD mode (Persistence data management).</li>
+<li>Integration of the dynamic concurrent mode between BLE and Zigbee.</li>
+</ul></li>
+<li>MAC 802.15.4:
+<ul>
+<li>ID 85031 : Association Procedure occasionally fails between 2 STM32WBxx
+<ul>
+<li>802.15.4 LLD enhancement corrects this issue.</li>
+</ul></li>
+<li>ID 91900 : Unexpected received Association Response
+<ul>
+<li>Fix provided in MAC reset procedure that deeply reset the Radio and 802.15.4 IP.</li>
+</ul></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/6ā€ via USB or via SWD/JTAG.</p>
+<table>
+<colgroup>
+<col style="width: 37%" />
+<col style="width: 13%" />
+<col style="width: 13%" />
+<col style="width: 13%" />
+<col style="width: 13%" />
+<col style="width: 6%" />
+<col style="width: 3%" />
+</colgroup>
+<thead>
+<tr class="header">
+<th>Wireless Coprocessor Binary</th>
+<th>STM32WB5xxG(1M)</th>
+<th>STM32WB5xxY(640k)</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>9A</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>9A</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 7ā€ via USB or via SWD/JTAG.</p>
+<table>
+<colgroup>
+<col style="width: 34%" />
+<col style="width: 14%" />
+<col style="width: 14%" />
+<col style="width: 14%" />
+<col style="width: 14%" />
+<col style="width: 3%" />
+<col style="width: 3%" />
+</colgroup>
+<thead>
+<tr class="header">
+<th>Wireless Coprocessor Binary</th>
+<th>STM32WB5xxG(1M)</th>
+<th>STM32WB5xxY(640k)</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>0x080E0000</td>
+<td>0x0808C000</td>
+<td>0x0806C000</td>
+<td>0x0802C000</td>
+<td><strong>v1.9.0</strong></td>
+<td>09/21/2020</td>
+</tr>
+<tr class="even">
+<td>stm32wb5x_BLE_HCI_AdvScan_fw.bin</td>
+<td>0x080EA000</td>
+<td>0x08096000</td>
+<td>0x08076000</td>
+<td>0x08036000</td>
+<td><strong>v1.9.0</strong></td>
+<td>09/21/2020</td>
+</tr>
+<tr class="odd">
+<td>stm32wb5x_BLE_LLD_fw.bin</td>
+<td>0x080EB000</td>
+<td>0x08097000</td>
+<td>0x08077000</td>
+<td>0x08037000</td>
+<td><strong>v1.9.0</strong></td>
+<td>09/21/2020</td>
+</tr>
+<tr class="even">
+<td>stm32wb5x_BLE_Stack_full_fw.bin</td>
+<td>0x080CB000</td>
+<td>0x08077000</td>
+<td>0x08057000</td>
+<td>0x08017000</td>
+<td><strong>v1.9.0</strong></td>
+<td>09/21/2020</td>
+</tr>
+<tr class="odd">
+<td>stm32wb5x_BLE_Stack_light_fw.bin</td>
+<td>0x080D5000</td>
+<td>0x08081000</td>
+<td>0x08061000</td>
+<td>0x08021000</td>
+<td><strong>v1.9.0</strong></td>
+<td>09/21/2020</td>
+</tr>
+<tr class="even">
+<td>stm32wb5x_BLE_Thread_dynamic_fw.bin</td>
+<td>0x08075000</td>
+<td>0x08021000</td>
+<td>0x08001000</td>
+<td>0x00</td>
+<td><strong>v1.9.0</strong></td>
+<td>09/21/2020</td>
+</tr>
+<tr class="odd">
+<td>stm32wb5x_BLE_Thread_static_fw.bin</td>
+<td>0x08077000</td>
+<td>0x08023000</td>
+<td>0x08003000</td>
+<td>0x00</td>
+<td><strong>v1.9.0</strong></td>
+<td>09/21/2020</td>
+</tr>
+<tr class="even">
+<td>stm32wb5x_BLE_Zigbee_FFD_dynamic_fw.bin</td>
+<td>0x08079000</td>
+<td>0x08025000</td>
+<td>0x08005000</td>
+<td>0x00</td>
+<td><strong>v1.9.0</strong></td>
+<td>09/21/2020</td>
+</tr>
+<tr class="odd">
+<td>stm32wb5x_BLE_Zigbee_FFD_static_fw.bin</td>
+<td>0x0807B000</td>
+<td>0x08027000</td>
+<td>0x08007000</td>
+<td>0x00</td>
+<td><strong>v1.9.0</strong></td>
+<td>09/21/2020</td>
+</tr>
+<tr class="even">
+<td>stm32wb5x_BLE_Zigbee_RFD_dynamic_fw.bin</td>
+<td>0x08087000</td>
+<td>0x08033000</td>
+<td>0x08013000</td>
+<td>0x00</td>
+<td><strong>v1.9.0</strong></td>
+<td>09/21/2020</td>
+</tr>
+<tr class="odd">
+<td>stm32wb5x_BLE_Zigbee_RFD_static_fw.bin</td>
+<td>0x08089000</td>
+<td>0x08035000</td>
+<td>0x08015000</td>
+<td>0x00</td>
+<td><strong>v1.9.0</strong></td>
+<td>09/21/2020</td>
+</tr>
+<tr class="even">
+<td>stm32wb5x_Mac_802_15_4_fw.bin</td>
+<td>0x080DC000</td>
+<td>0x08088000</td>
+<td>0x08068000</td>
+<td>0x08028000</td>
+<td><strong>v1.9.0</strong></td>
+<td>09/21/2020</td>
+</tr>
+<tr class="odd">
+<td>stm32wb5x_Phy_802_15_4_fw.bin</td>
+<td>0x080DE000</td>
+<td>0x0808A000</td>
+<td>0x0806A000</td>
+<td>0x0802A000</td>
+<td><strong>v1.9.0</strong></td>
+<td>09/21/2020</td>
+</tr>
+<tr class="even">
+<td>stm32wb5x_Thread_FTD_fw.bin</td>
+<td>0x0809B000</td>
+<td>0x08047000</td>
+<td>0x08027000</td>
+<td>0x00</td>
+<td><strong>v1.9.0</strong></td>
+<td>09/21/2020</td>
+</tr>
+<tr class="odd">
+<td>stm32wb5x_Thread_MTD_fw.bin</td>
+<td>0x080B1000</td>
+<td>0x0805D000</td>
+<td>0x0803D000</td>
+<td>0x00</td>
+<td><strong>v1.9.0</strong></td>
+<td>09/21/2020</td>
+</tr>
+<tr class="even">
+<td>stm32wb5x_Zigbee_FFD_fw.bin</td>
+<td>0x080A1000</td>
+<td>0x0804D000</td>
+<td>0x0802D000</td>
+<td>0x00</td>
+<td><strong>v1.9.0</strong></td>
+<td>09/21/2020</td>
+</tr>
+<tr class="odd">
+<td>stm32wb5x_Zigbee_RFD_fw.bin</td>
+<td>0x080B0000</td>
+<td>0x0805C000</td>
+<td>0x0803C000</td>
+<td>0x00</td>
+<td><strong>v1.9.0</strong></td>
+<td>09/21/2020</td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+<div class="collapse">
+<input type="checkbox" id="collapse-section9" aria-hidden="true"> <label for="collapse-section9" aria-hidden="false">V1.8.0 / 19-June-2020</label>
+<div>
+<h2 id="main-changes-1">Main Changes</h2>
+<p><strong>Associated changes in Wireless Coprocessor Binary</strong>:</p>
+<ul>
<li>BLE:
<ul>
<li>BLE Light Stack: Slave mode only, Secure connection, Privacy moe, and White list</li>
@@ -393,8 +717,8 @@
</ul></li>
<li>ZIGBEE:
<ul>
-<li>FFD Zigbee stack certified: : Zigbee PRO Feature Set(2017) + Green Power</li>
-<li>RFD Zigbee stack certification compliant: Zigbee PRO Feature Set(2017) + Green Power</li>
+<li>FFD Zigbee stack certified: Zigbee PRO Feature Set(2017) + Green Power</li>
+<li>RFD Zigbee stack certification compliant: Zigbee PRO Feature Set(2017)</li>
<li>Low power mode support</li>
<li>Support of persistent data management (NVM)</li>
<li>ID 75709 - [LowPower] Improve SFTimer wrap around time</li>
@@ -563,7 +887,7 @@
<div class="collapse">
<input type="checkbox" id="collapse-section8" aria-hidden="true"> <label for="collapse-section8" aria-hidden="false">V1.6.0 / 27-March-2020</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>MAC:
@@ -759,7 +1083,7 @@
<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-2">Main Changes</h2>
+<h2 id="main-changes-3">Main Changes</h2>
<p><strong>Associated changes in Wireless Coprocessor Binary</strong>:</p>
<ul>
<li>FUS:
@@ -951,7 +1275,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-3">Main Changes</h2>
+<h2 id="main-changes-4">Main Changes</h2>
<p><strong>Associated changes in Wireless Coprocessor Binary</strong>:</p>
<ul>
<li>ZIGBEE :
@@ -1096,7 +1420,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-4">Main Changes</h2>
+<h2 id="main-changes-5">Main Changes</h2>
<p><strong>Associated changes in Wireless Coprocessor Binary</strong>:</p>
<ul>
<li>ZIGBEE :
@@ -1236,7 +1560,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-5">Main Changes</h2>
+<h2 id="main-changes-6">Main Changes</h2>
<p><strong>Associated changes in Wireless Coprocessor Binary</strong>:</p>
<ul>
<li>BLE Link layer : fix issues with pairing</li>
@@ -1349,7 +1673,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-6">Main Changes</h2>
+<h2 id="main-changes-7">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>
@@ -1455,7 +1779,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-7">Main Changes</h2>
+<h2 id="main-changes-8">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>
@@ -1564,7 +1888,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-8">Main Changes</h2>
+<h2 id="main-changes-9">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 ac806debd..905664e65 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_HCI_AdvScan_fw.bin b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_HCI_AdvScan_fw.bin
new file mode 100644
index 000000000..e3921c8f3
--- /dev/null
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_HCI_AdvScan_fw.bin
Binary files differ
diff --git a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_LLD_fw.bin b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_LLD_fw.bin
new file mode 100644
index 000000000..feead1109
--- /dev/null
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_LLD_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 17bb07a25..485988b72 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 aa184dffb..82a2342db 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_dynamic_fw.bin b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Thread_dynamic_fw.bin
new file mode 100644
index 000000000..edac1cf0a
--- /dev/null
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Thread_dynamic_fw.bin
Binary files differ
diff --git a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Thread_static_fw.bin b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Thread_static_fw.bin
index f1281eaba..5c31f355b 100644
--- a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Thread_static_fw.bin
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Thread_static_fw.bin
Binary files differ
diff --git a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Zigbee_FFD_dynamic_fw.bin b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Zigbee_FFD_dynamic_fw.bin
new file mode 100644
index 000000000..d8efebad6
--- /dev/null
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Zigbee_FFD_dynamic_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
new file mode 100644
index 000000000..e2ed31325
--- /dev/null
+++ 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_BLE_Zigbee_RFD_dynamic_fw.bin b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Zigbee_RFD_dynamic_fw.bin
new file mode 100644
index 000000000..afb033fd6
--- /dev/null
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Zigbee_RFD_dynamic_fw.bin
Binary files differ
diff --git a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Zigbee_RFD_static_fw.bin b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Zigbee_RFD_static_fw.bin
new file mode 100644
index 000000000..7bd831938
--- /dev/null
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Zigbee_RFD_static_fw.bin
Binary files differ
diff --git a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Zigbee_static_fw.bin b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Zigbee_static_fw.bin
deleted file mode 100644
index 71c5858bc..000000000
--- a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_BLE_Zigbee_static_fw.bin
+++ /dev/null
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 c3259f662..2b2d16313 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_Phy_802_15_4_fw.bin b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Phy_802_15_4_fw.bin
new file mode 100644
index 000000000..3fd79e3b9
--- /dev/null
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Phy_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 e82ca5036..72740ab79 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 4e0dc4e1c..fa73e46f1 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_fw.bin b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Zigbee_FFD_fw.bin
index 808d13768..bdce86b44 100644
--- a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Zigbee_FFD_fw.bin
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Zigbee_FFD_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
index e477d7e98..0e42ac8ab 100644
--- a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Zigbee_RFD_fw.bin
+++ b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_Zigbee_RFD_fw.bin
Binary files differ
diff --git a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_rfmonitor_phy802_15_4_fw.bin b/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_rfmonitor_phy802_15_4_fw.bin
deleted file mode 100644
index 85e2dc726..000000000
--- a/Projects/STM32WB_Copro_Wireless_Binaries/STM32WB5x/stm32wb5x_rfmonitor_phy802_15_4_fw.bin
+++ /dev/null
Binary files differ
diff --git a/Release_Notes.html b/Release_Notes.html
index 204ca951b..a75d0e565 100644
--- a/Release_Notes.html
+++ b/Release_Notes.html
@@ -30,8 +30,8 @@
</div>
</div>
<h1 id="license">License</h1>
-<p>This software package is licensed by ST under ST license SLA0048, the ā€œLicenseā€; You may not use this package except in compliance with the License. You may obtain a copy of the License at:</p>
-<p><a href="http://www.st.com/SLA0048">http://www.st.com/SLA0048</a></p>
+<p>This software package is licensed by ST under ST license SLA0078, the ā€œLicenseā€; You may not use this package except in compliance with the License. You may obtain a copy of the License at:</p>
+<p><a href="SLA0078-License_evaluation_DM00394710_rev2.pdf">SLA0078-License_evaluation_DM00394710_rev2.pdf</a></p>
<h1 id="purpose">Purpose</h1>
<p><strong>STM32Cube is an STMicroelectronics original initiative to ease developers life by reducing development efforts, time and cost.</mark></strong></p>
<p>STM32Cube covers STM32 portfolio.</p>
@@ -60,27 +60,454 @@
<p>For quick getting started with the STM32CubeWB firmware package, refer to UM2550 and you can download firmware updates and all the latest documentation from www.st.com/stm32cubefw</p>
<p>Here is the list of references to user documents:</p>
<ul>
-<li><a href="http://www.st.com/st-web-ui/static/active/en/resource/technical/document/user_manual/DM00597487.pdf">UM2550</a> : Getting started with STM32CubeWB for STM32WBxx Series.</li>
-<li><a href="http://www.st.com/st-web-ui/static/active/en/resource/technical/document/user_manual/DM00524025.pdf">UM2442</a> : Description of STM32WB HAL and low-layer drivers.</li>
+<li><a href="http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/DM00492814.pdf">AN5155</a> : STM32Cube MCU Package examples for STM32WB Series</li>
+<li><a href="http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/dm00513965.pdf">AN5185</a> : ST FW upgrade services for STM32WB</li>
+<li><a href="http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/dm00556294.pdf">AN5247</a> : Over the air application and wireless firmware update</li>
+<li><a href="http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/DM00571230.pdf">AN5270</a> : STM32WB BLE wireless Interface</li>
<li><a href="http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/DM00598033.pdf">AN5289</a> : Building wireless applications with STM32WB Series microcontrollers</li>
<li><a href="http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/DM00600575.pdf">AN5292</a> : How to build a BluetoothĀ® Low Energy mesh application for STM32WBx5 microcontrollers</li>
-<li><a href="http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/DM00492814.pdf">AN5155</a> : STM32Cube MCU Package examples for STM32WB Series</li>
+<li><a href="http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/DM00643581.pdf">AN5379</a> : Examples of AT commands on STM32WB Series microcontrollers</li>
+<li><a href="http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/DM00704235.pdf">AN5491</a> : Creating Manufacture Zigbee Specific Clusters on STM32WB Series</li>
+<li><a href="http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/DM00704246.pdf">AN5492</a> : ZigBee persistent data management non-volatile memory for STM32WB Series</li>
+<li><a href="http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/DM00706938.pdf">AN5498</a> : How to use Zigbee clusters templates on STM32WB Series</li>
+<li><a href="http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/DM00707537.pdf">AN5500</a> : ZSDK API implementation for ZigBee on STM32WB Series</li>
+<li><a href="http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/DM00710974.pdf">AN5506</a> : Getting started with ZigBee on STM32WB Series</li>
+<li><a href="https://www.st.com/resource/en/programming_manual/dm00716581-stm32wb-ble-stack-programming-guidelines-stmicroelectronics.pdf">PM0271</a> : STM32WB BLE stack programming guidelines</li>
<li><a href="http://www.st.com/st-web-ui/static/active/en/resource/technical/document/user_manual/DM00105259.pdf">UM1721</a> : Developing Applications on STM32Cube with FatFs.</li>
<li><a href="http://www.st.com/st-web-ui/static/active/en/resource/technical/document/user_manual/DM00105262.pdf">UM1722</a> : Developing Applications on STM32Cube with RTOS.</li>
-<li>[AN5506] : Getting started with ZigBee on STM32WB Series</li>
-<li>[AN5498] : How to use Zigbee clusters templates on STM32WB Series</li>
-<li>[AN5500] : ZSDK API implementation for ZigBee on STM32WB Series</li>
-<li>[AN5491] : Creating Manufacture Zigbee Specific Clusters on STM32WB Series</li>
-<li>[AN5492] : ZigBee persistent data management non-volatile memory for STM32WB Series</li>
-<li>[PM0271] : Ā BLE Programming Manuel</li>
+<li><a href="http://www.st.com/st-web-ui/static/active/en/resource/technical/document/user_manual/DM00369109.pdf">UM2180</a> : Getting started with the ST BLE-Mesh Android application</li>
+<li><a href="http://www.st.com/st-web-ui/static/active/en/resource/technical/document/user_manual/DM00477323.pdf">UM2361</a> : Getting started with the ST BLE-Mesh iOS application</li>
+<li><a href="http://www.st.com/st-web-ui/static/active/en/resource/technical/document/user_manual/DM00524025.pdf">UM2442</a> : Description of STM32WB HAL and low-layer drivers.</li>
+<li><a href="http://www.st.com/st-web-ui/static/active/en/resource/technical/document/user_manual/DM00597487.pdf">UM2550</a> : Getting started with STM32CubeWB for STM32WBxx Series.</li>
+<li><a href="http://www.st.com/st-web-ui/static/active/en/resource/technical/document/user_manual/DM00598021.pdf">UM2551</a> : STM32CubeWB Nucleo demonstration firmware</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-section10" checked aria-hidden="true"> <label for="collapse-section10" aria-hidden="true">V1.8.0 / 23-June-2020</label>
+<input type="checkbox" id="collapse-section11" checked aria-hidden="true"> <label for="collapse-section11" aria-hidden="true">V1.9.0 / 25-September-2020</label>
<div>
<h2 id="main-changes">Main Changes</h2>
+<h3 id="introduce-blethread-and-blezigbee-dynamic-concurrent-mode-the-support-of-lld-ble-and-phy_802.15.4-cli-application">Introduce BLE/Thread and BLE/Zigbee dynamic concurrent mode, the support of LLD BLE and PHY_802.15.4 CLI application</h3>
+<ul>
+<li><strong>Dynamic Concurrent mode support between BLE and Zigbee</strong>
+<ul>
+<li>Through this feature, the STM32WB can support Zigbee and BLE protocols in parallel.</li>
+<li>3 new applications available on P-NUCLEO-WB55.Nucleo board highlight this feature.</li>
+<li>They are available under Projects-NUCLEO-WB55.Nucleo_Zigbee
+<ul>
+<li>BLE_Zigbee_Dyn</li>
+<li>BLE_Zigbee_Dyn_NVM</li>
+<li>BLE_Zigbee_Dyn_SED</li>
+</ul></li>
+<li>These application are using the following wireless copro binaries:
+<ul>
+<li><strong>stm32wb5x_BLE_Zigbee_FFD_dynamic_fw.bin</strong> : BLE Zigbee Full Feature Device Dynamic concurrent mode. To be used for Zigbee Coordinator or Router devices sharing its radio bandwidth with BLE.</li>
+<li><strong>stm32wb5x_BLE_Zigbee_RFD_dynamic_fw.bin</strong> : BLE Zigbee Reduced Feature Device Dynamic concurrent mode. To be used for Zigbee End Devices sharing its radio bandwidth with BLE.</li>
+</ul></li>
+</ul></li>
+<li><strong>Dynamic Concurrent mode support between BLE and Thread</strong>
+<ul>
+<li>Through this feature, the STM32WB can support Thread and BLE protocols in parallel.</li>
+<li>2 new applications available under Projects-NUCLEO-WB55.Nucleo_Thread highlight this feature.
+<ul>
+<li>Ble_Thread_Dyn</li>
+<li>Ble_Thread_Dyn_SED</li>
+</ul></li>
+<li>These application are using the following wireless copro binary: <strong>stm32wb5x_BLE_Thread_FFD_dynamic_fw.bin</strong>.</li>
+</ul></li>
+<li><strong>Static concurrent mode support between BLE and Zigbee-RFD</strong>
+<ul>
+<li>When using the static concurrent mode, the application can switch from BLE to Zigbee or from Zigbee to BLE on request.</li>
+<li>There are two flavors of static concurrent mode supporting BLE and Zigbee:
+<ul>
+<li>BLE-Zigbee_FFD (Full Function Device)</li>
+<li>BLE-Zigbee_RFD (Reduced Function Device and optimized for power consumption)</li>
+</ul></li>
+<li>The <strong>stm32wb5x_BLE_Zigbee_RFD_static_fw.bin</strong> copro binary is to be used for Zigbee End devices requesting BLE support in static concurrent mode.</li>
+</ul></li>
+<li><p><strong>Provide the ability to do only BLE advertising &amp; scanning at HCI level</strong></p></li>
+<li><strong>PHY_802.15.4 command line interface application</strong>
+<ul>
+<li>A dedicated application allows the control and the test of the 802_15_4 radio via a command line interface.</li>
+<li>It is available under Projects-NUCLEO-WB55.Nucleo_802_15_4
+<ul>
+<li>Phy_802_15_4_Cli</li>
+</ul></li>
+<li>This application request the usage of the following wireless copro binary: <strong>stm32wb5x_Phy_802_15_4_fw.bin</strong>.</li>
+</ul></li>
+<li><strong>BLE and LLD</strong>
+<ul>
+<li>3 new applications are provided based on usage of <strong>stm32wb5x_BLE_LLD_fw.bin</strong>:
+<ul>
+<li>LLD_BLE_Chat: Text communication between 2 boards using Terminal based on UART</li>
+<li>LLD_BLE_Pressbutton: Transmission and Reception between 2 boards using button and symbolized by blinking LED</li>
+<li>LLD_BLE_Proximity: State Machine Programmed to receive ID from others board (multi boards)</li>
+</ul></li>
+</ul></li>
+<li><strong>Thread</strong>
+<ul>
+<li>ID 91267 : Fix CoAP OpenThread API exposed on application side
+<ul>
+<li>The CoAP API is now compliant with <strong>OpenThread</strong> definition and <strong>mContext parameter</strong> is then correctly returned to the application.</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>
+</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;">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>
+</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.9.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_HCI_AdvScan_fw.bin</td>
+<td style="text-align: left;"><strong>v1.9.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_LLD_fw.bin</td>
+<td style="text-align: left;"><strong>v1.9.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.9.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.9.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_dynamic_fw.bin</td>
+<td style="text-align: left;"><strong>v1.9.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_Thread_static_fw.bin</td>
+<td style="text-align: left;"><strong>v1.9.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_Zigbee_FFD_dynamic_fw.bin</td>
+<td style="text-align: left;"><strong>v1.9.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.9.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_Zigbee_RFD_dynamic_fw.bin</td>
+<td style="text-align: left;"><strong>v1.9.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_RFD_static_fw.bin</td>
+<td style="text-align: left;"><strong>v1.9.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.9.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_Phy_802_15_4_fw.bin</td>
+<td style="text-align: left;"><strong>v1.9.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_Thread_FTD_fw.bin</td>
+<td style="text-align: left;"><strong>v1.9.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.9.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_fw.bin</td>
+<td style="text-align: left;"><strong>v1.9.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.9.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>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.5.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.6.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;">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="odd">
+<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="even">
+<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.6.0</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.9.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 20201117</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.4.0</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>STM32CubeIDE toolchain V1.4.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>
+</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>
+</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-section10" aria-hidden="true"> <label for="collapse-section10" aria-hidden="true">V1.8.0 / 23-June-2020</label>
+<div>
+<h2 id="main-changes-1">Main Changes</h2>
<h3 id="add-zigbee-low-power-mode-support-and-firmware-and-wireless-stack-upgrade-over-the-air">Add Zigbee low power mode support and firmware and wireless stack upgrade over the air</h3>
<ul>
<li><strong>Zigbee</strong>
@@ -91,8 +518,8 @@
</ul></li>
<li><strong>Certifications</strong>
<ul>
-<li>FFD Zigbee stack certified: : Zigbee PRO Feature Set(2017) + Green Power</li>
-<li>RFD Zigbee stack certification compliant: Zigbee PRO Feature Set(2017) + Green Power</li>
+<li>FFD Zigbee stack certified: Zigbee PRO Feature Set(2017) + Green Power</li>
+<li>RFD Zigbee stack certification compliant: Zigbee PRO Feature Set(2017)</li>
</ul></li>
<li><strong>Low power mode support</strong>
<ul>
@@ -144,15 +571,15 @@
<li>Replace SW4STM32 by STM32CubeIDE projects files for all examples and application</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>
<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>
</ul>
-<h3 id="components">Components</h3>
+<h3 id="components-1">Components</h3>
<table>
<caption>STM32WB5x Firmware Upgrade Services Binary</caption>
<thead>
@@ -422,25 +849,25 @@
</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>
<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>
+<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>STM32CubeIDE toolchain V1.4.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>
</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>
@@ -462,10 +889,10 @@
<div class="collapse">
<input type="checkbox" id="collapse-section9" aria-hidden="true"> <label for="collapse-section9" aria-hidden="true">V1.7.0 / 11-May-2020</label>
<div>
-<h2 id="main-changes-1">Main Changes</h2>
+<h2 id="main-changes-2">Main Changes</h2>
<h3 id="correct-install-address-for-stm32wb5x_thread_ftd_fw.bin">Correct install address for stm32wb5x_Thread_FTD_fw.bin</h3>
-<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>
@@ -473,7 +900,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-1">Components</h3>
+<h3 id="components-2">Components</h3>
<table>
<caption>STM32WB5x Firmware Upgrade Services Binary</caption>
<thead>
@@ -798,26 +1225,26 @@
</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>
<li>Moving from stm32wb5x_BLE_Stack_fw.bin to stm32wb5x_BLE_Thread_fw.bin</li>
</ul></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>STM32CubeIDE toolchain V1.2.0 + 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, 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-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>
@@ -840,7 +1267,7 @@
<div class="collapse">
<input type="checkbox" id="collapse-section8" aria-hidden="true"> <label for="collapse-section8" aria-hidden="true">V1.6.0 / 3-April-2020</label>
<div>
-<h2 id="main-changes-2">Main Changes</h2>
+<h2 id="main-changes-3">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>
@@ -941,8 +1368,8 @@
</ul></li>
</ul></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>
@@ -950,7 +1377,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-2">Components</h3>
+<h3 id="components-3">Components</h3>
<table>
<caption>STM32WB5x Firmware Upgrade Services Binary</caption>
<thead>
@@ -1275,27 +1702,27 @@
</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>
<li>Moving from stm32wb5x_BLE_Stack_fw.bin to stm32wb5x_BLE_Thread_fw.bin</li>
</ul></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>
<li>STM32CubeIDE toolchain V1.2.0 + 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, 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-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>
@@ -1318,7 +1745,7 @@
<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-3">Main Changes</h2>
+<h2 id="main-changes-4">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>:
@@ -1431,8 +1858,8 @@
<li>Introduce the support od STM32WB5Mxx inside the cmsis device, the HAL and the LL library.</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>
@@ -1440,7 +1867,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-3">Components</h3>
+<h3 id="components-4">Components</h3>
<table>
<caption>STM32WB5x Firmware Upgrade Services Binary</caption>
<thead>
@@ -1753,7 +2180,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>
@@ -1761,20 +2188,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-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>
<li>STM32CubeIDE toolchain V1.2.0 + 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, 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-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>
@@ -1797,7 +2224,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-4">Main Changes</h2>
+<h2 id="main-changes-5">Main Changes</h2>
<h3 id="maintenance-release">Maintenance Release</h3>
<ul>
<li><strong>BLE</strong>:
@@ -1822,15 +2249,15 @@
</ul></li>
<li>Maintenance release for HAL and LL drivers.</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>
<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-4">Components</h3>
+<h3 id="components-5">Components</h3>
<table>
<caption>Firmware Upgrade Services Binary</caption>
<thead>
@@ -2076,7 +2503,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>
@@ -2084,18 +2511,18 @@
</ul></li>
<li>BLE_MeshLightingDemo application is not functionnal under Linux platform.</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 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-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>
@@ -2117,7 +2544,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-5">Main Changes</h2>
+<h2 id="main-changes-6">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>
@@ -2146,15 +2573,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-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>
<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-5">Components</h3>
+<h3 id="components-6">Components</h3>
<table>
<caption>Firmware Upgrade Services Binary</caption>
<thead>
@@ -2394,7 +2821,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>
@@ -2403,18 +2830,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-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 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-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>
@@ -2436,7 +2863,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-6">Main Changes</h2>
+<h2 id="main-changes-7">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>
@@ -2463,15 +2890,15 @@
<li>Mesh Library V1.10.000</li>
</ul></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>Firmware Upgrade Services Binary</caption>
<thead>
@@ -2711,7 +3138,7 @@
</tr>
</tbody>
</table>
-<h2 id="known-limitations-6">Known Limitations</h2>
+<h2 id="known-limitations-7">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>
@@ -2721,18 +3148,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-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 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-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>
@@ -2754,7 +3181,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-7">Main Changes</h2>
+<h2 id="main-changes-8">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>
@@ -2780,8 +3207,8 @@
</ul></li>
</ul></li>
</ul>
-<h2 id="contents-7">Contents</h2>
-<h3 id="projects-7">Projects</h3>
+<h2 id="contents-8">Contents</h2>
+<h3 id="projects-8">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>
@@ -2789,7 +3216,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-7">Components</h3>
+<h3 id="components-8">Components</h3>
<table>
<caption>Firmware Upgrade Services Binary</caption>
<thead>
@@ -3011,7 +3438,7 @@
</tr>
</tbody>
</table>
-<h2 id="known-limitations-7">Known Limitations</h2>
+<h2 id="known-limitations-8">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>
@@ -3029,18 +3456,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-7">Development Toolchains and Compilers</h2>
+<h2 id="development-toolchains-and-compilers-8">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-7">Supported Devices and boards</h2>
+<h2 id="supported-devices-and-boards-8">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-7">Dependencies</h2>
+<h2 id="dependencies-8">Dependencies</h2>
<p>This software release is compatible with:</p>
<ul>
<li>STM32WB_Copro_Wireless_Binaries available under Projects/STM32WB_Copro_Wireless_Binaries</li>
@@ -3062,7 +3489,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-8">Main Changes</h2>
+<h2 id="main-changes-9">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>
@@ -3124,8 +3551,8 @@
<li>Projects\P-NUCLEO-WB55.USBDongle\Applications\BLE</li>
<li>Projects\P-NUCLEO-WB55.USBDongle\Applications\Thread</li>
</ul>
-<h2 id="contents-8">Contents</h2>
-<h3 id="projects-8">Projects</h3>
+<h2 id="contents-9">Contents</h2>
+<h3 id="projects-9">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>
@@ -3133,7 +3560,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-8">Components</h3>
+<h3 id="components-9">Components</h3>
<table>
<caption>Firmware Upgrade Services Binary</caption>
<thead>
@@ -3355,7 +3782,7 @@
</tr>
</tbody>
</table>
-<h2 id="known-limitations-8">Known Limitations</h2>
+<h2 id="known-limitations-9">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>
@@ -3373,18 +3800,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-8">Development Toolchains and Compilers</h2>
+<h2 id="development-toolchains-and-compilers-9">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-8">Supported Devices and boards</h2>
+<h2 id="supported-devices-and-boards-9">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-8">Dependencies</h2>
+<h2 id="dependencies-9">Dependencies</h2>
<p>This software release is compatible with:</p>
<ul>
<li>STM32WB_Copro_Wireless_Binaries available under Projects/STM32WB_Copro_Wireless_Binaries</li>
@@ -3406,7 +3833,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-9">Main Changes</h2>
+<h2 id="main-changes-10">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>
@@ -3422,15 +3849,15 @@
<li>Projects\P-NUCLEO-WB55.USBDongle\Applications\BLE</li>
<li>Projects\P-NUCLEO-WB55.USBDongle\Applications\Thread</li>
</ul>
-<h2 id="contents-9">Contents</h2>
-<h3 id="projects-9">Projects</h3>
+<h2 id="contents-10">Contents</h2>
+<h3 id="projects-10">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-9">Components</h3>
+<h3 id="components-10">Components</h3>
<table>
<caption>Coprocessor Wireless Binaries</caption>
<thead>
@@ -3621,7 +4048,7 @@
</tr>
</tbody>
</table>
-<h2 id="known-limitations-9">Known Limitations</h2>
+<h2 id="known-limitations-10">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>
@@ -3651,18 +4078,18 @@
</ul></li>
</ul></li>
</ul>
-<h2 id="development-toolchains-and-compilers-9">Development Toolchains and Compilers</h2>
+<h2 id="development-toolchains-and-compilers-10">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-9">Supported Devices and boards</h2>
+<h2 id="supported-devices-and-boards-10">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-9">Dependencies</h2>
+<h2 id="dependencies-10">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/package.xml b/package.xml
index 49d484066..bb130d19c 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.8.0">
+ <PackDescription Release="FW.WB.1.9.0">
<Note Release="ReleaseNotes.html"/>
</PackDescription>
</Package> \ No newline at end of file