Skip to content

Commit 462222a

Browse files
committed
skald_bthome_saul: add message fragmentation
1 parent 65926ac commit 462222a

File tree

3 files changed

+51
-12
lines changed

3 files changed

+51
-12
lines changed

sys/include/net/skald/bthome.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,24 @@ struct skald_bthome_ctx {
163163
*/
164164
uint8_t encrypt;
165165
#endif
166+
#if IS_USED(MODULE_SKALD_BTHOME_SAUL) || defined(DOXYGEN)
167+
/**
168+
* @brief The index of the last device sent in skald_bthome_ctx_t::devs.
169+
*
170+
* Will be updated on each periodic advertisement to allow for fragmenting
171+
* different measurement readings across multiple advertisements (in case all
172+
* measurements from skald_bthome_ctx_t::devs are too large for one
173+
* advertisement). Is initialized to 0.
174+
*
175+
* If a single reading is too big to fit into an advertisement,
176+
* the skald_ctx_t::update_pkt() callback will just return (i.e. BTHome
177+
* payload may be left empty) and skald_bthome_ctx_t::last_dev_sent will
178+
* be reset to 0.
179+
* This can e.g. happen with a @ref BTHOME_ID_TEXT or @ref BTHOME_ID_RAW record
180+
* if the appended bytes are larger than a BLE advertisement.
181+
*/
182+
uint8_t last_dev_sent;
183+
#endif
166184
};
167185

168186
/**

sys/net/ble/skald/skald_bthome.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,11 @@ int skald_bthome_add_measurement(
157157
uint16_t exp_size = ctx->skald.pkt.len + sizeof(obj_id) + data_len + data_contains_length;
158158
uint8_t offset = ctx->skald.pkt.len;
159159

160+
#ifdef MODULE_SKALD_BTHOME_ENCRYPT
161+
exp_size += 8;
162+
#endif
163+
160164
if (exp_size >= NETDEV_BLE_PDU_MAXLEN) {
161-
assert(exp_size < NETDEV_BLE_PDU_MAXLEN);
162165
return -EMSGSIZE;
163166
}
164167
ctx->skald.pkt.pdu[offset++] = (uint8_t)obj_id;

sys/net/ble/skald/skald_bthome_saul.c

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -419,32 +419,50 @@ static void _reset_hdr(skald_bthome_ctx_t *ctx)
419419
static void _update_saul_measurements(skald_ctx_t *skald_ctx)
420420
{
421421
skald_bthome_ctx_t *ctx = container_of(skald_ctx, skald_bthome_ctx_t, skald);
422+
uint8_t dev_idx = 0;
423+
uint8_t orig_last_dev_sent = ctx->last_dev_sent;
422424

423425
_reset_hdr(ctx);
424426
skald_bthome_saul_t *ptr = ctx->devs;
425427
while (ptr) {
426-
int dim = 1;
427-
phydat_t data = { 0 };
428-
429-
if (ptr->saul.driver) {
430-
dim = saul_reg_read(&ptr->saul, &data);
431-
if (dim <= 0) {
432-
continue;
428+
if ((ctx->last_dev_sent == 0) ||
429+
(dev_idx > ctx->last_dev_sent)) {
430+
int dim = 1;
431+
int res = 0;
432+
phydat_t data = { 0 };
433+
434+
if (ptr->saul.driver) {
435+
dim = saul_reg_read(&ptr->saul, &data);
436+
if (dim <= 0) {
437+
continue;
438+
}
433439
}
434-
}
435-
for (uint8_t i = 0; i < dim; i++) {
436-
if (ptr->add_measurement(ctx, ptr->obj_id, &data, i) < 0) {
440+
for (uint8_t i = 0; i < dim; i++) {
441+
if ((res = ptr->add_measurement(ctx, ptr->obj_id, &data, i)) < 0) {
442+
break;
443+
}
444+
}
445+
if ((res == -EMSGSIZE) && (dev_idx > 0)) {
446+
ctx->last_dev_sent = dev_idx - 1;
447+
}
448+
if (res < 0) {
437449
break;
438450
}
439451
}
440-
441452
ptr = container_of(
442453
ptr->saul.next, skald_bthome_saul_t, saul
443454
);
455+
dev_idx++;
444456
}
445457
#if IS_USED(MODULE_SKALD_BTHOME_ENCRYPT)
446458
skald_bthome_encrypt(ctx);
447459
#endif
460+
if ((ptr == NULL) ||
461+
/* or value just too big */
462+
(orig_last_dev_sent == ctx->last_dev_sent)) {
463+
/* reset device train */
464+
ctx->last_dev_sent = 0;
465+
}
448466
}
449467

450468
int skald_bthome_saul_add(skald_bthome_ctx_t *ctx, skald_bthome_saul_t *saul)

0 commit comments

Comments
 (0)