gattc_cache_manager.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /* Copyright (c) 2015 Nordic Semiconductor. All Rights Reserved.
  2. *
  3. * The information contained herein is property of Nordic Semiconductor ASA.
  4. * Terms and conditions of usage are described in detail in NORDIC
  5. * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
  6. *
  7. * Licensees are granted free, non-transferable use of the information. NO
  8. * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
  9. * the file.
  10. *
  11. */
  12. #include "gattc_cache_manager.h"
  13. #include "ble_gap.h"
  14. #include "ble_conn_state.h"
  15. #include "peer_manager_types.h"
  16. #include "peer_database.h"
  17. #include "id_manager.h"
  18. #include "sdk_common.h"
  19. #define MAX_SIMUL_SEC_PROCEDURES 2
  20. typedef struct
  21. {
  22. gccm_evt_handler_t evt_handler;
  23. } gccm_t;
  24. static gccm_t m_gccm;
  25. #define MODULE_INITIALIZED (m_gccm.evt_handler != NULL)
  26. #include "sdk_macros.h"
  27. static void internal_state_reset(gccm_t * gccm)
  28. {
  29. memset(gccm, 0, sizeof(gccm_t));
  30. }
  31. /**@brief Event handler for events from the peer_database module.
  32. *
  33. * @param[in] p_event The event that has happend with peer id and flags.
  34. */
  35. static void pdb_evt_handler(pdb_evt_t const * p_event)
  36. {
  37. gccm_evt_t gccm_evt;
  38. gccm_evt.evt_id = GCCM_EVT_REMOTE_DB_STORED;
  39. gccm_evt.peer_id = p_event->peer_id;
  40. m_gccm.evt_handler(&gccm_evt);
  41. }
  42. ret_code_t gccm_init(gccm_evt_handler_t evt_handler)
  43. {
  44. ret_code_t err_code;
  45. if (evt_handler == NULL)
  46. {
  47. err_code = NRF_ERROR_NULL;
  48. }
  49. else
  50. {
  51. err_code = pdb_register(pdb_evt_handler);
  52. if (err_code == NRF_SUCCESS)
  53. {
  54. internal_state_reset(&m_gccm);
  55. m_gccm.evt_handler = evt_handler;
  56. }
  57. }
  58. return err_code;
  59. }
  60. ret_code_t gccm_remote_db_store(pm_peer_id_t peer_id,
  61. ble_gatt_db_srv_t * p_remote_db,
  62. uint32_t n_services)
  63. {
  64. VERIFY_MODULE_INITIALIZED();
  65. VERIFY_PARAM_NOT_NULL(p_remote_db);
  66. // Initialize the peer_data
  67. pm_peer_data_const_t peer_data;
  68. memset(&peer_data, 0, sizeof(peer_data));
  69. peer_data.data_id = PM_PEER_DATA_ID_GATT_REMOTE;
  70. peer_data.p_remote_gatt_db = p_remote_db;
  71. peer_data.length_words = PM_REMOTE_DB_N_WORDS(n_services);
  72. return pdb_raw_store(peer_id, &peer_data, NULL);
  73. }
  74. ret_code_t gccm_remote_db_retrieve(pm_peer_id_t peer_id,
  75. ble_gatt_db_srv_t * p_remote_db,
  76. uint32_t * p_n_services)
  77. {
  78. VERIFY_MODULE_INITIALIZED();
  79. VERIFY_PARAM_NOT_NULL(p_remote_db);
  80. VERIFY_PARAM_NOT_NULL(p_n_services);
  81. // Initialize the peer_data
  82. pm_peer_data_t peer_data;
  83. memset(&peer_data, 0, sizeof(peer_data));
  84. peer_data.data_id = PM_PEER_DATA_ID_GATT_REMOTE;
  85. peer_data.p_remote_gatt_db = p_remote_db;
  86. peer_data.length_words = PM_REMOTE_DB_N_WORDS(*p_n_services);
  87. ret_code_t err_code = pdb_raw_read(peer_id, PM_PEER_DATA_ID_GATT_REMOTE, &peer_data);
  88. *p_n_services = PM_REMOTE_DB_N_SERVICES(peer_data.length_words);
  89. return err_code;
  90. }