GATT Human Interface Device Service (HIDS) Client
The HIDS Client uses the GATT Discovery Manager to acquire all attribute handles that are required to interact with the HIDS server.
Overview
Some additional data must be read from the discovered descriptors before the HIDS Client is ready.
This process is started automatically just after the handles are assigned.
If the process finishes successfully, the bt_hogp_ready_cb
function is called.
Otherwise, bt_hogp_prep_fail_cb
is called.
Configuration
Use the following Kconfig options to configure the library:
CONFIG_BT_HOGP
- Enable the library in the application build.CONFIG_BT_HOGP_REPORTS_MAX
- Set the maximum number of total reports supported by the library.The report memory is shared with all HIDS Client objects, so set this option to the maximum total number of reports supported by the application.
Usage
You can use the GATT HIDS Client library to interact with a connected HIDS server.
Retrieving the HIDS Client readiness state
The following functions are available to retrieve the readiness state of the service client object:
bt_hogp_assign_check()
- Check ifbt_hogp_handles_assign()
was called and the post-discovery process started.bt_hogp_ready_check()
- Check if the client object is ready to interact with the HIDS server. The ready flag is set just before thebt_hogp_ready_cb
function is called.
Reading the report map
To read the report map, call the bt_hogp_map_read()
function.
If the report map does not fit into a single PDU, call the function repeatedly with different offsets.
The HIDS report map interpretation implemented in the HIDS Client is not specifically supported.
Accessing the reports
To read or write a report, use one of the following functions:
To manage input report notifications, use the following functions:
The report size is always updated before the callback function is called while reading or notifying.
It can be obtained by calling bt_hogp_rep_size()
.
All report operations require a report info pointer as input. How to retrieve this pointer depends on whether you are processing a normal report or a boot report.
Call the bt_hogp_rep_next()
function to retrieve the report info pointer.
This function iterates through all detected reports (excluding boot reports).
Use the bt_hogp_rep_find()
function to find a specific report.
This function locates a report based on its type and ID.
If the connected device supports the boot protocol, it must have mouse or keyboard boot reports available. This means that:
For the mouse boot protocol, the function
bt_hogp_rep_boot_mouse_in()
returns a non-NULL value.For the keyboard boot protocol, the two functions
bt_hogp_rep_boot_kbd_in()
andbt_hogp_rep_boot_kbd_out()
return a non-NULL value.
All these functions return report pointers that may be used in the access functions.
However, these pointers cannot be used as a previous record pointer in bt_hogp_rep_next()
.
Changing protocol mode
To manage protocol modes, use the following functions:
bt_hogp_pm_write()
- Switch between Boot Protocol Mode and Report Protocol Mode.Every time the protocol mode is changed, the
bt_hogp_pm_update_cb
function is called.bt_hogp_pm_get()
- Retrieve the current protocol.This function returns the internally cached version of the current protocol mode.
bt_hogp_pm_update()
- Update the protocol mode value directly from the device.
Suspending and resuming
To suspend or resume the connected device, call the following functions:
bt_hogp_suspend()
- Suspend the connected device.bt_hogp_exit_suspend()
- Resume the connected device.
Samples using the library
The following nRF Connect SDK modules use this library:
The following nRF Connect SDK application uses this library:
Additional information
Do not access any of the values in the bt_hogp
object structure directly.
All values that should be accessed have accessor functions.
The structure is fully defined to allow the application to allocate the memory for it.
Dependencies
There are no dependencies for using this library.
API documentation
include/bluetooth/services/hogp.h
subsys/bluetooth/services/hogp.c
- group bt_hogp
API for the Bluetooth LE GATT HID Service (HIDS) Client.
Typedefs
-
typedef uint8_t (*bt_hogp_read_cb)(struct bt_hogp *hogp, struct bt_hogp_rep_info *rep, uint8_t err, const uint8_t *data)
Callback function that is called when a notification or read response is received.
This function is called when new data related to the given report object appears. The data size can be obtained from the report object from the bt_hogp_rep_info::size field.
- Param hogp:
HOGP object.
- Param rep:
Report object.
- Param err:
ATT error code.
- Param data:
Pointer to the received data.
- Retval BT_GATT_ITER_STOP:
Stop notification.
- Retval BT_GATT_ITER_CONTINUE:
Continue notification.
-
typedef void (*bt_hogp_write_cb)(struct bt_hogp *hogp, struct bt_hogp_rep_info *rep, uint8_t err)
Callback function that is called when a write response is received.
- Param hogp:
HOGP object.
- Param rep:
Report object.
- Param err:
ATT error code.
-
typedef void (*bt_hogp_ready_cb)(struct bt_hogp *hogp)
Callback function that is called when the HIDS client is ready.
When the bt_hogp_handles_assign function is called, the module starts reading all additional information it needs to work. When this process is finished, this callback function is called.
See also
bt_hogp_assign_error_cb
- Param hogp:
HOGP object.
-
typedef void (*bt_hogp_prep_fail_cb)(struct bt_hogp *hogp, int err)
Callback function that is called when an error is detected during HIDS client preparation.
When the bt_hogp_handles_assign function is called, the module starts reading all additional information it needs to work. If an error is detected during this process, this callback function is called.
See also
- Param hogp:
HOGP object.
- Param err:
Negative internal error code or positive ATT error code.
-
typedef void (*bt_hogp_map_cb)(struct bt_hogp *hogp, uint8_t err, const uint8_t *data, size_t size, size_t offset)
Callback function that is called when a chunk of a report map data is received.
- Param hogp:
HOGP object.
- Param err:
ATT error code.
- Param data:
Pointer to the data, or NULL if there is an error or no more data.
- Param size:
The size of the received data chunk.
- Param offset:
Current data chunk offset.
Functions
-
void bt_hogp_init(struct bt_hogp *hogp, const struct bt_hogp_init_params *params)
Initialize the HIDS client instance.
You must call this function on the HOGP object before any other function.
Note
This function clears the whole memory occupied by the object. Do not call it on the object in use.
- Parameters:
hogp – HOGP object.
params – Initialization parameters.
-
int bt_hogp_handles_assign(struct bt_gatt_dm *dm, struct bt_hogp *hogp)
Assign handlers to the HIDS client instance.
This function should be called when a link with a peer has been established, to associate the link to this instance of the module. This makes it possible to handle several links and associate each link to a particular instance of this module. The GATT attribute handles are provided by the GATT Discovery Manager.
Note
This function starts the report discovery process. Wait for one of the functions in bt_hogp_init_params before using the HIDS object.
- Parameters:
dm – Discovery object.
hogp – HOGP object.
- Return values:
0 – If the operation was successful. Otherwise, a (negative) error code is returned.
(-ENOTSUP) – Special error code used when the UUID of the service does not match the expected UUID.
-
void bt_hogp_release(struct bt_hogp *hogp)
Release the HIDS client instance.
This function releases all dynamic memory allocated by the HIDS client instance and clears all the instance data.
Note
Do not call this function on an instance that was not initialized (see bt_hogp_init). After the instance is initialized, it is safe to call this function multiple times.
- Parameters:
hogp – HOGP object.
-
void bt_hogp_abort_all(struct bt_hogp *hogp)
Abort all pending transfers.
Call this function only when the server is disconnected. Otherwise, if any read or write transfers are pending, the HOGP object might permanently return an EBUSY error on the following transfer attempts.
Note
This function disables transfers inside the HIDS client library. It does not abort any pending transfers in the Bluetooth LE stack.
- Parameters:
hogp – HOGP object.
-
bool bt_hogp_assign_check(const struct bt_hogp *hogp)
Check if the assignment function was called.
- Parameters:
hogp – HOGP object.
- Return values:
true – If the HIDS client has handlers assigned already.
false – If the HIDS client is released.
-
bool bt_hogp_ready_check(const struct bt_hogp *hogp)
Check if the HIDS client is ready to work.
Note
If bt_hogp_assign_check returns
true
while this function returnsfalse
, it means that initialization is in progress.- Parameters:
hogp – HOGP object.
- Return values:
true – If the HIDS client is ready to work.
false – If the HIDS client is not ready.
-
int bt_hogp_rep_read(struct bt_hogp *hogp, struct bt_hogp_rep_info *rep, bt_hogp_read_cb func)
Send a read request addressing the report value descriptor.
This function can be used on any type of report.
- Parameters:
hogp – HOGP object.
rep – Report object.
func – Function to be called to process the response.
- Return values:
0 – If the operation was successful. Otherwise, a (negative) error code is returned.
-
int bt_hogp_rep_write(struct bt_hogp *hogp, struct bt_hogp_rep_info *rep, bt_hogp_write_cb func, const void *data, uint8_t length)
Send a write request addressing the report value descriptor.
Note that In reports might not support this function. In this case, this function may succeed but pass an ATT error code to the callback function.
- Parameters:
hogp – HOGP object.
rep – Report object.
func – Function to be called to process the response.
data – Data to be sent.
length – Data size.
- Return values:
0 – If the operation was successful. Otherwise, a (negative) error code is returned.
-
int bt_hogp_rep_write_wo_rsp(struct bt_hogp *hogp, struct bt_hogp_rep_info *rep, const void *data, uint8_t length, bt_hogp_write_cb func)
Send a write command addressing the report value descriptor.
Note that in case of an error, no error response from the server is received. If the server cannot execute the command, it is just ignored.
- Parameters:
hogp – HOGP object.
rep – Report object.
data – Data to be sent.
length – Data size.
func – Function to be called when operation is completed.
- Return values:
0 – If the operation was successful. Otherwise, a (negative) error code is returned.
-
int bt_hogp_rep_subscribe(struct bt_hogp *hogp, struct bt_hogp_rep_info *rep, bt_hogp_read_cb func)
Subscribe to report notifications.
This function may be called only on Input type reports.
- Parameters:
hogp – HOGP object.
rep – Report object.
func – Function to be called to handle the notificated value.
- Return values:
0 – If the operation was successful. Otherwise, a (negative) error code is returned.
-
int bt_hogp_rep_unsubscribe(struct bt_hogp *hogp, struct bt_hogp_rep_info *rep)
Remove the subscription for a selected report.
- Parameters:
hogp – HOGP object.
rep – Report object.
- Return values:
0 – If the operation was successful. Otherwise, a (negative) error code is returned.
-
int bt_hogp_map_read(struct bt_hogp *hogp, bt_hogp_map_cb func, size_t offset, k_timeout_t timeout)
Read part of the report map.
This function sends a read request to the report map value. Depending on the
offset
, either read or read blob is sent.The report map might not fit into a single PDU. To read the whole map, call this function repeatedly with a different offset.
Note
This function uses the common read parameters structure inside the HIDS client object. This object may be used by other functions and is protected by semaphore.
- Parameters:
hogp – HOGP object.
func – Function to be called to process the response.
offset – Byte offset where to start data read.
timeout – Time-out for the common read structure usage.
- Return values:
0 – If the operation was successful. Otherwise, a (negative) error code is returned.
-
int bt_hogp_pm_update(struct bt_hogp *hogp, k_timeout_t timeout)
Read the current protocol mode from the server.
The callback is called when a read response is received.
See also
Note
Usually, the protocol mode value is read during HIDS client preparation, and its value is followed after that. This function may be used in an error recovery situation and should not be required in normal usage.
This function uses the common read parameters structure inside the HOGP object. This object may be used by other functions and is protected by semaphore.
- Parameters:
hogp – HOGP object.
timeout – Time-out for the common read structure usage.
- Return values:
0 – If the operation was successful. Otherwise, a (negative) error code is returned.
-
enum bt_hids_pm bt_hogp_pm_get(const struct bt_hogp *hogp)
Get the current protocol mode.
This function returns the protocol mode stored in the HOGP object. It does not generate any traffic on the radio.
- Parameters:
hogp – HOGP object.
- Returns:
Current protocol mode.
-
int bt_hogp_pm_write(struct bt_hogp *hogp, enum bt_hids_pm pm)
Set the current protocol mode.
This function sends a write command to the Protocol Mode value.
Note
For the Protocol Mode value, only Write Without Response is used, so there is no control over the real Protocol Mode value if the write does not succeed.
- Parameters:
hogp – HOGP object.
pm – Protocol mode to select.
- Return values:
0 – If the operation was successful. Otherwise, a (negative) error code is returned.
-
int bt_hogp_suspend(struct bt_hogp *hogp)
Suspend the device.
This function sends a SUSPEND command using the Control Point Characteristic. It should be called when the HOST enters SUSPEND state.
- Parameters:
hogp – HOGP object.
- Return values:
0 – If the operation was successful. Otherwise, a (negative) error code is returned.
-
int bt_hogp_exit_suspend(struct bt_hogp *hogp)
Exit suspend and resume.
This function is used to inform the device that the HOST exits SUSPEND state.
- Parameters:
hogp – HOGP object.
- Return values:
0 – If the operation was successful. Otherwise, a (negative) error code is returned.
-
struct bt_conn *bt_hogp_conn(const struct bt_hogp *hogp)
Get the connection object from the HIDS client.
This function gets the connection object that is used with a given HIDS client.
- Parameters:
hogp – HOGP object.
- Returns:
Connection object.
-
const struct bt_hids_info *bt_hogp_conn_info_val(const struct bt_hogp *hogp)
Access the HID information value.
This function accesses the structure with the decoded HID Information Characteristic value.
- Parameters:
hogp – HOGP object.
- Returns:
Pointer to the decoded HID information structure.
-
struct bt_hogp_rep_info *bt_hogp_rep_boot_kbd_in(struct bt_hogp *hogp)
Access boot keyboard input report.
- Parameters:
hogp – HOGP object.
- Returns:
The report pointer, or NULL if the device does not support boot keyboard protocol mode.
-
struct bt_hogp_rep_info *bt_hogp_rep_boot_kbd_out(struct bt_hogp *hogp)
Access boot keyboard output report.
- Parameters:
hogp – HOGP object.
- Returns:
The report pointer, or NULL if the device does not support boot keyboard protocol mode.
-
struct bt_hogp_rep_info *bt_hogp_rep_boot_mouse_in(struct bt_hogp *hogp)
Access boot mouse input report.
- Parameters:
hogp – HOGP object.
- Returns:
The report pointer, or NULL if the device does not support boot mouse protocol mode.
-
size_t bt_hogp_rep_count(const struct bt_hogp *hogp)
Get the number of HID reports in the device.
Note
This function does not take boot records into account. They can be accessed using separate functions.
- Parameters:
hogp – HOGP object.
- Returns:
The number of records.
-
struct bt_hogp_rep_info *bt_hogp_rep_next(struct bt_hogp *hogp, const struct bt_hogp_rep_info *rep)
Get the next report in the HOGP object.
- Parameters:
hogp – HOGP object.
rep – The record before the one to access, or NULL to access the first record.
- Returns:
The next report according to
rep
, or NULL if no more reports are available.
-
struct bt_hogp_rep_info *bt_hogp_rep_find(struct bt_hogp *hogp, enum bt_hids_report_type type, uint8_t id)
Find a report.
This function searches for a report with the given type and identifier.
- Parameters:
hogp – HOGP object.
type – The report type to find.
id – The identifier to find. Note that valid identifiers start from 1, but the value 0 may be used for devices that have one report of each type and there is no report ID inside the report map.
- Returns:
The report that was found, or NULL.
-
void bt_hogp_rep_user_data_set(struct bt_hogp_rep_info *rep, void *data)
Set user data in report.
- Parameters:
rep – Report object.
data – User data pointer to set.
-
void *bt_hogp_rep_user_data(const struct bt_hogp_rep_info *rep)
Get user data from report.
- Parameters:
rep – Report object.
- Returns:
User data pointer.
-
uint8_t bt_hogp_rep_id(const struct bt_hogp_rep_info *rep)
Get report identifier.
- Parameters:
rep – Report object.
- Returns:
Report identifier.
-
enum bt_hids_report_type bt_hogp_rep_type(const struct bt_hogp_rep_info *rep)
Get report type.
- Parameters:
rep – Report object.
- Returns:
Report type.
-
size_t bt_hogp_rep_size(const struct bt_hogp_rep_info *rep)
Get report size.
Note
You can rely on this function after completing the read procedure for your target HID report with the bt_hogp_rep_read API. The completion is reported by the appropriate callback. Alternatively, you can subscribe to your target report with bt_hogp_rep_subscribe API and start using the function below once you receive the first notification. In all other cases, the size information is not available.
- Parameters:
rep – Report object.
- Returns:
The size of the report or 0 if not available.
-
struct bt_hogp_init_params
- #include <hogp.h>
HIDS client parameters for the initialization function.
Public Members
-
bt_hogp_ready_cb ready_cb
Function to call when the HID client is ready.
-
bt_hogp_prep_fail_cb prep_error_cb
Function to call if HID preparation fails.
-
bt_hogp_pm_update_cb pm_update_cb
Function to call when the protocol mode is updated.
This function is called every time the protocol mode is read or written. The old value is not checked.
-
bt_hogp_ready_cb ready_cb
-
struct bt_hogp
- #include <hogp.h>
HOGP object.
Note
This structure is defined here to allow the user to allocate the memory for it in an application-dependent manner. Do not use any of the fields here directly, but use the accessor functions. There are accessors for every field you might need.
Public Members
-
struct bt_conn *conn
Connection object.
-
struct bt_hids_info info_val
HIDS client information.
-
bt_hogp_ready_cb ready_cb
Callback for HIDS client ready (see bt_hogp_ready_cb).
-
bt_hogp_prep_fail_cb prep_error_cb
Callback for HIDS client preparation failed.
-
bt_hogp_pm_update_cb pm_update_cb
Callback for protocol mode updated.
-
bt_hogp_map_cb map_cb
Callback for report map data chunk received.
-
struct bt_gatt_read_params read_params
Internal read parameters used when reading Protocol Mode or Report Map. This struct might also be used during initialization.
See also
-
struct k_sem read_params_sem
The semaphore for common read parameters protection.
This semaphore must be used when bt_hogp::read_params can be used.
-
uint8_t rep_idx
During the initialization process, all reports reference information is read. This structure helps tracking the current state of this process.
-
struct bt_hogp_rep_info *kbd_inp
Keyboard input boot report. Input and Output keyboard reports come in pairs. It is not valid that only one of the keyboard reports is present.
-
struct bt_hogp_rep_info *kbd_out
Keyboard output boot report. Input and Output keyboard reports come in pairs. It is not valid that only one of the keyboard reports is present.
-
struct bt_hogp_rep_info *mouse_inp
Mouse input boot report.
-
struct bt_hogp_rep_info **rep_info
Array of report information structures.
-
uint8_t rep_count
Number of records.
-
bool ready
Current state.
-
enum bt_hids_pm pm
Current protocol mode.
-
struct bt_hogp_handlers
- #include <hogp.h>
Handlers for descriptors
-
struct bt_conn *conn
-
typedef uint8_t (*bt_hogp_read_cb)(struct bt_hogp *hogp, struct bt_hogp_rep_info *rep, uint8_t err, const uint8_t *data)