Buffer.cpp 4.9 KB

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