rfid_worker.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #include "rfid_worker.h"
  2. RfidWorker::RfidWorker() {
  3. }
  4. RfidWorker::~RfidWorker() {
  5. }
  6. void RfidWorker::start_read() {
  7. reader.start();
  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. bool RfidWorker::detect() {
  21. return reader.detect();
  22. }
  23. bool RfidWorker::any_read() {
  24. return reader.any_read();
  25. }
  26. void RfidWorker::stop_read() {
  27. reader.stop();
  28. }
  29. void RfidWorker::start_write() {
  30. write_result = WriteResult::Nothing;
  31. write_sequence = new TickSequencer();
  32. validate_counts = 0;
  33. write_sequence->do_every_tick(1, std::bind(&RfidWorker::sq_write, this));
  34. write_sequence->do_after_tick(2, std::bind(&RfidWorker::sq_write_start_validate, this));
  35. write_sequence->do_every_tick(30, std::bind(&RfidWorker::sq_write_validate, this));
  36. write_sequence->do_every_tick(1, std::bind(&RfidWorker::sq_write_stop_validate, this));
  37. }
  38. RfidWorker::WriteResult RfidWorker::write() {
  39. write_sequence->tick();
  40. return write_result;
  41. }
  42. void RfidWorker::stop_write() {
  43. delete write_sequence;
  44. reader.stop();
  45. }
  46. void RfidWorker::start_emulate() {
  47. emulator.start(key.get_type(), key.get_data(), key.get_type_data_count());
  48. }
  49. void RfidWorker::stop_emulate() {
  50. emulator.stop();
  51. }
  52. void RfidWorker::sq_write() {
  53. for(size_t i = 0; i < 5; i++) {
  54. switch(key.get_type()) {
  55. case LfrfidKeyType::KeyEM4100:
  56. writer.start();
  57. writer.write_em(key.get_data());
  58. writer.stop();
  59. break;
  60. case LfrfidKeyType::KeyH10301:
  61. writer.start();
  62. writer.write_hid(key.get_data());
  63. writer.stop();
  64. break;
  65. case LfrfidKeyType::KeyI40134:
  66. writer.start();
  67. writer.write_indala(key.get_data());
  68. writer.stop();
  69. break;
  70. }
  71. }
  72. }
  73. void RfidWorker::sq_write_start_validate() {
  74. switch(key.get_type()) {
  75. case LfrfidKeyType::KeyEM4100:
  76. case LfrfidKeyType::KeyH10301:
  77. reader.start_forced(RfidReader::Type::Normal);
  78. break;
  79. case LfrfidKeyType::KeyI40134:
  80. reader.start_forced(RfidReader::Type::Indala);
  81. break;
  82. }
  83. }
  84. void RfidWorker::sq_write_validate() {
  85. static const uint8_t data_size = LFRFID_KEY_SIZE;
  86. uint8_t data[data_size] = {0};
  87. LfrfidKeyType type;
  88. bool result = reader.read(&type, data, data_size);
  89. if(result && (write_result != WriteResult::Ok)) {
  90. if(validate_counts > (5 * 60)) {
  91. write_result = WriteResult::NotWritable;
  92. }
  93. if(type == key.get_type()) {
  94. if(memcmp(data, key.get_data(), key.get_type_data_count()) == 0) {
  95. write_result = WriteResult::Ok;
  96. validate_counts = 0;
  97. } else {
  98. validate_counts++;
  99. }
  100. } else {
  101. validate_counts++;
  102. }
  103. };
  104. }
  105. void RfidWorker::sq_write_stop_validate() {
  106. reader.stop();
  107. }