subghz_protocol_common.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #include "subghz_protocol_common.h"
  2. #include <stdio.h>
  3. #include <lib/toolbox/hex.h>
  4. SubGhzProtocolEncoderCommon* subghz_protocol_encoder_common_alloc() {
  5. SubGhzProtocolEncoderCommon* instance = furi_alloc(sizeof(SubGhzProtocolEncoderCommon));
  6. instance->upload = furi_alloc(SUBGHZ_ENCODER_UPLOAD_MAX_SIZE * sizeof(LevelDuration));
  7. instance->start = true;
  8. instance->repeat = 10; //default number of repeat
  9. return instance;
  10. }
  11. void subghz_protocol_encoder_common_free(SubGhzProtocolEncoderCommon* instance) {
  12. furi_assert(instance);
  13. free(instance->upload);
  14. free(instance);
  15. }
  16. size_t subghz_encoder_common_get_repeat_left(SubGhzProtocolEncoderCommon* instance) {
  17. furi_assert(instance);
  18. return instance->repeat;
  19. }
  20. LevelDuration subghz_protocol_encoder_common_yield(void* context) {
  21. SubGhzProtocolEncoderCommon* instance = context;
  22. if(instance->repeat == 0){
  23. return level_duration_reset();
  24. }
  25. LevelDuration ret = instance->upload[instance->front];
  26. if(++instance->front == instance->size_upload) {
  27. instance->repeat--;
  28. instance->front = 0;
  29. }
  30. return ret;
  31. }
  32. void subghz_protocol_common_add_bit(SubGhzProtocolCommon *common, uint8_t bit){
  33. common->code_found = common->code_found << 1 | bit;
  34. common->code_count_bit++;
  35. }
  36. bool subghz_protocol_common_check_interval(SubGhzProtocolCommon *common, uint32_t duration, uint16_t duration_check) {
  37. if ((duration_check >= (duration - common->te_delta))&&(duration_check <= (duration + common->te_delta))){
  38. return true;
  39. } else {
  40. return false;
  41. }
  42. }
  43. uint64_t subghz_protocol_common_reverse_key(uint64_t key, uint8_t count_bit){
  44. uint64_t key_reverse=0;
  45. for(uint8_t i=0; i<count_bit; i++) {
  46. key_reverse=key_reverse<<1|bit_read(key,i);
  47. }
  48. return key_reverse;
  49. }
  50. void subghz_protocol_common_set_callback(SubGhzProtocolCommon* common, SubGhzProtocolCommonCallback callback, void* context) {
  51. common->callback = callback;
  52. common->context = context;
  53. }
  54. void subghz_protocol_common_to_str(SubGhzProtocolCommon* instance, string_t output) {
  55. if (instance->to_string) {
  56. instance->to_string(instance, output);
  57. } else {
  58. uint32_t code_found_hi = instance->code_found >> 32;
  59. uint32_t code_found_lo = instance->code_found & 0x00000000ffffffff;
  60. uint64_t code_found_reverse = subghz_protocol_common_reverse_key(instance->code_found, instance->code_count_bit);
  61. uint32_t code_found_reverse_hi = code_found_reverse>>32;
  62. uint32_t code_found_reverse_lo = code_found_reverse&0x00000000ffffffff;
  63. if (code_found_hi>0) {
  64. string_cat_printf(
  65. output,
  66. "Protocol %s, %d Bit\r\n"
  67. " KEY:0x%lX%08lX\r\n"
  68. " YEK:0x%lX%08lX\r\n"
  69. " SN:0x%05lX BTN:%02X\r\n",
  70. instance->name,
  71. instance->code_count_bit,
  72. code_found_hi,
  73. code_found_lo,
  74. code_found_reverse_hi,
  75. code_found_reverse_lo,
  76. instance->serial,
  77. instance->btn
  78. );
  79. } else {
  80. string_cat_printf(
  81. output,
  82. "Protocol %s, %d Bit\r\n"
  83. " KEY:0x%lX%lX\r\n"
  84. " YEK:0x%lX%lX\r\n"
  85. " SN:0x%05lX BTN:%02X\r\n",
  86. instance->name,
  87. instance->code_count_bit,
  88. code_found_hi,
  89. code_found_lo,
  90. code_found_reverse_hi,
  91. code_found_reverse_lo,
  92. instance->serial,
  93. instance->btn
  94. );
  95. }
  96. }
  97. }
  98. bool subghz_protocol_common_read_hex(string_t str, uint8_t* buff, uint16_t len) {
  99. string_strim(str);
  100. uint8_t nibble_high = 0;
  101. uint8_t nibble_low = 0;
  102. bool parsed = true;
  103. for(uint16_t i = 0; i < len; i++) {
  104. if(hex_char_to_hex_nibble(string_get_char(str, 0), &nibble_high) &&
  105. hex_char_to_hex_nibble(string_get_char(str, 1), &nibble_low)) {
  106. buff[i] = (nibble_high << 4) | nibble_low;
  107. if(string_size(str)>2){
  108. string_right(str, 2);
  109. }else if(i<len-1){
  110. parsed = false;
  111. break;
  112. };
  113. } else {
  114. parsed = false;
  115. break;
  116. }
  117. }
  118. return parsed;
  119. }