subghz_history.c 6.0 KB

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