encoder.c 1.9 KB

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