178ae886bSMilanka Ringwald /* 278ae886bSMilanka Ringwald * Copyright (C) 2021 BlueKitchen GmbH 378ae886bSMilanka Ringwald * 478ae886bSMilanka Ringwald * Redistribution and use in source and binary forms, with or without 578ae886bSMilanka Ringwald * modification, are permitted provided that the following conditions 678ae886bSMilanka Ringwald * are met: 778ae886bSMilanka Ringwald * 878ae886bSMilanka Ringwald * 1. Redistributions of source code must retain the above copyright 978ae886bSMilanka Ringwald * notice, this list of conditions and the following disclaimer. 1078ae886bSMilanka Ringwald * 2. Redistributions in binary form must reproduce the above copyright 1178ae886bSMilanka Ringwald * notice, this list of conditions and the following disclaimer in the 1278ae886bSMilanka Ringwald * documentation and/or other materials provided with the distribution. 1378ae886bSMilanka Ringwald * 3. Neither the name of the copyright holders nor the names of 1478ae886bSMilanka Ringwald * contributors may be used to endorse or promote products derived 1578ae886bSMilanka Ringwald * from this software without specific prior written permission. 1678ae886bSMilanka Ringwald * 4. Any redistribution, use, or modification is done solely for 1778ae886bSMilanka Ringwald * personal benefit and not for any commercial purpose or for 1878ae886bSMilanka Ringwald * monetary gain. 1978ae886bSMilanka Ringwald * 2078ae886bSMilanka Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 2178ae886bSMilanka Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2278ae886bSMilanka Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 2378ae886bSMilanka Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS 2478ae886bSMilanka Ringwald * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 2578ae886bSMilanka Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 2678ae886bSMilanka Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 2778ae886bSMilanka Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 2878ae886bSMilanka Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 2978ae886bSMilanka Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 3078ae886bSMilanka Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3178ae886bSMilanka Ringwald * SUCH DAMAGE. 3278ae886bSMilanka Ringwald * 3378ae886bSMilanka Ringwald * Please inquire about commercial licensing options at 3478ae886bSMilanka Ringwald * [email protected] 3578ae886bSMilanka Ringwald * 3678ae886bSMilanka Ringwald */ 3778ae886bSMilanka Ringwald 38*1ea30d1bSMilanka Ringwald /** 39*1ea30d1bSMilanka Ringwald * @text The Scan Parameters Service Client allows to store its 40*1ea30d1bSMilanka Ringwald * LE scan parameters on a remote device such that the remote device 41*1ea30d1bSMilanka Ringwald * can utilize this information to optimize power consumption and/or 42*1ea30d1bSMilanka Ringwald * reconnection latency. 43*1ea30d1bSMilanka Ringwald */ 44*1ea30d1bSMilanka Ringwald 4578ae886bSMilanka Ringwald #ifndef SCAN_PARAMAETERS_SERVICE_CLIENT_H 4678ae886bSMilanka Ringwald #define SCAN_PARAMAETERS_SERVICE_CLIENT_H 4778ae886bSMilanka Ringwald 4878ae886bSMilanka Ringwald #include <stdint.h> 4978ae886bSMilanka Ringwald #include "btstack_defines.h" 5078ae886bSMilanka Ringwald #include "bluetooth.h" 5178ae886bSMilanka Ringwald #include "ble/gatt_client.h" 5278ae886bSMilanka Ringwald #include "btstack_linked_list.h" 5378ae886bSMilanka Ringwald 5478ae886bSMilanka Ringwald #if defined __cplusplus 5578ae886bSMilanka Ringwald extern "C" { 5678ae886bSMilanka Ringwald #endif 5778ae886bSMilanka Ringwald 5878ae886bSMilanka Ringwald typedef enum { 5978ae886bSMilanka Ringwald SCAN_PARAMETERS_SERVICE_CLIENT_STATE_IDLE, 6078ae886bSMilanka Ringwald SCAN_PARAMETERS_SERVICE_CLIENT_STATE_W2_QUERY_SERVICE, 6178ae886bSMilanka Ringwald SCAN_PARAMETERS_SERVICE_CLIENT_STATE_W4_SERVICE_RESULT, 6278ae886bSMilanka Ringwald SCAN_PARAMETERS_SERVICE_CLIENT_STATE_W2_QUERY_CHARACTERISTIC, 6378ae886bSMilanka Ringwald SCAN_PARAMETERS_SERVICE_CLIENT_STATE_W4_CHARACTERISTIC_RESULT, 64b3f0de51SMilanka Ringwald #ifdef ENABLE_TESTING_SUPPORT 65b3f0de51SMilanka Ringwald SCAN_PARAMETERS_SERVICE_CLIENT_STATE_W2_QUERY_CCC, 66b3f0de51SMilanka Ringwald SCAN_PARAMETERS_SERVICE_CLIENT_STATE_W4_CCC, 67b3f0de51SMilanka Ringwald #endif 68b3f0de51SMilanka Ringwald SCAN_PARAMETERS_SERVICE_CLIENT_STATE_W2_CONFIGURE_NOTIFICATIONS, 69b3f0de51SMilanka Ringwald SCAN_PARAMETERS_SERVICE_CLIENT_STATE_W4_NOTIFICATIONS_CONFIGURED, 70b3f0de51SMilanka Ringwald 7178ae886bSMilanka Ringwald SCAN_PARAMETERS_SERVICE_CLIENT_STATE_CONNECTED 7278ae886bSMilanka Ringwald } scan_parameters_service_client_state_t; 7378ae886bSMilanka Ringwald 7478ae886bSMilanka Ringwald 7578ae886bSMilanka Ringwald typedef struct { 7678ae886bSMilanka Ringwald btstack_linked_item_t item; 7778ae886bSMilanka Ringwald 7878ae886bSMilanka Ringwald hci_con_handle_t con_handle; 7978ae886bSMilanka Ringwald uint16_t cid; 8078ae886bSMilanka Ringwald scan_parameters_service_client_state_t state; 8178ae886bSMilanka Ringwald btstack_packet_handler_t client_handler; 8278ae886bSMilanka Ringwald 8378ae886bSMilanka Ringwald // service 8478ae886bSMilanka Ringwald uint16_t start_handle; 8578ae886bSMilanka Ringwald uint16_t end_handle; 8678ae886bSMilanka Ringwald 8778ae886bSMilanka Ringwald // characteristic 8878ae886bSMilanka Ringwald uint16_t scan_interval_window_value_handle; 89b3f0de51SMilanka Ringwald 90b3f0de51SMilanka Ringwald uint16_t scan_refresh_value_handle; 91b3f0de51SMilanka Ringwald uint16_t scan_refresh_end_handle; 92b3f0de51SMilanka Ringwald uint16_t scan_refresh_properties; 93b3f0de51SMilanka Ringwald 9478ae886bSMilanka Ringwald bool scan_interval_window_value_update; 95b3f0de51SMilanka Ringwald 96b3f0de51SMilanka Ringwald gatt_client_notification_t notification_listener; 9778ae886bSMilanka Ringwald } scan_parameters_service_client_t; 9878ae886bSMilanka Ringwald 9978ae886bSMilanka Ringwald /* API_START */ 10078ae886bSMilanka Ringwald 10178ae886bSMilanka Ringwald /** 10278ae886bSMilanka Ringwald * @brief Initialize Scan Parameters Service. 10378ae886bSMilanka Ringwald */ 10478ae886bSMilanka Ringwald void scan_parameters_service_client_init(void); 10578ae886bSMilanka Ringwald 10678ae886bSMilanka Ringwald /** 107b3f0de51SMilanka Ringwald * @brief Set Scan Parameters Service. It will update all connected devices. 108b3f0de51SMilanka Ringwald * @param scan_interval 109b3f0de51SMilanka Ringwald * @param scan_window 110b3f0de51SMilanka Ringwald */ 111b3f0de51SMilanka Ringwald void scan_parameters_service_client_set(uint16_t scan_interval, uint16_t scan_window); 112b3f0de51SMilanka Ringwald 113b3f0de51SMilanka Ringwald /** 11478ae886bSMilanka Ringwald * @brief Connect to Scan Parameters Service of remote device. 11578ae886bSMilanka Ringwald * 11678ae886bSMilanka Ringwald * The GATTSERVICE_SUBEVENT_SCAN_PARAMETERS_SERVICE_CONNECTED event completes the request. 11778ae886bSMilanka Ringwald * Its status is set to ERROR_CODE_SUCCESS if remote service and SCAN_INTERVAL_WINDOW characteristic are found. 11878ae886bSMilanka Ringwald * Other status codes of this event: 11978ae886bSMilanka Ringwald * - GATT_CLIENT_IN_WRONG_STATE: client in wrong state 12078ae886bSMilanka Ringwald * - ERROR_CODE_UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE: service or characteristic not found 12178ae886bSMilanka Ringwald * - ATT errors, see bluetooth.h 12278ae886bSMilanka Ringwald * 12378ae886bSMilanka Ringwald * @param con_handle 12478ae886bSMilanka Ringwald * @param packet_handler 12578ae886bSMilanka Ringwald * @param scan_parameters_cid 12678ae886bSMilanka Ringwald * @return status ERROR_CODE_SUCCESS on success, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER if client with con_handle not found 12778ae886bSMilanka Ringwald */ 12878ae886bSMilanka Ringwald uint8_t scan_parameters_service_client_connect(hci_con_handle_t con_handle, btstack_packet_handler_t packet_handler, uint16_t * scan_parameters_cid); 12978ae886bSMilanka Ringwald 13078ae886bSMilanka Ringwald /** 131b3f0de51SMilanka Ringwald * @brief Enable notifications 132b3f0de51SMilanka Ringwald * @param scan_parameters_cid 133b3f0de51SMilanka Ringwald * @return status ERROR_CODE_SUCCESS on success, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER if client with con_handle is not found 13478ae886bSMilanka Ringwald */ 135b3f0de51SMilanka Ringwald uint8_t scan_parameters_service_client_enable_notifications(uint16_t scan_parameters_cid); 13678ae886bSMilanka Ringwald 13778ae886bSMilanka Ringwald /** 13878ae886bSMilanka Ringwald * @brief Disconnect from Scan Parameters Service. 13978ae886bSMilanka Ringwald * @param scan_parameters_cid 14078ae886bSMilanka Ringwald * @return status ERROR_CODE_SUCCESS on success, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER if client with con_handle is not found 14178ae886bSMilanka Ringwald */ 14278ae886bSMilanka Ringwald uint8_t scan_parameters_service_client_disconnect(uint16_t scan_parameters_cid); 14378ae886bSMilanka Ringwald 14478ae886bSMilanka Ringwald 14578ae886bSMilanka Ringwald /** 14678ae886bSMilanka Ringwald * @brief De-initialize Scan Parameters Service. 14778ae886bSMilanka Ringwald */ 14878ae886bSMilanka Ringwald void scan_parameters_service_client_deinit(void); 14978ae886bSMilanka Ringwald 15078ae886bSMilanka Ringwald /* API_END */ 15178ae886bSMilanka Ringwald 15278ae886bSMilanka Ringwald #if defined __cplusplus 15378ae886bSMilanka Ringwald } 15478ae886bSMilanka Ringwald #endif 15578ae886bSMilanka Ringwald 15678ae886bSMilanka Ringwald #endif 157