This commit is contained in:
snoyer 2024-06-25 13:16:57 -05:00 committed by GitHub
commit 9a12fd81db
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 66 additions and 12 deletions

View file

@ -4,9 +4,21 @@ The nice!view is a low-power, high refresh rate display meant to replace I2C OLE
This shield requires that an `&nice_view_spi` labeled SPI bus is provided with _at least_ MOSI, SCK, and CS pins defined.
## Custom widget
The nice!view shield includes a custom vertical widget.
Profile indicators show the status of the first five BLE profiles using numbers from 1 to 5.
The number corresponding to the currently selected profile is drawn in a filled disk
and the circle outline around each profile number correspond to the following states:
- solid outline: connected
- dashed outline: not connected
- no outline: not bound
## Disable custom widget
The nice!view shield includes a custom vertical widget. To use the built-in ZMK one, add the following item to your `.conf` file:
To use the built-in ZMK widget instead of the custom nice!view one, add the following item to your `.conf` file:
```
CONFIG_ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN=y

View file

@ -1,6 +1,6 @@
/*
*
* Copyright (c) 2023 The ZMK Contributors
* Copyright (c) 2024 The ZMK Contributors
* SPDX-License-Identifier: MIT
*
*/
@ -33,6 +33,8 @@ struct output_status_state {
int active_profile_index;
bool active_profile_connected;
bool active_profile_bonded;
bool profiles_connected[NICEVIEW_PROFILE_COUNT];
bool profiles_bonded[NICEVIEW_PROFILE_COUNT];
};
struct layer_status_state {
@ -142,15 +144,24 @@ static void draw_middle(lv_obj_t *widget, lv_color_t cbuf[], const struct status
lv_canvas_draw_rect(canvas, 0, 0, CANVAS_SIZE, CANVAS_SIZE, &rect_black_dsc);
// Draw circles
int circle_offsets[5][2] = {
int circle_offsets[NICEVIEW_PROFILE_COUNT][2] = {
{13, 13}, {55, 13}, {34, 34}, {13, 55}, {55, 55},
};
for (int i = 0; i < 5; i++) {
for (int i = 0; i < NICEVIEW_PROFILE_COUNT; i++) {
bool selected = i == state->active_profile_index;
lv_canvas_draw_arc(canvas, circle_offsets[i][0], circle_offsets[i][1], 13, 0, 360,
&arc_dsc);
if (state->profiles_connected[i]) {
lv_canvas_draw_arc(canvas, circle_offsets[i][0], circle_offsets[i][1], 13, 0, 360,
&arc_dsc);
} else if (state->profiles_bonded[i]) {
const int segments = 8;
const int gap = 20;
for (int j = 0; j < segments; ++j)
lv_canvas_draw_arc(canvas, circle_offsets[i][0], circle_offsets[i][1], 13,
360. / segments * j + gap / 2.0,
360. / segments * (j + 1) - gap / 2.0, &arc_dsc);
}
if (selected) {
lv_canvas_draw_arc(canvas, circle_offsets[i][0], circle_offsets[i][1], 9, 0, 359,
@ -234,6 +245,10 @@ static void set_output_status(struct zmk_widget_status *widget,
widget->state.active_profile_index = state->active_profile_index;
widget->state.active_profile_connected = state->active_profile_connected;
widget->state.active_profile_bonded = state->active_profile_bonded;
for (int i = 0; i < NICEVIEW_PROFILE_COUNT; ++i) {
widget->state.profiles_connected[i] = state->profiles_connected[i];
widget->state.profiles_bonded[i] = state->profiles_bonded[i];
}
draw_top(widget->obj, widget->cbuf, &widget->state);
draw_middle(widget->obj, widget->cbuf2, &widget->state);
@ -245,12 +260,18 @@ static void output_status_update_cb(struct output_status_state state) {
}
static struct output_status_state output_status_get_state(const zmk_event_t *_eh) {
return (struct output_status_state){
struct output_status_state state = {
.selected_endpoint = zmk_endpoints_selected(),
.active_profile_index = zmk_ble_active_profile_index(),
.active_profile_connected = zmk_ble_active_profile_is_connected(),
.active_profile_bonded = !zmk_ble_active_profile_is_open(),
};
for (int i = 0; i < MIN(NICEVIEW_PROFILE_COUNT, ZMK_BLE_PROFILE_COUNT); ++i) {
const bt_addr_le_t *addr = zmk_ble_profile_address(i);
state.profiles_connected[i] = zmk_ble_profile_is_connected(addr);
state.profiles_bonded[i] = !zmk_ble_profile_is_open(addr);
}
return state;
}
ZMK_DISPLAY_WIDGET_LISTENER(widget_output_status, struct output_status_state,

View file

@ -1,6 +1,6 @@
/*
*
* Copyright (c) 2023 The ZMK Contributors
* Copyright (c) 2024 The ZMK Contributors
* SPDX-License-Identifier: MIT
*
*/
@ -8,6 +8,8 @@
#include <lvgl.h>
#include <zmk/endpoints.h>
#define NICEVIEW_PROFILE_COUNT 5
#define CANVAS_SIZE 68
#define LVGL_BACKGROUND \
@ -23,6 +25,8 @@ struct status_state {
int active_profile_index;
bool active_profile_connected;
bool active_profile_bonded;
bool profiles_connected[NICEVIEW_PROFILE_COUNT];
bool profiles_bonded[NICEVIEW_PROFILE_COUNT];
uint8_t layer_index;
const char *layer_label;
uint8_t wpm[10];

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2020 The ZMK Contributors
* Copyright (c) 2024 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
@ -29,8 +29,11 @@ int zmk_ble_prof_disconnect(uint8_t index);
int zmk_ble_active_profile_index(void);
int zmk_ble_profile_index(const bt_addr_le_t *addr);
bt_addr_le_t *zmk_ble_profile_address(uint8_t index);
bt_addr_le_t *zmk_ble_active_profile_addr(void);
bool zmk_ble_profile_is_open(const bt_addr_le_t *addr);
bool zmk_ble_active_profile_is_open(void);
bool zmk_ble_profile_is_connected(const bt_addr_le_t *addr);
bool zmk_ble_active_profile_is_connected(void);
char *zmk_ble_active_profile_name(void);

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2020 The ZMK Contributors
* Copyright (c) 2024 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
@ -94,7 +94,11 @@ static void raise_profile_changed_event_callback(struct k_work *work) {
K_WORK_DEFINE(raise_profile_changed_event_work, raise_profile_changed_event_callback);
bool zmk_ble_active_profile_is_open(void) {
return !bt_addr_le_cmp(&profiles[active_profile].peer, BT_ADDR_LE_ANY);
return zmk_ble_profile_is_open(zmk_ble_active_profile_addr());
}
bool zmk_ble_profile_is_open(const bt_addr_le_t *addr) {
return !bt_addr_le_cmp(addr, BT_ADDR_LE_ANY);
}
void set_profile_address(uint8_t index, const bt_addr_le_t *addr) {
@ -113,9 +117,12 @@ void set_profile_address(uint8_t index, const bt_addr_le_t *addr) {
}
bool zmk_ble_active_profile_is_connected(void) {
return zmk_ble_profile_is_connected(zmk_ble_active_profile_addr());
}
bool zmk_ble_profile_is_connected(const bt_addr_le_t *addr) {
struct bt_conn *conn;
struct bt_conn_info info;
bt_addr_le_t *addr = zmk_ble_active_profile_addr();
if (!bt_addr_le_cmp(addr, BT_ADDR_LE_ANY)) {
return false;
} else if ((conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, addr)) == NULL) {
@ -248,6 +255,13 @@ int zmk_ble_profile_index(const bt_addr_le_t *addr) {
return -ENODEV;
}
bt_addr_le_t *zmk_ble_profile_address(uint8_t index) {
if (index >= ZMK_BLE_PROFILE_COUNT) {
return (bt_addr_le_t *)(BT_ADDR_LE_NONE);
}
return &profiles[index].peer;
}
#if IS_ENABLED(CONFIG_SETTINGS)
static void ble_save_profile_work(struct k_work *work) {
settings_save_one("ble/active_profile", &active_profile, sizeof(active_profile));