/** get data from a log, accounting for adding FMT headers */ int16_t DataFlash_Block::get_log_data(uint16_t log_num, uint16_t page, uint32_t offset, uint16_t len, uint8_t *data) { if (offset == 0) { uint8_t header[3]; get_log_data_raw(log_num, page, 0, 3, header); adding_fmt_headers = (header[0] != HEAD_BYTE1 || header[1] != HEAD_BYTE2 || header[2] != LOG_FORMAT_MSG); } uint16_t ret = 0; if (adding_fmt_headers) { // the log doesn't start with a FMT message, we need to add // them const uint16_t fmt_header_size = _num_types * sizeof(struct log_Format); while (offset < fmt_header_size && len > 0) { struct log_Format pkt; uint8_t t = offset / sizeof(pkt); uint8_t ofs = offset % sizeof(pkt); Log_Fill_Format(&_structures[t], pkt); uint8_t n = sizeof(pkt) - ofs; if (n > len) { n = len; } memcpy(data, ofs + (uint8_t *)&pkt, n); data += n; offset += n; len -= n; ret += n; } offset -= fmt_header_size; } if (len > 0) { ret += get_log_data_raw(log_num, page, offset, len, data); } return ret; }
/* write a structure format to the log */ void DataFlash_Class::Log_Write_Format(const struct LogStructure *s) { struct log_Format pkt; Log_Fill_Format(s, pkt); WriteBlock(&pkt, sizeof(pkt)); }
/* write a structure format to the log */ bool DataFlash_Class::Log_Write_Format(const struct LogStructure *s) { struct log_Format pkt; Log_Fill_Format(s, pkt); return WriteCriticalBlock(&pkt, sizeof(pkt)); }