ESPHome  2025.4.0
sml_parser.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <cassert>
4 #include <cstdint>
5 #include <cstdio>
6 #include <string>
7 #include <vector>
8 #include "constants.h"
9 
10 namespace esphome {
11 namespace sml {
12 
13 using bytes = std::vector<uint8_t>;
14 
15 class BytesView {
16  public:
17  BytesView() noexcept = default;
18 
19  explicit BytesView(const uint8_t *first, size_t count) noexcept : data_{first}, count_{count} {}
20 
21  explicit BytesView(const bytes &bytes) noexcept : data_{bytes.data()}, count_{bytes.size()} {}
22 
23  size_t size() const noexcept { return count_; }
24 
25  uint8_t operator[](size_t index) const noexcept {
26  assert(index < count_);
27  return data_[index];
28  }
29 
30  BytesView subview(size_t offset, size_t count) const noexcept {
31  assert(offset + count <= count_);
32  return BytesView{data_ + offset, count};
33  }
34 
35  const uint8_t *begin() const noexcept { return data_; }
36 
37  const uint8_t *end() const noexcept { return data_ + count_; }
38 
39  private:
40  const uint8_t *data_ = nullptr;
41  size_t count_ = 0;
42 };
43 
44 class SmlNode {
45  public:
46  uint8_t type;
48  std::vector<SmlNode> nodes;
49 };
50 
51 class ObisInfo {
52  public:
53  ObisInfo(const BytesView &server_id, const SmlNode &val_list_entry);
57  char unit;
58  char scaler;
60  uint16_t value_type;
61  std::string code_repr() const;
62 };
63 
64 class SmlFile {
65  public:
66  SmlFile(const BytesView &buffer);
67  bool setup_node(SmlNode *node);
68  std::vector<SmlNode> messages;
69  std::vector<ObisInfo> get_obis_info();
70 
71  protected:
73  size_t pos_;
74 };
75 
76 std::string bytes_repr(const BytesView &buffer);
77 
78 uint64_t bytes_to_uint(const BytesView &buffer);
79 
80 int64_t bytes_to_int(const BytesView &buffer);
81 
82 std::string bytes_to_string(const BytesView &buffer);
83 } // namespace sml
84 } // namespace esphome
size_t size() const noexcept
Definition: sml_parser.h:23
uint8_t operator[](size_t index) const noexcept
Definition: sml_parser.h:25
BytesView() noexcept=default
int64_t bytes_to_int(const BytesView &buffer)
Definition: sml_parser.cpp:120
std::string bytes_to_string(const BytesView &buffer)
Definition: sml_parser.cpp:136
BytesView subview(size_t offset, size_t count) const noexcept
Definition: sml_parser.h:30
BytesView value_bytes
Definition: sml_parser.h:47
BytesView(const uint8_t *first, size_t count) noexcept
Definition: sml_parser.h:19
BytesView(const bytes &bytes) noexcept
Definition: sml_parser.h:21
const BytesView buffer_
Definition: sml_parser.h:72
const uint8_t * begin() const noexcept
Definition: sml_parser.h:35
Implementation of SPI Controller mode.
Definition: a01nyub.cpp:7
std::vector< uint8_t > bytes
Definition: sml_parser.h:13
uint64_t bytes_to_uint(const BytesView &buffer)
Definition: sml_parser.cpp:112
const uint8_t * end() const noexcept
Definition: sml_parser.h:37
std::vector< SmlNode > messages
Definition: sml_parser.h:68
std::string bytes_repr(const BytesView &buffer)
Definition: sml_parser.cpp:104
std::vector< SmlNode > nodes
Definition: sml_parser.h:48