subghz_history.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. #include "subghz_history.h"
  2. #include <lib/subghz/protocols/subghz_protocol_keeloq.h>
  3. #include <lib/subghz/protocols/subghz_protocol_star_line.h>
  4. #include <lib/subghz/protocols/subghz_protocol_princeton.h>
  5. #include <furi.h>
  6. #include <m-string.h>
  7. #define SUBGHZ_HISTORY_MAX 20
  8. typedef struct SubGhzHistoryStruct SubGhzHistoryStruct;
  9. struct SubGhzHistoryStruct {
  10. const char* name;
  11. const char* manufacture_name;
  12. uint8_t type_protocol;
  13. uint8_t code_count_bit;
  14. uint64_t code_found;
  15. uint16_t te;
  16. FuriHalSubGhzPreset preset;
  17. uint32_t real_frequency;
  18. };
  19. struct SubGhzHistory {
  20. uint32_t last_update_timestamp;
  21. uint16_t last_index_write;
  22. uint64_t code_last_found;
  23. SubGhzHistoryStruct history[SUBGHZ_HISTORY_MAX];
  24. SubGhzProtocolCommonLoad data;
  25. };
  26. SubGhzHistory* subghz_history_alloc(void) {
  27. SubGhzHistory* instance = furi_alloc(sizeof(SubGhzHistory));
  28. return instance;
  29. }
  30. void subghz_history_free(SubGhzHistory* instance) {
  31. furi_assert(instance);
  32. free(instance);
  33. }
  34. void subghz_history_set_frequency_preset(
  35. SubGhzHistory* instance,
  36. uint16_t idx,
  37. uint32_t frequency,
  38. FuriHalSubGhzPreset preset) {
  39. furi_assert(instance);
  40. if(instance->last_index_write >= SUBGHZ_HISTORY_MAX) return;
  41. instance->history[idx].preset = preset;
  42. instance->history[idx].real_frequency = frequency;
  43. }
  44. uint32_t subghz_history_get_frequency(SubGhzHistory* instance, uint16_t idx) {
  45. furi_assert(instance);
  46. return instance->history[idx].real_frequency;
  47. }
  48. FuriHalSubGhzPreset subghz_history_get_preset(SubGhzHistory* instance, uint16_t idx) {
  49. furi_assert(instance);
  50. return instance->history[idx].preset;
  51. }
  52. void subghz_history_clean(SubGhzHistory* instance) {
  53. furi_assert(instance);
  54. instance->last_index_write = 0;
  55. instance->code_last_found = 0;
  56. }
  57. uint16_t subghz_history_get_item(SubGhzHistory* instance) {
  58. furi_assert(instance);
  59. return instance->last_index_write;
  60. }
  61. uint8_t subghz_history_get_type_protocol(SubGhzHistory* instance, uint16_t idx) {
  62. furi_assert(instance);
  63. return instance->history[idx].type_protocol;
  64. }
  65. const char* subghz_history_get_name(SubGhzHistory* instance, uint16_t idx) {
  66. furi_assert(instance);
  67. return instance->history[idx].name;
  68. }
  69. SubGhzProtocolCommonLoad* subghz_history_get_raw_data(SubGhzHistory* instance, uint16_t idx) {
  70. furi_assert(instance);
  71. instance->data.code_found = instance->history[idx].code_found;
  72. instance->data.code_count_bit = instance->history[idx].code_count_bit;
  73. instance->data.param1 = instance->history[idx].te;
  74. return &instance->data;
  75. }
  76. void subghz_history_get_text_item_menu(SubGhzHistory* instance, string_t output, uint16_t idx) {
  77. if(instance->history[idx].code_count_bit < 33) {
  78. string_printf(
  79. output,
  80. "%s %lX",
  81. instance->history[idx].name,
  82. (uint32_t)(instance->history[idx].code_found & 0xFFFFFFFF));
  83. } else {
  84. string_t str_buff;
  85. string_init(str_buff);
  86. if(strcmp(instance->history[idx].name, "KeeLoq") == 0) {
  87. string_set(str_buff, "KL ");
  88. string_cat(str_buff, instance->history[idx].manufacture_name);
  89. } else if(strcmp(instance->history[idx].name, "Star Line") == 0) {
  90. string_set(str_buff, "SL ");
  91. string_cat(str_buff, instance->history[idx].manufacture_name);
  92. } else {
  93. string_set(str_buff, instance->history[idx].name);
  94. }
  95. string_printf(
  96. output,
  97. "%s %lX%08lX",
  98. string_get_cstr(str_buff),
  99. (uint32_t)(instance->history[idx].code_found >> 32),
  100. (uint32_t)(instance->history[idx].code_found & 0xFFFFFFFF));
  101. string_clear(str_buff);
  102. }
  103. }
  104. void subghz_history_add_to_history(SubGhzHistory* instance, void* context) {
  105. furi_assert(instance);
  106. furi_assert(context);
  107. SubGhzProtocolCommon* protocol = context;
  108. if(instance->last_index_write >= SUBGHZ_HISTORY_MAX) return;
  109. if((instance->code_last_found == (protocol->code_last_found & 0xFFFF0FFFFFFFFFFF)) &&
  110. ((millis() - instance->last_update_timestamp) < 500)) {
  111. instance->last_update_timestamp = millis();
  112. return;
  113. }
  114. instance->code_last_found = protocol->code_last_found & 0xFFFF0FFFFFFFFFFF;
  115. instance->last_update_timestamp = millis();
  116. instance->history[instance->last_index_write].te = 0;
  117. instance->history[instance->last_index_write].manufacture_name = NULL;
  118. instance->history[instance->last_index_write].name = protocol->name;
  119. instance->history[instance->last_index_write].code_count_bit = protocol->code_last_count_bit;
  120. instance->history[instance->last_index_write].code_found = protocol->code_last_found;
  121. if(strcmp(protocol->name, "KeeLoq") == 0) {
  122. instance->history[instance->last_index_write].manufacture_name =
  123. subghz_protocol_keeloq_get_manufacture_name(protocol);
  124. } else if(strcmp(protocol->name, "Star Line") == 0) {
  125. instance->history[instance->last_index_write].manufacture_name =
  126. subghz_protocol_star_line_get_manufacture_name(protocol);
  127. } else if(strcmp(protocol->name, "Princeton") == 0) {
  128. instance->history[instance->last_index_write].te =
  129. subghz_protocol_princeton_get_te(protocol);
  130. }
  131. instance->history[instance->last_index_write].type_protocol = protocol->type_protocol;
  132. instance->last_index_write++;
  133. }