/***************************************************
  Пример работы оптического датчика отпечатков пальцев
  Разработанный для работы с Adafruit BMP085 Breakout Http://www.adafruit.com/products/751
  Автор Limor Fried/Ladyada для Adafruit Industries.

  Код модифицирован и откомментирован  http://iarduino.ru
  Сканер отпечатков пальцев для Arduino http://iarduino.ru/shop/Expansion-payments/skaner-otpechakov-palcev.html
  
  ### УДАЛЕНИЕ ОТПЕЧАТКОВ ПАЛЬЦЕВ ИЗ БАЗЫ МОДУЛЯ ###
 ****************************************************/


// Линия RX (Receive)  arduino (вывод 2), подключается к ЗЕЛЁНОМУ проводу датчика T (Transmit)
// Линия TX (Transmit) arduino (вывод 3), подключается к БЕЛОМУ   проводу датчика R (Receive)

#include <Adafruit_Fingerprint.h>                               // подключаем библиотеку для работы с модулем отпечатков пальцев
#include <SoftwareSerial.h>                                     // подключаем библиотеку для работы с программным UART

uint8_t              id;                                        // идентификационный номер, под которым будет сохранён шаблон отпечатка пальца
SoftwareSerial       mySerial(2, 3);                            // объявляем объект mySerial для работы с библиотекой SoftwareSerial ИМЯ_ОБЪЕКТА( RX, TX ); // Можно указывать любые выводы, поддерживающие прерывание PCINTx
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);  // объявляем объект finger   для работы с библиотекой Adafruit_Fingerprint ИМЯ_ОБЪЕКТА = Adafruit_Fingerprint(ПАРАМЕТР); // ПАРАМЕТР - ссылка на объект для работы с UART к которому подключен модуль, например: &Serial1

void setup(){
  while(!Serial);                                               // Ожидание инициализации аппаратного UART
  delay(500);                                                   // Ожидание инициализации модуля отпечатков пальцев
  Serial.begin(9600);                                           // Инициализация аппаратного UART на скорости 9600
  Serial.println("Scan sensor...");                             // Вывод сообщения "Поиск сенсора"
  finger.begin(57600);                                          // Инициализация программного UART на скорости 57600 (скорость модуля по умолчанию)
  if(finger.verifyPassword()){Serial.println("Found sensor!");} // Если модуль отпечатков    обнаружен, выводим сообщение "сенсор обнаружен"
  else{Serial.println("Did not find sensor :("); while(1);    } // Если модуль отпечатков не обнаружен, выводим сообщение "сенсор не обнаружен" и входим в бесконечный цикл: while(1);
}

void loop(){
  Serial.println("----------------------------------");
  Serial.print  ("Please enter ID number You want delete...");  // Вывод сообщения "Пожалуйста введите идентификационный номер который Вы хотите удалить"
  id = readnumber();                                            // Ожидание получения цифры, введённой с COM-порта
  Serial.print("Ok! ID="); Serial.println(id);                  // Вывод сообщения "Введён идентификационный номер" цифра
  deleteFingerprint(id);                                        // Вызываем функцию удаления шаблона по его ID
}
// функция возвращает номер, введённый с COM-порта
uint8_t readnumber(void){
  int num = -1;                                                 // Переменная с номером, который требуется вернуть
  while(num<0){                                                 // Вход в цикл, пока переменная num не станет >= 0
    while(!Serial.available());                                 // Ожидание пока в буфере COM-порта нет появятся данные
    while(Serial.available()){                                  // Цикл пока в буфере COM-порта не закончатся данные
      char c = Serial.read();                                   // Присваиваем очередной символ из COM-порта в переменную c
      if(isdigit(c)){                                           // Если значение переменной с - цифра, то ...
        if(num<0){num=0;}else{num *= 10;}                       // Увеличиваем значение num на один порядок
        num += c - '0';                                         // Прибавляем к значению num цифру из переменной c
      } delay(5);                                               // Задержка на 5мс, чтоб в буфер COM-порта успели догрузиться следующие символы (если таковые имеются)
    }
  }
  return num;                                                   // Возвращение введённого числа
}
// Функция удаляет отпечаток пальца по указанному ID
uint8_t deleteFingerprint(uint8_t id){
  int p = -1;                                                                                                        // Переменная для получения результатов выполнения функций
  p = finger.deleteModel(id);                                                                                        // Удаляем шаблон отпечатка пальца из базы данных и возвращаем результат выполнения данной операции в переменную p
  switch(p){                                                                                                         // Проверка ответа ...
    case FINGERPRINT_OK:                 Serial.println("ID Deleted!");                               break;         // Шаблон отпечатка пальца корректно удалён
    case FINGERPRINT_PACKETRECIEVEERR:   Serial.println("Communication error");                       break;         // Ошибка соединения
    case FINGERPRINT_BADLOCATION:        Serial.println("Could not delete in that location");         break;         // Не удалось сохранить в этом месте
    case FINGERPRINT_FLASHERR:           Serial.println("Error writing to flash");                    break;         // Ошибка записи в flash память
    default:                             Serial.println("Unknown error :(\nPlease try again ");       break;         // Неизвестная ошибка
  }
}
