Browse Source

Fix "unqualified id" warning (#15144)

Scott Lahteine 5 years ago
parent
commit
c97c393c4a
No account linked to committer's email address
1 changed files with 44 additions and 40 deletions
  1. 44
    40
      Marlin/src/feature/binary_protocol.h

+ 44
- 40
Marlin/src/feature/binary_protocol.h View File

228
                                      PACKET_PROCESS, PACKET_RESEND, PACKET_TIMEOUT, PACKET_ERROR };
228
                                      PACKET_PROCESS, PACKET_RESEND, PACKET_TIMEOUT, PACKET_ERROR };
229
 
229
 
230
   struct Packet { // 10 byte protocol overhead, ascii with checksum and line number has a minimum of 7 increasing with line
230
   struct Packet { // 10 byte protocol overhead, ascii with checksum and line number has a minimum of 7 increasing with line
231
-    struct [[gnu::packed]]  Header {
232
-      static constexpr uint16_t HEADER_TOKEN = 0xB5AD;
233
-      uint16_t token;       // packet start token
234
-      uint8_t sync;         // stream sync, resend id and packet loss detection
235
-      uint8_t meta;         // 4 bit protocol,
236
-                            // 4 bit packet type
237
-      uint16_t size;        // data length
238
-      uint16_t checksum;    // header checksum
239
 
231
 
232
+    union Header {
233
+      static constexpr uint16_t HEADER_TOKEN = 0xB5AD;
234
+      struct [[gnu::packed]] {
235
+        uint16_t token;       // packet start token
236
+        uint8_t sync;         // stream sync, resend id and packet loss detection
237
+        uint8_t meta;         // 4 bit protocol,
238
+                              // 4 bit packet type
239
+        uint16_t size;        // data length
240
+        uint16_t checksum;    // header checksum
241
+      };
240
       uint8_t protocol() { return (meta >> 4) & 0xF; }
242
       uint8_t protocol() { return (meta >> 4) & 0xF; }
241
       uint8_t type() { return meta & 0xF; }
243
       uint8_t type() { return meta & 0xF; }
242
       void reset() { token = 0; sync = 0; meta = 0; size = 0; checksum = 0; }
244
       void reset() { token = 0; sync = 0; meta = 0; size = 0; checksum = 0; }
245
+      uint8_t data[1];
243
     };
246
     };
244
 
247
 
245
-    struct [[gnu::packed]] Footer {
246
-      uint16_t checksum; // full packet checksum
248
+    union Footer {
249
+      struct [[gnu::packed]] {
250
+        uint16_t checksum; // full packet checksum
251
+      };
247
       void reset() { checksum = 0; }
252
       void reset() { checksum = 0; }
253
+      uint8_t data[1];
248
     };
254
     };
249
 
255
 
250
-    uint8_t header_data[sizeof(Header)],
251
-            footer_data[sizeof(Footer)];
256
+    Header header;
257
+    Footer footer;
252
     uint32_t bytes_received;
258
     uint32_t bytes_received;
253
     uint16_t checksum, header_checksum;
259
     uint16_t checksum, header_checksum;
254
     millis_t timeout;
260
     millis_t timeout;
255
     char* buffer;
261
     char* buffer;
256
 
262
 
257
-    Header& header() { return *reinterpret_cast<Header*>(header_data); }
258
-    Footer& footer() { return *reinterpret_cast<Footer*>(footer_data); }
259
     void reset() {
263
     void reset() {
260
-      header().reset();
261
-      footer().reset();
264
+      header.reset();
265
+      footer.reset();
262
       bytes_received = 0;
266
       bytes_received = 0;
263
       checksum = 0;
267
       checksum = 0;
264
       header_checksum = 0;
268
       header_checksum = 0;
312
           stream_state = StreamState::PACKET_WAIT;
316
           stream_state = StreamState::PACKET_WAIT;
313
         case StreamState::PACKET_WAIT:
317
         case StreamState::PACKET_WAIT:
314
           if (!stream_read(data)) { idle(); return; }  // no active packet so don't wait
318
           if (!stream_read(data)) { idle(); return; }  // no active packet so don't wait
315
-          packet.header_data[1] = data;
316
-          if (packet.header().token == Packet::Header::HEADER_TOKEN) {
319
+          packet.header.data[1] = data;
320
+          if (packet.header.token == packet.header.HEADER_TOKEN) {
317
             packet.bytes_received = 2;
321
             packet.bytes_received = 2;
318
             stream_state = StreamState::PACKET_HEADER;
322
             stream_state = StreamState::PACKET_HEADER;
319
           }
323
           }
320
           else {
324
           else {
321
             // stream corruption drop data
325
             // stream corruption drop data
322
-            packet.header_data[0] = data;
326
+            packet.header.data[0] = data;
323
           }
327
           }
324
           break;
328
           break;
325
         case StreamState::PACKET_HEADER:
329
         case StreamState::PACKET_HEADER:
326
           if (!stream_read(data)) break;
330
           if (!stream_read(data)) break;
327
 
331
 
328
-          packet.header_data[packet.bytes_received++] = data;
332
+          packet.header.data[packet.bytes_received++] = data;
329
           packet.checksum = checksum(packet.checksum, data);
333
           packet.checksum = checksum(packet.checksum, data);
330
 
334
 
331
           // header checksum calculation can't contain the checksum
335
           // header checksum calculation can't contain the checksum
332
-          if (packet.bytes_received == sizeof(Packet::Header) - 2)
336
+          if (packet.bytes_received == sizeof(Packet::header) - 2)
333
             packet.header_checksum = packet.checksum;
337
             packet.header_checksum = packet.checksum;
334
 
338
 
335
-          if (packet.bytes_received == sizeof(Packet::Header)) {
336
-            if (packet.header().checksum == packet.header_checksum) {
339
+          if (packet.bytes_received == sizeof(Packet::header)) {
340
+            if (packet.header.checksum == packet.header_checksum) {
337
               // The SYNC control packet is a special case in that it doesn't require the stream sync to be correct
341
               // The SYNC control packet is a special case in that it doesn't require the stream sync to be correct
338
-              if (static_cast<Protocol>(packet.header().protocol()) == Protocol::CONTROL && static_cast<ProtocolControl>(packet.header().type()) == ProtocolControl::SYNC) {
342
+              if (static_cast<Protocol>(packet.header.protocol()) == Protocol::CONTROL && static_cast<ProtocolControl>(packet.header.type()) == ProtocolControl::SYNC) {
339
                   SERIAL_ECHOLNPAIR("ss", sync, ",", buffer_size, ",", VERSION_MAJOR, ".", VERSION_MINOR, ".", VERSION_PATCH);
343
                   SERIAL_ECHOLNPAIR("ss", sync, ",", buffer_size, ",", VERSION_MAJOR, ".", VERSION_MINOR, ".", VERSION_PATCH);
340
                   stream_state = StreamState::PACKET_RESET;
344
                   stream_state = StreamState::PACKET_RESET;
341
                   break;
345
                   break;
342
               }
346
               }
343
-              if (packet.header().sync == sync) {
347
+              if (packet.header.sync == sync) {
344
                 buffer_next_index = 0;
348
                 buffer_next_index = 0;
345
                 packet.bytes_received = 0;
349
                 packet.bytes_received = 0;
346
-                if (packet.header().size) {
350
+                if (packet.header.size) {
347
                   stream_state = StreamState::PACKET_DATA;
351
                   stream_state = StreamState::PACKET_DATA;
348
                   packet.buffer = static_cast<char *>(&buffer[0]); // multipacket buffering not implemented, always allocate whole buffer to packet
352
                   packet.buffer = static_cast<char *>(&buffer[0]); // multipacket buffering not implemented, always allocate whole buffer to packet
349
                 }
353
                 }
350
                 else
354
                 else
351
                   stream_state = StreamState::PACKET_PROCESS;
355
                   stream_state = StreamState::PACKET_PROCESS;
352
               }
356
               }
353
-              else if (packet.header().sync == sync - 1) {           // ok response must have been lost
354
-                SERIAL_ECHOLNPAIR("ok", packet.header().sync);  // transmit valid packet received and drop the payload
357
+              else if (packet.header.sync == sync - 1) {           // ok response must have been lost
358
+                SERIAL_ECHOLNPAIR("ok", packet.header.sync);  // transmit valid packet received and drop the payload
355
                 stream_state = StreamState::PACKET_RESET;
359
                 stream_state = StreamState::PACKET_RESET;
356
               }
360
               }
357
               else if (packet_retries) {
361
               else if (packet_retries) {
364
             }
368
             }
365
             else {
369
             else {
366
               SERIAL_ECHO_START();
370
               SERIAL_ECHO_START();
367
-              SERIAL_ECHOLNPAIR("Packet Header(", packet.header().sync, "?) Corrupt");
371
+              SERIAL_ECHOLNPAIR("Packet header(", packet.header.sync, "?) corrupt");
368
               stream_state = StreamState::PACKET_RESEND;
372
               stream_state = StreamState::PACKET_RESEND;
369
             }
373
             }
370
           }
374
           }
384
           packet.bytes_received++;
388
           packet.bytes_received++;
385
           buffer_next_index++;
389
           buffer_next_index++;
386
 
390
 
387
-          if (packet.bytes_received == packet.header().size) {
391
+          if (packet.bytes_received == packet.header.size) {
388
             stream_state = StreamState::PACKET_FOOTER;
392
             stream_state = StreamState::PACKET_FOOTER;
389
             packet.bytes_received = 0;
393
             packet.bytes_received = 0;
390
           }
394
           }
392
         case StreamState::PACKET_FOOTER:
396
         case StreamState::PACKET_FOOTER:
393
           if (!stream_read(data)) break;
397
           if (!stream_read(data)) break;
394
 
398
 
395
-          packet.footer_data[packet.bytes_received++] = data;
396
-          if (packet.bytes_received == sizeof(Packet::Footer)) {
397
-            if (packet.footer().checksum == packet.checksum) {
399
+          packet.footer.data[packet.bytes_received++] = data;
400
+          if (packet.bytes_received == sizeof(Packet::footer)) {
401
+            if (packet.footer.checksum == packet.checksum) {
398
               stream_state = StreamState::PACKET_PROCESS;
402
               stream_state = StreamState::PACKET_PROCESS;
399
             }
403
             }
400
             else {
404
             else {
401
               SERIAL_ECHO_START();
405
               SERIAL_ECHO_START();
402
-              SERIAL_ECHOLNPAIR("Packet(", packet.header().sync, ") Payload Corrupt");
406
+              SERIAL_ECHOLNPAIR("Packet(", packet.header.sync, ") payload corrupt");
403
               stream_state = StreamState::PACKET_RESEND;
407
               stream_state = StreamState::PACKET_RESEND;
404
             }
408
             }
405
           }
409
           }
407
         case StreamState::PACKET_PROCESS:
411
         case StreamState::PACKET_PROCESS:
408
           sync++;
412
           sync++;
409
           packet_retries = 0;
413
           packet_retries = 0;
410
-          bytes_received += packet.header().size;
414
+          bytes_received += packet.header.size;
411
 
415
 
412
-          SERIAL_ECHOLNPAIR("ok", packet.header().sync); // transmit valid packet received
416
+          SERIAL_ECHOLNPAIR("ok", packet.header.sync); // transmit valid packet received
413
           dispatch();
417
           dispatch();
414
           stream_state = StreamState::PACKET_RESET;
418
           stream_state = StreamState::PACKET_RESET;
415
           break;
419
           break;
429
           stream_state = StreamState::PACKET_RESEND;
433
           stream_state = StreamState::PACKET_RESEND;
430
           break;
434
           break;
431
         case StreamState::PACKET_ERROR:
435
         case StreamState::PACKET_ERROR:
432
-          SERIAL_ECHOLNPAIR("fe", packet.header().sync);
436
+          SERIAL_ECHOLNPAIR("fe", packet.header.sync);
433
           reset(); // reset everything, resync required
437
           reset(); // reset everything, resync required
434
           stream_state = StreamState::PACKET_RESET;
438
           stream_state = StreamState::PACKET_RESET;
435
           break;
439
           break;
438
   }
442
   }
439
 
443
 
440
   void dispatch() {
444
   void dispatch() {
441
-    switch(static_cast<Protocol>(packet.header().protocol())) {
445
+    switch(static_cast<Protocol>(packet.header.protocol())) {
442
       case Protocol::CONTROL:
446
       case Protocol::CONTROL:
443
-        switch(static_cast<ProtocolControl>(packet.header().type())) {
447
+        switch(static_cast<ProtocolControl>(packet.header.type())) {
444
           case ProtocolControl::CLOSE: // revert back to ASCII mode
448
           case ProtocolControl::CLOSE: // revert back to ASCII mode
445
             card.flag.binary_mode = false;
449
             card.flag.binary_mode = false;
446
             break;
450
             break;
449
         }
453
         }
450
         break;
454
         break;
451
       case Protocol::FILE_TRANSFER:
455
       case Protocol::FILE_TRANSFER:
452
-        SDFileTransferProtocol::process(packet.header().type(), packet.buffer, packet.header().size); // send user data to be processed
456
+        SDFileTransferProtocol::process(packet.header.type(), packet.buffer, packet.header.size); // send user data to be processed
453
       break;
457
       break;
454
       default:
458
       default:
455
         SERIAL_ECHO_MSG("Unsupported Binary Protocol");
459
         SERIAL_ECHO_MSG("Unsupported Binary Protocol");

Loading…
Cancel
Save