subghz_history.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  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 50
  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_space_left(SubGhzHistory* instance, string_t output) {
  77. furi_assert(instance);
  78. string_printf(output, "%02u/%02u", instance->last_index_write, SUBGHZ_HISTORY_MAX);
  79. }
  80. void subghz_history_get_text_item_menu(SubGhzHistory* instance, string_t output, uint16_t idx) {
  81. if(instance->history[idx].code_count_bit < 33) {
  82. string_printf(
  83. output,
  84. "%s %lX",
  85. instance->history[idx].name,
  86. (uint32_t)(instance->history[idx].code_found & 0xFFFFFFFF));
  87. } else {
  88. string_t str_buff;
  89. string_init(str_buff);
  90. if(strcmp(instance->history[idx].name, "KeeLoq") == 0) {
  91. string_set(str_buff, "KL ");
  92. string_cat(str_buff, instance->history[idx].manufacture_name);
  93. } else if(strcmp(instance->history[idx].name, "Star Line") == 0) {
  94. string_set(str_buff, "SL ");
  95. string_cat(str_buff, instance->history[idx].manufacture_name);
  96. } else {
  97. string_set(str_buff, instance->history[idx].name);
  98. }
  99. string_printf(
  100. output,
  101. "%s %lX%08lX",
  102. string_get_cstr(str_buff),
  103. (uint32_t)(instance->history[idx].code_found >> 32),
  104. (uint32_t)(instance->history[idx].code_found & 0xFFFFFFFF));
  105. string_clear(str_buff);
  106. }
  107. }
  108. void subghz_history_add_to_history(SubGhzHistory* instance, void* context) {
  109. furi_assert(instance);
  110. furi_assert(context);
  111. SubGhzProtocolCommon* protocol = context;
  112. if(instance->last_index_write >= SUBGHZ_HISTORY_MAX) return;
  113. if((instance->code_last_found == (protocol->code_last_found & 0xFFFF0FFFFFFFFFFF)) &&
  114. ((millis() - instance->last_update_timestamp) < 500)) {
  115. instance->last_update_timestamp = millis();
  116. return;
  117. }
  118. instance->code_last_found = protocol->code_last_found & 0xFFFF0FFFFFFFFFFF;
  119. instance->last_update_timestamp = millis();
  120. instance->history[instance->last_index_write].te = 0;
  121. instance->history[instance->last_index_write].manufacture_name = NULL;
  122. instance->history[instance->last_index_write].name = protocol->name;
  123. instance->history[instance->last_index_write].code_count_bit = protocol->code_last_count_bit;
  124. instance->history[instance->last_index_write].code_found = protocol->code_last_found;
  125. if(strcmp(protocol->name, "KeeLoq") == 0) {
  126. instance->history[instance->last_index_write].manufacture_name =
  127. subghz_protocol_keeloq_get_manufacture_name(protocol);
  128. } else if(strcmp(protocol->name, "Star Line") == 0) {
  129. instance->history[instance->last_index_write].manufacture_name =
  130. subghz_protocol_star_line_get_manufacture_name(protocol);
  131. } else if(strcmp(protocol->name, "Princeton") == 0) {
  132. instance->history[instance->last_index_write].te =
  133. subghz_protocol_princeton_get_te(protocol);
  134. }
  135. instance->history[instance->last_index_write].type_protocol = protocol->type_protocol;
  136. instance->last_index_write++;
  137. }