diff --git a/firmware/include/msgpack.h b/firmware/include/msgpack.h index 424d360..dda3aaa 100644 --- a/firmware/include/msgpack.h +++ b/firmware/include/msgpack.h @@ -773,6 +773,13 @@ inline result unpack(const parser &p, std::vector &out) { return p.next(); } +inline result unpack(const parser &p, std::span &out) { + auto v = p.get_binary_view(); + if (!v) return std::unexpected(v.error()); + out = std::span(reinterpret_cast(v->data()), v->size()); + return p.next(); +} + template requires (!std::is_same_v) result unpack(const parser &p, std::vector &out) { diff --git a/firmware/include/wire.h b/firmware/include/wire.h index d76f230..15e751d 100644 --- a/firmware/include/wire.h +++ b/firmware/include/wire.h @@ -13,7 +13,7 @@ struct Envelope { static constexpr int8_t ext_id = 0; uint32_t message_id; uint32_t checksum; - std::vector payload; + std::span payload; auto as_tuple() const { return std::tie(message_id, checksum, payload); } auto as_tuple() { return std::tie(message_id, checksum, payload); } }; @@ -94,7 +94,7 @@ static constexpr uint8_t hash_key[8] = {}; struct DecodedMessage { uint32_t message_id; int8_t type_id; - std::vector payload; + std::span payload; }; static constexpr size_t ext16_header_len = 4; @@ -151,8 +151,7 @@ inline msgpack::result try_decode(const uint8_t *data, size_t le auto& [type_id, ext_data] = *ext; return DecodedMessage{env.message_id, type_id, - std::vector(reinterpret_cast(ext_data.data()), - reinterpret_cast(ext_data.data()) + ext_data.size())}; + std::span(reinterpret_cast(ext_data.data()), ext_data.size())}; } template diff --git a/firmware/lib/dispatch.cpp b/firmware/lib/dispatch.cpp index 5b6ecef..f9f301a 100644 --- a/firmware/lib/dispatch.cpp +++ b/firmware/lib/dispatch.cpp @@ -59,12 +59,11 @@ void dispatch_schedule_ms(uint32_t ms, std::function fn) { continue; } - usb_rx_buf.clear(); - auto it = handler_map.find(msg->type_id); - if (it == handler_map.end()) continue; + if (it == handler_map.end()) { usb_rx_buf.clear(); continue; } span_writer out(tx_buf); auto resp = it->second(msg->message_id, msg->payload, out); + usb_rx_buf.clear(); if (!resp || *resp == 0) continue; size_t resp_len = *resp; if (resp_len <= usb.tx.free()) {