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