SE050 Driver
API reference
Loading...
Searching...
No Matches
se050_atr.hpp
Go to the documentation of this file.
1
7#pragma once
8
9#include "se050_types.hpp"
10
11#include <cstddef>
12#include <cstdint>
13
14namespace se050::atr {
15
16struct Profile {
17 std::uint8_t protocol_version{0};
18 std::uint8_t vendor_id[5]{};
19 std::uint16_t bwt{0};
20 std::uint16_t ifsc{0};
21 std::uint8_t plid{0};
22 std::uint16_t max_i2c_khz{0};
23 std::uint8_t config{0};
24 std::uint8_t min_poll_ms{0};
25 std::uint16_t segt_us{0};
26 std::uint16_t wakeup_us{0};
27 const std::uint8_t* historical{nullptr};
28 std::size_t historical_len{0};
29};
30
31[[nodiscard]] inline Error Parse(const std::uint8_t* inf, std::size_t inf_len, Profile* out) noexcept {
32 if (inf == nullptr || out == nullptr) {
34 }
35 if (inf_len < 7U) {
36 return Error::Protocol;
37 }
38 out->protocol_version = inf[0];
39 for (std::size_t i = 0; i < 5U; ++i) {
40 out->vendor_id[i] = inf[1U + i];
41 }
42 const std::size_t dllp_len = inf[6];
43 if (7U + dllp_len > inf_len || dllp_len < 4U) {
44 return Error::Protocol;
45 }
46 const std::uint8_t* dllp = inf + 7U;
47 out->bwt = static_cast<std::uint16_t>((static_cast<std::uint16_t>(dllp[0]) << 8U) | dllp[1]);
48 out->ifsc = static_cast<std::uint16_t>((static_cast<std::uint16_t>(dllp[2]) << 8U) | dllp[3]);
49
50 std::size_t off = 7U + dllp_len;
51 if (off + 2U > inf_len) {
52 return Error::Protocol;
53 }
54 out->plid = inf[off++];
55 const std::size_t plp_len = inf[off++];
56 if (off + plp_len > inf_len || plp_len < 11U) {
57 return Error::Protocol;
58 }
59 const std::uint8_t* plp = inf + off;
60 out->max_i2c_khz = static_cast<std::uint16_t>((static_cast<std::uint16_t>(plp[0]) << 8U) | plp[1]);
61 out->config = plp[2];
62 out->min_poll_ms = plp[3];
63 out->segt_us = static_cast<std::uint16_t>((static_cast<std::uint16_t>(plp[7]) << 8U) | plp[8]);
64 out->wakeup_us = static_cast<std::uint16_t>((static_cast<std::uint16_t>(plp[9]) << 8U) | plp[10]);
65
66 off += plp_len;
67 if (off >= inf_len) {
68 return Error::Protocol;
69 }
70 const std::size_t hb_len = inf[off++];
71 if (off + hb_len > inf_len) {
72 return Error::Protocol;
73 }
74 out->historical = inf + off;
75 out->historical_len = hb_len;
76 return Error::Ok;
77}
78
79} // namespace se050::atr
Definition se050_atr.hpp:14
Error Parse(const std::uint8_t *inf, std::size_t inf_len, Profile *out) noexcept
Definition se050_atr.hpp:31
Error
Definition se050_types.hpp:14
Shared types, limits, and error codes for the HF-SE050 driver.
Definition se050_atr.hpp:16
std::uint16_t bwt
Definition se050_atr.hpp:19
std::uint16_t max_i2c_khz
Definition se050_atr.hpp:22
std::uint16_t wakeup_us
Definition se050_atr.hpp:26
std::uint8_t config
Definition se050_atr.hpp:23
std::uint16_t segt_us
Definition se050_atr.hpp:25
std::uint8_t min_poll_ms
Definition se050_atr.hpp:24
const std::uint8_t * historical
Definition se050_atr.hpp:27
std::uint8_t plid
Definition se050_atr.hpp:21
std::size_t historical_len
Definition se050_atr.hpp:28
std::uint16_t ifsc
Definition se050_atr.hpp:20
std::uint8_t protocol_version
Definition se050_atr.hpp:17
std::uint8_t vendor_id[5]
Definition se050_atr.hpp:18