/* start writing to a new log file */ uint16_t DataFlash_File::start_new_log(void) { stop_logging(); if (_open_error) { // we have previously failed to open a file - don't try again // to prevent us trying to open files while in flight return 0xFFFF; } if (_read_fd != -1) { ::close(_read_fd); _read_fd = -1; } uint16_t log_num = find_last_log(); // re-use empty logs if possible if (_get_log_size(log_num) > 0 || log_num == 0) { log_num++; } if (log_num > MAX_LOG_FILES) { log_num = 1; } char *fname = _log_file_name(log_num); _write_fd = ::open(fname, O_WRONLY|O_CREAT|O_TRUNC, 0666); if (_write_fd == -1) { _initialised = false; _open_error = true; int saved_errno = errno; ::printf("Log open fail for %s - %s\n", fname, strerror(saved_errno)); hal.console->printf("Log open fail for %s - %s\n", fname, strerror(saved_errno)); free(fname); return 0xFFFF; } free(fname); _write_offset = 0; _writebuf_head = 0; _writebuf_tail = 0; log_write_started = true; // now update lastlog.txt with the new log number fname = _lastlog_file_name(); FILE *f = ::fopen(fname, "w"); fprintf(f, "%u\r\n", (unsigned)log_num); fclose(f); free(fname); return log_num; }
// remove all log files void DataFlash_File::EraseAll() { uint16_t log_num; for (log_num=0; log_num<MAX_LOG_FILES; log_num++) { char *fname = _log_file_name(log_num); if (fname == NULL) { break; } unlink(fname); free(fname); } char *fname = _lastlog_file_name(); if (fname != NULL) { unlink(fname); free(fname); } }
/* find the highest log number */ uint16_t DataFlash_File::find_last_log(void) { unsigned ret = 0; char *fname = _lastlog_file_name(); if (fname == NULL) { return ret; } FILE *f = ::fopen(fname, "r"); free(fname); if (f != NULL) { char buf[10]; memset(buf, 0, sizeof(buf)); // PX4 doesn't have fscanf() if (fread(buf, 1, sizeof(buf)-1, f) > 0) { sscanf(buf, "%u", &ret); } fclose(f); } return ret; }
/* start writing to a new log file */ uint16_t DataFlash_File::start_new_log(void) { stop_logging(); if (_read_fd != -1) { ::close(_read_fd); _read_fd = -1; } uint16_t log_num = find_last_log(); // re-use empty logs if possible if (_get_log_size(log_num) > 0 || log_num == 0) { log_num++; } if (log_num > MAX_LOG_FILES) { log_num = 1; } char *fname = _log_file_name(log_num); _write_fd = ::open(fname, O_WRONLY|O_CREAT|O_TRUNC, 0666); free(fname); if (_write_fd == -1) { _initialised = false; return 0xFFFF; } _write_offset = 0; _writebuf_head = 0; _writebuf_tail = 0; log_write_started = true; // now update lastlog.txt with the new log number fname = _lastlog_file_name(); FILE *f = ::fopen(fname, "w"); fprintf(f, "%u\r\n", (unsigned)log_num); fclose(f); free(fname); return log_num; }