subghz_protocol.c 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. #include "subghz_protocol.h"
  2. #include "subghz_protocol_came.h"
  3. #include "subghz_protocol_cfm.h"
  4. #include "subghz_protocol_keeloq.h"
  5. #include "subghz_protocol_nice_flo.h"
  6. #include "subghz_protocol_nice_flor_s.h"
  7. #include "subghz_protocol_princeton.h"
  8. #include "subghz_protocol_gate_tx.h"
  9. #include "subghz_protocol_ido.h"
  10. #include "subghz_protocol_faac_slh.h"
  11. #include "subghz_protocol_nero_sketch.h"
  12. #include "subghz_protocol_star_line.h"
  13. #include "../subghz_keystore.h"
  14. #include <furi.h>
  15. #include <m-string.h>
  16. typedef enum {
  17. SubGhzProtocolTypeCame,
  18. SubGhzProtocolTypeKeeloq,
  19. SubGhzProtocolTypeNiceFlo,
  20. SubGhzProtocolTypeNiceFlorS,
  21. SubGhzProtocolTypePrinceton,
  22. SubGhzProtocolTypeGateTX,
  23. SubGhzProtocolTypeIDo,
  24. SubGhzProtocolTypeFaacSLH,
  25. SubGhzProtocolTypeNeroSketch,
  26. SubGhzProtocolTypeStarLine,
  27. SubGhzProtocolTypeMax,
  28. } SubGhzProtocolType;
  29. struct SubGhzProtocol {
  30. SubGhzKeystore* keystore;
  31. SubGhzProtocolCommon* protocols[SubGhzProtocolTypeMax];
  32. SubGhzProtocolTextCallback text_callback;
  33. void* text_callback_context;
  34. SubGhzProtocolCommonCallbackDump parser_callback;
  35. void* parser_callback_context;
  36. };
  37. static void subghz_protocol_text_rx_callback(SubGhzProtocolCommon* parser, void* context) {
  38. SubGhzProtocol* instance = context;
  39. string_t output;
  40. string_init(output);
  41. subghz_protocol_common_to_str((SubGhzProtocolCommon*)parser, output);
  42. if (instance->text_callback) {
  43. instance->text_callback(output, instance->text_callback_context);
  44. } else {
  45. printf(string_get_cstr(output));
  46. }
  47. string_clear(output);
  48. }
  49. static void subghz_protocol_parser_rx_callback(SubGhzProtocolCommon* parser, void* context) {
  50. SubGhzProtocol* instance = context;
  51. if (instance->parser_callback) {
  52. instance->parser_callback(parser, instance->parser_callback_context);
  53. }
  54. }
  55. SubGhzProtocol* subghz_protocol_alloc() {
  56. SubGhzProtocol* instance = furi_alloc(sizeof(SubGhzProtocol));
  57. instance->keystore = subghz_keystore_alloc();
  58. instance->protocols[SubGhzProtocolTypeCame] =(SubGhzProtocolCommon*)subghz_protocol_came_alloc();
  59. instance->protocols[SubGhzProtocolTypeKeeloq] = (SubGhzProtocolCommon*)subghz_protocol_keeloq_alloc(instance->keystore);
  60. instance->protocols[SubGhzProtocolTypePrinceton] = (SubGhzProtocolCommon*)subghz_decoder_princeton_alloc();
  61. instance->protocols[SubGhzProtocolTypeNiceFlo] = (SubGhzProtocolCommon*)subghz_protocol_nice_flo_alloc();
  62. instance->protocols[SubGhzProtocolTypeNiceFlorS] = (SubGhzProtocolCommon*)subghz_protocol_nice_flor_s_alloc();
  63. instance->protocols[SubGhzProtocolTypeGateTX] = (SubGhzProtocolCommon*)subghz_protocol_gate_tx_alloc();
  64. instance->protocols[SubGhzProtocolTypeIDo] = (SubGhzProtocolCommon*)subghz_protocol_ido_alloc();
  65. instance->protocols[SubGhzProtocolTypeFaacSLH] = (SubGhzProtocolCommon*)subghz_protocol_faac_slh_alloc();
  66. instance->protocols[SubGhzProtocolTypeNeroSketch] = (SubGhzProtocolCommon*)subghz_protocol_nero_sketch_alloc();
  67. instance->protocols[SubGhzProtocolTypeStarLine] = (SubGhzProtocolCommon*)subghz_protocol_star_line_alloc(instance->keystore);
  68. return instance;
  69. }
  70. void subghz_protocol_free(SubGhzProtocol* instance) {
  71. furi_assert(instance);
  72. subghz_protocol_came_free((SubGhzProtocolCame*)instance->protocols[SubGhzProtocolTypeCame]);
  73. subghz_protocol_keeloq_free((SubGhzProtocolKeeloq*)instance->protocols[SubGhzProtocolTypeKeeloq]);
  74. subghz_decoder_princeton_free((SubGhzDecoderPrinceton*)instance->protocols[SubGhzProtocolTypePrinceton]);
  75. subghz_protocol_nice_flo_free((SubGhzProtocolNiceFlo*)instance->protocols[SubGhzProtocolTypeNiceFlo]);
  76. subghz_protocol_nice_flor_s_free((SubGhzProtocolNiceFlorS*)instance->protocols[SubGhzProtocolTypeNiceFlorS]);
  77. subghz_protocol_gate_tx_free((SubGhzProtocolGateTX*)instance->protocols[SubGhzProtocolTypeGateTX]);
  78. subghz_protocol_ido_free((SubGhzProtocolIDo*)instance->protocols[SubGhzProtocolTypeIDo]);
  79. subghz_protocol_faac_slh_free((SubGhzProtocolFaacSLH*)instance->protocols[SubGhzProtocolTypeFaacSLH]);
  80. subghz_protocol_nero_sketch_free((SubGhzProtocolNeroSketch*)instance->protocols[SubGhzProtocolTypeNeroSketch]);
  81. subghz_protocol_star_line_free((SubGhzProtocolStarLine*)instance->protocols[SubGhzProtocolTypeStarLine]);
  82. subghz_keystore_free(instance->keystore);
  83. free(instance);
  84. }
  85. SubGhzProtocolCommon* subghz_protocol_get_by_name(SubGhzProtocol* instance, const char* name) {
  86. SubGhzProtocolCommon* result = NULL;
  87. for(size_t i = 0; i < SubGhzProtocolTypeMax; i++) {
  88. if(strcmp(instance->protocols[i]->name, name) == 0) {
  89. result = instance->protocols[i];
  90. break;
  91. }
  92. }
  93. return result;
  94. }
  95. void subghz_protocol_enable_dump_text(SubGhzProtocol* instance, SubGhzProtocolTextCallback callback, void* context) {
  96. furi_assert(instance);
  97. for(size_t i = 0; i < SubGhzProtocolTypeMax; i++) {
  98. subghz_protocol_common_set_callback(instance->protocols[i], subghz_protocol_text_rx_callback, instance);
  99. }
  100. instance->text_callback = callback;
  101. instance->text_callback_context = context;
  102. }
  103. void subghz_protocol_enable_dump(SubGhzProtocol* instance, SubGhzProtocolCommonCallbackDump callback, void* context) {
  104. furi_assert(instance);
  105. for(size_t i = 0; i < SubGhzProtocolTypeMax; i++) {
  106. subghz_protocol_common_set_callback(instance->protocols[i], subghz_protocol_parser_rx_callback, instance);
  107. }
  108. instance->parser_callback = callback;
  109. instance->parser_callback_context = context;
  110. }
  111. void subghz_protocol_load_nice_flor_s_file(SubGhzProtocol* instance, const char* file_name) {
  112. // subghz_protocol_nice_flor_s_name_file(instance->nice_flor_s, file_name);
  113. subghz_protocol_nice_flor_s_name_file((SubGhzProtocolNiceFlorS*) instance->protocols[SubGhzProtocolTypeNiceFlorS], file_name);
  114. }
  115. void subghz_protocol_load_keeloq_file(SubGhzProtocol* instance, const char* file_name) {
  116. subghz_keystore_load(instance->keystore, file_name);
  117. }
  118. void subghz_protocol_reset(SubGhzProtocol* instance) {
  119. subghz_protocol_came_reset((SubGhzProtocolCame*)instance->protocols[SubGhzProtocolTypeCame]);
  120. subghz_protocol_keeloq_reset((SubGhzProtocolKeeloq*)instance->protocols[SubGhzProtocolTypeKeeloq]);
  121. subghz_decoder_princeton_reset((SubGhzDecoderPrinceton*)instance->protocols[SubGhzProtocolTypePrinceton]);
  122. subghz_protocol_nice_flo_reset((SubGhzProtocolNiceFlo*)instance->protocols[SubGhzProtocolTypeNiceFlo]);
  123. subghz_protocol_nice_flor_s_reset((SubGhzProtocolNiceFlorS*)instance->protocols[SubGhzProtocolTypeNiceFlorS]);
  124. subghz_protocol_gate_tx_reset((SubGhzProtocolGateTX*)instance->protocols[SubGhzProtocolTypeGateTX]);
  125. subghz_protocol_ido_reset((SubGhzProtocolIDo*)instance->protocols[SubGhzProtocolTypeIDo]);
  126. subghz_protocol_faac_slh_reset((SubGhzProtocolFaacSLH*)instance->protocols[SubGhzProtocolTypeFaacSLH]);
  127. subghz_protocol_nero_sketch_reset((SubGhzProtocolNeroSketch*)instance->protocols[SubGhzProtocolTypeNeroSketch]);
  128. subghz_protocol_star_line_reset((SubGhzProtocolStarLine*)instance->protocols[SubGhzProtocolTypeStarLine]);
  129. }
  130. void subghz_protocol_parse(SubGhzProtocol* instance, bool level, uint32_t duration) {
  131. subghz_protocol_came_parse((SubGhzProtocolCame*)instance->protocols[SubGhzProtocolTypeCame], level, duration);
  132. subghz_protocol_keeloq_parse((SubGhzProtocolKeeloq*)instance->protocols[SubGhzProtocolTypeKeeloq], level, duration);
  133. subghz_decoder_princeton_parse((SubGhzDecoderPrinceton*)instance->protocols[SubGhzProtocolTypePrinceton], level, duration);
  134. subghz_protocol_nice_flo_parse((SubGhzProtocolNiceFlo*)instance->protocols[SubGhzProtocolTypeNiceFlo], level, duration);
  135. subghz_protocol_nice_flor_s_parse((SubGhzProtocolNiceFlorS*)instance->protocols[SubGhzProtocolTypeNiceFlorS], level, duration);
  136. subghz_protocol_gate_tx_parse((SubGhzProtocolGateTX*)instance->protocols[SubGhzProtocolTypeGateTX], level, duration);
  137. subghz_protocol_ido_parse((SubGhzProtocolIDo*)instance->protocols[SubGhzProtocolTypeIDo], level, duration);
  138. subghz_protocol_faac_slh_parse((SubGhzProtocolFaacSLH*)instance->protocols[SubGhzProtocolTypeFaacSLH], level, duration);
  139. subghz_protocol_nero_sketch_parse((SubGhzProtocolNeroSketch*)instance->protocols[SubGhzProtocolTypeNeroSketch], level, duration);
  140. subghz_protocol_star_line_parse((SubGhzProtocolStarLine*)instance->protocols[SubGhzProtocolTypeStarLine], level, duration);
  141. }