@@ -6,17 +6,17 @@ Buffer::Buffer(){
66 bufB = (uint8_t *)malloc (BUF_SIZE);
77}
88
9- void Buffer::createPcapFile (fs::FS* fs, String fn , bool log ){
9+ void Buffer::createFile ( String name , bool is_pcap ){
1010 int i=0 ;
11- if (!log ) {
11+ if (is_pcap ) {
1212 do {
13- fileName = " /" +fn +" _" +(String)i+" .pcap" ;
13+ fileName = " /" +name +" _" +(String)i+" .pcap" ;
1414 i++;
1515 } while (fs->exists (fileName));
1616 }
1717 else {
1818 do {
19- fileName = " /" +fn +" _" +(String)i+" .log" ;
19+ fileName = " /" +name +" _" +(String)i+" .log" ;
2020 i++;
2121 } while (fs->exists (fileName));
2222 }
@@ -27,15 +27,15 @@ void Buffer::createPcapFile(fs::FS* fs, String fn, bool log){
2727 file.close ();
2828}
2929
30- void Buffer::open (bool log ){
30+ void Buffer::open (bool is_pcap ){
3131 bufSizeA = 0 ;
3232 bufSizeB = 0 ;
3333
3434 bufSizeB = 0 ;
3535
3636 writing = true ;
3737
38- if (!log ) {
38+ if (is_pcap ) {
3939 write (uint32_t (0xa1b2c3d4 )); // magic number
4040 write (uint16_t (2 )); // major version number
4141 write (uint16_t (4 )); // minor version number
@@ -46,14 +46,35 @@ void Buffer::open(bool log){
4646 }
4747}
4848
49- void Buffer::close (fs::FS* fs){
50- if (!writing) return ;
51- forceSave (fs);
52- writing = false ;
53- Serial.println (text01);
49+ void Buffer::openFile (String file_name, fs::FS* fs, bool serial, bool is_pcap) {
50+ bool save_pcap = settings_obj.loadSetting <bool >(" SavePCAP" );
51+ if (!save_pcap) {
52+ this ->fs = NULL ;
53+ this ->serial = false ;
54+ writing = false ;
55+ return ;
56+ }
57+ this ->fs = fs;
58+ this ->serial = serial;
59+ if (this ->fs ) {
60+ createFile (file_name, is_pcap);
61+ }
62+ if (this ->fs || this ->serial ) {
63+ open (is_pcap);
64+ } else {
65+ writing = false ;
66+ }
67+ }
68+
69+ void Buffer::pcapOpen (String file_name, fs::FS* fs, bool serial) {
70+ openFile (file_name, fs, serial, true );
5471}
5572
56- void Buffer::addPacket (uint8_t * buf, uint32_t len, bool log){
73+ void Buffer::logOpen (String file_name, fs::FS* fs, bool serial) {
74+ openFile (file_name, fs, serial, false );
75+ }
76+
77+ void Buffer::add (const uint8_t * buf, uint32_t len, bool is_pcap){
5778 // buffer is full -> drop packet
5879 if ((useA && bufSizeA + len >= BUF_SIZE && bufSizeB > 0 ) || (!useA && bufSizeB + len >= BUF_SIZE && bufSizeA > 0 )){
5980 // Serial.print(";");
@@ -74,7 +95,7 @@ void Buffer::addPacket(uint8_t* buf, uint32_t len, bool log){
7495
7596 microSeconds -= seconds*1000 *1000 ; // e.g. 45200400 - 45*1000*1000 = 45200400 - 45000000 = 400us (because we only need the offset)
7697
77- if (!log ) {
98+ if (is_pcap ) {
7899 write (seconds); // ts_sec
79100 write (microSeconds); // ts_usec
80101 write (len); // incl_len
@@ -84,6 +105,20 @@ void Buffer::addPacket(uint8_t* buf, uint32_t len, bool log){
84105 write (buf, len); // packet payload
85106}
86107
108+ void Buffer::append (wifi_promiscuous_pkt_t *packet, int len) {
109+ bool save_packet = settings_obj.loadSetting <bool >(text_table4[7 ]);
110+ if (save_packet) {
111+ add (packet->payload , len, true );
112+ }
113+ }
114+
115+ void Buffer::append (String log) {
116+ bool save_packet = settings_obj.loadSetting <bool >(text_table4[7 ]);
117+ if (save_packet) {
118+ add ((const uint8_t *)log.c_str (), log.length (), false );
119+ }
120+ }
121+
87122void Buffer::write (int32_t n){
88123 uint8_t buf[4 ];
89124 buf[0 ] = n;
@@ -109,8 +144,9 @@ void Buffer::write(uint16_t n){
109144 write (buf,2 );
110145}
111146
112- void Buffer::write (uint8_t * buf, uint32_t len){
147+ void Buffer::write (const uint8_t * buf, uint32_t len){
113148 if (!writing) return ;
149+ while (saving) delay (10 );
114150
115151 if (useA){
116152 memcpy (&bufA[bufSizeA], buf, len);
@@ -121,127 +157,86 @@ void Buffer::write(uint8_t* buf, uint32_t len){
121157 }
122158}
123159
124- void Buffer::save (fs::FS* fs){
125- if (saving) return ; // makes sure the function isn't called simultaneously on different cores
126-
127- // buffers are already emptied, therefor saving is unecessary
128- if ((useA && bufSizeB == 0 ) || (!useA && bufSizeA == 0 )){
129- // Serial.printf("useA: %s, bufA %u, bufB %u\n",useA ? "true" : "false",bufSizeA,bufSizeB); // for debug porpuses
130- return ;
131- }
132-
133- // Serial.println("saving file");
134-
135- uint32_t startTime = millis ();
136- uint32_t finishTime;
137-
138- file = fs->open (fileName, FILE_APPEND);
139- if (!file) {
140- Serial.println (text02 + fileName+" '" );
141- // useSD = false;
142- return ;
143- }
144-
145- saving = true ;
146-
147- uint32_t len;
148-
149- if (useA){
150- file.write (bufB, bufSizeB);
151- len = bufSizeB;
152- bufSizeB = 0 ;
153- }
154- else {
155- file.write (bufA, bufSizeA);
156- len = bufSizeA;
157- bufSizeA = 0 ;
158- }
159-
160- file.close ();
161-
162- finishTime = millis () - startTime;
163-
164- // Serial.printf("\n%u bytes written for %u ms\n", len, finishTime);
165-
166- saving = false ;
167-
168- }
169-
170- void Buffer::forceSave (fs::FS* fs){
171- uint32_t len = bufSizeA + bufSizeB;
172- if (len == 0 ) return ;
173-
160+ void Buffer::saveFs (){
174161 file = fs->open (fileName, FILE_APPEND);
175162 if (!file) {
176163 Serial.println (text02+fileName+" '" );
177- // useSD = false;
178164 return ;
179165 }
180166
181- saving = true ;
182- writing = false ;
183-
184167 if (useA){
185-
186168 if (bufSizeB > 0 ){
187169 file.write (bufB, bufSizeB);
188- bufSizeB = 0 ;
189170 }
190-
191171 if (bufSizeA > 0 ){
192172 file.write (bufA, bufSizeA);
193- bufSizeA = 0 ;
194173 }
195-
196174 } else {
197-
198175 if (bufSizeA > 0 ){
199176 file.write (bufA, bufSizeA);
200- bufSizeA = 0 ;
201177 }
202-
203178 if (bufSizeB > 0 ){
204179 file.write (bufB, bufSizeB);
205- bufSizeB = 0 ;
206180 }
207-
208181 }
209182
210183 file.close ();
211-
212- // Serial.printf("saved %u bytes\n",len);
213-
214- saving = false ;
215- writing = true ;
216184}
217185
218- void Buffer::forceSaveSerial () {
219- uint32_t len = bufSizeA + bufSizeB;
220- if (len == 0 ) return ;
221-
222- saving = true ;
223- writing = false ;
186+ void Buffer::saveSerial () {
187+ // Saves to main console UART, user-facing app will ignore these markers
188+ // Uses / and ] in markers as they are illegal characters for SSIDs
189+ const char * mark_begin = " [BUF/BEGIN]" ;
190+ const size_t mark_begin_len = strlen (mark_begin);
191+ const char * mark_close = " [BUF/CLOSE]" ;
192+ const size_t mark_close_len = strlen (mark_close);
193+
194+ // Additional buffer and memcpy's so that a single Serial.write() is called
195+ // This is necessary so that other console output isn't mixed into buffer stream
196+ uint8_t * buf = (uint8_t *)malloc (mark_begin_len + bufSizeA + bufSizeB + mark_close_len);
197+ uint8_t * it = buf;
198+ memcpy (it, mark_begin, mark_begin_len);
199+ it += mark_begin_len;
224200
225201 if (useA){
226202 if (bufSizeB > 0 ){
227- Serial1. write ( bufB, bufSizeB);
228- bufSizeB = 0 ;
203+ memcpy (it, bufB, bufSizeB);
204+ it += bufSizeB ;
229205 }
230206 if (bufSizeA > 0 ){
231- Serial1. write ( bufA, bufSizeA);
232- bufSizeA = 0 ;
207+ memcpy (it, bufA, bufSizeA);
208+ it += bufSizeA ;
233209 }
234210 } else {
235211 if (bufSizeA > 0 ){
236- Serial1. write ( bufA, bufSizeA);
237- bufSizeA = 0 ;
212+ memcpy (it, bufA, bufSizeA);
213+ it += bufSizeA ;
238214 }
239215 if (bufSizeB > 0 ){
240- Serial1. write ( bufB, bufSizeB);
241- bufSizeB = 0 ;
216+ memcpy (it, bufB, bufSizeB);
217+ it += bufSizeB ;
242218 }
243219 }
244220
221+ memcpy (it, mark_close, mark_close_len);
222+ it += mark_close_len;
223+ Serial.write (buf, it - buf);
224+ free (buf);
225+ }
226+
227+ void Buffer::save () {
228+ saving = true ;
229+
230+ if ((bufSizeA + bufSizeB) == 0 ){
231+ saving = false ;
232+ return ;
233+ }
234+
235+ if (this ->fs ) saveFs ();
236+ if (this ->serial ) saveSerial ();
237+
238+ bufSizeA = 0 ;
239+ bufSizeB = 0 ;
240+
245241 saving = false ;
246- writing = true ;
247242}
0 commit comments