subghz_protocol_gate_tx.c 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. #include "subghz_protocol_gate_tx.h"
  2. struct SubGhzProtocolGateTX {
  3. SubGhzProtocolCommon common;
  4. };
  5. SubGhzProtocolGateTX* subghz_protocol_gate_tx_alloc(void) {
  6. SubGhzProtocolGateTX* instance = furi_alloc(sizeof(SubGhzProtocolGateTX));
  7. instance->common.name = "GateTX";
  8. instance->common.code_min_count_bit_for_found = 24;
  9. instance->common.te_short = 350;
  10. instance->common.te_long = 700;
  11. instance->common.te_delta = 100;
  12. instance->common.type_protocol = TYPE_PROTOCOL_STATIC;
  13. instance->common.to_string = (SubGhzProtocolCommonToStr)subghz_protocol_gate_tx_to_str;
  14. instance->common.to_save_string =
  15. (SubGhzProtocolCommonGetStrSave)subghz_protocol_gate_tx_to_save_str;
  16. instance->common.to_load_protocol=
  17. (SubGhzProtocolCommonLoad)subghz_protocol_gate_tx_to_load_protocol;
  18. instance->common.get_upload_protocol =
  19. (SubGhzProtocolEncoderCommonGetUpLoad)subghz_protocol_gate_tx_send_key;
  20. return instance;
  21. }
  22. void subghz_protocol_gate_tx_free(SubGhzProtocolGateTX* instance) {
  23. furi_assert(instance);
  24. free(instance);
  25. }
  26. bool subghz_protocol_gate_tx_send_key(SubGhzProtocolGateTX* instance, SubGhzProtocolEncoderCommon* encoder){
  27. furi_assert(instance);
  28. furi_assert(encoder);
  29. size_t index = 0;
  30. encoder->size_upload =(instance->common.code_last_count_bit * 2) + 2;
  31. if(encoder->size_upload > SUBGHZ_ENCODER_UPLOAD_MAX_SIZE) return false;
  32. //Send header
  33. encoder->upload[index++] = level_duration_make(false, (uint32_t)instance->common.te_short * 49);
  34. //Send start bit
  35. encoder->upload[index++] = level_duration_make(true, (uint32_t)instance->common.te_long);
  36. //Send key data
  37. for (uint8_t i = instance->common.code_last_count_bit; i > 0; i--) {
  38. if(bit_read(instance->common.code_last_found, i - 1)){
  39. //send bit 1
  40. encoder->upload[index++] = level_duration_make(false, (uint32_t)instance->common.te_long);
  41. encoder->upload[index++] = level_duration_make(true, (uint32_t)instance->common.te_short);
  42. }else{
  43. //send bit 0
  44. encoder->upload[index++] = level_duration_make(false, (uint32_t)instance->common.te_short);
  45. encoder->upload[index++] = level_duration_make(true, (uint32_t)instance->common.te_long);
  46. }
  47. }
  48. return true;
  49. }
  50. void subghz_protocol_gate_tx_reset(SubGhzProtocolGateTX* instance) {
  51. instance->common.parser_step = 0;
  52. }
  53. /** Analysis of received data
  54. *
  55. * @param instance SubGhzProtocolFaacSLH instance
  56. */
  57. void subghz_protocol_gate_tx_check_remote_controller(SubGhzProtocolGateTX* instance) {
  58. uint32_t code_found_reverse = subghz_protocol_common_reverse_key(instance->common.code_last_found, instance->common.code_last_count_bit);
  59. instance->common.serial = (code_found_reverse & 0xFF) << 12 | ((code_found_reverse >>8) & 0xFF) << 4 | ((code_found_reverse >>20) & 0x0F) ;
  60. instance->common.btn = ((code_found_reverse >> 16) & 0x0F);
  61. }
  62. void subghz_protocol_gate_tx_parse(SubGhzProtocolGateTX* instance, bool level, uint32_t duration) {
  63. switch (instance->common.parser_step) {
  64. case 0:
  65. if ((!level)
  66. && (DURATION_DIFF(duration,instance->common.te_short * 47)< instance->common.te_delta * 47)) {
  67. //Found Preambula
  68. instance->common.parser_step = 1;
  69. } else {
  70. instance->common.parser_step = 0;
  71. }
  72. break;
  73. case 1:
  74. if (level && ((DURATION_DIFF(duration,instance->common.te_long)< instance->common.te_delta*3))){
  75. //Found start bit
  76. instance->common.parser_step = 2;
  77. instance->common.code_found = 0;
  78. instance->common.code_count_bit = 0;
  79. } else {
  80. instance->common.parser_step = 0;
  81. }
  82. break;
  83. case 2:
  84. if (!level) {
  85. if (duration >= (instance->common.te_short * 10 + instance->common.te_delta)) {
  86. instance->common.parser_step = 1;
  87. if (instance->common.code_count_bit>= instance->common.code_min_count_bit_for_found) {
  88. instance->common.code_last_found = instance->common.code_found;
  89. instance->common.code_last_count_bit = instance->common.code_count_bit;
  90. if (instance->common.callback) instance->common.callback((SubGhzProtocolCommon*)instance, instance->common.context);
  91. }
  92. instance->common.code_found = 0;
  93. instance->common.code_count_bit = 0;
  94. break;
  95. } else {
  96. instance->common.te_last = duration;
  97. instance->common.parser_step = 3;
  98. }
  99. }
  100. break;
  101. case 3:
  102. if(level){
  103. if ((DURATION_DIFF(instance->common.te_last,instance->common.te_short)< instance->common.te_delta)
  104. && (DURATION_DIFF(duration,instance->common.te_long)< instance->common.te_delta*3)) {
  105. subghz_protocol_common_add_bit(&instance->common, 0);
  106. instance->common.parser_step = 2;
  107. } else if ((DURATION_DIFF(instance->common.te_last,instance->common.te_long)< instance->common.te_delta*3)
  108. && (DURATION_DIFF(duration,instance->common.te_short)< instance->common.te_delta)) {
  109. subghz_protocol_common_add_bit(&instance->common, 1);
  110. instance->common.parser_step = 2;
  111. } else {
  112. instance->common.parser_step = 0;
  113. }
  114. }else{
  115. instance->common.parser_step = 0;
  116. }
  117. break;
  118. }
  119. }
  120. void subghz_protocol_gate_tx_to_str(SubGhzProtocolGateTX* instance, string_t output) {
  121. subghz_protocol_gate_tx_check_remote_controller(instance);
  122. string_cat_printf(output,
  123. "%s, %d Bit\r\n"
  124. " KEY:%06lX\r\n"
  125. " SN:%05lX BTN:%lX\r\n",
  126. instance->common.name,
  127. instance->common.code_last_count_bit,
  128. (uint32_t)(instance->common.code_last_found & 0xFFFFFF),
  129. instance->common.serial,
  130. instance->common.btn
  131. );
  132. }
  133. void subghz_protocol_gate_tx_to_save_str(SubGhzProtocolGateTX* instance, string_t output) {
  134. string_printf(
  135. output,
  136. "Protocol: %s\n"
  137. "Bit: %d\n"
  138. "Key: %08lX\n",
  139. instance->common.name,
  140. instance->common.code_last_count_bit,
  141. (uint32_t)(instance->common.code_last_found & 0x00000000ffffffff));
  142. }
  143. bool subghz_protocol_gate_tx_to_load_protocol(FileWorker* file_worker, SubGhzProtocolGateTX* instance){
  144. bool loaded = false;
  145. string_t temp_str;
  146. string_init(temp_str);
  147. int res = 0;
  148. int data = 0;
  149. do {
  150. // Read and parse bit data from 2nd line
  151. if(!file_worker_read_until(file_worker, temp_str, '\n')) {
  152. break;
  153. }
  154. res = sscanf(string_get_cstr(temp_str), "Bit: %d\n", &data);
  155. if(res != 1) {
  156. break;
  157. }
  158. instance->common.code_last_count_bit = (uint8_t)data;
  159. // Read and parse key data from 3nd line
  160. if(!file_worker_read_until(file_worker, temp_str, '\n')) {
  161. break;
  162. }
  163. uint32_t temp_key = 0;
  164. res = sscanf(string_get_cstr(temp_str), "Key: %08lX\n", &temp_key);
  165. if(res != 1) {
  166. break;
  167. }
  168. instance->common.code_last_found = (uint64_t)temp_key;
  169. subghz_protocol_gate_tx_check_remote_controller(instance);
  170. loaded = true;
  171. } while(0);
  172. string_clear(temp_str);
  173. return loaded;
  174. }