gatts_cache_manager.h 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. /**
  2. * Copyright (c) 2015 - 2020, Nordic Semiconductor ASA
  3. *
  4. * All rights reserved.
  5. *
  6. * Redistribution and use in source and binary forms, with or without modification,
  7. * are permitted provided that the following conditions are met:
  8. *
  9. * 1. Redistributions of source code must retain the above copyright notice, this
  10. * list of conditions and the following disclaimer.
  11. *
  12. * 2. Redistributions in binary form, except as embedded into a Nordic
  13. * Semiconductor ASA integrated circuit in a product or a software update for
  14. * such product, must reproduce the above copyright notice, this list of
  15. * conditions and the following disclaimer in the documentation and/or other
  16. * materials provided with the distribution.
  17. *
  18. * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
  19. * contributors may be used to endorse or promote products derived from this
  20. * software without specific prior written permission.
  21. *
  22. * 4. This software, with or without modification, must only be used with a
  23. * Nordic Semiconductor ASA integrated circuit.
  24. *
  25. * 5. Any software provided in binary form under this license must not be reverse
  26. * engineered, decompiled, modified and/or disassembled.
  27. *
  28. * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
  29. * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  30. * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
  31. * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
  32. * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  33. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
  34. * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  35. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  36. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  37. * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  38. *
  39. */
  40. #ifndef GATTS_CACHE_MANAGER_H__
  41. #define GATTS_CACHE_MANAGER_H__
  42. #include <stdint.h>
  43. #include "sdk_errors.h"
  44. #include "ble.h"
  45. #include "ble_gap.h"
  46. #include "peer_manager_types.h"
  47. #ifdef __cplusplus
  48. extern "C" {
  49. #endif
  50. /**
  51. * @cond NO_DOXYGEN
  52. * @defgroup gatts_cache_manager GATT Server Cache Manager
  53. * @ingroup peer_manager
  54. * @{
  55. * @brief An internal module of @ref peer_manager. A module for managing persistent storing of GATT
  56. * attributes pertaining to the GATT server role of the local device.
  57. */
  58. /**@brief Function for initializing the GATT Server Cache Manager module.
  59. *
  60. * @retval NRF_SUCCESS Initialization was successful.
  61. * @retval NRF_ERROR_INTERNAL If an internal error occurred.
  62. */
  63. ret_code_t gscm_init(void);
  64. /**@brief Function for triggering local GATT database data to be stored persistently. Values are
  65. * retrieved from the SoftDevice and written to persistent storage.
  66. *
  67. * @param[in] conn_handle Connection handle to perform update on.
  68. *
  69. * @retval NRF_SUCCESS Store operation started.
  70. * @retval BLE_ERROR_INVALID_CONN_HANDLE conn_handle does not refer to an active connection with a
  71. * bonded peer.
  72. * @retval NRF_ERROR_BUSY Unable to perform operation at this time. Reattempt later.
  73. * @retval NRF_ERROR_DATA_SIZE Write buffer not large enough. Call will never work with
  74. * this GATT database.
  75. * @retval NRF_ERROR_STORAGE_FULL No room in persistent_storage. Free up space; the
  76. * operation will be automatically reattempted after the
  77. * next FDS garbage collection procedure.
  78. */
  79. ret_code_t gscm_local_db_cache_update(uint16_t conn_handle);
  80. /**@brief Function for applying stored local GATT database data to the SoftDevice. Values are
  81. * retrieved from persistent storage and given to the SoftDevice.
  82. *
  83. * @param[in] conn_handle Connection handle to apply values to.
  84. *
  85. * @retval NRF_SUCCESS Store operation started.
  86. * @retval BLE_ERROR_INVALID_CONN_HANDLE conn_handle does not refer to an active connection with a
  87. * bonded peer.
  88. * @retval NRF_ERROR_INVALID_DATA The stored data was rejected by the SoftDevice, which
  89. * probably means that the local database has changed. The
  90. * system part of the sys_attributes was attempted applied,
  91. * so service changed indications can be sent to subscribers.
  92. * @retval NRF_ERROR_BUSY Unable to perform operation at this time. Reattempt later.
  93. * @retval NRF_ERROR_INTERNAL An unexpected error happened.
  94. */
  95. ret_code_t gscm_local_db_cache_apply(uint16_t conn_handle);
  96. /**@brief Function for storing the fact that the local database has changed, for all currently
  97. * bonded peers.
  98. *
  99. * @note This will cause a later call to @ref gscm_service_changed_ind_needed to return true for
  100. * a connection with a currently bonded peer.
  101. */
  102. void gscm_local_database_has_changed(void);
  103. /**@brief Function for checking if a service changed indication should be sent.
  104. *
  105. * @param[in] conn_handle The connection to check.
  106. *
  107. * @return true if a service changed indication should be sent, false if not.
  108. */
  109. bool gscm_service_changed_ind_needed(uint16_t conn_handle);
  110. /**@brief Function for sending a service changed indication to a connected peer.
  111. *
  112. * @param[in] conn_handle The connection to send the indication on.
  113. *
  114. * @retval NRF_SUCCESS Indication sent or not needed.
  115. * @retval BLE_ERROR_INVALID_CONN_HANDLE conn_handle does not refer to an active connection.
  116. * @retval NRF_ERROR_BUSY Unable to send indication at this time. Reattempt later.
  117. * @retval BLE_ERROR_GATTS_SYS_ATTR_MISSING Information missing. Apply local cache, then reattempt.
  118. * @retval NRF_ERROR_INVALID_PARAM From @ref sd_ble_gatts_service_changed. Unexpected.
  119. * @retval NRF_ERROR_NOT_SUPPORTED Service changed characteristic is not present.
  120. * @retval NRF_ERROR_INVALID_STATE Service changed cannot be indicated to this peer
  121. * because the peer has not subscribed to it.
  122. * @retval NRF_ERROR_INTERNAL An unexpected error happened.
  123. */
  124. ret_code_t gscm_service_changed_ind_send(uint16_t conn_handle);
  125. /**@brief Function for specifying that a peer has been made aware of the latest local database
  126. * change.
  127. *
  128. * @note After calling this, a later call to @ref gscm_service_changed_ind_needed will to return
  129. * false for this peer unless @ref gscm_local_database_has_changed is called again.
  130. *
  131. * @param[in] peer_id The connection to send the indication on.
  132. */
  133. void gscm_db_change_notification_done(pm_peer_id_t peer_id);
  134. /** @}
  135. * @endcond
  136. */
  137. #ifdef __cplusplus
  138. }
  139. #endif
  140. #endif /* GATTS_CACHE_MANAGER_H__ */