Skip to content

Commit d0ee30b

Browse files
authored
Testing: split ble encoder test (zmkfirmware#2754)
test(sensors): Add mock encoder sensor Add a new mock sensor driver for generating mock encoder sensor channel data. test(split): Add a peripheral sensor split test Test BLE split logic for peripheral sensors (encoders).
1 parent 3377ed0 commit d0ee30b

File tree

13 files changed

+235
-0
lines changed

13 files changed

+235
-0
lines changed

app/module/drivers/sensor/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,5 @@
44
add_subdirectory_ifdef(CONFIG_ZMK_BATTERY battery)
55
add_subdirectory_ifdef(CONFIG_EC11 ec11)
66
add_subdirectory_ifdef(CONFIG_ZMK_MAX17048 max17048)
7+
8+
add_subdirectory_ifdef(CONFIG_ZMK_SENSOR_ENCODER_MOCK encoder_mock)

app/module/drivers/sensor/Kconfig

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,6 @@ rsource "battery/Kconfig"
77
rsource "ec11/Kconfig"
88
rsource "max17048/Kconfig"
99

10+
rsource "encoder_mock/Kconfig"
11+
1012
endif # SENSOR
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# Copyright (c) 2024 The ZMK Contributors
2+
# SPDX-License-Identifier: MIT
3+
4+
zephyr_include_directories(.)
5+
6+
zephyr_library()
7+
8+
zephyr_library_sources(encoder_mock.c)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# Copyright (c) 2024 The ZMK Contributors
2+
# SPDX-License-Identifier: MIT
3+
4+
config ZMK_SENSOR_ENCODER_MOCK
5+
bool "Mock Encoder Sensor"
6+
default y
7+
depends on DT_HAS_ZMK_SENSOR_ENCODER_MOCK_ENABLED
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
/*
2+
* Copyright (c) 2024 The ZMK Contributors
3+
*
4+
* SPDX-License-Identifier: MIT
5+
*/
6+
7+
#define DT_DRV_COMPAT zmk_sensor_encoder_mock
8+
9+
#include <stdlib.h>
10+
#include <zephyr/device.h>
11+
#include <zephyr/drivers/sensor.h>
12+
#include <zephyr/kernel.h>
13+
#include <zephyr/logging/log.h>
14+
15+
LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
16+
17+
struct enc_mock_config {
18+
uint16_t startup_delay;
19+
uint16_t event_period;
20+
bool exit_after;
21+
const int16_t *events;
22+
size_t events_len;
23+
};
24+
25+
struct enc_mock_data {
26+
const struct sensor_trigger *trigger;
27+
sensor_trigger_handler_t handler;
28+
29+
size_t event_index;
30+
struct k_work_delayable work;
31+
const struct device *dev;
32+
};
33+
34+
static void enc_mock_work_cb(struct k_work *work) {
35+
struct k_work_delayable *dwork = CONTAINER_OF(work, struct k_work_delayable, work);
36+
struct enc_mock_data *data = CONTAINER_OF(dwork, struct enc_mock_data, work);
37+
38+
const struct device *dev = data->dev;
39+
40+
data->handler(dev, data->trigger);
41+
}
42+
43+
static int enc_mock_trigger_set(const struct device *dev, const struct sensor_trigger *trig,
44+
sensor_trigger_handler_t handler) {
45+
struct enc_mock_data *drv_data = dev->data;
46+
const struct enc_mock_config *drv_cfg = dev->config;
47+
48+
drv_data->trigger = trig;
49+
drv_data->handler = handler;
50+
51+
int ret = k_work_schedule(&drv_data->work, K_MSEC(drv_cfg->startup_delay));
52+
if (ret < 0) {
53+
LOG_WRN("Failed to schedule next mock sensor event %d", ret);
54+
return ret;
55+
}
56+
57+
return 0;
58+
}
59+
60+
static int enc_mock_sample_fetch(const struct device *dev, enum sensor_channel chan) {
61+
struct enc_mock_data *drv_data = dev->data;
62+
const struct enc_mock_config *drv_cfg = dev->config;
63+
64+
drv_data->event_index++;
65+
66+
if (drv_data->event_index < drv_cfg->events_len - 1) {
67+
k_work_schedule(&drv_data->work, K_MSEC(drv_cfg->event_period));
68+
} else if (drv_cfg->exit_after) {
69+
exit(0);
70+
}
71+
return 0;
72+
}
73+
74+
static int enc_mock_channel_get(const struct device *dev, enum sensor_channel chan,
75+
struct sensor_value *val) {
76+
struct enc_mock_data *drv_data = dev->data;
77+
const struct enc_mock_config *drv_cfg = dev->config;
78+
79+
val->val1 = drv_cfg->events[drv_data->event_index];
80+
81+
return 0;
82+
}
83+
84+
static const struct sensor_driver_api enc_mock_driver_api = {
85+
.trigger_set = enc_mock_trigger_set,
86+
.sample_fetch = enc_mock_sample_fetch,
87+
.channel_get = enc_mock_channel_get,
88+
};
89+
90+
int enc_mock_init(const struct device *dev) {
91+
struct enc_mock_data *drv_data = dev->data;
92+
93+
drv_data->dev = dev;
94+
drv_data->event_index = -1;
95+
96+
k_work_init_delayable(&drv_data->work, enc_mock_work_cb);
97+
98+
return 0;
99+
}
100+
101+
#define ENC_MOCK_INST(n) \
102+
struct enc_mock_data enc_mock_data_##n = {}; \
103+
const int16_t mock_data_##n[] = DT_INST_PROP(n, events); \
104+
const struct enc_mock_config enc_mock_cfg_##n = { \
105+
.events = mock_data_##n, \
106+
.events_len = DT_INST_PROP_LEN(n, events), \
107+
.startup_delay = DT_INST_PROP(n, event_startup_delay), \
108+
.event_period = DT_INST_PROP(n, event_period), \
109+
.exit_after = DT_INST_PROP(n, exit_after), \
110+
}; \
111+
DEVICE_DT_INST_DEFINE(n, enc_mock_init, NULL, &enc_mock_data_##n, &enc_mock_cfg_##n, \
112+
POST_KERNEL, CONFIG_SENSOR_INIT_PRIORITY, &enc_mock_driver_api);
113+
114+
DT_INST_FOREACH_STATUS_OKAY(ENC_MOCK_INST)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Copyright (c) 2024 The ZMK Contributors
2+
# SPDX-License-Identifier: MIT
3+
4+
description: |
5+
Allows defining a mock sensor driver that simulates periodic encoder rotation events.
6+
7+
compatible: "zmk,sensor-encoder-mock"
8+
9+
properties:
10+
event-startup-delay:
11+
type: int
12+
default: 0
13+
description: Milliseconds to delay before starting generating the events
14+
event-period:
15+
type: int
16+
description: Milliseconds between each generated event
17+
events:
18+
type: array
19+
description: List of angle events to generate
20+
exit-after:
21+
type: boolean
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
s/^d_02: @[0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9][0-9][0-9][0-9] .{19}/profile 0 /p
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
CONFIG_ZMK_SPLIT=y
2+
CONFIG_SENSOR=y
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#include <behaviors.dtsi>
2+
#include <dt-bindings/zmk/bt.h>
3+
#include <dt-bindings/zmk/keys.h>
4+
5+
#include "shared.dtsi"
6+
7+
&kscan {
8+
/delete-property/ exit-after;
9+
events = <>;
10+
};
11+
/ {
12+
keymap {
13+
compatible = "zmk,keymap";
14+
15+
default_layer {
16+
bindings = <
17+
&kp A &kp B
18+
&bt BT_SEL 0 &bt BT_CLR>;
19+
20+
sensor-bindings = <&inc_dec_kp A B>;
21+
};
22+
};
23+
};
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
2+
#include <dt-bindings/zmk/kscan_mock.h>
3+
4+
#include "shared.dtsi"
5+
6+
&kscan {
7+
events = <>;
8+
9+
/delete-property/ exit-after;
10+
};
11+
12+
&mock_encoder {
13+
status = "okay";
14+
15+
event-startup-delay = <2000>;
16+
event-period = <2000>;
17+
events = <18 (-18)>;
18+
};

0 commit comments

Comments
 (0)