xref: /btstack/src/ble/gatt-service/scan_parameters_service_client.h (revision 7aa5195fa4e273d13737d85f8ad3e87aade1e700)
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