mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2025-01-18 12:52:44 +01:00
skald_bthome_saul: add capability for custom SAUL entries
This commit is contained in:
parent
ce6a7e0b96
commit
7d0d41a10a
@ -78,10 +78,20 @@ int _get_encryption_key(void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static int _add_text(skald_bthome_ctx_t *ctx, uint8_t obj_id, phydat_t *data, uint8_t idx)
|
||||||
|
{
|
||||||
|
static const char info[] = "RIOT";
|
||||||
|
|
||||||
|
(void)data;
|
||||||
|
(void)idx;
|
||||||
|
return skald_bthome_add_measurement(ctx, obj_id, info, strlen(info));
|
||||||
|
}
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
saul_reg_t *dev = saul_reg;
|
saul_reg_t *dev = saul_reg;
|
||||||
unsigned i = 0;
|
unsigned i = 0;
|
||||||
|
int res;
|
||||||
|
|
||||||
ztimer_sleep(ZTIMER_MSEC, 2000);
|
ztimer_sleep(ZTIMER_MSEC, 2000);
|
||||||
printf("Skald and the tale of Harald's home\n");
|
printf("Skald and the tale of Harald's home\n");
|
||||||
@ -112,7 +122,6 @@ int main(void)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
while (dev && (i < CONFIG_BTHOME_SAUL_REG_DEVS)) {
|
while (dev && (i < CONFIG_BTHOME_SAUL_REG_DEVS)) {
|
||||||
int res;
|
|
||||||
_saul_devs[i].saul = *dev; /* copy registry entry */
|
_saul_devs[i].saul = *dev; /* copy registry entry */
|
||||||
_saul_devs[i].saul.next = NULL;
|
_saul_devs[i].saul.next = NULL;
|
||||||
printf("Adding %s (%s) to BTHome.\n", dev->name, saul_class_to_str(dev->driver->type));
|
printf("Adding %s (%s) to BTHome.\n", dev->name, saul_class_to_str(dev->driver->type));
|
||||||
@ -126,6 +135,17 @@ int main(void)
|
|||||||
dev = dev->next;
|
dev = dev->next;
|
||||||
}
|
}
|
||||||
assert(!saul_reg || _ctx.devs);
|
assert(!saul_reg || _ctx.devs);
|
||||||
|
if (i < CONFIG_BTHOME_SAUL_REG_DEVS) {
|
||||||
|
memset(&_saul_devs[i].saul, 0, sizeof(_saul_devs[i].saul));
|
||||||
|
_saul_devs[i].obj_id = BTHOME_ID_TEXT;
|
||||||
|
_saul_devs[i].flags = SKALD_BTHOME_SAUL_FLAGS_CUSTOM;
|
||||||
|
_saul_devs[i].add_measurement = _add_text;
|
||||||
|
if ((res = skald_bthome_saul_add(&_ctx, &_saul_devs[i])) < 0) {
|
||||||
|
errno = -res;
|
||||||
|
perror("Unable to add text info to BTHome");
|
||||||
|
};
|
||||||
|
i++;
|
||||||
|
}
|
||||||
skald_bthome_advertise(&_ctx, BTHOME_ADV_INTERVAL);
|
skald_bthome_advertise(&_ctx, BTHOME_ADV_INTERVAL);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -592,6 +592,11 @@ ifneq (,$(filter skald_bthome_saul,$(USEMODULE)))
|
|||||||
USEMODULE += saul_reg
|
USEMODULE += saul_reg
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifneq (,$(filter skald_update_pkt_cb,$(USEMODULE)))
|
||||||
|
USEMODULE += event
|
||||||
|
USEMODULE += skald
|
||||||
|
endif
|
||||||
|
|
||||||
ifneq (,$(filter bluetil_addr,$(USEMODULE)))
|
ifneq (,$(filter bluetil_addr,$(USEMODULE)))
|
||||||
USEMODULE += fmt
|
USEMODULE += fmt
|
||||||
endif
|
endif
|
||||||
|
@ -60,6 +60,16 @@ extern "C" {
|
|||||||
typedef struct skald_bthome_ctx skald_bthome_ctx_t;
|
typedef struct skald_bthome_ctx skald_bthome_ctx_t;
|
||||||
|
|
||||||
#if IS_USED(MODULE_SKALD_BTHOME_SAUL) || defined(DOXYGEN)
|
#if IS_USED(MODULE_SKALD_BTHOME_SAUL) || defined(DOXYGEN)
|
||||||
|
/**
|
||||||
|
* @brief Flags for the BTHome-SAUL-adapter
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
/**
|
||||||
|
* @brief Use custom object ID and add-measurement callback
|
||||||
|
*/
|
||||||
|
SKALD_BTHOME_SAUL_FLAGS_CUSTOM = 0x01,
|
||||||
|
} skald_bthome_saul_flags_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief BTHome-SAUL-adapter
|
* @brief BTHome-SAUL-adapter
|
||||||
*/
|
*/
|
||||||
@ -76,9 +86,20 @@ typedef struct {
|
|||||||
*
|
*
|
||||||
* @see skald_bthome_id_t
|
* @see skald_bthome_id_t
|
||||||
*
|
*
|
||||||
* Will be filled by @ref skald_bthome_saul_add().
|
* Will be filled by @ref skald_bthome_saul_add() if
|
||||||
|
* @ref SKALD_BTHOME_SAUL_FLAGS_CUSTOM is unset in
|
||||||
|
* skald_bthome_saul_t::flags. Otherwise, set to the desired
|
||||||
|
* object ID for the measurement.
|
||||||
*/
|
*/
|
||||||
skald_bthome_id_t obj_id;
|
skald_bthome_id_t obj_id;
|
||||||
|
/**
|
||||||
|
* @brief Flags for the BTHome-SAUL-adapter
|
||||||
|
*
|
||||||
|
* @see skald_bthome_saul_flags_t
|
||||||
|
*
|
||||||
|
* May be set before calling @ref skald_bthome_saul_add()
|
||||||
|
*/
|
||||||
|
skald_bthome_saul_flags_t flags;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Callback to add measurement from SAUL registry entry
|
* @brief Callback to add measurement from SAUL registry entry
|
||||||
@ -87,7 +108,10 @@ typedef struct {
|
|||||||
* @ref saul_reg_read() and should ultimately call
|
* @ref saul_reg_read() and should ultimately call
|
||||||
* @ref skald_bthome_add_measurement() * (or one of its wrappers).
|
* @ref skald_bthome_add_measurement() * (or one of its wrappers).
|
||||||
*
|
*
|
||||||
* Will be filled by @ref skald_bthome_saul_add().
|
* Will be filled by @ref skald_bthome_saul_add() if
|
||||||
|
* @ref SKALD_BTHOME_SAUL_FLAGS_CUSTOM is unset in
|
||||||
|
* skald_bthome_saul_t::flags. Otherwise, set to the desired
|
||||||
|
* object ID for the measurement.
|
||||||
*
|
*
|
||||||
* @param[in,out] ctx BTHome advertising context. MUST not be NULL.
|
* @param[in,out] ctx BTHome advertising context. MUST not be NULL.
|
||||||
* @param[in] obj_id The object ID for the measurement.
|
* @param[in] obj_id The object ID for the measurement.
|
||||||
|
@ -427,12 +427,14 @@ static void _update_saul_measurements(skald_ctx_t *skald_ctx)
|
|||||||
_reset_hdr(ctx);
|
_reset_hdr(ctx);
|
||||||
skald_bthome_saul_t *ptr = ctx->devs;
|
skald_bthome_saul_t *ptr = ctx->devs;
|
||||||
while (ptr) {
|
while (ptr) {
|
||||||
int dim;
|
int dim = 1;
|
||||||
phydat_t data;
|
phydat_t data = { 0 };
|
||||||
|
|
||||||
dim = saul_reg_read(&ptr->saul, &data);
|
if (ptr->saul.driver) {
|
||||||
if (dim <= 0) {
|
dim = saul_reg_read(&ptr->saul, &data);
|
||||||
continue;
|
if (dim <= 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for (uint8_t i = 0; i < dim; i++) {
|
for (uint8_t i = 0; i < dim; i++) {
|
||||||
if (ptr->add_measurement(ctx, ptr->obj_id, &data, i) < 0) {
|
if (ptr->add_measurement(ctx, ptr->obj_id, &data, i) < 0) {
|
||||||
@ -451,22 +453,24 @@ static void _update_saul_measurements(skald_ctx_t *skald_ctx)
|
|||||||
|
|
||||||
int skald_bthome_saul_add(skald_bthome_ctx_t *ctx, skald_bthome_saul_t *saul)
|
int skald_bthome_saul_add(skald_bthome_ctx_t *ctx, skald_bthome_saul_t *saul)
|
||||||
{
|
{
|
||||||
int dim;
|
if ((saul->saul.driver != NULL) &&
|
||||||
phydat_t sample;
|
(saul->saul.driver->type & SAUL_CAT_MASK) != SAUL_CAT_SENSE) {
|
||||||
|
|
||||||
if ((saul->saul.driver->type & SAUL_CAT_MASK) != SAUL_CAT_SENSE) {
|
|
||||||
return -ENOTSUP;
|
return -ENOTSUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ctx->skald.update_pkt) {
|
if (!ctx->skald.update_pkt) {
|
||||||
ctx->skald.update_pkt = &_update_saul_measurements;
|
ctx->skald.update_pkt = &_update_saul_measurements;
|
||||||
}
|
}
|
||||||
dim = saul_reg_read(&saul->saul, &sample);
|
if (!(saul->flags & SKALD_BTHOME_SAUL_FLAGS_CUSTOM)) {
|
||||||
if (dim <= 0) {
|
phydat_t sample;
|
||||||
return -ENODEV;
|
int dim = saul_reg_read(&saul->saul, &sample);
|
||||||
}
|
|
||||||
if (_saul_sense_to_bthome_id(saul, &sample) < 0) {
|
if (dim <= 0) {
|
||||||
return -ENOENT;
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
if (_saul_sense_to_bthome_id(saul, &sample) < 0) {
|
||||||
|
return -ENOENT;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (ctx->devs) {
|
if (ctx->devs) {
|
||||||
skald_bthome_saul_t *ptr = ctx->devs;
|
skald_bthome_saul_t *ptr = ctx->devs;
|
||||||
|
Loading…
Reference in New Issue
Block a user