Buffer.cpp 4.1 KB

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