math.c 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #include "math.h"
  2. uint64_t subghz_protocol_blocks_reverse_key(uint64_t key, uint8_t count_bit) {
  3. uint64_t key_reverse = 0;
  4. for(uint8_t i = 0; i < count_bit; i++) {
  5. key_reverse = key_reverse << 1 | bit_read(key, i);
  6. }
  7. return key_reverse;
  8. }
  9. uint8_t subghz_protocol_blocks_get_parity(uint64_t key, uint8_t count_bit) {
  10. uint8_t parity = 0;
  11. for(uint8_t i = 0; i < count_bit; i++) {
  12. parity += bit_read(key, i);
  13. }
  14. return parity & 0x01;
  15. }
  16. uint8_t subghz_protocol_blocks_crc4(
  17. uint8_t const message[],
  18. unsigned nBytes,
  19. uint8_t polynomial,
  20. uint8_t init) {
  21. unsigned remainder = init << 4; // LSBs are unused
  22. unsigned poly = polynomial << 4;
  23. unsigned bit;
  24. while(nBytes--) {
  25. remainder ^= *message++;
  26. for(bit = 0; bit < 8; bit++) {
  27. if(remainder & 0x80) {
  28. remainder = (remainder << 1) ^ poly;
  29. } else {
  30. remainder = (remainder << 1);
  31. }
  32. }
  33. }
  34. return remainder >> 4 & 0x0f; // discard the LSBs
  35. }
  36. uint8_t subghz_protocol_blocks_crc7(
  37. uint8_t const message[],
  38. unsigned nBytes,
  39. uint8_t polynomial,
  40. uint8_t init) {
  41. unsigned remainder = init << 1; // LSB is unused
  42. unsigned poly = polynomial << 1;
  43. unsigned byte, bit;
  44. for(byte = 0; byte < nBytes; ++byte) {
  45. remainder ^= message[byte];
  46. for(bit = 0; bit < 8; ++bit) {
  47. if(remainder & 0x80) {
  48. remainder = (remainder << 1) ^ poly;
  49. } else {
  50. remainder = (remainder << 1);
  51. }
  52. }
  53. }
  54. return remainder >> 1 & 0x7f; // discard the LSB
  55. }
  56. uint8_t subghz_protocol_blocks_crc8(
  57. uint8_t const message[],
  58. unsigned nBytes,
  59. uint8_t polynomial,
  60. uint8_t init) {
  61. uint8_t remainder = init;
  62. unsigned byte, bit;
  63. for(byte = 0; byte < nBytes; ++byte) {
  64. remainder ^= message[byte];
  65. for(bit = 0; bit < 8; ++bit) {
  66. if(remainder & 0x80) {
  67. remainder = (remainder << 1) ^ polynomial;
  68. } else {
  69. remainder = (remainder << 1);
  70. }
  71. }
  72. }
  73. return remainder;
  74. }