Buffer.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. #include "Buffer.h"
  2. Buffer::Buffer(){
  3. bufA = (uint8_t*)malloc(BUF_SIZE);
  4. bufB = (uint8_t*)malloc(BUF_SIZE);
  5. }
  6. void Buffer::open(fs::FS* fs){
  7. int i=0;
  8. do{
  9. fileName = "/"+(String)i+".pcap";
  10. i++;
  11. } while(fs->exists(fileName));
  12. Serial.println(fileName);
  13. file = fs->open(fileName, FILE_WRITE);
  14. file.close();
  15. bufSizeA = 0;
  16. bufSizeB = 0;
  17. writing = true;
  18. write(uint32_t(0xa1b2c3d4)); // magic number
  19. write(uint16_t(2)); // major version number
  20. write(uint16_t(4)); // minor version number
  21. write(int32_t(0)); // GMT to local correction
  22. write(uint32_t(0)); // accuracy of timestamps
  23. write(uint32_t(SNAP_LEN)); // max length of captured packets, in octets
  24. write(uint32_t(105)); // data link type
  25. //useSD = true;
  26. }
  27. void Buffer::close(fs::FS* fs){
  28. if(!writing) return;
  29. forceSave(fs);
  30. writing = false;
  31. Serial.println("file closed");
  32. }
  33. void Buffer::addPacket(uint8_t* buf, uint32_t len){
  34. // buffer is full -> drop packet
  35. if((useA && bufSizeA + len >= BUF_SIZE && bufSizeB > 0) || (!useA && bufSizeB + len >= BUF_SIZE && bufSizeA > 0)){
  36. //Serial.print(";");
  37. return;
  38. }
  39. if(useA && bufSizeA + len + 16 >= BUF_SIZE && bufSizeB == 0){
  40. useA = false;
  41. //Serial.println("\nswitched to buffer B");
  42. }
  43. else if(!useA && bufSizeB + len + 16 >= BUF_SIZE && bufSizeA == 0){
  44. useA = true;
  45. //Serial.println("\nswitched to buffer A");
  46. }
  47. uint32_t microSeconds = micros(); // e.g. 45200400 => 45s 200ms 400us
  48. uint32_t seconds = (microSeconds/1000)/1000; // e.g. 45200400/1000/1000 = 45200 / 1000 = 45s
  49. microSeconds -= seconds*1000*1000; // e.g. 45200400 - 45*1000*1000 = 45200400 - 45000000 = 400us (because we only need the offset)
  50. write(seconds); // ts_sec
  51. write(microSeconds); // ts_usec
  52. write(len); // incl_len
  53. write(len); // orig_len
  54. write(buf, len); // packet payload
  55. }
  56. void Buffer::write(int32_t n){
  57. uint8_t buf[4];
  58. buf[0] = n;
  59. buf[1] = n >> 8;
  60. buf[2] = n >> 16;
  61. buf[3] = n >> 24;
  62. write(buf,4);
  63. }
  64. void Buffer::write(uint32_t n){
  65. uint8_t buf[4];
  66. buf[0] = n;
  67. buf[1] = n >> 8;
  68. buf[2] = n >> 16;
  69. buf[3] = n >> 24;
  70. write(buf,4);
  71. }
  72. void Buffer::write(uint16_t n){
  73. uint8_t buf[2];
  74. buf[0] = n;
  75. buf[1] = n >> 8;
  76. write(buf,2);
  77. }
  78. void Buffer::write(uint8_t* buf, uint32_t len){
  79. if(!writing) return;
  80. if(useA){
  81. memcpy(&bufA[bufSizeA], buf, len);
  82. bufSizeA += len;
  83. }else{
  84. memcpy(&bufB[bufSizeB], buf, len);
  85. bufSizeB += len;
  86. }
  87. }
  88. void Buffer::save(fs::FS* fs){
  89. if(saving) return; // makes sure the function isn't called simultaneously on different cores
  90. // buffers are already emptied, therefor saving is unecessary
  91. if((useA && bufSizeB == 0) || (!useA && bufSizeA == 0)){
  92. //Serial.printf("useA: %s, bufA %u, bufB %u\n",useA ? "true" : "false",bufSizeA,bufSizeB); // for debug porpuses
  93. return;
  94. }
  95. //Serial.println("saving file");
  96. uint32_t startTime = millis();
  97. uint32_t finishTime;
  98. file = fs->open(fileName, FILE_APPEND);
  99. if (!file) {
  100. Serial.println("Failed to open file '"+fileName+"'");
  101. //useSD = false;
  102. return;
  103. }
  104. saving = true;
  105. uint32_t len;
  106. if(useA){
  107. file.write(bufB, bufSizeB);
  108. len = bufSizeB;
  109. bufSizeB = 0;
  110. }
  111. else{
  112. file.write(bufA, bufSizeA);
  113. len = bufSizeA;
  114. bufSizeA = 0;
  115. }
  116. file.close();
  117. finishTime = millis() - startTime;
  118. //Serial.printf("\n%u bytes written for %u ms\n", len, finishTime);
  119. saving = false;
  120. }
  121. void Buffer::forceSave(fs::FS* fs){
  122. uint32_t len = bufSizeA + bufSizeB;
  123. if(len == 0) return;
  124. file = fs->open(fileName, FILE_APPEND);
  125. if (!file) {
  126. Serial.println("Failed to open file '"+fileName+"'");
  127. //useSD = false;
  128. return;
  129. }
  130. saving = true;
  131. writing = false;
  132. if(useA){
  133. if(bufSizeB > 0){
  134. file.write(bufB, bufSizeB);
  135. bufSizeB = 0;
  136. }
  137. if(bufSizeA > 0){
  138. file.write(bufA, bufSizeA);
  139. bufSizeA = 0;
  140. }
  141. } else {
  142. if(bufSizeA > 0){
  143. file.write(bufA, bufSizeA);
  144. bufSizeA = 0;
  145. }
  146. if(bufSizeB > 0){
  147. file.write(bufB, bufSizeB);
  148. bufSizeB = 0;
  149. }
  150. }
  151. file.close();
  152. //Serial.printf("saved %u bytes\n",len);
  153. saving = false;
  154. writing = true;
  155. }