subghz_protocol_nero_sketch.c 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. #include "subghz_protocol_nero_sketch.h"
  2. struct SubGhzProtocolNeroSketch {
  3. SubGhzProtocolCommon common;
  4. };
  5. SubGhzProtocolNeroSketch* subghz_protocol_nero_sketch_alloc(void) {
  6. SubGhzProtocolNeroSketch* instance = furi_alloc(sizeof(SubGhzProtocolNeroSketch));
  7. instance->common.name = "Nero Sketch";
  8. instance->common.code_min_count_bit_for_found = 40;
  9. instance->common.te_shot = 330;
  10. instance->common.te_long = 660;
  11. instance->common.te_delta = 150;
  12. instance->common.to_string = (SubGhzProtocolCommonToStr)subghz_protocol_nero_sketch_to_str;
  13. return instance;
  14. }
  15. void subghz_protocol_nero_sketch_free(SubGhzProtocolNeroSketch* instance) {
  16. furi_assert(instance);
  17. free(instance);
  18. }
  19. /** Send bit
  20. *
  21. * @param instance - SubGhzProtocolNeroSketch instance
  22. * @param bit - bit
  23. */
  24. void subghz_protocol_nero_sketch_send_bit(SubGhzProtocolNeroSketch* instance, uint8_t bit) {
  25. if (bit) {
  26. //send bit 1
  27. SUBGHZ_TX_PIN_HIGTH();
  28. delay_us(instance->common.te_long);
  29. SUBGHZ_TX_PIN_LOW();
  30. delay_us(instance->common.te_shot);
  31. } else {
  32. //send bit 0
  33. SUBGHZ_TX_PIN_HIGTH();
  34. delay_us(instance->common.te_shot);
  35. SUBGHZ_TX_PIN_LOW();
  36. delay_us(instance->common.te_long);
  37. }
  38. }
  39. void subghz_protocol_nero_sketch_send_key(SubGhzProtocolNeroSketch* instance, uint64_t key, uint8_t bit,uint8_t repeat) {
  40. while (repeat--) {
  41. //Send header
  42. for(uint8_t i = 0; i < 47; i++){
  43. SUBGHZ_TX_PIN_HIGTH();
  44. delay_us(instance->common.te_shot);
  45. SUBGHZ_TX_PIN_LOW();
  46. delay_us(instance->common.te_shot);
  47. }
  48. //Send start bit
  49. SUBGHZ_TX_PIN_HIGTH();
  50. delay_us(instance->common.te_shot*4);
  51. SUBGHZ_TX_PIN_LOW();
  52. delay_us(instance->common.te_shot);
  53. //Send key data
  54. for (uint8_t i = bit; i > 0; i--) {
  55. subghz_protocol_nero_sketch_send_bit(instance, bit_read(key, i - 1));
  56. }
  57. //Send stop bit
  58. SUBGHZ_TX_PIN_HIGTH();
  59. delay_us(instance->common.te_shot*3);
  60. SUBGHZ_TX_PIN_LOW();
  61. delay_us(instance->common.te_shot);
  62. }
  63. }
  64. void subghz_protocol_nero_sketch_reset(SubGhzProtocolNeroSketch* instance) {
  65. instance->common.parser_step = 0;
  66. }
  67. /** Analysis of received data
  68. *
  69. * @param instance SubGhzProtocolNeroSketch instance
  70. */
  71. void subghz_protocol_nero_sketch_check_remote_controller(SubGhzProtocolNeroSketch* instance) {
  72. //пока не понятно с серийником, но код статический
  73. // uint64_t code_found_reverse = subghz_protocol_common_reverse_key(instance->common.code_found, instance->common.code_count_bit);
  74. // uint32_t code_fix = code_found_reverse & 0xFFFFFFFF;
  75. // //uint32_t code_hop = (code_found_reverse >> 24) & 0xFFFFF;
  76. // instance->common.serial = code_fix & 0xFFFFFFF;
  77. // instance->common.btn = (code_fix >> 28) & 0x0F;
  78. if (instance->common.callback) instance->common.callback((SubGhzProtocolCommon*)instance, instance->common.context);
  79. }
  80. void subghz_protocol_nero_sketch_parse(SubGhzProtocolNeroSketch* instance, bool level, uint32_t duration) {
  81. switch (instance->common.parser_step) {
  82. case 0:
  83. if ((level)
  84. && (DURATION_DIFF(duration,instance->common.te_shot)< instance->common.te_delta)) {
  85. instance->common.parser_step = 1;
  86. instance->common.te_last = duration;
  87. instance->common.header_count = 0;
  88. } else {
  89. instance->common.parser_step = 0;
  90. }
  91. break;
  92. case 1:
  93. if (level){
  94. if((DURATION_DIFF(duration,instance->common.te_shot)< instance->common.te_delta )
  95. || (DURATION_DIFF(duration,instance->common.te_shot*4)< instance->common.te_delta)) {
  96. instance->common.te_last = duration;
  97. } else {
  98. instance->common.parser_step = 0;
  99. }
  100. } else if(DURATION_DIFF(duration,instance->common.te_shot)< instance->common.te_delta){
  101. if(DURATION_DIFF(instance->common.te_last,instance->common.te_shot)< instance->common.te_delta){
  102. // Found header
  103. instance->common.header_count++;
  104. break;
  105. }else if(DURATION_DIFF(instance->common.te_last,instance->common.te_shot*4)< instance->common.te_delta){
  106. // Found start bit
  107. if(instance->common.header_count>40) {
  108. instance->common.parser_step = 2;
  109. instance->common.code_found = 0;
  110. instance->common.code_count_bit = 0;
  111. }else {
  112. instance->common.parser_step = 0;
  113. }
  114. } else {
  115. instance->common.parser_step = 0;
  116. }
  117. } else {
  118. instance->common.parser_step = 0;
  119. }
  120. break;
  121. case 2:
  122. if (level) {
  123. if (duration >= (instance->common.te_shot * 2 + instance->common.te_delta*2)) {
  124. //Found stop bit
  125. instance->common.parser_step = 0;
  126. if (instance->common.code_count_bit>= instance->common.code_min_count_bit_for_found) {
  127. subghz_protocol_nero_sketch_check_remote_controller(instance);
  128. }
  129. instance->common.code_found = 0;
  130. instance->common.code_count_bit = 0;
  131. break;
  132. } else {
  133. instance->common.te_last = duration;
  134. instance->common.parser_step = 3;
  135. }
  136. }else{
  137. instance->common.parser_step = 0;
  138. }
  139. break;
  140. case 3:
  141. if(!level){
  142. if ((DURATION_DIFF(instance->common.te_last,instance->common.te_shot)< instance->common.te_delta)
  143. && (DURATION_DIFF(duration,instance->common.te_long)< instance->common.te_delta)) {
  144. subghz_protocol_common_add_bit(&instance->common, 0);
  145. instance->common.parser_step = 2;
  146. } else if ((DURATION_DIFF(instance->common.te_last,instance->common.te_long )< instance->common.te_delta)
  147. && (DURATION_DIFF(duration,instance->common.te_shot)< instance->common.te_delta)) {
  148. subghz_protocol_common_add_bit(&instance->common, 1);
  149. instance->common.parser_step = 2;
  150. } else {
  151. instance->common.parser_step = 0;
  152. }
  153. } else {
  154. instance->common.parser_step = 0;
  155. }
  156. break;
  157. }
  158. }
  159. void subghz_protocol_nero_sketch_to_str(SubGhzProtocolNeroSketch* instance, string_t output) {
  160. uint32_t code_found_hi = instance->common.code_found >> 32;
  161. uint32_t code_found_lo = instance->common.code_found & 0x00000000ffffffff;
  162. uint64_t code_found_reverse = subghz_protocol_common_reverse_key(instance->common.code_found, instance->common.code_count_bit);
  163. uint32_t code_found_reverse_hi = code_found_reverse>>32;
  164. uint32_t code_found_reverse_lo = code_found_reverse&0x00000000ffffffff;
  165. //uint32_t rev_hi =
  166. string_cat_printf(output,
  167. "Protocol %s, %d Bit\r\n"
  168. " KEY:0x%lX%08lX\r\n"
  169. " YEK:0x%lX%08lX\r\n",
  170. instance->common.name,
  171. instance->common.code_count_bit,
  172. code_found_hi,
  173. code_found_lo,
  174. code_found_reverse_hi,
  175. code_found_reverse_lo
  176. );
  177. }