summaryrefslogtreecommitdiff
path: root/app/src
diff options
context:
space:
mode:
authorPete Johanson <peter@peterjohanson.com>2020-06-29 00:37:11 -0400
committerPete Johanson <peter@peterjohanson.com>2020-07-17 22:43:40 -0400
commit3796f76c56d42ca9b4fd36edae7f6bf6656009b9 (patch)
tree367eaa4b9c7b80c1e0d8a5f196668c2c911a4137 /app/src
parentf6110a632d0ddbc0a9ebd7bfd4997366f95facfd (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.c7
-rw-r--r--app/src/split/bluetooth/service.c49
-rw-r--r--app/src/split_listener.c36
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