buffer_frame.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include <stdlib.h>
  2. #include <stdint.h>
  3. #include "iec_include.h"
  4. static struct sFrameVFT bufferFrameVFT = {
  5. BufferFrame_destroy,
  6. BufferFrame_resetFrame,
  7. BufferFrame_setNextByte,
  8. BufferFrame_appendBytes,
  9. BufferFrame_getMsgSize,
  10. BufferFrame_getBuffer,
  11. BufferFrame_getSpaceLeft
  12. };
  13. Frame
  14. BufferFrame_initialize(BufferFrame self, uint8_t* buffer, int startSize)
  15. {
  16. self->virtualFunctionTable = &bufferFrameVFT;
  17. self->buffer = buffer;
  18. self->startSize = startSize;
  19. self->msgSize = startSize;
  20. self->isUsed = false;
  21. return (Frame) self;
  22. }
  23. void
  24. BufferFrame_destroy(Frame super)
  25. {
  26. BufferFrame self = (BufferFrame) super;
  27. self->isUsed = false;
  28. }
  29. void
  30. BufferFrame_resetFrame(Frame super)
  31. {
  32. BufferFrame self = (BufferFrame) super;
  33. self->msgSize = self->startSize;
  34. }
  35. void
  36. BufferFrame_setNextByte(Frame super, uint8_t byte)
  37. {
  38. BufferFrame self = (BufferFrame) super;
  39. self->buffer[self->msgSize++] = byte;
  40. }
  41. void
  42. BufferFrame_appendBytes(Frame super, const uint8_t* bytes, int numberOfBytes)
  43. {
  44. BufferFrame self = (BufferFrame) super;
  45. int i;
  46. uint8_t* target = self->buffer + self->msgSize;
  47. for (i = 0; i < numberOfBytes; i++)
  48. target[i] = bytes[i];
  49. self->msgSize += numberOfBytes;
  50. }
  51. int
  52. BufferFrame_getMsgSize(Frame super)
  53. {
  54. BufferFrame self = (BufferFrame) super;
  55. return self->msgSize;
  56. }
  57. uint8_t*
  58. BufferFrame_getBuffer(Frame super)
  59. {
  60. BufferFrame self = (BufferFrame) super;
  61. return self->buffer;
  62. }
  63. int
  64. BufferFrame_getSpaceLeft(Frame super)
  65. {
  66. BufferFrame self = (BufferFrame) super;
  67. return ((self->startSize) - self->msgSize);
  68. }
  69. bool
  70. BufferFrame_isUsed(BufferFrame self)
  71. {
  72. return self->isUsed;
  73. }
  74. void
  75. BufferFrame_markAsUsed(BufferFrame self)
  76. {
  77. self->isUsed = true;
  78. }