diff --git a/src/NimBLEDevice.cpp b/src/NimBLEDevice.cpp index 01cc079..52357f8 100644 --- a/src/NimBLEDevice.cpp +++ b/src/NimBLEDevice.cpp @@ -76,6 +76,8 @@ extern "C" void ble_store_config_init(void); /** * Singletons for the NimBLEDevice. */ +NimBLEDeviceCallbacks* NimBLEDevice::m_pDeviceCallbacks = nullptr; + # if defined(CONFIG_BT_NIMBLE_ROLE_OBSERVER) NimBLEScan* NimBLEDevice::m_pScan = nullptr; # endif @@ -900,7 +902,9 @@ bool NimBLEDevice::init(const std::string& deviceName) { // Setup callbacks for host events ble_hs_cfg.reset_cb = NimBLEDevice::onReset; ble_hs_cfg.sync_cb = NimBLEDevice::onSync; - ble_hs_cfg.store_status_cb = ble_store_util_status_rr; /*TODO: Implement handler for this*/ + ble_hs_cfg.store_status_cb = [](struct ble_store_status_event* event, void* arg) { + return m_pDeviceCallbacks->onStoreStatus(event, arg); + }; // Set initial security capabilities ble_hs_cfg.sm_io_cap = BLE_HS_IO_NO_INPUT_OUTPUT; @@ -1262,4 +1266,13 @@ void nimble_cpp_assert(const char* file, unsigned line) { } # endif // CONFIG_NIMBLE_CPP_DEBUG_ASSERT_ENABLED +void NimBLEDevice::setDeviceCallbacks(NimBLEDeviceCallbacks* cb) { + m_pDeviceCallbacks = cb ? cb : &defaultDeviceCallbacks; +} + +int NimBLEDeviceCallbacks::onStoreStatus(struct ble_store_status_event* event, void* arg) { + NIMBLE_LOGD("NimBLEDeviceCallbacks", "onStoreStatus: default"); + return ble_store_util_status_rr(event, arg); +} + #endif // CONFIG_BT_ENABLED diff --git a/src/NimBLEDevice.h b/src/NimBLEDevice.h index 9f9f52b..ad59767 100644 --- a/src/NimBLEDevice.h +++ b/src/NimBLEDevice.h @@ -66,6 +66,7 @@ class NimBLEConnInfo; # endif class NimBLEAddress; +class NimBLEDeviceCallbacks; # define BLEDevice NimBLEDevice # define BLEClient NimBLEClient @@ -129,6 +130,7 @@ class NimBLEDevice { static bool setOwnAddrType(uint8_t type); static bool setOwnAddr(const NimBLEAddress& addr); static bool setOwnAddr(const uint8_t* addr); + static void setDeviceCallbacks(NimBLEDeviceCallbacks* cb); static void setScanDuplicateCacheSize(uint16_t cacheSize); static void setScanFilterMode(uint8_t type); static bool setCustomGapHandler(gap_event_handler handler); @@ -213,6 +215,8 @@ class NimBLEDevice { static ble_gap_event_listener m_listener; static uint8_t m_ownAddrType; static std::vector m_whiteList; + static NimBLEDeviceCallbacks* m_pDeviceCallbacks; + static NimBLEDeviceCallbacks defaultDeviceCallbacks; # if defined(CONFIG_BT_NIMBLE_ROLE_OBSERVER) static NimBLEScan* m_pScan; @@ -295,5 +299,27 @@ class NimBLEDevice { # include "NimBLEUtils.h" +/** + * @brief Callbacks associated with a BLE device. + */ +class NimBLEDeviceCallbacks { + public: + virtual ~NimBLEDeviceCallbacks() {}; + + /** + * @brief Indicates an inability to perform a store operation. + * This callback should do one of two things: + * -Address the problem and return 0, indicating that the store operation + * should proceed. + * -Return nonzero to indicate that the store operation should be aborted. + * @param event Describes the store event being reported. + * BLE_STORE_EVENT_FULL; or + * BLE_STORE_EVENT_OVERFLOW + * @return 0 if the store operation should proceed; + * nonzero if the store operation should be aborted. + */ + virtual int onStoreStatus(struct ble_store_status_event* event, void* arg); +}; + #endif // CONFIG_BT_ENABLED #endif // NIMBLE_CPP_DEVICE_H_