subghz_protocol_came_atomo.c 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. #include "subghz_protocol_came_atomo.h"
  2. #include "subghz_protocol_common.h"
  3. #include <lib/toolbox/manchester-decoder.h>
  4. struct SubGhzProtocolCameAtomo {
  5. SubGhzProtocolCommon common;
  6. ManchesterState manchester_saved_state;
  7. };
  8. typedef enum {
  9. CameAtomoDecoderStepReset = 0,
  10. CameAtomoDecoderStepDecoderData,
  11. } CameAtomoDecoderStep;
  12. SubGhzProtocolCameAtomo* subghz_protocol_came_atomo_alloc() {
  13. SubGhzProtocolCameAtomo* instance = furi_alloc(sizeof(SubGhzProtocolCameAtomo));
  14. instance->common.name = "CAME Atomo";
  15. instance->common.code_min_count_bit_for_found = 62;
  16. instance->common.te_short = 600;
  17. instance->common.te_long = 1200;
  18. instance->common.te_delta = 250;
  19. instance->common.type_protocol = SubGhzProtocolCommonTypeStatic;
  20. instance->common.to_string = (SubGhzProtocolCommonToStr)subghz_protocol_came_atomo_to_str;
  21. // instance->common.to_save_string =
  22. // (SubGhzProtocolCommonGetStrSave)subghz_protocol_came_atomo_to_save_str;
  23. //instance->common.to_load_protocol_from_file =
  24. // (SubGhzProtocolCommonLoadFromFile)subghz_protocol_came_atomo_to_load_protocol_from_file;
  25. instance->common.to_load_protocol =
  26. (SubGhzProtocolCommonLoadFromRAW)subghz_decoder_came_atomo_to_load_protocol;
  27. // instance->common.get_upload_protocol =
  28. // (SubGhzProtocolCommonEncoderGetUpLoad)subghz_protocol_came_atomo_send_key;
  29. return instance;
  30. }
  31. void subghz_protocol_came_atomo_free(SubGhzProtocolCameAtomo* instance) {
  32. furi_assert(instance);
  33. free(instance);
  34. }
  35. /** Analysis of received data
  36. *
  37. * @param instance SubGhzProtocolCameAtomo instance
  38. */
  39. void subghz_protocol_came_atomo_remote_controller(SubGhzProtocolCameAtomo* instance) {
  40. }
  41. void subghz_protocol_came_atomo_reset(SubGhzProtocolCameAtomo* instance) {
  42. instance->common.parser_step = CameAtomoDecoderStepReset;
  43. manchester_advance(
  44. instance->manchester_saved_state,
  45. ManchesterEventReset,
  46. &instance->manchester_saved_state,
  47. NULL);
  48. }
  49. void subghz_protocol_came_atomo_parse(
  50. SubGhzProtocolCameAtomo* instance,
  51. bool level,
  52. uint32_t duration) {
  53. ManchesterEvent event = ManchesterEventReset;
  54. switch(instance->common.parser_step) {
  55. case CameAtomoDecoderStepReset:
  56. if((!level) && (DURATION_DIFF(duration, instance->common.te_long * 65) <
  57. instance->common.te_delta * 20)) {
  58. //Found header CAME
  59. instance->common.parser_step = CameAtomoDecoderStepDecoderData;
  60. instance->common.code_found = 0;
  61. instance->common.code_count_bit = 1;
  62. manchester_advance(
  63. instance->manchester_saved_state,
  64. ManchesterEventReset,
  65. &instance->manchester_saved_state,
  66. NULL);
  67. manchester_advance(
  68. instance->manchester_saved_state,
  69. ManchesterEventShortLow,
  70. &instance->manchester_saved_state,
  71. NULL);
  72. } else {
  73. instance->common.parser_step = CameAtomoDecoderStepReset;
  74. }
  75. break;
  76. case CameAtomoDecoderStepDecoderData:
  77. if(!level) {
  78. if(DURATION_DIFF(duration, instance->common.te_short) < instance->common.te_delta) {
  79. event = ManchesterEventShortLow;
  80. } else if(DURATION_DIFF(duration, instance->common.te_long) < instance->common.te_delta) {
  81. event = ManchesterEventLongLow;
  82. } else if(duration >= (instance->common.te_long * 2 + instance->common.te_delta)) {
  83. if(instance->common.code_count_bit >=
  84. instance->common.code_min_count_bit_for_found) {
  85. instance->common.code_last_found = instance->common.code_found;
  86. instance->common.code_last_count_bit = instance->common.code_count_bit;
  87. // uint32_t code_found_hi = instance->common.code_last_found >> 32;
  88. // uint32_t code_found_lo = instance->common.code_last_found & 0x00000000ffffffff;
  89. // uint64_t code_found_reverse = subghz_protocol_common_reverse_key(
  90. // instance->common.code_last_found, instance->common.code_last_count_bit);
  91. // uint32_t code_found_reverse_hi = code_found_reverse >> 32;
  92. // uint32_t code_found_reverse_lo = code_found_reverse & 0x00000000ffffffff;
  93. // FURI_LOG_I(
  94. // "ATOMO",
  95. // "%08lX%08lX %08lX%08lX %d",
  96. // code_found_hi,
  97. // code_found_lo,
  98. // code_found_reverse_hi,
  99. // code_found_reverse_lo,
  100. // instance->common.code_last_count_bit);
  101. if(instance->common.callback)
  102. instance->common.callback(
  103. (SubGhzProtocolCommon*)instance, instance->common.context);
  104. }
  105. instance->common.code_found = 0;
  106. instance->common.code_count_bit = 1;
  107. manchester_advance(
  108. instance->manchester_saved_state,
  109. ManchesterEventReset,
  110. &instance->manchester_saved_state,
  111. NULL);
  112. manchester_advance(
  113. instance->manchester_saved_state,
  114. ManchesterEventShortLow,
  115. &instance->manchester_saved_state,
  116. NULL);
  117. } else {
  118. instance->common.parser_step = CameAtomoDecoderStepReset;
  119. }
  120. } else {
  121. if(DURATION_DIFF(duration, instance->common.te_short) < instance->common.te_delta) {
  122. event = ManchesterEventShortHigh;
  123. } else if(DURATION_DIFF(duration, instance->common.te_long) < instance->common.te_delta) {
  124. event = ManchesterEventLongHigh;
  125. } else {
  126. instance->common.parser_step = CameAtomoDecoderStepReset;
  127. }
  128. }
  129. if(event != ManchesterEventReset) {
  130. bool data;
  131. bool data_ok = manchester_advance(
  132. instance->manchester_saved_state, event, &instance->manchester_saved_state, &data);
  133. if(data_ok) {
  134. instance->common.code_found = (instance->common.code_found << 1) | !data;
  135. instance->common.code_count_bit++;
  136. }
  137. }
  138. break;
  139. }
  140. }
  141. void subghz_protocol_came_atomo_to_str(SubGhzProtocolCameAtomo* instance, string_t output) {
  142. uint32_t code_found_hi = instance->common.code_last_found >> 32;
  143. uint32_t code_found_lo = instance->common.code_last_found & 0x00000000ffffffff;
  144. string_cat_printf(
  145. output,
  146. "%s %dbit\r\n"
  147. "Key:0x%lX%08lX\r\n",
  148. instance->common.name,
  149. instance->common.code_last_count_bit,
  150. code_found_hi,
  151. code_found_lo);
  152. }
  153. // void subghz_protocol_came_atomo_to_save_str(SubGhzProtocolCameAtomo* instance, string_t output) {
  154. // string_printf(
  155. // output,
  156. // "Protocol: %s\n"
  157. // "Bit: %d\n"
  158. // "Key: %08lX%08lX\r\n",
  159. // instance->common.name,
  160. // instance->common.code_last_count_bit,
  161. // (uint32_t)(instance->common.code_last_found >> 32),
  162. // (uint32_t)(instance->common.code_last_found & 0xFFFFFFFF));
  163. // }
  164. // bool subghz_protocol_came_atomo_to_load_protocol_from_file(
  165. // FileWorker* file_worker,
  166. // SubGhzProtocolCameAtomo* instance) {
  167. // bool loaded = false;
  168. // string_t temp_str;
  169. // string_init(temp_str);
  170. // int res = 0;
  171. // int data = 0;
  172. // do {
  173. // // Read and parse bit data from 2nd line
  174. // if(!file_worker_read_until(file_worker, temp_str, '\n')) {
  175. // break;
  176. // }
  177. // res = sscanf(string_get_cstr(temp_str), "Bit: %d\n", &data);
  178. // if(res != 1) {
  179. // break;
  180. // }
  181. // instance->common.code_last_count_bit = (uint8_t)data;
  182. // // Read and parse key data from 3nd line
  183. // if(!file_worker_read_until(file_worker, temp_str, '\n')) {
  184. // break;
  185. // }
  186. // // strlen("Key: ") = 5
  187. // string_right(temp_str, 5);
  188. // uint8_t buf_key[8] = {0};
  189. // if(!subghz_protocol_common_read_hex(temp_str, buf_key, 8)) {
  190. // break;
  191. // }
  192. // for(uint8_t i = 0; i < 8; i++) {
  193. // instance->common.code_last_found = instance->common.code_last_found << 8 | buf_key[i];
  194. // }
  195. // loaded = true;
  196. // } while(0);
  197. // string_clear(temp_str);
  198. // subghz_protocol_came_atomo_remote_controller(instance);
  199. // return loaded;
  200. // }
  201. void subghz_decoder_came_atomo_to_load_protocol(SubGhzProtocolCameAtomo* instance, void* context) {
  202. furi_assert(context);
  203. furi_assert(instance);
  204. SubGhzProtocolCommonLoad* data = context;
  205. instance->common.code_last_found = data->code_found;
  206. instance->common.code_last_count_bit = data->code_count_bit;
  207. subghz_protocol_came_atomo_remote_controller(instance);
  208. }