manchester_encoder.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #include "manchester_encoder.h"
  2. #include <stdio.h>
  3. void manchester_encoder_reset(ManchesterEncoderState* state) {
  4. state->step = 0;
  5. }
  6. bool manchester_encoder_advance(
  7. ManchesterEncoderState* state,
  8. const bool curr_bit,
  9. ManchesterEncoderResult* result) {
  10. bool advance = false;
  11. switch(state->step) {
  12. case 0:
  13. state->prev_bit = curr_bit;
  14. if(state->prev_bit) {
  15. *result = ManchesterEncoderResultShortLow;
  16. } else {
  17. *result = ManchesterEncoderResultShortHigh;
  18. }
  19. state->step = 1;
  20. advance = true;
  21. break;
  22. case 1:
  23. *result = (state->prev_bit << 1) + curr_bit;
  24. if(curr_bit == state->prev_bit) {
  25. state->step = 2;
  26. } else {
  27. state->prev_bit = curr_bit;
  28. advance = true;
  29. }
  30. break;
  31. case 2:
  32. if(curr_bit) {
  33. *result = ManchesterEncoderResultShortLow;
  34. } else {
  35. *result = ManchesterEncoderResultShortHigh;
  36. }
  37. state->prev_bit = curr_bit;
  38. state->step = 1;
  39. advance = true;
  40. break;
  41. default:
  42. printf("DO CRASH HERE\r\n");
  43. // furi_crash
  44. break;
  45. }
  46. return advance;
  47. }
  48. ManchesterEncoderResult manchester_encoder_finish(ManchesterEncoderState* state) {
  49. state->step = 0;
  50. return (state->prev_bit << 1) + state->prev_bit;
  51. }