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 232fca4dadSMilanka Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN 242fca4dadSMilanka Ringwald * GMBH 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 381ea30d1bSMilanka Ringwald /** 39fe5a6c4eSMilanka Ringwald * @title Scan Parameters Service Client 40fe5a6c4eSMilanka Ringwald * 41fe5a6c4eSMilanka Ringwald */ 42fe5a6c4eSMilanka Ringwald 43fe5a6c4eSMilanka Ringwald /** 441ea30d1bSMilanka Ringwald * @text The Scan Parameters Service Client allows to store its 451ea30d1bSMilanka Ringwald * LE scan parameters on a remote device such that the remote device 461ea30d1bSMilanka Ringwald * can utilize this information to optimize power consumption and/or 471ea30d1bSMilanka Ringwald * reconnection latency. 481ea30d1bSMilanka Ringwald */ 491ea30d1bSMilanka Ringwald 5078ae886bSMilanka Ringwald #ifndef SCAN_PARAMAETERS_SERVICE_CLIENT_H 5178ae886bSMilanka Ringwald #define SCAN_PARAMAETERS_SERVICE_CLIENT_H 5278ae886bSMilanka Ringwald 5378ae886bSMilanka Ringwald #include <stdint.h> 5478ae886bSMilanka Ringwald #include "btstack_defines.h" 5578ae886bSMilanka Ringwald #include "bluetooth.h" 5678ae886bSMilanka Ringwald #include "ble/gatt_client.h" 5778ae886bSMilanka Ringwald #include "btstack_linked_list.h" 5878ae886bSMilanka Ringwald 5978ae886bSMilanka Ringwald #if defined __cplusplus 6078ae886bSMilanka Ringwald extern "C" { 6178ae886bSMilanka Ringwald #endif 6278ae886bSMilanka Ringwald 6378ae886bSMilanka Ringwald typedef enum { 6478ae886bSMilanka Ringwald SCAN_PARAMETERS_SERVICE_CLIENT_STATE_IDLE, 6578ae886bSMilanka Ringwald SCAN_PARAMETERS_SERVICE_CLIENT_STATE_W2_QUERY_SERVICE, 6678ae886bSMilanka Ringwald SCAN_PARAMETERS_SERVICE_CLIENT_STATE_W4_SERVICE_RESULT, 6778ae886bSMilanka Ringwald SCAN_PARAMETERS_SERVICE_CLIENT_STATE_W2_QUERY_CHARACTERISTIC, 6878ae886bSMilanka Ringwald SCAN_PARAMETERS_SERVICE_CLIENT_STATE_W4_CHARACTERISTIC_RESULT, 69b3f0de51SMilanka Ringwald #ifdef ENABLE_TESTING_SUPPORT 70b3f0de51SMilanka Ringwald SCAN_PARAMETERS_SERVICE_CLIENT_STATE_W2_QUERY_CCC, 71b3f0de51SMilanka Ringwald SCAN_PARAMETERS_SERVICE_CLIENT_STATE_W4_CCC, 72b3f0de51SMilanka Ringwald #endif 73b3f0de51SMilanka Ringwald SCAN_PARAMETERS_SERVICE_CLIENT_STATE_W2_CONFIGURE_NOTIFICATIONS, 74b3f0de51SMilanka Ringwald SCAN_PARAMETERS_SERVICE_CLIENT_STATE_W4_NOTIFICATIONS_CONFIGURED, 75b3f0de51SMilanka Ringwald 7678ae886bSMilanka Ringwald SCAN_PARAMETERS_SERVICE_CLIENT_STATE_CONNECTED 7778ae886bSMilanka Ringwald } scan_parameters_service_client_state_t; 7878ae886bSMilanka Ringwald 7978ae886bSMilanka Ringwald 8078ae886bSMilanka Ringwald typedef struct { 8178ae886bSMilanka Ringwald btstack_linked_item_t item; 8278ae886bSMilanka Ringwald 8378ae886bSMilanka Ringwald hci_con_handle_t con_handle; 8478ae886bSMilanka Ringwald uint16_t cid; 8578ae886bSMilanka Ringwald scan_parameters_service_client_state_t state; 8678ae886bSMilanka Ringwald btstack_packet_handler_t client_handler; 8778ae886bSMilanka Ringwald 8878ae886bSMilanka Ringwald // service 8978ae886bSMilanka Ringwald uint16_t start_handle; 9078ae886bSMilanka Ringwald uint16_t end_handle; 9178ae886bSMilanka Ringwald 9278ae886bSMilanka Ringwald // characteristic 9378ae886bSMilanka Ringwald uint16_t scan_interval_window_value_handle; 94b3f0de51SMilanka Ringwald 95b3f0de51SMilanka Ringwald uint16_t scan_refresh_value_handle; 96b3f0de51SMilanka Ringwald uint16_t scan_refresh_end_handle; 97b3f0de51SMilanka Ringwald uint16_t scan_refresh_properties; 98b3f0de51SMilanka Ringwald 9978ae886bSMilanka Ringwald bool scan_interval_window_value_update; 100b3f0de51SMilanka Ringwald 101b3f0de51SMilanka Ringwald gatt_client_notification_t notification_listener; 10278ae886bSMilanka Ringwald } scan_parameters_service_client_t; 10378ae886bSMilanka Ringwald 10478ae886bSMilanka Ringwald /* API_START */ 10578ae886bSMilanka Ringwald 10678ae886bSMilanka Ringwald /** 10778ae886bSMilanka Ringwald * @brief Initialize Scan Parameters Service. 10878ae886bSMilanka Ringwald */ 10978ae886bSMilanka Ringwald void scan_parameters_service_client_init(void); 11078ae886bSMilanka Ringwald 11178ae886bSMilanka Ringwald /** 112b3f0de51SMilanka Ringwald * @brief Set Scan Parameters Service. It will update all connected devices. 113b3f0de51SMilanka Ringwald * @param scan_interval 114b3f0de51SMilanka Ringwald * @param scan_window 115b3f0de51SMilanka Ringwald */ 116b3f0de51SMilanka Ringwald void scan_parameters_service_client_set(uint16_t scan_interval, uint16_t scan_window); 117b3f0de51SMilanka Ringwald 118b3f0de51SMilanka Ringwald /** 11978ae886bSMilanka Ringwald * @brief Connect to Scan Parameters Service of remote device. 12078ae886bSMilanka Ringwald * 12178ae886bSMilanka Ringwald * The GATTSERVICE_SUBEVENT_SCAN_PARAMETERS_SERVICE_CONNECTED event completes the request. 12278ae886bSMilanka Ringwald * Its status is set to ERROR_CODE_SUCCESS if remote service and SCAN_INTERVAL_WINDOW characteristic are found. 123*7aa5195fSMatthias Ringwald * * 12478ae886bSMilanka Ringwald * Other status codes of this event: 12578ae886bSMilanka Ringwald * - GATT_CLIENT_IN_WRONG_STATE: client in wrong state 12678ae886bSMilanka Ringwald * - ERROR_CODE_UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE: service or characteristic not found 12778ae886bSMilanka Ringwald * - ATT errors, see bluetooth.h 12878ae886bSMilanka Ringwald * 129*7aa5195fSMatthias Ringwald * Connection state is stored in hids_client_t objects provided via memory pool 130*7aa5195fSMatthias Ringwald * Max number of connections is limited by MAX_NR_HIDS_CLIENTS unless HAVE_MALLOC is used 131*7aa5195fSMatthias Ringwald * 13278ae886bSMilanka Ringwald * @param con_handle 13378ae886bSMilanka Ringwald * @param packet_handler 13478ae886bSMilanka Ringwald * @param scan_parameters_cid 13578ae886bSMilanka Ringwald * @return status ERROR_CODE_SUCCESS on success, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER if client with con_handle not found 13678ae886bSMilanka Ringwald */ 13778ae886bSMilanka 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); 13878ae886bSMilanka Ringwald 13978ae886bSMilanka Ringwald /** 140b3f0de51SMilanka Ringwald * @brief Enable notifications 141b3f0de51SMilanka Ringwald * @param scan_parameters_cid 142b3f0de51SMilanka Ringwald * @return status ERROR_CODE_SUCCESS on success, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER if client with con_handle is not found 14378ae886bSMilanka Ringwald */ 144b3f0de51SMilanka Ringwald uint8_t scan_parameters_service_client_enable_notifications(uint16_t scan_parameters_cid); 14578ae886bSMilanka Ringwald 14678ae886bSMilanka Ringwald /** 14778ae886bSMilanka Ringwald * @brief Disconnect from Scan Parameters Service. 14878ae886bSMilanka Ringwald * @param scan_parameters_cid 14978ae886bSMilanka Ringwald * @return status ERROR_CODE_SUCCESS on success, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER if client with con_handle is not found 15078ae886bSMilanka Ringwald */ 15178ae886bSMilanka Ringwald uint8_t scan_parameters_service_client_disconnect(uint16_t scan_parameters_cid); 15278ae886bSMilanka Ringwald 15378ae886bSMilanka Ringwald 15478ae886bSMilanka Ringwald /** 15578ae886bSMilanka Ringwald * @brief De-initialize Scan Parameters Service. 15678ae886bSMilanka Ringwald */ 15778ae886bSMilanka Ringwald void scan_parameters_service_client_deinit(void); 15878ae886bSMilanka Ringwald 15978ae886bSMilanka Ringwald /* API_END */ 16078ae886bSMilanka Ringwald 16178ae886bSMilanka Ringwald #if defined __cplusplus 16278ae886bSMilanka Ringwald } 16378ae886bSMilanka Ringwald #endif 16478ae886bSMilanka Ringwald 16578ae886bSMilanka Ringwald #endif 166