kindlebt
Bluetooth functionality for Kindle 11th gen and up
Loading...
Searching...
No Matches
kindlebt.c
1#include <kindlebt/kindlebt.h>
2
3#include <pthread.h>
4#include <stdbool.h>
5
6#include <ace/bluetooth_ble_api.h>
7#include <ace/bluetooth_ble_gatt_client_api.h>
8#include <ace/bluetooth_common_api.h>
9#include <ace/bluetooth_session_api.h>
10
11#include "log.h"
12
13#include <kindlebt/compat_ace.h>
15
16#include "kindlebt_callbacks.c"
17
18static bleCallbacks_t ble_callbacks = {
19 .size = sizeof(bleCallbacks_t),
20 .common_cbs =
21 {
22 .size = sizeof(commonCallbacks_t),
23 .adapter_state_cb = adapterStateCallback,
24 .bond_state_cb = bondStateCallback,
25 },
26 .ble_registered_cb = bleRegCallback,
27 .connection_state_change_cb = bleConnStateChangedCallback,
28 .on_ble_mtu_updated_cb = bleMtuUpdatedCallback,
29};
30
31static bleGattClientCallbacks_t gatt_client_callbacks = {
32 .size = sizeof(bleGattClientCallbacks_t),
33 .on_ble_gattc_service_discovered_cb = bleGattcServiceDiscoveredCallbackWrapper,
34 .on_ble_gattc_get_gatt_db_cb = bleGattcGetDbCallbackWrapper,
35 .notify_characteristics_cb = bleGattcNotifyCharsCallbackWrapper,
36 .on_ble_gattc_read_characteristics_cb = bleGattcReadCharsCallbackWrapper,
37 .on_ble_gattc_write_characteristics_cb = bleGattcWriteCharsCallbackWrapper,
38};
39
40bool isBLESupported(void) { return aceBT_isBLESupported(); };
41
42status_t enableRadio(sessionHandle session_handle) { return aceBT_enableRadio(session_handle); }
43status_t disableRadio(sessionHandle session_handle) { return aceBT_disableRadio(session_handle); }
44status_t getRadioState(state_t* p_out_state) { return aceBT_getRadioState(p_out_state); }
45
46sessionType_t getSupportedSession(void) { return aceBT_getSupportedSession(); }
47
48status_t openSession(sessionType_t session_type, sessionHandle* session_handle) {
49 return aceBT_openSession(session_type, NULL, session_handle);
50}
51
52status_t closeSession(sessionHandle session_handle) { return aceBT_closeSession(session_handle); }
53
55 if (callback_vars.ble_registered) {
56 log_warn("BLE is already registered\n");
57 return ACE_STATUS_OK;
58 }
59
60 status_t ble_status = aceBT_bleRegister(session_handle, &ble_callbacks);
61 if (ble_status != ACE_STATUS_OK) return ble_status;
62
63 return waitForCondition(
64 &callback_vars_lock, &callback_vars_cond, &callback_vars.ble_registered
65 );
66}
67
69 status_t ble_status = aceBT_bleDeRegister(session_handle);
70 if (ble_status != ACE_STATUS_OK) return ble_status;
71
72 setCallbackVariable(
73 &callback_vars_lock, &callback_vars_cond, &callback_vars.ble_registered, false
74 );
75
76 return ble_status;
77}
78
80 // If provided a callback struct, replace the local copy
81 // Applications can also just set the application callback directly
82 if (callbacks != NULL) {
83 application_gatt_client_callbacks = *callbacks;
84 }
85
86 return shim_bleRegisterGattClient(
87 session_handle, &gatt_client_callbacks, ACE_BT_BLE_APPID_GADGETS
88 );
89}
90
92 return shim_bleDeregisterGattClient(session_handle);
93}
94
96 status_t services_status = shim_bleDiscoverAllServices(session_handle, conn_handle);
97 if (services_status != ACE_STATUS_OK) return services_status;
98
99 status_t cond_status =
100 waitForCondition(&callback_vars_lock, &callback_vars_cond, &callback_vars.gattc_discovered);
101
102 return cond_status;
103}
104
106 status_t db_status = shim_bleGetDatabase(conn_handle);
107 if (db_status != ACE_STATUS_OK) return db_status;
108
109 status_t cond_status =
110 waitForCondition(&callback_vars_lock, &callback_vars_cond, &callback_vars.got_gatt_db);
111
112 if (cond_status == ACE_STATUS_OK) p_gatt_service = pGgatt_service;
113
114 return cond_status;
115}
116
118 bleGattsService_t** dst_gatt_service, const bleGattsService_t* src_gatt_service, int no_svc
119) {
120 return aceBT_bleCloneGattService(dst_gatt_service, src_gatt_service, no_svc);
121}
122
124 sessionHandle session_handle, bleConnHandle* conn_handle, bdAddr_t* p_device,
125 bleConnParam_t conn_param, bleConnRole_t conn_role, bleConnPriority_t conn_priority
126) {
127 status_t conn_status =
128 aceBt_bleConnect(session_handle, p_device, conn_param, conn_role, false, conn_priority);
129 if (conn_status != ACE_STATUS_OK) return conn_status;
130
131 status_t cond_status =
132 waitForCondition(&callback_vars_lock, &callback_vars_cond, &callback_vars.gattc_connected);
133
134 if (cond_status == ACE_STATUS_OK) *conn_handle = ble_conn_handle;
135
136 return cond_status;
137}
138
139status_t bleDisconnect(bleConnHandle conn_handle) { return aceBT_bleDisconnect(conn_handle); }
140
142 sessionHandle session_handle, bleConnHandle conn_handle,
144) {
145 return shim_bleReadCharacteristic(session_handle, conn_handle, chars_value);
146}
147
149 sessionHandle session_handle, bleConnHandle conn_handle,
150 bleGattCharacteristicsValue_t* chars_value, responseType_t request_type
151) {
152 return shim_bleWriteCharacteristic(session_handle, conn_handle, chars_value, request_type);
153}
154
156 sessionHandle session_handle, bleConnHandle conn_handle,
157 bleGattCharacteristicsValue_t* chars_value, responseType_t request_type
158) {
159 return shim_bleWriteDescriptor(session_handle, conn_handle, chars_value, request_type);
160}
161
163 sessionHandle session_handle, bleConnHandle conn_handle,
164 bleGattCharacteristicsValue_t chars_value, bool enable
165) {
166 return shim_bleSetNotification(session_handle, conn_handle, chars_value, enable);
167}
aceBt_bleConnParam_t bleConnParam_t
BLE connection parameters.
aceBT_bleGattClientCallbacks_t bleGattClientCallbacks_t
Callback struct of GATT Client Bluetooth operations.
aceBT_state_t state_t
Bluetooth radio state.
aceBT_responseType_t responseType_t
Type of write operation for a BLE characteristic.
aceBT_bleCallbacks_t bleCallbacks_t
Callback struct of LE Bluetooth operations.
aceBT_bdAddr_t bdAddr_t
Bluetooth address.
ace_status_t status_t
Bluetooth API status codes.
aceBT_bleConnRole_t bleConnRole_t
BLE connection role.
aceBT_bleGattsService_t bleGattsService_t
Structure for a GATT Server service.
aceBT_bleConnHandle bleConnHandle
Connection handle for the lifetime of a Bluetooth connection.
aceBt_bleConnPriority_t bleConnPriority_t
BLE connection priority.
aceBT_commonCallbacks_t commonCallbacks_t
Callback struct of common Classic/LE Bluetooth operations.
aceBT_sessionHandle sessionHandle
Session handle for the lifetime of the Bluetooth application.
aceBT_bleGattCharacteristicsValue_t bleGattCharacteristicsValue_t
BLE GATT Characteristic.
aceBT_sessionType_t sessionType_t
Bluetooth session type (Classic, Low Energy, Dual)
status_t enableRadio(sessionHandle session_handle)
Turn on the Bluetooth radio.
Definition kindlebt.c:42
status_t bleWriteDescriptor(sessionHandle session_handle, bleConnHandle conn_handle, bleGattCharacteristicsValue_t *chars_value, responseType_t request_type)
Write a Characteristic Descriptor from a BLE device.
Definition kindlebt.c:155
status_t disableRadio(sessionHandle session_handle)
Turn off the Bluetooth radio.
Definition kindlebt.c:43
status_t bleWriteCharacteristic(sessionHandle session_handle, bleConnHandle conn_handle, bleGattCharacteristicsValue_t *chars_value, responseType_t request_type)
Write a Characteristic from a BLE device.
Definition kindlebt.c:148
status_t getRadioState(state_t *p_out_state)
Get current radio status.
Definition kindlebt.c:44
status_t bleGetDatabase(bleConnHandle conn_handle, bleGattsService_t *p_gatt_service)
Retrieve all services of a remote GATT Server.
Definition kindlebt.c:105
status_t openSession(sessionType_t session_type, sessionHandle *session_handle)
Open a Bluetooth session.
Definition kindlebt.c:48
status_t bleRegisterGattClient(sessionHandle session_handle, bleGattClientCallbacks_t *callbacks)
Register as a BLE GATT Client.
Definition kindlebt.c:79
status_t bleRegister(sessionHandle session_handle)
Register as BLE client.
Definition kindlebt.c:54
status_t bleSetNotification(sessionHandle session_handle, bleConnHandle conn_handle, bleGattCharacteristicsValue_t chars_value, bool enable)
Set notifications on a Characteristic from a BLE device.
Definition kindlebt.c:162
status_t closeSession(sessionHandle session_handle)
Close a Bluetooth session.
Definition kindlebt.c:52
status_t bleDeregister(sessionHandle session_handle)
Deregister as BLE client.
Definition kindlebt.c:68
bool isBLESupported(void)
Is BLE supported by the hardware Bluetooth adapter.
Definition kindlebt.c:40
status_t bleReadCharacteristic(sessionHandle session_handle, bleConnHandle conn_handle, bleGattCharacteristicsValue_t chars_value)
Read a Characteristic from a BLE device.
Definition kindlebt.c:141
status_t bleDiscoverAllServices(sessionHandle session_handle, bleConnHandle conn_handle)
Discover all services of a remote GATT Server.
Definition kindlebt.c:95
status_t bleConnect(sessionHandle session_handle, bleConnHandle *conn_handle, bdAddr_t *p_device, bleConnParam_t conn_param, bleConnRole_t conn_role, bleConnPriority_t conn_priority)
Connect to a BLE device.
Definition kindlebt.c:123
status_t bleDisconnect(bleConnHandle conn_handle)
Disconnect from a BLE device.
Definition kindlebt.c:139
status_t bleDeregisterGattClient(sessionHandle session_handle)
Deregister as a BLE GATT Client.
Definition kindlebt.c:91
sessionType_t getSupportedSession(void)
Gets the supported Bluetooth session type (Classic, BLE, Dual).
Definition kindlebt.c:46
Bluetooth library for Kindles.
status_t bleCloneGattService(bleGattsService_t **dst_gatt_service, const bleGattsService_t *src_gatt_service, int no_svc)
[Internal] Clone a GATT Service
Definition kindlebt.c:117
Internal definitions.
bleConnHandle ble_conn_handle
Internal BLE connection handle.
bleGattsService_t * pGgatt_service
Internal reference to a GATT service.
bleCallbackVars_t callback_vars
Internal bleCallbackVars_t.