oscillator_adjustment.cpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include "oscillator_adjustment.h"
  2. #if defined(MECOFFEE_RUST_OSCILLATOR)
  3. extern "C" uint32_t mecoffee_rust_adjust_oscillator(uint8_t events, int16_t offset,
  4. uint8_t baseline, uint8_t period);
  5. #endif
  6. namespace meCoffee {
  7. OscillatorAdjustmentResult adjustOscillator(uint8_t qualifiedEventCount, int16_t oldOffset, uint8_t baselineByte,
  8. uint8_t oldFractionPeriod) {
  9. #if defined(MECOFFEE_RUST_OSCILLATOR)
  10. const uint32_t packed = mecoffee_rust_adjust_oscillator(qualifiedEventCount, oldOffset, baselineByte, oldFractionPeriod);
  11. OscillatorAdjustmentResult result;
  12. result.newOffset = static_cast<int16_t>(static_cast<uint16_t>(packed));
  13. result.newFractionPeriod = static_cast<uint8_t>(packed >> 16);
  14. result.calibrationValue = static_cast<uint8_t>(packed >> 24);
  15. result.shouldWriteCalibration = result.calibrationValue != 0;
  16. return result;
  17. #else
  18. OscillatorAdjustmentResult result;
  19. result.newOffset = oldOffset;
  20. result.newFractionPeriod = oldFractionPeriod;
  21. result.shouldWriteCalibration = false;
  22. result.calibrationValue = 0;
  23. uint8_t selectedPeriod;
  24. if (qualifiedEventCount < 105) {
  25. selectedPeriod = 100;
  26. } else if (qualifiedEventCount >= 116) {
  27. selectedPeriod = 120;
  28. } else {
  29. return result;
  30. }
  31. result.newFractionPeriod = selectedPeriod;
  32. uint16_t wrappedOffset = static_cast<uint16_t>(oldOffset);
  33. if (qualifiedEventCount < selectedPeriod) {
  34. wrappedOffset = static_cast<uint16_t>(wrappedOffset - 1);
  35. } else if (qualifiedEventCount > selectedPeriod) {
  36. wrappedOffset = static_cast<uint16_t>(wrappedOffset + 1);
  37. }
  38. int16_t clampedOffset = static_cast<int16_t>(wrappedOffset);
  39. if (clampedOffset < -8) {
  40. clampedOffset = -8;
  41. } else if (clampedOffset > 8) {
  42. clampedOffset = 8;
  43. }
  44. result.newOffset = clampedOffset;
  45. if (clampedOffset != oldOffset) {
  46. uint8_t calibrationValue = static_cast<uint8_t>(baselineByte + static_cast<uint8_t>(clampedOffset));
  47. if ((calibrationValue & 0x80) == 0) {
  48. calibrationValue = 128;
  49. }
  50. result.shouldWriteCalibration = true;
  51. result.calibrationValue = calibrationValue;
  52. }
  53. return result;
  54. #endif
  55. }
  56. } // namespace meCoffee