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