static bool DownloadFlightInner(Port &port, const char *filename, FILE *file, OperationEnvironment &env) { PortNMEAReader reader(port, env); unsigned row_count = 0, i = 1; while (true) { /* read up to 32 lines at a time */ unsigned nrequest = row_count == 0 ? 1 : 32; if (row_count > 0) { assert(i <= row_count); const unsigned remaining = row_count - i + 1; if (nrequest > remaining) nrequest = remaining; } const unsigned start = i; const unsigned end = start + nrequest; /* send request to Nano */ reader.Flush(); if (!RequestFlight(port, filename, start, end, env)) return false; /* read the requested lines and save to file */ TimeoutClock timeout(2000); while (i != end) { const char *line = reader.ExpectLine("PLXVC,FLIGHT,A,", timeout); if (line == nullptr || !HandleFlightLine(line, file, i, row_count)) return false; } if (i > row_count) /* finished successfully */ return true; if (start == 1) /* configure the range in the first iteration, now that we know the length of the file */ env.SetProgressRange(row_count); env.SetProgressPosition(i - 1); } }
static bool DownloadFlightInner(Port &port, const char *filename, FILE *file, OperationEnvironment &env) { PortNMEAReader reader(port, env); unsigned row_count = 0, i = 1; while (true) { /* read up to 32 lines at a time */ unsigned nrequest = row_count == 0 ? 1 : 32; if (row_count > 0) { assert(i <= row_count); const unsigned remaining = row_count - i + 1; if (nrequest > remaining) nrequest = remaining; } const unsigned start = i; const unsigned end = start + nrequest; unsigned request_retry_count = 0; /* read the requested lines and save to file */ while (i != end) { if (i == start) { /* send request range to Nano */ reader.Flush(); if (!RequestFlight(port, filename, start, end, env)) return false; request_retry_count++; } TimeoutClock timeout(2000); const char *line = reader.ExpectLine("PLXVC,FLIGHT,A,", timeout); if (line == nullptr || !HandleFlightLine(line, file, i, row_count)) { if (request_retry_count > 5) return false; /* Discard data which might still be in-transit, e.g. buffered inside a bluetooth dongle */ port.FullFlush(env, 200, 2000); /* If we already received parts of the request range correctly break out of the loop to calculate new request range */ if (i != start) break; /* No valid reply received (i==start) - request same range again */ } } if (i > row_count) /* finished successfully */ return true; if (start == 1) /* configure the range in the first iteration, now that we know the length of the file */ env.SetProgressRange(row_count); env.SetProgressPosition(i - 1); } }