uhf_data.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. #include <furi.h>
  2. #include "uhf_data.h"
  3. UHFData* uhf_data_alloc() {
  4. UHFData* uhf_data = (UHFData*)malloc(sizeof(UHFData));
  5. uhf_data->word_length = 0;
  6. uhf_data->length = 0;
  7. uhf_data->start = false;
  8. uhf_data->end = false;
  9. uhf_data->next = NULL;
  10. return uhf_data;
  11. }
  12. int uhf_data_append(UHFData* uhf_data, uint8_t data) {
  13. if(data == 0xBB) {
  14. uhf_data->start = true;
  15. }
  16. if(!uhf_data->start) return 0;
  17. if(uhf_data->end) return 0;
  18. if(uhf_data->length >= MAX_DATA_SIZE) return 0;
  19. if(data == 0x7E) {
  20. uhf_data->end = true;
  21. }
  22. uhf_data->data[uhf_data->length++] = data;
  23. return 1;
  24. }
  25. void uhf_data_reset(UHFData* uhf_data) {
  26. for(size_t i = 0; i < uhf_data->length; i++) {
  27. uhf_data->data[i] = 0x00;
  28. }
  29. uhf_data->start = false;
  30. uhf_data->end = false;
  31. uhf_data->length = 0;
  32. uhf_data->next = NULL;
  33. }
  34. uint8_t uhf_data_calculate_checksum(UHFData* uhf_data) {
  35. // CheckSum8 Modulo 256
  36. // Sum of Bytes % 256
  37. uint8_t sum_val = 0x00;
  38. size_t length = uhf_data->length - 2;
  39. for(size_t i = 1; i < length; i++) {
  40. sum_val += uhf_data->data[i];
  41. }
  42. return sum_val % 256;
  43. }
  44. bool uhf_data_verfiy_checksum(UHFData* uhf_data) {
  45. uint8_t data_checksum = uhf_data->data[uhf_data->length - 2];
  46. uint8_t actual_checksum = uhf_data_calculate_checksum(uhf_data);
  47. return data_checksum == actual_checksum;
  48. }
  49. void uhf_data_free(UHFData* uhf_data) {
  50. if(uhf_data == NULL) return;
  51. while(uhf_data != NULL) {
  52. UHFData* next = uhf_data->next;
  53. free(uhf_data);
  54. uhf_data = next;
  55. }
  56. }
  57. UHFTag* uhf_tag_alloc() {
  58. UHFTag* uhf_tag = (UHFTag*)malloc(sizeof(UHFTag));
  59. return uhf_tag;
  60. }
  61. void uhf_tag_set_epc(UHFTag* uhf_tag, uint8_t* data) {
  62. // ED 1A 34 00 22 11 22 11 22 11 22 11 22 11 22 11
  63. // memcpy((void*)&select_cmd->data, (void*)&CMD_SET_SELECT_PARAMETER.cmd[0], select_cmd->length);
  64. memcpy(&uhf_tag->CRC, &data, 2);
  65. data += 2;
  66. memcpy(&uhf_tag->PC, data, 2);
  67. uint16_t epc_length = uhf_tag->PC[0];
  68. epc_length <<= 1;
  69. epc_length += uhf_tag->PC[1] & 0x08;
  70. epc_length *= 2;
  71. uhf_tag->epc_length = epc_length;
  72. memcpy(&uhf_tag->EPC, &data, (size_t)epc_length);
  73. }
  74. void uhf_tag_set_tid(UHFTag* uhf_tag, uint8_t* data) {
  75. memcpy(&uhf_tag->CRC, &data, 2);
  76. data += 2;
  77. memcpy(&uhf_tag->PC, data, 2);
  78. uint16_t epc_length = uhf_tag->PC[0];
  79. epc_length <<= 1;
  80. epc_length += uhf_tag->PC[1] & 0x08;
  81. epc_length *= 2;
  82. uhf_tag->epc_length = epc_length;
  83. memcpy(&uhf_tag->EPC, &data, (size_t)epc_length);
  84. }
  85. void uhf_tag_free(UHFTag* uhf_tag) {
  86. free(uhf_tag);
  87. }
  88. UHFResponseData* uhf_response_data_alloc() {
  89. UHFResponseData* uhf_response_data = (UHFResponseData*)malloc(sizeof(UHFResponseData));
  90. uhf_response_data->head = uhf_data_alloc();
  91. uhf_response_data->tail = uhf_response_data->head;
  92. uhf_response_data->size = 1;
  93. return uhf_response_data;
  94. }
  95. UHFData* uhf_response_data_add_new_uhf_data(UHFResponseData* uhf_response_data) {
  96. UHFData* temp = uhf_response_data->head;
  97. while(temp->next != NULL) {
  98. temp = temp->next;
  99. }
  100. temp->next = uhf_data_alloc();
  101. uhf_response_data->size++;
  102. uhf_response_data->tail = temp->next;
  103. return temp->next;
  104. }
  105. UHFData* uhf_response_data_get_uhf_data(UHFResponseData* uhf_response_data, uint index) {
  106. if(uhf_response_data == NULL || uhf_response_data->size <= index) return NULL;
  107. UHFData* uhf_data = uhf_response_data->head;
  108. if(index == 0) return uhf_data;
  109. while(uhf_data != NULL && index >= 1) {
  110. uhf_data = uhf_data->next;
  111. index--;
  112. }
  113. return uhf_data;
  114. }
  115. void uhf_response_data_reset(UHFResponseData* uhf_response_data) {
  116. uhf_data_reset(uhf_response_data->head);
  117. if(uhf_response_data->size == 1) {
  118. return;
  119. }
  120. uhf_data_free(uhf_response_data->head->next);
  121. uhf_response_data->size = 1;
  122. }
  123. void uhf_response_data_free(UHFResponseData* uhf_response_data) {
  124. uhf_data_free(uhf_response_data->head);
  125. free(uhf_response_data);
  126. }