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.

96 lines
1.8KB

  1. #pragma once
  2. #ifdef OSC_ENABLE
  3. #define OSCBUFFER_SIZE (256)
  4. #define SERVERUP_POS (0) // (Int32) : indica se il server e' up o down
  5. #define START_OF_BUFFER (SERVERUP_POS + sizeof(uint32_t)) // prima locazione di memoria utile per il buffer circolare
  6. class oscCircBuffer
  7. {
  8. private:
  9. uint8_t * mapAccess;
  10. int rdPtr;
  11. int WR_PTR_POS;
  12. int P0;
  13. int PN;
  14. public:
  15. static int bufferOverhead() { return sizeof(uint32_t); } // n. di bytes EXTRA richiesti per la gestione del buffer circolare
  16. void Clear()
  17. {
  18. rdPtr = wrPtr_get();
  19. }
  20. oscCircBuffer(int bufferSize, void *acc, int offset)
  21. {
  22. WR_PTR_POS = offset;
  23. P0 = WR_PTR_POS + bufferOverhead(); // posizione 0 memoria effettiva (dove salvare e leggere i dati, dopo i primi 8 bytes riservati ai puntatori rd/wr)
  24. PN = P0 + bufferSize - bufferOverhead();
  25. mapAccess = (uint8_t *)acc;
  26. Clear();
  27. }
  28. ~oscCircBuffer()
  29. {
  30. mapAccess = NULL;
  31. }
  32. void WriteChunk(OSCMsg *msg)
  33. {
  34. uint8_t *ptr = (uint8_t *)msg;
  35. int cur_wrPtr = wrPtr_get();
  36. for(int k = 0; k < (int)sizeof(OSCMsg); k++)
  37. cur_wrPtr = Put(*ptr++, cur_wrPtr);
  38. wrPtr_set(cur_wrPtr); // finalizza IN SOLIDO il chunk appena letto
  39. }
  40. bool ReadChunk(OSCMsg *msg)
  41. {
  42. if(data_available())
  43. {
  44. uint8_t *p = (uint8_t *)msg;
  45. for(int k = 0; k < (int)sizeof(OSCMsg); k++)
  46. *p++ = Get();
  47. return true;
  48. }
  49. return false;
  50. }
  51. private:
  52. int wrPtr_get()
  53. {
  54. return *((uint32_t *)(mapAccess + WR_PTR_POS));
  55. }
  56. void wrPtr_set(uint32_t v)
  57. {
  58. uint32_t *ptr = (uint32_t *)(mapAccess + WR_PTR_POS);
  59. *ptr = v;
  60. }
  61. bool data_available() { return rdPtr != wrPtr_get(); }
  62. int incPtr(int ptr)
  63. {
  64. if(++ptr >= PN)
  65. ptr = P0;
  66. return ptr;
  67. }
  68. int Put(uint8_t b, int ptr)
  69. {
  70. mapAccess[ptr] = b;
  71. return incPtr(ptr);
  72. }
  73. uint8_t Get()
  74. {
  75. int trdPtr = rdPtr;
  76. uint8_t rv = mapAccess[trdPtr];
  77. rdPtr = incPtr(trdPtr);
  78. return rv;
  79. }
  80. };
  81. #endif