Skip to content

Commit 65926ac

Browse files
committed
skald_bthome_saul: add capability for custom SAUL entries
1 parent 7c9b9db commit 65926ac

File tree

4 files changed

+71
-18
lines changed

4 files changed

+71
-18
lines changed

examples/networking/ble/misc/skald_bthome/main.c

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,20 @@ int _get_encryption_key(void)
7777
}
7878
#endif
7979

80+
static int _add_text(skald_bthome_ctx_t *ctx, uint8_t obj_id, phydat_t *data, uint8_t idx)
81+
{
82+
static const char info[] = "RIOT";
83+
84+
(void)data;
85+
(void)idx;
86+
return skald_bthome_add_measurement(ctx, obj_id, info, strlen(info));
87+
}
88+
8089
int main(void)
8190
{
8291
saul_reg_t *dev = saul_reg;
8392
unsigned i = 0;
93+
int res;
8494

8595
ztimer_sleep(ZTIMER_MSEC, 2000);
8696
printf("Skald and the tale of Harald's home\n");
@@ -111,7 +121,6 @@ int main(void)
111121
return 1;
112122
}
113123
while (dev && (i < CONFIG_BTHOME_SAUL_REG_DEVS)) {
114-
int res;
115124
_saul_devs[i].saul = *dev; /* copy registry entry */
116125
_saul_devs[i].saul.next = NULL;
117126
printf("Adding %s (%s) to BTHome.\n", dev->name, saul_class_to_str(dev->driver->type));
@@ -125,6 +134,17 @@ int main(void)
125134
dev = dev->next;
126135
}
127136
assert(!saul_reg || _ctx.devs);
137+
if (i < CONFIG_BTHOME_SAUL_REG_DEVS) {
138+
memset(&_saul_devs[i].saul, 0, sizeof(_saul_devs[i].saul));
139+
_saul_devs[i].obj_id = BTHOME_ID_TEXT;
140+
_saul_devs[i].flags = SKALD_BTHOME_SAUL_FLAGS_CUSTOM;
141+
_saul_devs[i].add_measurement = _add_text;
142+
if ((res = skald_bthome_saul_add(&_ctx, &_saul_devs[i])) < 0) {
143+
errno = -res;
144+
perror("Unable to add text info to BTHome");
145+
};
146+
i++;
147+
}
128148
skald_bthome_advertise(&_ctx, BTHOME_ADV_INTERVAL);
129149
return 0;
130150
}

sys/Makefile.dep

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -604,6 +604,11 @@ ifneq (,$(filter skald_bthome_saul,$(USEMODULE)))
604604
USEMODULE += saul_reg
605605
endif
606606

607+
ifneq (,$(filter skald_update_pkt_cb,$(USEMODULE)))
608+
USEMODULE += event
609+
USEMODULE += skald
610+
endif
611+
607612
ifneq (,$(filter bluetil_addr,$(USEMODULE)))
608613
USEMODULE += fmt
609614
endif

sys/include/net/skald/bthome.h

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,16 @@ extern "C" {
5656
typedef struct skald_bthome_ctx skald_bthome_ctx_t;
5757

5858
#if IS_USED(MODULE_SKALD_BTHOME_SAUL) || defined(DOXYGEN)
59+
/**
60+
* @brief Flags for the BTHome-SAUL-adapter
61+
*/
62+
typedef enum {
63+
/**
64+
* @brief Use custom object ID and add-measurement callback
65+
*/
66+
SKALD_BTHOME_SAUL_FLAGS_CUSTOM = 0x01,
67+
} skald_bthome_saul_flags_t;
68+
5969
/**
6070
* @brief BTHome-SAUL-adapter
6171
*/
@@ -72,9 +82,20 @@ typedef struct {
7282
*
7383
* @see skald_bthome_id_t
7484
*
75-
* Will be filled by @ref skald_bthome_saul_add().
85+
* Will be filled by @ref skald_bthome_saul_add() if
86+
* @ref SKALD_BTHOME_SAUL_FLAGS_CUSTOM is unset in
87+
* skald_bthome_saul_t::flags. Otherwise, set to the desired
88+
* object ID for the measurement.
7689
*/
7790
skald_bthome_id_t obj_id;
91+
/**
92+
* @brief Flags for the BTHome-SAUL-adapter
93+
*
94+
* @see skald_bthome_saul_flags_t
95+
*
96+
* May be set before calling @ref skald_bthome_saul_add()
97+
*/
98+
skald_bthome_saul_flags_t flags;
7899

79100
/**
80101
* @brief Callback to add measurement from SAUL registry entry
@@ -83,7 +104,10 @@ typedef struct {
83104
* @ref saul_reg_read() and should ultimately call
84105
* @ref skald_bthome_add_measurement() * (or one of its wrappers).
85106
*
86-
* Will be filled by @ref skald_bthome_saul_add().
107+
* Will be filled by @ref skald_bthome_saul_add() if
108+
* @ref SKALD_BTHOME_SAUL_FLAGS_CUSTOM is unset in
109+
* skald_bthome_saul_t::flags. Otherwise, set to the desired
110+
* object ID for the measurement.
87111
*
88112
* @param[in,out] ctx BTHome advertising context. MUST not be NULL.
89113
* @param[in] obj_id The object ID for the measurement.

sys/net/ble/skald/skald_bthome_saul.c

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -423,12 +423,14 @@ static void _update_saul_measurements(skald_ctx_t *skald_ctx)
423423
_reset_hdr(ctx);
424424
skald_bthome_saul_t *ptr = ctx->devs;
425425
while (ptr) {
426-
int dim;
427-
phydat_t data;
426+
int dim = 1;
427+
phydat_t data = { 0 };
428428

429-
dim = saul_reg_read(&ptr->saul, &data);
430-
if (dim <= 0) {
431-
continue;
429+
if (ptr->saul.driver) {
430+
dim = saul_reg_read(&ptr->saul, &data);
431+
if (dim <= 0) {
432+
continue;
433+
}
432434
}
433435
for (uint8_t i = 0; i < dim; i++) {
434436
if (ptr->add_measurement(ctx, ptr->obj_id, &data, i) < 0) {
@@ -447,22 +449,24 @@ static void _update_saul_measurements(skald_ctx_t *skald_ctx)
447449

448450
int skald_bthome_saul_add(skald_bthome_ctx_t *ctx, skald_bthome_saul_t *saul)
449451
{
450-
int dim;
451-
phydat_t sample;
452-
453-
if ((saul->saul.driver->type & SAUL_CAT_MASK) != SAUL_CAT_SENSE) {
452+
if ((saul->saul.driver != NULL) &&
453+
(saul->saul.driver->type & SAUL_CAT_MASK) != SAUL_CAT_SENSE) {
454454
return -ENOTSUP;
455455
}
456456

457457
if (!ctx->skald.update_pkt) {
458458
ctx->skald.update_pkt = &_update_saul_measurements;
459459
}
460-
dim = saul_reg_read(&saul->saul, &sample);
461-
if (dim <= 0) {
462-
return -ENODEV;
463-
}
464-
if (_saul_sense_to_bthome_id(saul, &sample) < 0) {
465-
return -ENOENT;
460+
if (!(saul->flags & SKALD_BTHOME_SAUL_FLAGS_CUSTOM)) {
461+
phydat_t sample;
462+
int dim = saul_reg_read(&saul->saul, &sample);
463+
464+
if (dim <= 0) {
465+
return -ENODEV;
466+
}
467+
if (_saul_sense_to_bthome_id(saul, &sample) < 0) {
468+
return -ENOENT;
469+
}
466470
}
467471
if (ctx->devs) {
468472
skald_bthome_saul_t *ptr = ctx->devs;

0 commit comments

Comments
 (0)