ESPHome 2025.6.0
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Modules Pages
ld2420.h
Go to the documentation of this file.
1#pragma once
2
7#ifdef USE_TEXT_SENSOR
9#endif
10#ifdef USE_SELECT
12#endif
13#ifdef USE_NUMBER
15#endif
16#ifdef USE_BUTTON
18#endif
19#include <map>
20#include <functional>
21
22namespace esphome {
23namespace ld2420 {
24
25// Local const's
26static const uint16_t REFRESH_RATE_MS = 1000;
27
28// Command sets
29static const uint8_t CMD_ABD_DATA_REPLY_SIZE = 0x04;
30static const uint8_t CMD_ABD_DATA_REPLY_START = 0x0A;
31static const uint16_t CMD_DISABLE_CONF = 0x00FE;
32static const uint16_t CMD_ENABLE_CONF = 0x00FF;
33static const uint8_t CMD_MAX_BYTES = 0x64;
34static const uint16_t CMD_PARM_HIGH_TRESH = 0x0012;
35static const uint16_t CMD_PARM_LOW_TRESH = 0x0021;
36static const uint16_t CMD_PROTOCOL_VER = 0x0002;
37static const uint16_t CMD_READ_ABD_PARAM = 0x0008;
38static const uint16_t CMD_READ_REG_ADDR = 0x0020;
39static const uint16_t CMD_READ_REGISTER = 0x0002;
40static const uint16_t CMD_READ_SERIAL_NUM = 0x0011;
41static const uint16_t CMD_READ_SYS_PARAM = 0x0013;
42static const uint16_t CMD_READ_VERSION = 0x0000;
43static const uint8_t CMD_REG_DATA_REPLY_SIZE = 0x02;
44static const uint16_t CMD_RESTART = 0x0068;
45static const uint16_t CMD_SYSTEM_MODE = 0x0000;
46static const uint16_t CMD_SYSTEM_MODE_GR = 0x0003;
47static const uint16_t CMD_SYSTEM_MODE_MTT = 0x0001;
48static const uint16_t CMD_SYSTEM_MODE_SIMPLE = 0x0064;
49static const uint16_t CMD_SYSTEM_MODE_DEBUG = 0x0000;
50static const uint16_t CMD_SYSTEM_MODE_ENERGY = 0x0004;
51static const uint16_t CMD_SYSTEM_MODE_VS = 0x0002;
52static const uint16_t CMD_WRITE_ABD_PARAM = 0x0007;
53static const uint16_t CMD_WRITE_REGISTER = 0x0001;
54static const uint16_t CMD_WRITE_SYS_PARAM = 0x0012;
55
56static const uint8_t LD2420_ERROR_NONE = 0x00;
57static const uint8_t LD2420_ERROR_TIMEOUT = 0x02;
58static const uint8_t LD2420_ERROR_UNKNOWN = 0x01;
59static const uint8_t LD2420_TOTAL_GATES = 16;
60static const uint8_t CALIBRATE_SAMPLES = 64;
61
62// Register address values
63static const uint16_t CMD_MIN_GATE_REG = 0x0000;
64static const uint16_t CMD_MAX_GATE_REG = 0x0001;
65static const uint16_t CMD_TIMEOUT_REG = 0x0004;
66static const uint16_t CMD_GATE_MOVE_THRESH[LD2420_TOTAL_GATES] = {0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015,
67 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B,
68 0x001C, 0x001D, 0x001E, 0x001F};
69static const uint16_t CMD_GATE_STILL_THRESH[LD2420_TOTAL_GATES] = {0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025,
70 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B,
71 0x002C, 0x002D, 0x002E, 0x002F};
72static const uint32_t FACTORY_MOVE_THRESH[LD2420_TOTAL_GATES] = {60000, 30000, 400, 250, 250, 250, 250, 250,
73 250, 250, 250, 250, 250, 250, 250, 250};
74static const uint32_t FACTORY_STILL_THRESH[LD2420_TOTAL_GATES] = {40000, 20000, 200, 200, 200, 200, 200, 150,
75 150, 100, 100, 100, 100, 100, 100, 100};
76static const uint16_t FACTORY_TIMEOUT = 120;
77static const uint16_t FACTORY_MIN_GATE = 1;
78static const uint16_t FACTORY_MAX_GATE = 12;
79
80// COMMAND_BYTE Header & Footer
81static const uint8_t CMD_FRAME_COMMAND = 6;
82static const uint8_t CMD_FRAME_DATA_LENGTH = 4;
83static const uint32_t CMD_FRAME_FOOTER = 0x01020304;
84static const uint32_t CMD_FRAME_HEADER = 0xFAFBFCFD;
85static const uint32_t DEBUG_FRAME_FOOTER = 0xFAFBFCFD;
86static const uint32_t DEBUG_FRAME_HEADER = 0x1410BFAA;
87static const uint32_t ENERGY_FRAME_FOOTER = 0xF5F6F7F8;
88static const uint32_t ENERGY_FRAME_HEADER = 0xF1F2F3F4;
89static const uint8_t CMD_FRAME_STATUS = 7;
90static const uint8_t CMD_ERROR_WORD = 8;
91static const uint8_t ENERGY_SENSOR_START = 9;
92static const uint8_t CALIBRATE_REPORT_INTERVAL = 4;
93static const int CALIBRATE_VERSION_MIN = 154;
94static const std::string OP_NORMAL_MODE_STRING = "Normal";
95static const std::string OP_SIMPLE_MODE_STRING = "Simple";
96
98static const std::map<std::string, uint8_t> OP_MODE_TO_UINT{
99 {"Normal", OP_NORMAL_MODE}, {"Calibrate", OP_CALIBRATE_MODE}, {"Simple", OP_SIMPLE_MODE}};
100static constexpr const char *ERR_MESSAGE[] = {"None", "Unknown", "Timeout"};
101
103 public:
104 virtual void on_presence(bool presence){};
105 virtual void on_distance(uint16_t distance){};
106 virtual void on_energy(uint16_t *sensor_energy, size_t size){};
107 virtual void on_fw_version(std::string &fw){};
108};
109
111 public:
112 void setup() override;
113 void dump_config() override;
114 void loop() override;
115#ifdef USE_SELECT
116 void set_operating_mode_select(select::Select *selector) { this->operating_selector_ = selector; };
117#endif
118#ifdef USE_NUMBER
131 bool is_gate_select() { return gate_select_number_ != nullptr; };
132 uint8_t get_gate_select_value() { return static_cast<uint8_t>(this->gate_select_number_->state); };
135 void publish_gate_move_threshold(uint8_t gate) {
136 // With gate_select we only use 1 number pointer, thus we hard code [0]
137 this->gate_move_threshold_numbers_[0]->publish_state(this->new_config.move_thresh[gate]);
138 };
139 void publish_gate_still_threshold(uint8_t gate) {
140 this->gate_still_threshold_numbers_[0]->publish_state(this->new_config.still_thresh[gate]);
141 };
144#endif
145#ifdef USE_BUTTON
150#endif
151 void register_listener(LD2420Listener *listener) { this->listeners_.push_back(listener); }
152
153 struct CmdFrameT {
154 uint32_t header{0};
155 uint16_t length{0};
156 uint16_t command{0};
157 uint8_t data[18];
158 uint16_t data_length{0};
159 uint32_t footer{0};
160 };
161
162 struct RegConfigT {
163 uint16_t min_gate{0};
164 uint16_t max_gate{0};
165 uint16_t timeout{0};
166 uint32_t move_thresh[LD2420_TOTAL_GATES];
167 uint32_t still_thresh[LD2420_TOTAL_GATES];
168 };
169
170 void send_module_restart();
172 void apply_config_action();
175 float get_setup_priority() const override;
176 int send_cmd_from_array(CmdFrameT cmd_frame);
177 void report_gate_data();
178 void handle_cmd_error(uint8_t error);
179 void set_operating_mode(const std::string &state);
181 void update_radar_data(uint16_t const *gate_energy, uint8_t sample_number);
182 uint8_t calc_checksum(void *data, size_t size);
183
192 uint16_t radar_data[LD2420_TOTAL_GATES][CALIBRATE_SAMPLES];
193 uint16_t gate_avg[LD2420_TOTAL_GATES];
194 uint16_t gate_peak[LD2420_TOTAL_GATES];
199#ifdef USE_SELECT
201#endif
202#ifdef USE_BUTTON
207#endif
208 void set_min_max_distances_timeout(uint32_t max_gate_distance, uint32_t min_gate_distance, uint32_t timeout);
209 void set_gate_threshold(uint8_t gate);
210 void set_reg_value(uint16_t reg, uint16_t value);
211 uint8_t set_config_mode(bool enable);
212 void set_system_mode(uint16_t mode);
213 void ld2420_restart();
214
215 protected:
216 struct CmdReplyT {
217 uint8_t command;
218 uint8_t status;
219 uint32_t data[4];
220 uint8_t length;
221 uint16_t error;
222 volatile bool ack;
223 };
224
225 int get_firmware_int_(const char *version_string);
227 int get_gate_threshold_(uint8_t gate);
228 void get_reg_value_(uint16_t reg);
230 uint16_t get_mode_() { return this->system_mode_; };
231 void set_mode_(uint16_t mode) { this->system_mode_ = mode; };
232 bool get_presence_() { return this->presence_; };
233 void set_presence_(bool presence) { this->presence_ = presence; };
234 uint16_t get_distance_() { return this->distance_; };
235 void set_distance_(uint16_t distance) { this->distance_ = distance; };
236 bool get_cmd_active_() { return this->cmd_active_; };
237 void set_cmd_active_(bool active) { this->cmd_active_ = active; };
238 void handle_simple_mode_(const uint8_t *inbuf, int len);
239 void handle_energy_mode_(uint8_t *buffer, int len);
240 void handle_ack_data_(uint8_t *buffer, int len);
241 void readline_(int rx_data, uint8_t *buffer, int len);
242 void set_calibration_(bool state) { this->calibration_ = state; };
243 bool get_calibration_() { return this->calibration_; };
244
245#ifdef USE_NUMBER
252 std::vector<number::Number *> gate_still_threshold_numbers_ = std::vector<number::Number *>(16);
253 std::vector<number::Number *> gate_move_threshold_numbers_ = std::vector<number::Number *>(16);
254#endif
255
256 uint16_t gate_energy_[LD2420_TOTAL_GATES];
260 uint16_t system_mode_{CMD_SYSTEM_MODE_ENERGY};
261 bool cmd_active_{false};
262 char ld2420_firmware_ver_[8]{"v0.0.0"};
263 bool presence_{false};
264 bool calibration_{false};
265 uint16_t distance_{0};
267 std::vector<LD2420Listener *> listeners_{};
268};
269
270} // namespace ld2420
271} // namespace esphome
BedjetMode mode
BedJet operating mode.
Base class for all buttons.
Definition button.h:29
int get_firmware_int_(const char *version_string)
Definition ld2420.cpp:105
void readline_(int rx_data, uint8_t *buffer, int len)
Definition ld2420.cpp:321
void set_system_mode(uint16_t mode)
Definition ld2420.cpp:657
void handle_ack_data_(uint8_t *buffer, int len)
Definition ld2420.cpp:429
void set_gate_timeout_number(number::Number *number)
Definition ld2420.h:119
void set_gate_still_sensitivity_factor_number(number::Number *number)
Definition ld2420.h:126
std::vector< number::Number * > gate_still_threshold_numbers_
Definition ld2420.h:252
number::Number * gate_select_number_
Definition ld2420.h:247
uint8_t set_config_mode(bool enable)
Definition ld2420.cpp:556
void register_listener(LD2420Listener *listener)
Definition ld2420.h:151
button::Button * factory_reset_button_
Definition ld2420.h:206
void update_radar_data(uint16_t const *gate_energy, uint8_t sample_number)
Definition ld2420.cpp:246
float get_setup_priority() const override
Definition ld2420.cpp:65
void set_operating_mode_select(select::Select *selector)
Definition ld2420.h:116
void set_distance_(uint16_t distance)
Definition ld2420.h:235
void set_min_max_distances_timeout(uint32_t max_gate_distance, uint32_t min_gate_distance, uint32_t timeout)
Definition ld2420.cpp:686
uint8_t calc_checksum(void *data, size_t size)
Definition ld2420.cpp:96
void set_gate_threshold(uint8_t gate)
Definition ld2420.cpp:719
void set_factory_reset_button(button::Button *button)
Definition ld2420.h:149
void handle_energy_mode_(uint8_t *buffer, int len)
Definition ld2420.cpp:348
void set_gate_move_threshold_numbers(int gate, number::Number *n)
Definition ld2420.h:130
uint16_t gate_avg[LD2420_TOTAL_GATES]
Definition ld2420.h:193
void publish_gate_still_threshold(uint8_t gate)
Definition ld2420.h:139
button::Button * revert_config_button_
Definition ld2420.h:204
void set_calibration_(bool state)
Definition ld2420.h:242
number::Number * min_gate_distance_number_
Definition ld2420.h:248
void set_restart_module_button(button::Button *button)
Definition ld2420.h:148
button::Button * apply_config_button_
Definition ld2420.h:203
uint16_t radar_data[LD2420_TOTAL_GATES][CALIBRATE_SAMPLES]
Definition ld2420.h:192
std::vector< LD2420Listener * > listeners_
Definition ld2420.h:267
std::vector< number::Number * > gate_move_threshold_numbers_
Definition ld2420.h:253
void set_mode_(uint16_t mode)
Definition ld2420.h:231
uint16_t gate_energy_[LD2420_TOTAL_GATES]
Definition ld2420.h:256
void set_min_gate_distance_number(number::Number *number)
Definition ld2420.h:121
void set_gate_still_threshold_numbers(int gate, number::Number *n)
Definition ld2420.h:129
int get_gate_threshold_(uint8_t gate)
Definition ld2420.cpp:611
number::Number * gate_still_sensitivity_factor_number_
Definition ld2420.h:251
void set_revert_config_button(button::Button *button)
Definition ld2420.h:147
void handle_cmd_error(uint8_t error)
Definition ld2420.cpp:609
int send_cmd_from_array(CmdFrameT cmd_frame)
Definition ld2420.cpp:497
void get_reg_value_(uint16_t reg)
Definition ld2420.cpp:583
uint16_t gate_peak[LD2420_TOTAL_GATES]
Definition ld2420.h:194
void publish_gate_move_threshold(uint8_t gate)
Definition ld2420.h:135
void handle_simple_mode_(const uint8_t *inbuf, int len)
Definition ld2420.cpp:387
number::Number * max_gate_distance_number_
Definition ld2420.h:249
void set_gate_select_number(number::Number *number)
Definition ld2420.h:120
select::Select * operating_selector_
Definition ld2420.h:200
button::Button * restart_module_button_
Definition ld2420.h:205
void set_operating_mode(const std::string &state)
Definition ld2420.cpp:293
number::Number * gate_timeout_number_
Definition ld2420.h:246
void set_apply_config_button(button::Button *button)
Definition ld2420.h:146
void set_max_gate_distance_number(number::Number *number)
Definition ld2420.h:122
void set_presence_(bool presence)
Definition ld2420.h:233
number::Number * gate_move_sensitivity_factor_number_
Definition ld2420.h:250
void set_reg_value(uint16_t reg, uint16_t value)
Definition ld2420.cpp:595
void set_gate_move_sensitivity_factor_number(number::Number *number)
Definition ld2420.h:123
void set_cmd_active_(bool active)
Definition ld2420.h:237
virtual void on_fw_version(std::string &fw)
Definition ld2420.h:107
virtual void on_distance(uint16_t distance)
Definition ld2420.h:105
virtual void on_presence(bool presence)
Definition ld2420.h:104
virtual void on_energy(uint16_t *sensor_energy, size_t size)
Definition ld2420.h:106
Base-class for all numbers.
Definition number.h:39
Base-class for all selects.
Definition select.h:31
bool state
Definition fan.h:0
@ OP_CALIBRATE_MODE
Definition ld2420.h:97
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
std::string size_t len
Definition helpers.h:302
uint32_t IRAM_ATTR HOT millis()
Definition core.cpp:28
uint32_t still_thresh[LD2420_TOTAL_GATES]
Definition ld2420.h:167
uint32_t move_thresh[LD2420_TOTAL_GATES]
Definition ld2420.h:166