ESPHome 2026.6.0-dev
Loading...
Searching...
No Matches
am43_base.cpp
Go to the documentation of this file.
1#include "am43_base.h"
3#include <cstring>
4
5namespace esphome::am43 {
6
7const uint8_t START_PACKET[5] = {0x00, 0xff, 0x00, 0x00, 0x9a};
8
10 uint8_t data = 0x1;
11 return this->encode_(0xA2, &data, 1);
12}
13
15 uint8_t data = 0x1;
16 return this->encode_(0xAA, &data, 1);
17}
18
20 uint8_t data = 0x1;
21 return this->encode_(CMD_GET_POSITION, &data, 1);
22}
23
25 uint8_t data[2];
26 data[0] = (pin & 0xFF00) >> 8;
27 data[1] = pin & 0xFF;
28 return this->encode_(CMD_SEND_PIN, data, 2);
29}
30
32 uint8_t data = 0xDD;
33 return this->encode_(CMD_SET_STATE, &data, 1);
34}
35
37 uint8_t data = 0xEE;
38 return this->encode_(CMD_SET_STATE, &data, 1);
39}
40
42 uint8_t data = 0xCC;
43 return this->encode_(CMD_SET_STATE, &data, 1);
44}
45
47 return this->encode_(CMD_SET_POSITION, &position, 1);
48}
49
51 uint8_t checksum = 0;
52 int i = 0;
53 for (i = 0; i < this->packet_.length; i++)
54 checksum = checksum ^ this->packet_.data[i];
55 this->packet_.data[i] = checksum ^ 0xff;
56 this->packet_.length++;
57}
58
59Am43Packet *Am43Encoder::encode_(uint8_t command, uint8_t *data, uint8_t length) {
60 memcpy(this->packet_.data, START_PACKET, 5);
61 this->packet_.data[5] = command;
62 this->packet_.data[6] = length;
63 memcpy(&this->packet_.data[7], data, length);
64 this->packet_.length = length + 7;
65 this->checksum_();
66 char hex_buf[format_hex_size(sizeof(this->packet_.data))];
67 ESP_LOGV("am43", "ENC(%d): 0x%s", this->packet_.length,
68 format_hex_to(hex_buf, this->packet_.data, this->packet_.length));
69 return &this->packet_;
70}
71
72#define VERIFY_MIN_LENGTH(x) \
73 if (length < (x)) \
74 return;
75
76void Am43Decoder::decode(const uint8_t *data, uint16_t length) {
77 this->has_battery_level_ = false;
78 this->has_light_level_ = false;
79 this->has_set_position_response_ = false;
80 this->has_set_state_response_ = false;
81 this->has_position_ = false;
82 this->has_pin_response_ = false;
83 char hex_buf[format_hex_size(24)]; // Max expected packet size
84 ESP_LOGV("am43", "DEC(%d): 0x%s", length, format_hex_to(hex_buf, data, length));
85
86 if (length < 2 || data[0] != 0x9a)
87 return;
88 switch (data[1]) {
89 case CMD_GET_BATTERY_LEVEL: {
90 VERIFY_MIN_LENGTH(8);
91 this->battery_level_ = data[7];
92 this->has_battery_level_ = true;
93 break;
94 }
95 case CMD_GET_LIGHT_LEVEL: {
96 VERIFY_MIN_LENGTH(5);
97 this->light_level_ = 100 * ((float) data[4] / 9);
98 this->has_light_level_ = true;
99 break;
100 }
101 case CMD_GET_POSITION: {
102 VERIFY_MIN_LENGTH(6);
103 this->position_ = data[5];
104 this->has_position_ = true;
105 break;
106 }
107 case CMD_NOTIFY_POSITION: {
108 VERIFY_MIN_LENGTH(5);
109 this->position_ = data[4];
110 this->has_position_ = true;
111 break;
112 }
113 case CMD_SEND_PIN: {
114 VERIFY_MIN_LENGTH(4);
115 this->pin_ok_ = data[3] == RESPONSE_ACK;
116 this->has_pin_response_ = true;
117 break;
118 }
119 case CMD_SET_POSITION: {
120 VERIFY_MIN_LENGTH(4);
121 this->set_position_ok_ = data[3] == RESPONSE_ACK;
122 this->has_set_position_response_ = true;
123 break;
124 }
125 case CMD_SET_STATE: {
126 VERIFY_MIN_LENGTH(4);
127 this->set_state_ok_ = data[3] == RESPONSE_ACK;
128 this->has_set_state_response_ = true;
129 break;
130 }
131 default:
132 break;
133 }
134};
135
136} // namespace esphome::am43
uint8_t checksum
Definition bl0906.h:3
void decode(const uint8_t *data, uint16_t length)
Definition am43_base.cpp:76
Am43Packet * get_send_pin_request(uint16_t pin)
Definition am43_base.cpp:24
Am43Packet * get_set_position_request(uint8_t position)
Definition am43_base.cpp:46
Am43Packet * get_open_request()
Definition am43_base.cpp:31
Am43Packet * encode_(uint8_t command, uint8_t *data, uint8_t length)
Definition am43_base.cpp:59
Am43Packet * get_light_level_request()
Definition am43_base.cpp:14
Am43Packet * get_stop_request()
Definition am43_base.cpp:41
Am43Packet * get_position_request()
Definition am43_base.cpp:19
Am43Packet * get_battery_level_request()
Definition am43_base.cpp:9
Am43Packet * get_close_request()
Definition am43_base.cpp:36
float position
Definition cover.h:0
const uint8_t START_PACKET[5]
Definition am43_base.cpp:7
constexpr size_t format_hex_size(size_t byte_count)
Calculate buffer size needed for format_hex_to: "XXXXXXXX...\0" = bytes * 2 + 1.
Definition helpers.h:1360
char * format_hex_to(char *buffer, size_t buffer_size, const uint8_t *data, size_t length)
Format byte array as lowercase hex to buffer (base implementation).
Definition helpers.cpp:334
uint16_t length
Definition tt21100.cpp:0