Skip to content

Commit abc0afa

Browse files
committed
mosaic-X5 SD : Replace ldi,DSK1 with exeSBFOnce,,DiskStatus
1 parent 0d72b71 commit abc0afa

File tree

2 files changed

+99
-18
lines changed

2 files changed

+99
-18
lines changed

Firmware/RTK_Everywhere/GNSS_Mosaic.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -580,13 +580,14 @@ class GNSS_MOSAIC : GNSS
580580
float _latStdDev;
581581
float _lonStdDev;
582582
bool _receiverSetupSeen;
583+
bool _diskStatusSeen;
583584
std::vector<uint8_t> svInTracking;
584585
//std::vector<uint8_t> svInPVT;
585586

586587
// Constructor
587588
GNSS_MOSAIC() : _determiningFixedPosition(true), _clkBias_ms(0),
588589
_latStdDev(999.9), _lonStdDev(999.9), _receiverSetupSeen(false),
589-
_radioExtBytesReceived_millis(0),
590+
_radioExtBytesReceived_millis(0), _diskStatusSeen(false),
590591
GNSS()
591592
{
592593
svInTracking.clear();
@@ -1051,6 +1052,8 @@ class GNSS_MOSAIC : GNSS
10511052
bool updateSD();
10521053

10531054
void waitSBFReceiverSetup(unsigned long timeout);
1055+
1056+
void waitSBFDiskStatus(unsigned long timeout);
10541057
};
10551058

10561059
#endif // __GNSS_MOSAIC_H__

Firmware/RTK_Everywhere/GNSS_Mosaic.ino

Lines changed: 95 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2648,24 +2648,37 @@ bool GNSS_MOSAIC::updateSD()
26482648
if (!previousCardPresent) // If the card is not present, skip the list disk info
26492649
return false;
26502650

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+
// }
26672671

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;
26692682
}
26702683

26712684
//----------------------------------------
@@ -2702,6 +2715,40 @@ void GNSS_MOSAIC::waitSBFReceiverSetup(unsigned long timeout)
27022715
sempStopParser(&sbfParse);
27032716
}
27042717

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+
27052752
//==========================================================================
27062753
// Parser support routines
27072754
//==========================================================================
@@ -2798,6 +2845,37 @@ void processSBFReceiverSetup(SEMP_PARSE_STATE *parse, uint16_t type)
27982845
}
27992846
}
28002847

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+
28012879
//----------------------------------------
28022880
// Call back from within the SBF parser, for end of valid message
28032881
// Process a complete message incoming from parser

0 commit comments

Comments
 (0)