// This function starts a new log file in the DataFlash void DataFlash_Block::start_new_log(void) { uint16_t last_page = find_last_page(); StartRead(last_page); //Serial.print("last page: "); Serial.println(last_page); //Serial.print("file #: "); Serial.println(GetFileNumber()); //Serial.print("file page: "); Serial.println(GetFilePage()); if(find_last_log() == 0 || GetFileNumber() == 0xFFFF) { SetFileNumber(1); StartWrite(1); //Serial.println("start log from 0"); return; } // Check for log of length 1 page and suppress if(GetFilePage() <= 1) { SetFileNumber(GetFileNumber()); // Last log too short, reuse its number StartWrite(last_page); // and overwrite it //Serial.println("start log from short"); } else { if(last_page == 0xFFFF) last_page=0; SetFileNumber(GetFileNumber()+1); StartWrite(last_page + 1); //Serial.println("start log normal"); } }
// This function determines the number of whole or partial log files in the DataFlash // Wholly overwritten files are (of course) lost. uint16_t DataFlash_Block::get_num_logs(void) { uint16_t lastpage; uint16_t last; uint16_t first; if (find_last_page() == 1) { return 0; } StartRead(1); if (GetFileNumber() == 0xFFFF) { return 0; } lastpage = find_last_page(); StartRead(lastpage); last = GetFileNumber(); StartRead(lastpage + 2); first = GetFileNumber(); if(first > last) { StartRead(1); first = GetFileNumber(); } if (last == first) { return 1; } return (last - first + 1); }
// This function finds the last page of a particular log file uint16_t DataFlash_Block::find_last_page_of_log(uint16_t log_number) { uint16_t look; uint16_t bottom; uint16_t top; uint32_t look_hash; uint32_t check_hash; if(check_wrapped()) { StartRead(1); bottom = GetFileNumber(); if (bottom > log_number) { bottom = find_last_page(); top = df_NumPages; } else { bottom = 1; top = find_last_page(); } } else { bottom = 1; top = find_last_page(); } check_hash = (int32_t)log_number<<16 | 0xFFFF; while(top-bottom > 1) { look = (top+bottom)/2; StartRead(look); look_hash = (int32_t)GetFileNumber()<<16 | GetFilePage(); if (look_hash >= 0xFFFF0000) look_hash = 0; if(look_hash > check_hash) { // move down top = look; } else { // move up bottom = look; } } StartRead(top); if (GetFileNumber() == log_number) return top; StartRead(bottom); if (GetFileNumber() == log_number) return bottom; return -1; }
// This function finds the first and last pages of a log file // The first page may be greater than the last page if the DataFlash has been filled and partially overwritten. void DataFlash_Block::get_log_boundaries(uint16_t log_num, uint16_t & start_page, uint16_t & end_page) { uint16_t num = get_num_logs(); uint16_t look; if (df_BufferIdx != 0) { FinishWrite(); hal.scheduler->delay(100); } if(num == 1) { StartRead(df_NumPages); if (GetFileNumber() == 0xFFFF) { start_page = 1; end_page = find_last_page_of_log((uint16_t)log_num); } else { end_page = find_last_page_of_log((uint16_t)log_num); start_page = end_page + 1; } } else { if(log_num==1) { StartRead(df_NumPages); if(GetFileNumber() == 0xFFFF) { start_page = 1; } else { start_page = find_last_page() + 1; } } else { if(log_num == find_last_log() - num + 1) { start_page = find_last_page() + 1; } else { look = log_num-1; do { start_page = find_last_page_of_log(look) + 1; look--; } while (start_page <= 0 && look >=1); } } } if (start_page == df_NumPages+1 || start_page == 0) { start_page = 1; } end_page = find_last_page_of_log(log_num); if (end_page == 0) { end_page = start_page; } }
bool DataFlash_Block::check_wrapped(void) { StartRead(df_NumPages); if(GetFileNumber() == 0xFFFF) return 0; else return 1; }
/* dump header information from all log pages */ void DataFlash_Block::DumpPageInfo(AP_HAL::BetterStream *port) { for (uint16_t count=1; count<=df_NumPages; count++) { StartRead(count); port->printf_P(PSTR("DF page, log file #, log page: %u,\t"), (unsigned)count); port->printf_P(PSTR("%u,\t"), (unsigned)GetFileNumber()); port->printf_P(PSTR("%u\n"), (unsigned)GetFilePage()); } }
void InitDebugLine( dw_client cli, const char *source_filename, char *inc_list, unsigned inc_list_len ) { stmt_prologue prol = { 0, DWARF_IMPL_VERSION, sizeof( stmt_prologue ) - offsetof( stmt_prologue, minimum_instruction_length ), DW_MIN_INSTR_LENGTH, 0, DWLINE_BASE, DWLINE_RANGE, DWLINE_OPCODE_BASE, { /* LEB128 args - Instruction op-code */ 0, /* DW_LNS_copy */ 1, /* DW_LNS_advance */ 1, /* DW_LNS_advance_line */ 1, /* DW_LNS_set_file */ 1, /* DW_LNS_set_column */ 0, /* DW_LNS_negate_stmt */ 0, /* DW_LNS_set_basic_block */ 0, /* DW_LNS_const_add_pc */ 0 /* DW_LNS_fixed_advance_pc */ /* // GNU sets the last entry to 1. This is (maybe?) incorrect as the DW_LNS_fixed_advance_pc // opcode has a fixed uhalf (uint_16)argument, not a (U)LEB128 argument. */ } }; static uint_8 const terminators[] = {0,0}; prol.prologue_length += inc_list_len + 2; // +2 for 2 list terminators cli->debug_line.files = NULL; cli->debug_line.addr = 0; cli->debug_line.line = 1; cli->debug_line.column = 0; cli->debug_line.is_stmt = 0; cli->debug_line.end_sequence = 0; /* write the prologue */ CLIWrite( DW_DEBUG_LINE, (char*)&prol, sizeof( prol ) ); if( inc_list != 0 ) { // write the include list CLIWrite( DW_DEBUG_LINE, inc_list, inc_list_len ); } CLIWrite( DW_DEBUG_LINE, terminators, sizeof(terminators) ); /* and put out the source filename */ GetFileNumber( cli, source_filename ); }
static void ChecksumAddLump(md5_context_t *md5_context, lumpinfo_t *lump) { char buf[9]; strncpy(buf, lump->name, 8); buf[8] = '\0'; MD5_UpdateString(md5_context, buf); MD5_UpdateInt32(md5_context, GetFileNumber(lump->wad_file)); MD5_UpdateInt32(md5_context, lump->position); MD5_UpdateInt32(md5_context, lump->size); }
// This function finds the last page of the last file uint16_t DataFlash_Block::find_last_page(void) { uint16_t look; uint16_t bottom = 1; uint16_t top = df_NumPages; uint32_t look_hash; uint32_t bottom_hash; uint32_t top_hash; StartRead(bottom); bottom_hash = ((int32_t)GetFileNumber()<<16) | GetFilePage(); while(top-bottom > 1) { look = (top+bottom)/2; StartRead(look); look_hash = (int32_t)GetFileNumber()<<16 | GetFilePage(); if (look_hash >= 0xFFFF0000) look_hash = 0; if(look_hash < bottom_hash) { // move down top = look; } else { // move up bottom = look; bottom_hash = look_hash; } } StartRead(top); top_hash = ((int32_t)GetFileNumber()<<16) | GetFilePage(); if (top_hash >= 0xFFFF0000) { top_hash = 0; } if (top_hash > bottom_hash) { return top; } return bottom; }
void DWENTRY DWSetFile( dw_client cli, const char *filename ) { uint_8 buf[ 1 + MAX_LEB128 ]; uint_8 *end; _Validate( filename != NULL ); buf[0] = DW_LNS_set_file; end = LEB128( buf + 1, GetFileNumber( cli, filename ) ); CLIWrite( DW_DEBUG_LINE, buf, end - buf ); }
// This function starts a new log file in the DataFlash uint16_t DataFlash_Block::start_new_log(void) { uint16_t last_page = find_last_page(); StartRead(last_page); //Serial.print("last page: "); Serial.println(last_page); //Serial.print("file #: "); Serial.println(GetFileNumber()); //Serial.print("file page: "); Serial.println(GetFilePage()); if(find_last_log() == 0 || GetFileNumber() == 0xFFFF) { SetFileNumber(1); StartWrite(1); //Serial.println("start log from 0"); log_write_started = true; return 1; } uint16_t new_log_num; // Check for log of length 1 page and suppress if(GetFilePage() <= 1) { new_log_num = GetFileNumber(); // Last log too short, reuse its number // and overwrite it SetFileNumber(new_log_num); StartWrite(last_page); } else { new_log_num = GetFileNumber()+1; if (last_page == 0xFFFF) { last_page=0; } SetFileNumber(new_log_num); StartWrite(last_page + 1); } log_write_started = true; return new_log_num; }
// This funciton finds the last log number uint16_t DataFlash_Block::find_last_log(void) { uint16_t last_page = find_last_page(); StartRead(last_page); return GetFileNumber(); }