rfid-worker.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #include "rfid-worker.h"
  2. RfidWorker::RfidWorker() {
  3. }
  4. RfidWorker::~RfidWorker() {
  5. }
  6. void RfidWorker::start_read() {
  7. reader.start(RfidReader::Type::Normal);
  8. }
  9. bool RfidWorker::read() {
  10. static const uint8_t data_size = LFRFID_KEY_SIZE;
  11. uint8_t data[data_size] = {0};
  12. LfrfidKeyType type;
  13. bool result = reader.read(&type, data, data_size);
  14. if(result) {
  15. key.set_type(type);
  16. key.set_data(data, data_size);
  17. };
  18. return result;
  19. }
  20. void RfidWorker::stop_read() {
  21. reader.stop();
  22. }
  23. void RfidWorker::start_write() {
  24. write_result = WriteResult::Nothing;
  25. write_sequence = new TickSequencer();
  26. validate_counts = 0;
  27. write_sequence->do_every_tick(1, std::bind(&RfidWorker::sq_write, this));
  28. write_sequence->do_after_tick(2, std::bind(&RfidWorker::sq_write_start_validate, this));
  29. write_sequence->do_after_tick(15, std::bind(&RfidWorker::sq_write_validate, this));
  30. write_sequence->do_every_tick(1, std::bind(&RfidWorker::sq_write_stop_validate, this));
  31. }
  32. RfidWorker::WriteResult RfidWorker::write() {
  33. write_sequence->tick();
  34. return write_result;
  35. }
  36. void RfidWorker::stop_write() {
  37. delete write_sequence;
  38. reader.stop();
  39. }
  40. void RfidWorker::start_emulate() {
  41. emulator.start(key.get_type(), key.get_data(), key.get_type_data_count());
  42. }
  43. void RfidWorker::stop_emulate() {
  44. emulator.stop();
  45. }
  46. void RfidWorker::sq_write() {
  47. // TODO expand this
  48. switch(key.get_type()) {
  49. case LfrfidKeyType::KeyEM4100:
  50. writer.start();
  51. writer.write_em(key.get_data());
  52. writer.stop();
  53. break;
  54. case LfrfidKeyType::KeyH10301:
  55. writer.start();
  56. writer.write_hid(key.get_data());
  57. writer.stop();
  58. break;
  59. default:
  60. break;
  61. }
  62. }
  63. void RfidWorker::sq_write_start_validate() {
  64. reader.start(RfidReader::Type::Normal);
  65. }
  66. void RfidWorker::sq_write_validate() {
  67. static const uint8_t data_size = LFRFID_KEY_SIZE;
  68. uint8_t data[data_size] = {0};
  69. LfrfidKeyType type;
  70. bool result = reader.read(&type, data, data_size);
  71. if(result) {
  72. if(type == key.get_type()) {
  73. if(memcmp(data, key.get_data(), key.get_type_data_count()) == 0) {
  74. write_result = WriteResult::Ok;
  75. validate_counts = 0;
  76. } else {
  77. validate_counts++;
  78. }
  79. } else {
  80. validate_counts++;
  81. }
  82. if(validate_counts > 5) {
  83. write_result = WriteResult::NotWritable;
  84. }
  85. };
  86. }
  87. void RfidWorker::sq_write_stop_validate() {
  88. reader.stop();
  89. }