diff options
author | Pete Johanson <peter@peterjohanson.com> | 2020-06-29 00:37:11 -0400 |
---|---|---|
committer | Pete Johanson <peter@peterjohanson.com> | 2020-07-17 22:43:40 -0400 |
commit | 3796f76c56d42ca9b4fd36edae7f6bf6656009b9 (patch) | |
tree | 367eaa4b9c7b80c1e0d8a5f196668c2c911a4137 /app/src | |
parent | f6110a632d0ddbc0a9ebd7bfd4997366f95facfd (diff) |
Initial exploration of split BLE service.
* Service for split peripheral to report
position state to split central.
* Updated advertising info.
* Behavior for split BT until we have a proper
event system.
Diffstat (limited to 'app/src')
-rw-r--r-- | app/src/ble.c | 7 | ||||
-rw-r--r-- | app/src/split/bluetooth/service.c | 49 | ||||
-rw-r--r-- | app/src/split_listener.c | 36 |
3 files changed, 91 insertions, 1 deletions
diff --git a/app/src/ble.c b/app/src/ble.c index c0e81a9..94a23da 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -12,6 +12,7 @@ #include <bluetooth/gatt.h> #include <zmk/keys.h> +#include <zmk/split/bluetooth/service.h> static struct bt_conn *auth_passkey_entry_conn; static u8_t passkey_entries[6] = {0, 0, 0, 0, 0, 0}; @@ -121,9 +122,13 @@ static struct bt_conn_auth_cb zmk_ble_auth_cb_display = { static const struct bt_data zmk_ble_ad[] = { BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)), - BT_DATA_BYTES(BT_DATA_UUID16_ALL, + BT_DATA_BYTES(BT_DATA_UUID16_SOME, 0x12, 0x18, /* HID Service */ 0x0f, 0x18), /* Battery Service */ +#if IS_ENABLED(CONFIG_ZMK_SPLIT_BLE) + BT_DATA_BYTES(BT_DATA_UUID128_SOME, + ZMK_SPLIT_BT_SERVICE_UUID) +#endif }; static void zmk_ble_ready(int err) diff --git a/app/src/split/bluetooth/service.c b/app/src/split/bluetooth/service.c new file mode 100644 index 0000000..a669723 --- /dev/null +++ b/app/src/split/bluetooth/service.c @@ -0,0 +1,49 @@ + +#include <zephyr/types.h> +#include <sys/util.h> +#include <bluetooth/gatt.h> + +#include <zmk/matrix.h> +#include <zmk/split/bluetooth/service.h> + +static u8_t num_of_positions = ZMK_KEYMAP_LEN; +static u8_t position_state[16]; + +static ssize_t split_svc_pos_state(struct bt_conn *conn, const struct bt_gatt_attr *attrs, void *buf, u16_t len, u16_t offset) +{ + return bt_gatt_attr_read(conn, attrs, buf, len, offset, &position_state, sizeof(position_state)); +} + +static ssize_t split_svc_num_of_positions(struct bt_conn *conn, const struct bt_gatt_attr *attrs, void *buf, u16_t len, u16_t offset) +{ + return bt_gatt_attr_read(conn, attrs, buf, len, offset, attrs->user_data, sizeof(u8_t)); +} + +static void split_svc_pos_state_ccc(const struct bt_gatt_attr *attr, u16_t value) +{ +} + + +BT_GATT_SERVICE_DEFINE(split_svc, + BT_GATT_PRIMARY_SERVICE(ZMK_BT_UUID_SPLIT), + BT_GATT_CHARACTERISTIC(ZMK_BT_UUID_SPLIT_POS_STATE, BT_GATT_CHRC_READ | BT_GATT_CHRC_NOTIFY, + BT_GATT_PERM_READ_ENCRYPT, + split_svc_pos_state, NULL, &position_state), + BT_GATT_CCC(split_svc_pos_state_ccc, + BT_GATT_PERM_READ_ENCRYPT | BT_GATT_PERM_WRITE_ENCRYPT), + BT_GATT_DESCRIPTOR(BT_UUID_NUM_OF_DIGITALS, BT_GATT_PERM_READ, + split_svc_num_of_positions, NULL, &num_of_positions), +); + +int zmk_split_bt_position_pressed(u8_t position) +{ + WRITE_BIT(position_state[position / 8], position % 8, true); + return bt_gatt_notify(NULL, &split_svc.attrs[1], &position_state, sizeof(position_state)); +} + +int zmk_split_bt_position_released(u8_t position) +{ + WRITE_BIT(position_state[position / 8], position % 8, false); + // WRITE_BIT(position_state, position, false); + return bt_gatt_notify(NULL, &split_svc.attrs[1], &position_state, sizeof(position_state)); +}
\ No newline at end of file diff --git a/app/src/split_listener.c b/app/src/split_listener.c new file mode 100644 index 0000000..65f835a --- /dev/null +++ b/app/src/split_listener.c @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2020 Peter Johanson <peter@peterjohanson.com> + * + * SPDX-License-Identifier: MIT + */ + +#define DT_DRV_COMPAT zmk_split_listener + +#include <device.h> +#include <power/reboot.h> +#include <logging/log.h> + +#include <zmk/split/bluetooth/service.h> + +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +#include <zmk/event-manager.h> +#include <zmk/events/position-state-changed.h> +#include <zmk/hid.h> +#include <zmk/endpoints.h> + +int split_listener(const struct zmk_event_header *eh) +{ + if (is_position_state_changed(eh)) { + const struct position_state_changed *ev = cast_position_state_changed(eh); + if (ev->state) { + zmk_split_bt_position_pressed(ev->position); + } else { + zmk_split_bt_position_released(ev->position); + } + } + return 0; +} + +ZMK_LISTENER(split_listener, split_listener); +ZMK_SUBSCRIPTION(split_listener, position_state_changed);
\ No newline at end of file |