/* Read the log and print it on port */ void DataFlash_Block::LogReadProcess(uint16_t log_num, uint16_t start_page, uint16_t end_page, print_mode_fn print_mode, AP_HAL::BetterStream *port) { uint8_t log_step = 0; uint16_t page = start_page; bool first_entry = true; if (df_BufferIdx != 0) { FinishWrite(); hal.scheduler->delay(100); } StartRead(start_page); while (true) { uint8_t data; if (!ReadBlock(&data, 1)) { break; } // This is a state machine to read the packets switch(log_step) { case 0: if (data == HEAD_BYTE1) { log_step++; } break; case 1: if (data == HEAD_BYTE2) { log_step++; } else { log_step = 0; } break; case 2: log_step = 0; if (first_entry && data != LOG_FORMAT_MSG) { _print_log_formats(port); } first_entry = false; _print_log_entry(data, print_mode, port); break; } uint16_t new_page = GetPage(); if (new_page != page) { if (new_page == end_page+1 || new_page == start_page) { return; } page = new_page; } } }
/* Read the log and print it on port */ void DataFlash_Block::LogReadProcess(uint16_t log_num, uint16_t start_page, uint16_t end_page, uint8_t num_types, const struct LogStructure *structure, void (*print_mode)(AP_HAL::BetterStream *port, uint8_t mode), AP_HAL::BetterStream *port) { uint8_t log_step = 0; uint16_t page = start_page; if (df_BufferIdx != 0) { FinishWrite(); hal.scheduler->delay(100); } StartRead(start_page); while (true) { uint8_t data; ReadBlock(&data, 1); // This is a state machine to read the packets switch(log_step) { case 0: if (data == HEAD_BYTE1) { log_step++; } break; case 1: if (data == HEAD_BYTE2) { log_step++; } else { log_step = 0; } break; case 2: log_step = 0; _print_log_entry(data, num_types, structure, print_mode, port); break; } uint16_t new_page = GetPage(); if (new_page != page) { if (new_page == end_page+1 || new_page == start_page) { return; } page = new_page; } } }
/* Read the log and print it on port */ void DataFlash_File::LogReadProcess(uint16_t log_num, uint16_t start_page, uint16_t end_page, void (*print_mode)(AP_HAL::BetterStream *port, uint8_t mode), AP_HAL::BetterStream *port) { uint8_t log_step = 0; if (!_initialised || _open_error) { return; } if (_read_fd != -1) { ::close(_read_fd); _read_fd = -1; } char *fname = _log_file_name(log_num); if (fname == NULL) { return; } _read_fd = ::open(fname, O_RDONLY); free(fname); if (_read_fd == -1) { return; } _read_fd_log_num = log_num; _read_offset = 0; if (start_page != 0) { ::lseek(_read_fd, start_page * DATAFLASH_PAGE_SIZE, SEEK_SET); _read_offset = start_page * DATAFLASH_PAGE_SIZE; } uint8_t log_counter = 0; while (true) { uint8_t data; if (::read(_read_fd, &data, 1) != 1) { // reached end of file break; } _read_offset++; // This is a state machine to read the packets switch(log_step) { case 0: if (data == HEAD_BYTE1) { log_step++; } break; case 1: if (data == HEAD_BYTE2) { log_step++; } else { log_step = 0; } break; case 2: log_step = 0; _print_log_entry(data, print_mode, port); log_counter++; if (log_counter == 10) { log_counter = 0; ::lseek(_read_fd, 0, SEEK_CUR); } break; } if (_read_offset >= (end_page+1) * DATAFLASH_PAGE_SIZE) { break; } } ::close(_read_fd); _read_fd = -1; }