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.

82 lines
1.6 KiB

  1. #pragma once
  2. #include <stdbool.h>
  3. #include <stdint.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <functional>
  8. //
  9. namespace iflytop {
  10. using namespace std;
  11. class TMCReg {
  12. private:
  13. /* data */
  14. public:
  15. uint8_t flag = 0;
  16. uint8_t reg = 0;
  17. uint8_t val = 0;
  18. void setActiveFlag() { flag = flag | 0x01; }
  19. bool isActive() { return flag & 0x01; }
  20. void setUpdateFlag() { flag = flag | 0x02; }
  21. bool isUpdate() { return flag & 0x02; }
  22. };
  23. class TMCRegCache {
  24. public:
  25. TMCReg cache[50];
  26. public:
  27. void foreach (function<void(TMCReg* item)> fn) {
  28. for (size_t i = 0; i < sizeof(cache) / sizeof(cache[0]); i++) {
  29. if (cache[i].isActive() && cache[i].isUpdate()) {
  30. fn(&cache[i]);
  31. }
  32. }
  33. }
  34. bool activeReg(uint8_t reg) {
  35. TMCReg* item = findReg(reg);
  36. if (item) return true;
  37. item = findPassive();
  38. if (item) {
  39. item->reg = reg;
  40. item->setActiveFlag();
  41. return true;
  42. }
  43. return false;
  44. }
  45. void setReg(uint8_t reg, uint8_t val) {
  46. TMCReg* item = findReg(reg);
  47. if (item) {
  48. item->val = val;
  49. item->setUpdateFlag();
  50. }
  51. }
  52. private:
  53. TMCReg* findPassive() {
  54. for (size_t i = 0; i < sizeof(cache) / sizeof(cache[0]); i++) {
  55. if (!cache[i].isActive()) {
  56. return &cache[i];
  57. }
  58. }
  59. return nullptr;
  60. }
  61. TMCReg* findReg(uint8_t reg) {
  62. for (size_t i = 0; i < sizeof(cache) / sizeof(cache[0]); i++) {
  63. if (cache[i].isActive() && cache[i].reg == reg) {
  64. return &cache[i];
  65. }
  66. }
  67. return nullptr;
  68. }
  69. };
  70. } // namespace iflytop