Advertisement
Guest User

Untitled

a guest
Sep 20th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.11 KB | None | 0 0
  1. #include "circbuff.h"
  2.  
  3. void circbuff_init(circbuff_t *circbuff) {
  4. circbuff->end_bit = 0;
  5. circbuff->end_byte = 0;
  6. circbuff->start_bit = 0;
  7. circbuff->start_byte = 0;
  8. }
  9.  
  10. uint8_t circbuff_size(circbuff_t *circbuff) {
  11. if (circbuff->end_byte >= circbuff->start_byte) {
  12. return (circbuff->end_byte - circbuff->start_byte);
  13. } else {
  14. return CIRCBUFF_LENGTH -
  15. (circbuff->start_byte - circbuff->end_byte);
  16. }
  17. }
  18.  
  19. bool circbuff_is_full(circbuff_t *circbuff) {
  20. return (circbuff_size(circbuff) >= CIRCBUFF_LENGTH - 1);
  21. }
  22.  
  23. bool circbuff_add_byte(circbuff_t *circbuff, uint8_t data) {
  24. bool status = false;
  25. if (circbuff_is_full(circbuff) == true) {
  26. circbuff->start_byte =
  27. (circbuff->start_byte + 1) % CIRCBUFF_LENGTH;
  28. circbuff->start_bit = 0;
  29. status = true;
  30. }
  31. circbuff->data[circbuff->end_byte] = data;
  32. circbuff->end_byte = (circbuff->end_byte + 1) % CIRCBUFF_LENGTH;
  33. circbuff->end_bit = 0;
  34. return status;
  35. }
  36.  
  37. bool circbuff_is_empty(circbuff_t *circbuff) {
  38. return circbuff->start_byte == circbuff->end_byte;
  39. }
  40.  
  41. uint8_t circbuff_pop_byte(circbuff_t *circbuff) {
  42. circbuff->start_bit = 0;
  43. if (circbuff_is_empty(circbuff) == false) {
  44. uint8_t data = circbuff->data[circbuff->start_byte];
  45. circbuff->start_byte =
  46. (circbuff->start_byte + 1) % CIRCBUFF_LENGTH;
  47. return data;
  48. }
  49. return 0;
  50. }
  51.  
  52. bool circbuff_add_bit(circbuff_t *circbuff, uint8_t data) {
  53. bool status = false;
  54.  
  55. circbuff->data[circbuff->end_byte] |= data << (7 - circbuff->end_bit);
  56.  
  57. circbuff->end_bit++;
  58. if (circbuff->end_bit > 7) {
  59. if (circbuff_is_full(circbuff) == true) {
  60. circbuff->start_byte =
  61. (circbuff->start_byte + 1) % CIRCBUFF_LENGTH;
  62. circbuff->start_bit = 0;
  63. status = true;
  64. }
  65. circbuff->end_byte = (circbuff->end_byte + 1) % CIRCBUFF_LENGTH;
  66. circbuff->end_bit = 0;
  67. circbuff->data[circbuff->end_byte] = 0;
  68. }
  69.  
  70. return status;
  71. }
  72.  
  73. uint8_t circbuff_pop_bit(circbuff_t *circbuff) {
  74. uint8_t data;
  75. uint8_t bit;
  76.  
  77. data = circbuff->data[circbuff->start_byte];
  78. bit = (data & (1 << (7 - circbuff->start_bit))) >>
  79. (7 - circbuff->start_bit);
  80.  
  81. circbuff->start_bit++;
  82. if (circbuff->start_bit > 7) {
  83. circbuff_pop_byte(circbuff);
  84. }
  85.  
  86. return bit;
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement