ESPHome 2026.11.0-dev
Loading...
Searching...
No Matches
ld2420.h
Go to the documentation of this file.
1#pragma once
2
7#include <span>
8#ifdef USE_TEXT_SENSOR
10#endif
11#ifdef USE_SELECT
13#endif
14#ifdef USE_NUMBER
16#endif
17#ifdef USE_BUTTON
19#endif
20
21namespace esphome::ld2420 {
22
23static constexpr uint8_t CALIBRATE_SAMPLES = 64;
24// Energy frame is 45 bytes; +1 for null terminator, +4 so that a frame footer always lands
25// inside the buffer during footer-based resynchronization after losing sync.
26static constexpr uint8_t MAX_LINE_LENGTH = 50;
27static constexpr uint8_t TOTAL_GATES = 16;
28
34
36 public:
37 virtual void on_presence(bool presence) {};
38 virtual void on_distance(uint16_t distance) {};
39 virtual void on_energy(uint16_t *sensor_energy, size_t size) {};
40 virtual void on_fw_version(std::string &fw) {};
41};
42
43class LD2420Component final : public Component, public uart::UARTDevice {
44 public:
45 struct CmdFrameT {
48 uint16_t length{0};
49 uint16_t command{0};
50 uint16_t data_length{0};
51 uint8_t data[18];
52 };
53
54 struct RegConfigT {
55 uint32_t move_thresh[TOTAL_GATES];
56 uint32_t still_thresh[TOTAL_GATES];
57 uint16_t min_gate{0};
58 uint16_t max_gate{0};
59 uint16_t timeout{0};
60 };
61
62 void setup() override;
63 void dump_config() override;
64 void loop() override;
65#ifdef USE_SELECT
66 void set_operating_mode_select(select::Select *selector) { this->operating_selector_ = selector; };
67#endif
68#ifdef USE_NUMBER
81 bool is_gate_select() { return gate_select_number_ != nullptr; };
82 uint8_t get_gate_select_value() { return static_cast<uint8_t>(this->gate_select_number_->state); };
85 void publish_gate_move_threshold(uint8_t gate) {
86 // With gate_select we only use 1 number pointer, thus we hard code [0]
87 this->gate_move_threshold_numbers_[0]->publish_state(this->new_config.move_thresh[gate]);
88 };
89 void publish_gate_still_threshold(uint8_t gate) {
90 this->gate_still_threshold_numbers_[0]->publish_state(this->new_config.still_thresh[gate]);
91 };
92 // Stores a threshold number's value for its gate, or for the selected gate with gate_select
93 void set_gate_threshold_value(number::Number *n, float value);
96#endif
97#ifdef USE_BUTTON
102#endif
103 void register_listener(LD2420Listener *listener) { this->listeners_.push_back(listener); }
104
105 void send_module_restart();
107 void apply_config_action();
110 int send_cmd_from_array(CmdFrameT cmd_frame);
111 void report_gate_data();
112 void handle_cmd_error(uint16_t error);
113 void set_operating_mode(const char *state);
115 void update_radar_data(uint16_t const *gate_energy, uint8_t sample_number);
116 uint8_t set_config_mode(bool enable);
117 void set_min_max_distances_timeout(uint32_t max_gate_distance, uint32_t min_gate_distance, uint32_t timeout);
118 void set_gate_threshold(uint8_t gate);
119 void set_reg_value(uint16_t reg, uint16_t value);
120 void set_system_mode(uint16_t mode);
121 void ld2420_restart();
122
129 uint16_t radar_data[TOTAL_GATES][CALIBRATE_SAMPLES];
130 uint16_t gate_avg[TOTAL_GATES];
131 uint16_t gate_peak[TOTAL_GATES];
138#ifdef USE_SELECT
140#endif
141#ifdef USE_BUTTON
146#endif
147
148 protected:
149 struct CmdReplyT {
151 uint16_t error;
152 uint8_t command;
153 uint8_t status;
154 uint8_t length;
155 volatile bool ack;
156 };
157
159 int get_gate_threshold_(uint8_t gate);
160 void get_reg_value_(uint16_t reg);
162 uint16_t get_mode_() { return this->system_mode_; };
163 void set_mode_(uint16_t mode) { this->system_mode_ = mode; };
164 bool get_presence_() { return this->presence_; };
165 void set_presence_(bool presence) { this->presence_ = presence; };
166 uint16_t get_distance_() { return this->distance_; };
167 void set_distance_(uint16_t distance) { this->distance_ = distance; };
168 void handle_simple_mode_(const uint8_t *inbuf, int len);
169 void handle_energy_mode_(uint8_t *buffer, int len);
170 void handle_ack_data_(uint8_t *buffer, int len);
171 void readline_(int rx_data, uint8_t *buffer, int len);
172 void read_batch_(std::span<uint8_t, MAX_LINE_LENGTH> buffer);
173 void set_calibration_(bool state) { this->calibration_ = state; };
174 bool get_calibration_() { return this->calibration_; };
175
176#ifdef USE_NUMBER
183 std::vector<number::Number *> gate_still_threshold_numbers_ = std::vector<number::Number *>(16);
184 std::vector<number::Number *> gate_move_threshold_numbers_ = std::vector<number::Number *>(16);
185#endif
186
187 uint16_t distance_{0};
188 uint16_t system_mode_;
189 uint16_t gate_energy_[TOTAL_GATES];
190 uint8_t buffer_pos_{0}; // where to resume processing/populating buffer
191 uint8_t buffer_data_[MAX_LINE_LENGTH];
192 char firmware_ver_[8]{"v0.0.0"};
193 bool cmd_active_{false};
194 bool presence_{false};
195 bool calibration_{false};
197 std::vector<LD2420Listener *> listeners_{};
198};
199
200} // namespace esphome::ld2420
BedjetMode mode
BedJet operating mode.
Base class for all buttons.
Definition button.h:25
void readline_(int rx_data, uint8_t *buffer, int len)
Definition ld2420.cpp:426
void set_system_mode(uint16_t mode)
Definition ld2420.cpp:799
void handle_ack_data_(uint8_t *buffer, int len)
Definition ld2420.cpp:562
void set_gate_timeout_number(number::Number *number)
Definition ld2420.h:69
void set_gate_still_sensitivity_factor_number(number::Number *number)
Definition ld2420.h:76
std::vector< number::Number * > gate_still_threshold_numbers_
Definition ld2420.h:183
number::Number * gate_select_number_
Definition ld2420.h:178
uint8_t set_config_mode(bool enable)
Definition ld2420.cpp:690
void register_listener(LD2420Listener *listener)
Definition ld2420.h:103
button::Button * factory_reset_button_
Definition ld2420.h:145
void update_radar_data(uint16_t const *gate_energy, uint8_t sample_number)
Definition ld2420.cpp:341
void set_operating_mode_select(select::Select *selector)
Definition ld2420.h:66
void set_distance_(uint16_t distance)
Definition ld2420.h:167
void set_min_max_distances_timeout(uint32_t max_gate_distance, uint32_t min_gate_distance, uint32_t timeout)
Definition ld2420.cpp:829
void set_gate_threshold(uint8_t gate)
Definition ld2420.cpp:862
void set_factory_reset_button(button::Button *button)
Definition ld2420.h:101
void handle_energy_mode_(uint8_t *buffer, int len)
Definition ld2420.cpp:456
void set_gate_move_threshold_numbers(int gate, number::Number *n)
Definition ld2420.h:80
void publish_gate_still_threshold(uint8_t gate)
Definition ld2420.h:89
button::Button * revert_config_button_
Definition ld2420.h:143
void set_calibration_(bool state)
Definition ld2420.h:173
number::Number * min_gate_distance_number_
Definition ld2420.h:179
void set_restart_module_button(button::Button *button)
Definition ld2420.h:100
button::Button * apply_config_button_
Definition ld2420.h:142
void set_gate_threshold_value(number::Number *n, float value)
Definition ld2420.cpp:920
uint16_t gate_peak[TOTAL_GATES]
Definition ld2420.h:131
std::vector< LD2420Listener * > listeners_
Definition ld2420.h:197
std::vector< number::Number * > gate_move_threshold_numbers_
Definition ld2420.h:184
void set_mode_(uint16_t mode)
Definition ld2420.h:163
uint16_t gate_avg[TOTAL_GATES]
Definition ld2420.h:130
void set_min_gate_distance_number(number::Number *number)
Definition ld2420.h:71
void set_gate_still_threshold_numbers(int gate, number::Number *n)
Definition ld2420.h:79
void read_batch_(std::span< uint8_t, MAX_LINE_LENGTH > buffer)
Definition ld2420.cpp:545
uint8_t buffer_data_[MAX_LINE_LENGTH]
Definition ld2420.h:191
int get_gate_threshold_(uint8_t gate)
Definition ld2420.cpp:753
number::Number * gate_still_sensitivity_factor_number_
Definition ld2420.h:182
void set_revert_config_button(button::Button *button)
Definition ld2420.h:99
int send_cmd_from_array(CmdFrameT cmd_frame)
Definition ld2420.cpp:629
void get_reg_value_(uint16_t reg)
Definition ld2420.cpp:718
uint16_t gate_energy_[TOTAL_GATES]
Definition ld2420.h:189
void publish_gate_move_threshold(uint8_t gate)
Definition ld2420.h:85
void handle_simple_mode_(const uint8_t *inbuf, int len)
Definition ld2420.cpp:503
number::Number * max_gate_distance_number_
Definition ld2420.h:180
void set_gate_select_number(number::Number *number)
Definition ld2420.h:70
select::Select * operating_selector_
Definition ld2420.h:139
button::Button * restart_module_button_
Definition ld2420.h:144
number::Number * gate_timeout_number_
Definition ld2420.h:177
void set_apply_config_button(button::Button *button)
Definition ld2420.h:98
void set_max_gate_distance_number(number::Number *number)
Definition ld2420.h:72
void set_operating_mode(const char *state)
Definition ld2420.cpp:389
uint16_t radar_data[TOTAL_GATES][CALIBRATE_SAMPLES]
Definition ld2420.h:129
void handle_cmd_error(uint16_t error)
Definition ld2420.cpp:744
void set_presence_(bool presence)
Definition ld2420.h:165
number::Number * gate_move_sensitivity_factor_number_
Definition ld2420.h:181
void set_reg_value(uint16_t reg, uint16_t value)
Definition ld2420.cpp:730
void set_gate_move_sensitivity_factor_number(number::Number *number)
Definition ld2420.h:73
virtual void on_fw_version(std::string &fw)
Definition ld2420.h:40
virtual void on_distance(uint16_t distance)
Definition ld2420.h:38
virtual void on_presence(bool presence)
Definition ld2420.h:37
virtual void on_energy(uint16_t *sensor_energy, size_t size)
Definition ld2420.h:39
Base-class for all numbers.
Definition number.h:29
Base-class for all selects.
Definition select.h:28
bool state
Definition fan.h:2
uint32_t buffer
Definition gif.cpp:50
@ OP_CALIBRATE_MODE
Definition ld2420.h:31
const void size_t len
Definition hal.h:68
uint16_t size
Definition helpers.cpp:34
static void uint32_t