@@ -2648,24 +2648,37 @@ bool GNSS_MOSAIC::updateSD()
2648
2648
if (!previousCardPresent) // If the card is not present, skip the list disk info
2649
2649
return false ;
2650
2650
2651
- char diskInfo[200 ];
2652
- bool response =
2653
- sendAndWaitForIdle (" ldi,DSK1\n\r " , " DiskInfo" , 1000 , 25 , &diskInfo[0 ], sizeof (diskInfo), false ); // No debug
2654
- if (response)
2655
- {
2656
- char *ptr = strstr (diskInfo, " total=\" " );
2657
- if (ptr == nullptr )
2658
- return false ;
2659
- ptr += strlen (" total=\" " );
2660
- sscanf (ptr, " %llu\" " , &sdCardSize);
2661
- ptr = strstr (ptr, " free=\" " );
2662
- if (ptr == nullptr )
2663
- return false ;
2664
- ptr += strlen (" free=\" " );
2665
- sscanf (ptr, " %llu\" " , &sdFreeSpace);
2666
- }
2651
+ // Use ldi,DSK1 to read the disk information
2652
+ // This is inefficient as the DiskInfo lists all files on the SD card
2653
+ // exeSBFOnce DiskStatus is much more efficient
2654
+ //
2655
+ // char diskInfo[200];
2656
+ // bool response =
2657
+ // sendAndWaitForIdle("ldi,DSK1\n\r", "DiskInfo", 1000, 25, &diskInfo[0], sizeof(diskInfo), false); // No debug
2658
+ // if (response)
2659
+ // {
2660
+ // char *ptr = strstr(diskInfo, " total=\"");
2661
+ // if (ptr == nullptr)
2662
+ // return false;
2663
+ // ptr += strlen(" total=\"");
2664
+ // sscanf(ptr, "%llu\"", &sdCardSize);
2665
+ // ptr = strstr(ptr, " free=\"");
2666
+ // if (ptr == nullptr)
2667
+ // return false;
2668
+ // ptr += strlen(" free=\"");
2669
+ // sscanf(ptr, "%llu\"", &sdFreeSpace);
2670
+ // }
2667
2671
2668
- return response;
2672
+ _diskStatusSeen = false ;
2673
+
2674
+ // Request the DiskStatus SBF block using a esoc (exeSBFOnce) command on COM4
2675
+ String request = " esoc,COM4,DiskStatus\n\r " ;
2676
+ serial2GNSS->write (request.c_str (), request.length ());
2677
+
2678
+ // Wait for up to 1 second for the DiskStatus
2679
+ waitSBFDiskStatus (1000 );
2680
+
2681
+ return _diskStatusSeen;
2669
2682
}
2670
2683
2671
2684
// ----------------------------------------
@@ -2702,6 +2715,40 @@ void GNSS_MOSAIC::waitSBFReceiverSetup(unsigned long timeout)
2702
2715
sempStopParser (&sbfParse);
2703
2716
}
2704
2717
2718
+ // ----------------------------------------
2719
+ void GNSS_MOSAIC::waitSBFDiskStatus (unsigned long timeout)
2720
+ {
2721
+ SEMP_PARSE_ROUTINE const sbfParserTable[] = {sempSbfPreamble};
2722
+ const int sbfParserCount = sizeof (sbfParserTable) / sizeof (sbfParserTable[0 ]);
2723
+ const char *const sbfParserNames[] = {
2724
+ " SBF" ,
2725
+ };
2726
+ const int sbfParserNameCount = sizeof (sbfParserNames) / sizeof (sbfParserNames[0 ]);
2727
+
2728
+ SEMP_PARSE_STATE *sbfParse;
2729
+
2730
+ // Initialize the SBF parser for the mosaic-X5
2731
+ sbfParse = sempBeginParser (sbfParserTable, sbfParserCount, sbfParserNames, sbfParserNameCount,
2732
+ 0 , // Scratchpad bytes
2733
+ 500 , // Buffer length
2734
+ processSBFDiskStatus, // eom Call Back
2735
+ " Sbf" ); // Parser Name
2736
+ if (!sbfParse)
2737
+ reportFatalError (" Failed to initialize the SBF parser" );
2738
+
2739
+ unsigned long startTime = millis ();
2740
+ while ((millis () < (startTime + timeout)) && (_diskStatusSeen == false ))
2741
+ {
2742
+ if (serial2GNSS->available ())
2743
+ {
2744
+ // Update the parser state based on the incoming byte
2745
+ sempParseNextByte (sbfParse, serial2GNSS->read ());
2746
+ }
2747
+ }
2748
+
2749
+ sempStopParser (&sbfParse);
2750
+ }
2751
+
2705
2752
// ==========================================================================
2706
2753
// Parser support routines
2707
2754
// ==========================================================================
@@ -2798,6 +2845,37 @@ void processSBFReceiverSetup(SEMP_PARSE_STATE *parse, uint16_t type)
2798
2845
}
2799
2846
}
2800
2847
2848
+ // ----------------------------------------
2849
+ void processSBFDiskStatus (SEMP_PARSE_STATE *parse, uint16_t type)
2850
+ {
2851
+ // If this is DiskStatus, extract some data
2852
+ if (sempSbfGetBlockNumber (parse) == 4059 )
2853
+ {
2854
+ if (sempSbfGetU1 (parse, 14 ) < 1 ) // Check N is at least 1
2855
+ return ;
2856
+
2857
+ uint64_t diskUsageMSB = sempSbfGetU2 (parse, 20 + 2 ); // DiskUsageMSB
2858
+ uint64_t diskUsageLSB = sempSbfGetU4 (parse, 20 + 4 ); // DiskUsageLSB
2859
+
2860
+ if ((diskUsageMSB == 65535 ) && (diskUsageLSB == 4294967295 ))
2861
+ return ;
2862
+
2863
+ uint64_t diskSizeMB = sempSbfGetU4 (parse, 20 + 8 ); // DiskSize in megabytes
2864
+
2865
+ if (diskSizeMB == 0 )
2866
+ return ;
2867
+
2868
+ uint64_t diskUsage = (diskUsageMSB * 4294967296 ) + diskUsageLSB;
2869
+
2870
+ sdCardSize = diskSizeMB * 1048576 ; // Convert to bytes
2871
+
2872
+ sdFreeSpace = sdCardSize - diskUsage;
2873
+
2874
+ GNSS_MOSAIC *mosaic = (GNSS_MOSAIC *)gnss;
2875
+ mosaic->_diskStatusSeen = true ;
2876
+ }
2877
+ }
2878
+
2801
2879
// ----------------------------------------
2802
2880
// Call back from within the SBF parser, for end of valid message
2803
2881
// Process a complete message incoming from parser
0 commit comments