subghz_history.c 6.2 KB

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