You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
2.9KB

  1. // Copyright 2013 Olivier Gillet.
  2. //
  3. // Author: Olivier Gillet (ol.gillet@gmail.com)
  4. //
  5. // Permission is hereby granted, free of charge, to any person obtaining a copy
  6. // of this software and associated documentation files (the "Software"), to deal
  7. // in the Software without restriction, including without limitation the rights
  8. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. // copies of the Software, and to permit persons to whom the Software is
  10. // furnished to do so, subject to the following conditions:
  11. //
  12. // The above copyright notice and this permission notice shall be included in
  13. // all copies or substantial portions of the Software.
  14. //
  15. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  21. // THE SOFTWARE.
  22. //
  23. // See http://creativecommons.org/licenses/MIT/ for more information.
  24. //
  25. // -----------------------------------------------------------------------------
  26. //
  27. // FSK demodulator for firmware updater (through gate inputs)
  28. #ifndef STM_AUDIO_BOOTLOADER_FSK_DEMODULATOR_H_
  29. #define STM_AUDIO_BOOTLOADER_FSK_DEMODULATOR_H_
  30. #include "stmlib/stmlib.h"
  31. #include "stmlib/utils/ring_buffer.h"
  32. #include <cstdio>
  33. namespace stm_audio_bootloader {
  34. class Demodulator {
  35. public:
  36. Demodulator() { }
  37. ~Demodulator() { }
  38. void Init(uint32_t pause, uint32_t one, uint32_t zero) {
  39. pause_one_threshold_ = (pause + one) >> 1;
  40. one_zero_threshold_ = (one + zero) >> 1;
  41. }
  42. void Sync() {
  43. symbols_.Init();
  44. previous_sample_ = false;
  45. duration_ = 0;
  46. swallow_ = 4;
  47. }
  48. void PushSample(bool sample) {
  49. if (previous_sample_ == sample) {
  50. ++duration_;
  51. } else {
  52. previous_sample_ = sample;
  53. uint8_t symbol = 0;
  54. if (duration_ >= pause_one_threshold_) {
  55. symbol = 2;
  56. } else if (duration_ >= one_zero_threshold_) {
  57. symbol = 1;
  58. } else {
  59. symbol = 0;
  60. }
  61. if (swallow_) {
  62. symbol = 2;
  63. --swallow_;
  64. }
  65. symbols_.Overwrite(symbol);
  66. duration_ = 0;
  67. }
  68. }
  69. inline size_t available() const {
  70. return symbols_.readable();
  71. }
  72. inline uint8_t NextSymbol() {
  73. return symbols_.ImmediateRead();
  74. }
  75. private:
  76. stmlib::RingBuffer<uint8_t, 128> symbols_;
  77. uint32_t pause_one_threshold_;
  78. uint32_t one_zero_threshold_;
  79. bool previous_sample_;
  80. uint32_t duration_;
  81. uint8_t swallow_;
  82. DISALLOW_COPY_AND_ASSIGN(Demodulator);
  83. };
  84. } // namespace stm_audio_bootloader
  85. #endif // STM_AUDIO_BOOTLOADER_FSK_DEMODULATOR_H_