7namespace fingerprint_grow {
9static const char *
const TAG =
"fingerprint_grow";
22 ESP_LOGV(TAG,
"No touch sensing");
36 ESP_LOGD(TAG,
"Finger removed");
84 if (this->
new_password_ != std::numeric_limits<uint32_t>::max()) {
96 ESP_LOGI(TAG,
"Starting enrollment in slot %d", finger_id);
119 ESP_LOGI(TAG,
"Finished enrollment");
124 ESP_LOGD(TAG,
"Scan and match");
126 ESP_LOGV(TAG,
"Scan and match");
133 ESP_LOGD(TAG,
"Fingerprint matched");
134 uint16_t finger_id = ((uint16_t) this->
data_[1] << 8) | this->
data_[2];
135 uint16_t confidence = ((uint16_t) this->
data_[3] << 8) | this->
data_[4];
146 ESP_LOGD(TAG,
"Fingerprint not matched to any saved slots");
155 ESP_LOGD(TAG,
"Getting image %d", buffer);
157 ESP_LOGV(TAG,
"Getting image %d", buffer);
161 switch (send_result) {
167 ESP_LOGD(TAG,
"Finger Misplaced");
170 ESP_LOGV(TAG,
"No finger");
174 ESP_LOGE(TAG,
"Imaging error");
178 ESP_LOGD(TAG,
"Unknown Scan Error: %d", send_result);
182 ESP_LOGD(TAG,
"Processing image %d", buffer);
185 switch (send_result) {
187 ESP_LOGI(TAG,
"Processed image %d", buffer);
190 ESP_LOGE(TAG,
"Image too messy");
195 ESP_LOGE(TAG,
"Could not find fingerprint features");
203 ESP_LOGI(TAG,
"Creating model");
209 ESP_LOGE(TAG,
"Scans do not match");
211 return this->
data_[0];
214 ESP_LOGI(TAG,
"Storing model");
218 ESP_LOGI(TAG,
"Stored model");
221 ESP_LOGE(TAG,
"Invalid slot");
224 ESP_LOGE(TAG,
"Error writing to flash");
227 return this->
data_[0];
231 ESP_LOGD(TAG,
"Checking password");
236 ESP_LOGD(TAG,
"Password verified");
239 ESP_LOGE(TAG,
"Wrong password");
246 ESP_LOGI(TAG,
"Setting new password: %" PRIu32, this->
new_password_);
250 ESP_LOGI(TAG,
"New password successfully set");
251 ESP_LOGI(TAG,
"Define the new password in your configuration and reflash now");
252 ESP_LOGW(TAG,
"!!!Forgetting the password will render your device unusable!!!");
259 ESP_LOGD(TAG,
"Getting parameters");
262 ESP_LOGD(TAG,
"Got parameters");
284 ESP_LOGD(TAG,
"Getting fingerprint count");
287 ESP_LOGD(TAG,
"Got fingerprint count");
294 ESP_LOGI(TAG,
"Deleting fingerprint in slot %d", finger_id);
295 this->
data_ = {
DELETE, (uint8_t) (finger_id >> 8), (uint8_t) (finger_id & 0xFF), 0x00, 0x01};
298 ESP_LOGI(TAG,
"Deleted fingerprint");
302 ESP_LOGE(TAG,
"Reader failed to delete fingerprint");
308 ESP_LOGI(TAG,
"Deleting all stored fingerprints");
312 ESP_LOGI(TAG,
"Deleted all fingerprints");
316 ESP_LOGE(TAG,
"Reader failed to clear fingerprint library");
322 ESP_LOGD(TAG,
"Setting LED");
330 ESP_LOGD(TAG,
"LED set");
336 ESP_LOGE(TAG,
"Try aura_led_control instead");
342 const uint32_t now =
millis();
345 delay(this->last_aura_led_duration_ - elapsed);
347 ESP_LOGD(TAG,
"Setting Aura LED");
351 ESP_LOGD(TAG,
"Aura LED set");
352 this->last_aura_led_control_ =
millis();
353 this->last_aura_led_duration_ = 10 *
speed * count;
359 ESP_LOGE(TAG,
"Try led_control instead");
367 this->
write((uint8_t) (START_CODE >> 8));
368 this->
write((uint8_t) (START_CODE & 0xFF));
375 uint16_t wire_length = p_data_buffer->size() + 2;
376 this->
write((uint8_t) (wire_length >> 8));
377 this->
write((uint8_t) (wire_length & 0xFF));
379 uint16_t sum = (wire_length >> 8) + (wire_length & 0xFF) +
COMMAND;
380 for (
auto data : *p_data_buffer) {
385 this->
write((uint8_t) (sum >> 8));
386 this->
write((uint8_t) (sum & 0xFF));
388 p_data_buffer->clear();
391 uint16_t idx = 0,
length = 0;
393 for (uint16_t timer = 0; timer < 1000; timer++) {
403 if (
byte != (uint8_t) (START_CODE >> 8))
407 if (
byte != (uint8_t) (START_CODE & 0xFF)) {
416 if (
byte != this->
address_[idx - 2]) {
428 length = (uint16_t)
byte << 8;
434 p_data_buffer->push_back(
byte);
435 if ((idx - 8) ==
length) {
436 switch ((*p_data_buffer)[0]) {
453 ESP_LOGE(TAG,
"Reader failed to process request");
456 ESP_LOGE(TAG,
"Unknown response received from reader: 0x%.2X", (*p_data_buffer)[0]);
460 return (*p_data_buffer)[0];
466 ESP_LOGE(TAG,
"No response received from reader");
488 for (uint16_t timer = 0; timer < WAIT_FOR_WAKE_UP_MS; timer++) {
506 ESP_LOGD(TAG,
"Sensor has woken up!");
508 ESP_LOGE(TAG,
"Timed out waiting for sensor wake-up");
510 ESP_LOGE(TAG,
"Received wrong byte from the sensor during wake-up: 0x%.2X",
byte);
521 ESP_LOGE(TAG,
"Wrong password");
532 ESP_LOGD(TAG,
"Fingerprint sensor is now in sleep mode.");
545 "GROW_FINGERPRINT_READER:\n"
546 " System Identifier Code: 0x%.4X\n"
547 " Touch Sensing Pin: %s\n"
548 " Sensor Power Pin: %s",
554 ESP_LOGCONFIG(TAG,
" Idle Period to Sleep: Never");
556 LOG_UPDATE_INTERVAL(
this);
virtual void mark_failed()
Mark this component as failed.
virtual void digital_write(bool value)=0
virtual bool digital_read()=0
virtual size_t dump_summary(char *buffer, size_t len) const
Write a summary of this pin to the provided buffer.
void publish_state(bool new_state)
Publish a new state to the front-end.
sensor::Sensor * last_confidence_sensor_
CallbackManager< void(uint16_t, uint16_t)> finger_scan_matched_callback_
uint8_t enrollment_image_
GPIOPin * sensor_power_pin_
sensor::Sensor * capacity_sensor_
void dump_config() override
sensor::Sensor * status_sensor_
sensor::Sensor * security_level_sensor_
uint8_t enrollment_buffers_
CallbackManager< void()> finger_scan_unmatched_callback_
void get_fingerprint_count_()
void enroll_fingerprint(uint16_t finger_id, uint8_t num_buffers)
uint32_t idle_period_to_sleep_ms_
sensor::Sensor * last_finger_id_sensor_
std::vector< uint8_t > data_
uint8_t transfer_(std::vector< uint8_t > *p_data_buffer)
uint16_t enrollment_slot_
CallbackManager< void(uint16_t)> enrollment_done_callback_
binary_sensor::BinarySensor * enrolling_binary_sensor_
sensor::Sensor * fingerprint_count_sensor_
CallbackManager< void(uint16_t)> enrollment_failed_callback_
void finish_enrollment(uint8_t result)
CallbackManager< void()> finger_scan_start_callback_
uint8_t scan_image_(uint8_t buffer)
void aura_led_control(uint8_t state, uint8_t speed, uint8_t color, uint8_t count)
CallbackManager< void(uint8_t, uint16_t)> enrollment_scan_callback_
CallbackManager< void()> finger_scan_misplaced_callback_
void led_control(bool state)
uint8_t save_fingerprint_()
uint32_t last_transfer_ms_
uint16_t last_aura_led_duration_
void delete_all_fingerprints()
uint32_t last_aura_led_control_
CallbackManager< void()> finger_scan_invalid_callback_
void delete_fingerprint(uint16_t finger_id)
uint16_t system_identifier_code_
void publish_state(float state)
Publish a new state to the front-end.
float get_state() const
Getter-syntax for .state.
size_t write(uint8_t data)
Providing packet encoding functions for exchanging data with a remote host.
constexpr size_t GPIO_SUMMARY_MAX_LEN
Maximum buffer size for dump_summary output.
void IRAM_ATTR HOT delay(uint32_t ms)
uint32_t IRAM_ATTR HOT millis()