6namespace fingerprint_grow {
8static const char *
const TAG =
"fingerprint_grow";
21 ESP_LOGV(TAG,
"No touch sensing");
35 ESP_LOGD(TAG,
"Finger removed");
95 ESP_LOGI(TAG,
"Starting enrollment in slot %d", finger_id);
118 ESP_LOGI(TAG,
"Finished enrollment");
123 ESP_LOGD(TAG,
"Scan and match");
125 ESP_LOGV(TAG,
"Scan and match");
132 ESP_LOGD(TAG,
"Fingerprint matched");
133 uint16_t finger_id = ((uint16_t) this->
data_[1] << 8) | this->
data_[2];
134 uint16_t confidence = ((uint16_t) this->
data_[3] << 8) | this->
data_[4];
145 ESP_LOGD(TAG,
"Fingerprint not matched to any saved slots");
154 ESP_LOGD(TAG,
"Getting image %d", buffer);
156 ESP_LOGV(TAG,
"Getting image %d", buffer);
160 switch (send_result) {
166 ESP_LOGD(TAG,
"Finger Misplaced");
169 ESP_LOGV(TAG,
"No finger");
173 ESP_LOGE(TAG,
"Imaging error");
177 ESP_LOGD(TAG,
"Unknown Scan Error: %d", send_result);
181 ESP_LOGD(TAG,
"Processing image %d", buffer);
184 switch (send_result) {
186 ESP_LOGI(TAG,
"Processed image %d", buffer);
189 ESP_LOGE(TAG,
"Image too messy");
194 ESP_LOGE(TAG,
"Could not find fingerprint features");
202 ESP_LOGI(TAG,
"Creating model");
208 ESP_LOGE(TAG,
"Scans do not match");
210 return this->
data_[0];
213 ESP_LOGI(TAG,
"Storing model");
217 ESP_LOGI(TAG,
"Stored model");
220 ESP_LOGE(TAG,
"Invalid slot");
223 ESP_LOGE(TAG,
"Error writing to flash");
226 return this->
data_[0];
230 ESP_LOGD(TAG,
"Checking password");
235 ESP_LOGD(TAG,
"Password verified");
238 ESP_LOGE(TAG,
"Wrong password");
245 ESP_LOGI(TAG,
"Setting new password: %" PRIu32, this->
new_password_);
249 ESP_LOGI(TAG,
"New password successfully set");
250 ESP_LOGI(TAG,
"Define the new password in your configuration and reflash now");
251 ESP_LOGW(TAG,
"!!!Forgetting the password will render your device unusable!!!");
258 ESP_LOGD(TAG,
"Getting parameters");
261 ESP_LOGD(TAG,
"Got parameters");
283 ESP_LOGD(TAG,
"Getting fingerprint count");
286 ESP_LOGD(TAG,
"Got fingerprint count");
293 ESP_LOGI(TAG,
"Deleting fingerprint in slot %d", finger_id);
294 this->
data_ = {
DELETE, (uint8_t) (finger_id >> 8), (uint8_t) (finger_id & 0xFF), 0x00, 0x01};
297 ESP_LOGI(TAG,
"Deleted fingerprint");
301 ESP_LOGE(TAG,
"Reader failed to delete fingerprint");
307 ESP_LOGI(TAG,
"Deleting all stored fingerprints");
311 ESP_LOGI(TAG,
"Deleted all fingerprints");
315 ESP_LOGE(TAG,
"Reader failed to clear fingerprint library");
321 ESP_LOGD(TAG,
"Setting LED");
329 ESP_LOGD(TAG,
"LED set");
335 ESP_LOGE(TAG,
"Try aura_led_control instead");
341 const uint32_t now =
millis();
344 delay(this->last_aura_led_duration_ - elapsed);
346 ESP_LOGD(TAG,
"Setting Aura LED");
350 ESP_LOGD(TAG,
"Aura LED set");
351 this->last_aura_led_control_ =
millis();
352 this->last_aura_led_duration_ = 10 *
speed * count;
358 ESP_LOGE(TAG,
"Try led_control instead");
366 this->
write((uint8_t) (START_CODE >> 8));
367 this->
write((uint8_t) (START_CODE & 0xFF));
374 uint16_t wire_length = p_data_buffer->size() + 2;
375 this->
write((uint8_t) (wire_length >> 8));
376 this->
write((uint8_t) (wire_length & 0xFF));
378 uint16_t sum = (wire_length >> 8) + (wire_length & 0xFF) +
COMMAND;
379 for (
auto data : *p_data_buffer) {
384 this->
write((uint8_t) (sum >> 8));
385 this->
write((uint8_t) (sum & 0xFF));
387 p_data_buffer->clear();
390 uint16_t idx = 0,
length = 0;
392 for (uint16_t timer = 0; timer < 1000; timer++) {
402 if (
byte != (uint8_t) (START_CODE >> 8))
406 if (
byte != (uint8_t) (START_CODE & 0xFF)) {
415 if (
byte != this->
address_[idx - 2]) {
427 length = (uint16_t)
byte << 8;
433 p_data_buffer->push_back(
byte);
434 if ((idx - 8) ==
length) {
435 switch ((*p_data_buffer)[0]) {
452 ESP_LOGE(TAG,
"Reader failed to process request");
455 ESP_LOGE(TAG,
"Unknown response received from reader: 0x%.2X", (*p_data_buffer)[0]);
459 return (*p_data_buffer)[0];
465 ESP_LOGE(TAG,
"No response received from reader");
487 for (uint16_t timer = 0; timer < WAIT_FOR_WAKE_UP_MS; timer++) {
505 ESP_LOGD(TAG,
"Sensor has woken up!");
507 ESP_LOGE(TAG,
"Timed out waiting for sensor wake-up");
509 ESP_LOGE(TAG,
"Received wrong byte from the sensor during wake-up: 0x%.2X",
byte);
520 ESP_LOGE(TAG,
"Wrong password");
531 ESP_LOGD(TAG,
"Fingerprint sensor is now in sleep mode.");
536 "GROW_FINGERPRINT_READER:\n"
537 " System Identifier Code: 0x%.4X\n"
538 " Touch Sensing Pin: %s\n"
539 " Sensor Power Pin: %s",
542 this->has_power_pin_ ? this->sensor_power_pin_->dump_summary().c_str() :
"None");
546 ESP_LOGCONFIG(TAG,
" Idle Period to Sleep: Never");
548 LOG_UPDATE_INTERVAL(
this);
virtual void mark_failed()
Mark this component as failed.
virtual std::string dump_summary() const =0
virtual void digital_write(bool value)=0
virtual bool digital_read()=0
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.
void IRAM_ATTR HOT delay(uint32_t ms)
uint32_t IRAM_ATTR HOT millis()