fsk_ocs.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #include "fsk_osc.h"
  2. #include <stdlib.h>
  3. struct FSKOsc {
  4. uint16_t freq[2];
  5. uint16_t osc_phase_max;
  6. int32_t osc_phase_current;
  7. uint32_t pulse;
  8. };
  9. FSKOsc* fsk_osc_alloc(uint32_t freq_low, uint32_t freq_hi, uint32_t osc_phase_max) {
  10. FSKOsc* osc = malloc(sizeof(FSKOsc));
  11. osc->freq[0] = freq_low;
  12. osc->freq[1] = freq_hi;
  13. osc->osc_phase_max = osc_phase_max;
  14. osc->osc_phase_current = 0;
  15. osc->pulse = 0;
  16. return osc;
  17. }
  18. void fsk_osc_free(FSKOsc* osc) {
  19. free(osc);
  20. }
  21. void fsk_osc_reset(FSKOsc* osc) {
  22. osc->osc_phase_current = 0;
  23. osc->pulse = 0;
  24. }
  25. bool fsk_osc_next(FSKOsc* osc, bool bit, uint32_t* period) {
  26. bool advance = false;
  27. *period = osc->freq[bit];
  28. osc->osc_phase_current += *period;
  29. if(osc->osc_phase_current > osc->osc_phase_max) {
  30. advance = true;
  31. osc->osc_phase_current -= osc->osc_phase_max;
  32. }
  33. return advance;
  34. }
  35. bool fsk_osc_next_half(FSKOsc* osc, bool bit, bool* level, uint32_t* duration) {
  36. bool advance = false;
  37. // if pulse is zero, we need to output high, otherwise we need to output low
  38. if(osc->pulse == 0) {
  39. uint32_t length;
  40. advance = fsk_osc_next(osc, bit, &length);
  41. *duration = length / 2;
  42. osc->pulse = *duration;
  43. *level = true;
  44. } else {
  45. // output low half and reset pulse
  46. *duration = osc->pulse;
  47. osc->pulse = 0;
  48. *level = false;
  49. }
  50. return advance;
  51. }