experiments with Pylontech/GroWatt PV tech
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.

112 lines
1.9 KiB

  1. #ifndef circ_buffer_h
  2. #define circ_buffer_h
  3. #include <stdlib.h>
  4. /// <summary>
  5. /// This class allows a fixed size circular buffer.
  6. /// When push_back is called, oldest data is overwritten.
  7. /// Does not use any dynamic allocators.
  8. /// </summary>
  9. template <class ItemType, int elementCnt> class circular_buffer
  10. {
  11. private:
  12. ItemType m_arr[elementCnt];
  13. int m_writePos;
  14. int m_size;
  15. void advanceWritePos()
  16. {
  17. if(m_size < elementCnt)
  18. {
  19. m_size++;
  20. }
  21. m_writePos++;
  22. if(m_writePos >= elementCnt)
  23. {
  24. m_writePos = 0;
  25. }
  26. }
  27. circular_buffer(const circular_buffer<ItemType, elementCnt>& rhs);
  28. public:
  29. circular_buffer()
  30. {
  31. clear();
  32. }
  33. void operator=(const circular_buffer<ItemType, elementCnt>& rhs)
  34. {
  35. memcpy(m_arr, rhs.m_arr, sizeof(m_arr));
  36. m_size = rhs.m_size;
  37. m_writePos = rhs.m_writePos;
  38. }
  39. void push_back(const ItemType& item)
  40. {
  41. m_arr[m_writePos] = item;
  42. advanceWritePos();
  43. }
  44. void clear()
  45. {
  46. memset(m_arr,0,sizeof(m_arr));
  47. m_size = m_writePos = 0;
  48. }
  49. void sort()
  50. {
  51. if (size() < 2)
  52. return;
  53. bool swapped;
  54. do
  55. {
  56. swapped = false;
  57. for(int ix=0; ix<size()-1; ix++)
  58. {
  59. if(at(ix) > at(ix+1))
  60. {
  61. ItemType tmp = at(ix);
  62. at(ix) = at(ix+1);
  63. at(ix+1) = tmp;
  64. swapped = true;
  65. }
  66. }
  67. }while(swapped);
  68. }
  69. int size() const { return m_size; }
  70. bool isFull() const { return size() == elementCnt; }
  71. ItemType& operator[](int pos) {return at(pos);}
  72. ItemType& at(int pos)
  73. {
  74. if(m_size < elementCnt)
  75. {
  76. return m_arr[pos];
  77. }
  78. int readPos = m_writePos + pos;
  79. if(readPos >= elementCnt)
  80. {
  81. readPos -= elementCnt;
  82. }
  83. return m_arr[readPos];
  84. }
  85. #if _DEBUG_ENABLED
  86. void print()
  87. {
  88. printf("---\n");
  89. for(int i=0; i<size(); i++)
  90. {
  91. printf("%d = %d\n", i, at(i));
  92. }
  93. }
  94. #endif
  95. };
  96. #endif //circ_buffer_h