encoder.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #include "encoder.h"
  2. #include "math.h"
  3. #include <core/check.h>
  4. #define TAG "SubGhzBlockEncoder"
  5. void subghz_protocol_blocks_set_bit_array(
  6. bool bit_value,
  7. uint8_t data_array[],
  8. size_t set_index_bit,
  9. size_t max_size_array) {
  10. furi_assert(set_index_bit < max_size_array * 8);
  11. bit_write(data_array[set_index_bit >> 3], 7 - (set_index_bit & 0x7), bit_value);
  12. }
  13. bool subghz_protocol_blocks_get_bit_array(uint8_t data_array[], size_t read_index_bit) {
  14. return bit_read(data_array[read_index_bit >> 3], 7 - (read_index_bit & 0x7));
  15. }
  16. size_t subghz_protocol_blocks_get_upload(
  17. uint8_t data_array[],
  18. size_t count_bit_data_array,
  19. LevelDuration* upload,
  20. size_t max_size_upload,
  21. uint32_t duration_bit) {
  22. size_t index_bit = 0;
  23. size_t size_upload = 0;
  24. uint32_t duration = duration_bit;
  25. bool last_bit = subghz_protocol_blocks_get_bit_array(data_array, index_bit++);
  26. for(size_t i = 1; i < count_bit_data_array; i++) {
  27. if(last_bit == subghz_protocol_blocks_get_bit_array(data_array, index_bit)) {
  28. duration += duration_bit;
  29. } else {
  30. furi_assert(max_size_upload > size_upload);
  31. upload[size_upload++] = level_duration_make(
  32. subghz_protocol_blocks_get_bit_array(data_array, index_bit - 1), duration);
  33. last_bit = !last_bit;
  34. duration = duration_bit;
  35. }
  36. index_bit++;
  37. }
  38. upload[size_upload++] = level_duration_make(
  39. subghz_protocol_blocks_get_bit_array(data_array, index_bit - 1), duration);
  40. return size_upload;
  41. }