oscillator_adjustment.cpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #include "oscillator_adjustment.h"
  2. namespace meCoffee {
  3. OscillatorAdjustmentResult adjustOscillator(uint8_t qualifiedEventCount, int16_t oldOffset, uint8_t baselineByte,
  4. uint8_t oldFractionPeriod) {
  5. OscillatorAdjustmentResult result;
  6. result.newOffset = oldOffset;
  7. result.newFractionPeriod = oldFractionPeriod;
  8. result.shouldWriteCalibration = false;
  9. result.calibrationValue = 0;
  10. uint8_t selectedPeriod;
  11. if (qualifiedEventCount < 105) {
  12. selectedPeriod = 100;
  13. } else if (qualifiedEventCount >= 116) {
  14. selectedPeriod = 120;
  15. } else {
  16. return result;
  17. }
  18. result.newFractionPeriod = selectedPeriod;
  19. uint16_t wrappedOffset = static_cast<uint16_t>(oldOffset);
  20. if (qualifiedEventCount < selectedPeriod) {
  21. wrappedOffset = static_cast<uint16_t>(wrappedOffset - 1);
  22. } else if (qualifiedEventCount > selectedPeriod) {
  23. wrappedOffset = static_cast<uint16_t>(wrappedOffset + 1);
  24. }
  25. int16_t clampedOffset = static_cast<int16_t>(wrappedOffset);
  26. if (clampedOffset < -8) {
  27. clampedOffset = -8;
  28. } else if (clampedOffset > 8) {
  29. clampedOffset = 8;
  30. }
  31. result.newOffset = clampedOffset;
  32. if (clampedOffset != oldOffset) {
  33. uint8_t calibrationValue = static_cast<uint8_t>(baselineByte + static_cast<uint8_t>(clampedOffset));
  34. if ((calibrationValue & 0x80) == 0) {
  35. calibrationValue = 128;
  36. }
  37. result.shouldWriteCalibration = true;
  38. result.calibrationValue = calibrationValue;
  39. }
  40. return result;
  41. }
  42. } // namespace meCoffee