mirror of
https://github.com/davidgiven/fluxengine.git
synced 2025-10-31 11:17:01 -07:00
Switch from Logger() to log().
This commit is contained in:
@@ -49,7 +49,7 @@ void FlagGroup::applyOption(const OptionProto& option)
|
||||
error("option '{}' has an option group inside it, which isn't allowed",
|
||||
option.name());
|
||||
|
||||
Logger() << fmt::format("OPTION: {}",
|
||||
log("OPTION: {}",
|
||||
option.has_message() ? option.message() : option.comment());
|
||||
|
||||
config.MergeFrom(option.config());
|
||||
|
||||
@@ -36,8 +36,7 @@ namespace
|
||||
_writer{_bytes.writer()}
|
||||
{
|
||||
|
||||
Logger() << fmt::format(
|
||||
"A2R: writing A2R {} file containing {} tracks\n",
|
||||
log("A2R: writing A2R {} file containing {} tracks\n",
|
||||
singlesided() ? "single sided" : "double sided",
|
||||
config.tracks().end() - config.tracks().start() + 1);
|
||||
|
||||
@@ -53,7 +52,7 @@ namespace
|
||||
writeStream();
|
||||
writeMeta();
|
||||
|
||||
Logger() << "A2R: writing output file...\n";
|
||||
log("A2R: writing output file...\n");
|
||||
std::ofstream of(
|
||||
_config.filename(), std::ios::out | std::ios::binary);
|
||||
if (!of.is_open())
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include "fluxmap.h"
|
||||
#include "layout.h"
|
||||
#include "scp.h"
|
||||
#include "lib/logger.h"
|
||||
#include <fstream>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
@@ -64,8 +65,7 @@ public:
|
||||
else
|
||||
_fileheader.heads = 0;
|
||||
|
||||
std::cout << fmt::format(
|
||||
"SCP: writing 96 tpi {} file containing {} tracks\n",
|
||||
log("SCP: writing 96 tpi {} file containing {} tracks",
|
||||
(minSide == maxSide) ? "single sided" : "double sided",
|
||||
_fileheader.end_track - _fileheader.start_track + 1);
|
||||
}
|
||||
@@ -79,7 +79,7 @@ public:
|
||||
appendChecksum(checksum, _trackdata);
|
||||
write_le32(_fileheader.checksum, checksum);
|
||||
|
||||
std::cout << "SCP: writing output file...\n";
|
||||
log("SCP: writing output file");
|
||||
std::ofstream of(_config.filename(), std::ios::out | std::ios::binary);
|
||||
if (!of.is_open())
|
||||
error("cannot open output file");
|
||||
@@ -97,9 +97,8 @@ public:
|
||||
|
||||
if (strack >= std::size(_fileheader.track))
|
||||
{
|
||||
std::cout << fmt::format(
|
||||
"SCP: cannot write track {} head {}, "
|
||||
"there are not not enough Track Data Headers.\n",
|
||||
log("SCP: cannot write track {} head {}, there are not not enough "
|
||||
"Track Data Headers.",
|
||||
track,
|
||||
head);
|
||||
return;
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include "fluxsource/fluxsource.h"
|
||||
#include "scp.h"
|
||||
#include "proto.h"
|
||||
#include "lib/logger.h"
|
||||
#include <fstream>
|
||||
|
||||
static int trackno(int strack)
|
||||
@@ -51,12 +52,12 @@ public:
|
||||
if ((_header.cell_width != 0) && (_header.cell_width != 16))
|
||||
error("currently only 16-bit cells in SCP files are supported");
|
||||
|
||||
std::cout << fmt::format("SCP tracks {}-{}, heads {}-{}\n",
|
||||
log("SCP tracks {}-{}, heads {}-{}",
|
||||
trackno(_header.start_track),
|
||||
trackno(_header.end_track),
|
||||
startSide,
|
||||
endSide);
|
||||
std::cout << fmt::format("SCP sample resolution: {} ns\n", _resolution);
|
||||
log("SCP sample resolution: {} ns", _resolution);
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
@@ -35,8 +35,7 @@ public:
|
||||
unsigned numHeads = 1;
|
||||
unsigned numSectors = 0;
|
||||
|
||||
Logger() << fmt::format(
|
||||
"D64: reading image with {} tracks, {} heads", numTracks, numHeads);
|
||||
log("D64: reading image with {} tracks, {} heads", numTracks, numHeads);
|
||||
|
||||
uint32_t offset = 0;
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ public:
|
||||
std::string diskName = header.slice(0, 0x16);
|
||||
|
||||
if (diskName[0])
|
||||
Logger() << fmt::format("D88: disk name: {}", diskName);
|
||||
log("D88: disk name: {}", diskName);
|
||||
|
||||
ByteReader headerReader(header);
|
||||
|
||||
@@ -46,7 +46,7 @@ public:
|
||||
int diskSize = headerReader.seek(0x1c).read_le32();
|
||||
|
||||
if (diskSize > fileSize)
|
||||
Logger() << "D88: found multiple disk images. Only using first";
|
||||
log("D88: found multiple disk images. Only using first");
|
||||
|
||||
int trackTableEnd = headerReader.seek(0x20).read_le32();
|
||||
int trackTableSize = trackTableEnd - 0x20;
|
||||
@@ -58,19 +58,19 @@ public:
|
||||
|
||||
if (config.encoder().format_case() !=
|
||||
EncoderProto::FormatCase::FORMAT_NOT_SET)
|
||||
Logger() << "D88: overriding configured format";
|
||||
log("D88: overriding configured format");
|
||||
|
||||
auto ibm = config.mutable_encoder()->mutable_ibm();
|
||||
int clockRate = 500;
|
||||
if (mediaFlag == 0x20)
|
||||
{
|
||||
Logger() << "D88: forcing high density mode";
|
||||
log("D88: forcing high density mode");
|
||||
config.mutable_drive()->set_high_density(true);
|
||||
config.set_tpi(96);
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger() << "D88: forcing single/double density mode";
|
||||
log("D88: forcing single/double density mode");
|
||||
clockRate = 300;
|
||||
config.mutable_drive()->set_high_density(false);
|
||||
config.set_tpi(48);
|
||||
@@ -216,7 +216,7 @@ public:
|
||||
|
||||
image->calculateSize();
|
||||
const Geometry& geometry = image->getGeometry();
|
||||
Logger() << fmt::format("D88: read {} tracks, {} sides",
|
||||
log("D88: read {} tracks, {} sides",
|
||||
geometry.numTracks,
|
||||
geometry.numSides);
|
||||
|
||||
|
||||
@@ -104,23 +104,23 @@ public:
|
||||
switch (mediaByte)
|
||||
{
|
||||
case 0x00:
|
||||
Logger() << "DIM: automatically setting format to 1.2MB "
|
||||
"(1024 byte sectors)";
|
||||
log("DIM: automatically setting format to 1.2MB "
|
||||
"(1024 byte sectors)");
|
||||
trackdata->set_target_rotational_period_ms(167);
|
||||
layoutdata->set_sector_size(1024);
|
||||
for (int i = 0; i < 9; i++)
|
||||
physical->add_sector(i);
|
||||
break;
|
||||
case 0x02:
|
||||
Logger() << "DIM: automatically setting format to 1.2MB "
|
||||
"(512 byte sectors)";
|
||||
log("DIM: automatically setting format to 1.2MB "
|
||||
"(512 byte sectors)");
|
||||
trackdata->set_target_rotational_period_ms(167);
|
||||
layoutdata->set_sector_size(512);
|
||||
for (int i = 0; i < 15; i++)
|
||||
physical->add_sector(i);
|
||||
break;
|
||||
case 0x03:
|
||||
Logger() << "DIM: automatically setting format to 1.44MB";
|
||||
log("DIM: automatically setting format to 1.44MB");
|
||||
trackdata->set_target_rotational_period_ms(200);
|
||||
layoutdata->set_sector_size(512);
|
||||
for (int i = 0; i < 18; i++)
|
||||
@@ -128,7 +128,7 @@ public:
|
||||
break;
|
||||
default:
|
||||
error(
|
||||
"DIM: unknown media byte 0x%02x, could not determine "
|
||||
"DIM: unknown media byte 0x{:02x}, could not determine "
|
||||
"write profile automatically",
|
||||
mediaByte);
|
||||
break;
|
||||
@@ -139,7 +139,7 @@ public:
|
||||
|
||||
image->calculateSize();
|
||||
const Geometry& geometry = image->getGeometry();
|
||||
Logger() << fmt::format("DIM: read {} tracks, {} sides, {} kB total",
|
||||
log("DIM: read {} tracks, {} sides, {} kB total",
|
||||
geometry.numTracks,
|
||||
geometry.numSides,
|
||||
((int)inputFile.tellg() - 256) / 1024);
|
||||
|
||||
@@ -63,8 +63,7 @@ public:
|
||||
error("don't understand DiskCopy disks of type {}", encoding);
|
||||
}
|
||||
|
||||
Logger() << fmt::format(
|
||||
"DC42: reading image with {} tracks, {} heads; {}; {}",
|
||||
log("DC42: reading image with {} tracks, {} heads; {}; {}",
|
||||
numTracks,
|
||||
numHeads,
|
||||
mfm ? "MFM" : "GCR",
|
||||
|
||||
@@ -83,8 +83,8 @@ public:
|
||||
switch (fddType)
|
||||
{
|
||||
case 0x90:
|
||||
Logger() << "FDI: automatically setting format to 1.2MB "
|
||||
"(1024 byte sectors)";
|
||||
log("FDI: automatically setting format to 1.2MB (1024 byte "
|
||||
"sectors)");
|
||||
trackdata->set_target_rotational_period_ms(167);
|
||||
layoutdata->set_sector_size(1024);
|
||||
for (int i = 0; i < 9; i++)
|
||||
@@ -92,7 +92,7 @@ public:
|
||||
break;
|
||||
|
||||
case 0x30:
|
||||
Logger() << "FDI: automatically setting format to 1.44MB";
|
||||
log("FDI: automatically setting format to 1.44MB");
|
||||
trackdata->set_target_rotational_period_ms(200);
|
||||
layoutdata->set_sector_size(512);
|
||||
for (int i = 0; i < 18; i++)
|
||||
@@ -110,7 +110,7 @@ public:
|
||||
|
||||
image->calculateSize();
|
||||
const Geometry& geometry = image->getGeometry();
|
||||
Logger() << fmt::format("FDI: read {} tracks, {} sides, {} kB total",
|
||||
log("FDI: read {} tracks, {} sides, {} kB total",
|
||||
geometry.numTracks,
|
||||
geometry.numSides,
|
||||
((int)inputFile.tellg() - headerSize) / 1024);
|
||||
|
||||
@@ -102,7 +102,7 @@ std::unique_ptr<Image> ImageReader::readMappedImage()
|
||||
if (!_config.filesystem_sector_order())
|
||||
return rawImage;
|
||||
|
||||
Logger() << "READER: converting from filesystem sector order to disk order";
|
||||
log("READER: converting from filesystem sector order to disk order");
|
||||
std::set<std::shared_ptr<const Sector>> sectors;
|
||||
for (const auto& e : *rawImage)
|
||||
{
|
||||
|
||||
@@ -106,21 +106,38 @@ class IMDImageReader : public ImageReader
|
||||
public:
|
||||
IMDImageReader(const ImageReaderProto& config): ImageReader(config) {}
|
||||
|
||||
std::unique_ptr<Image> readImage()
|
||||
// clang-format off
|
||||
/*
|
||||
IMAGE FILE FORMAT
|
||||
The overall layout of an ImageDisk .IMD image file is:
|
||||
IMD v.vv: dd/mm/yyyy hh:mm:ss
|
||||
Comment (ASCII only - unlimited size)
|
||||
1A byte - ASCII EOF character
|
||||
- For each track on the disk:
|
||||
1 byte Mode value see getModulationspeed for
|
||||
definition 1 byte Track 1 byte Head 1 byte number of sectors in track 1 byte
|
||||
sector size see getsectorsize for definition sector
|
||||
numbering map sector track map (optional) definied in high byte
|
||||
of head (since head is 0 or 1) sector head map (optional) definied in high
|
||||
byte of head (since head is 0 or 1) sector data records <End of file>
|
||||
*/
|
||||
* IMAGE FILE FORMAT
|
||||
* The overall layout of an ImageDisk .IMD image file is:
|
||||
* IMD v.vv: dd/mm/yyyy hh:mm:ss
|
||||
* Comment (ASCII only - unlimited size)
|
||||
* 1A byte - ASCII EOF character
|
||||
* - For each track on the disk:
|
||||
* 1 byte Mode value (0-5) see getModulationspeed for definition
|
||||
* 1 byte Cylinder (0-n)
|
||||
* 1 byte Head (0-1)
|
||||
* 1 byte number of sectors in track (1-n)
|
||||
* 1 byte sector size (0-6) see getsectorsize for definition
|
||||
* sector numbering map IMD start numbering sectors with 1.
|
||||
* sector cylinder map (optional) definied in high byte of head (since head is 0 or 1)
|
||||
* sector head map (optional) definied in high byte of head (since head is 0 or 1)
|
||||
* sector data records For each data record:
|
||||
* 1 byte Sector status
|
||||
* 0: Sector data unavailable - could not be read
|
||||
* 1: Normal data: (Sector Size) bytes follow
|
||||
* 2: Compressed: All bytes in sector have same value (xx)
|
||||
* 3: Normal data with "Deleted-Data address mark"
|
||||
* 4: Compressed with "Deleted-Data address mark"
|
||||
* 5: Normal data read with data error
|
||||
* 6: Compressed read with data error"
|
||||
* 7: Deleted data read with data error"
|
||||
* 8: Compressed, Deleted read with data error"
|
||||
* sector size of Sector data
|
||||
* <End of file>
|
||||
*/
|
||||
// clang-format on
|
||||
std::unique_ptr<Image> readImage()
|
||||
{
|
||||
// Read File
|
||||
std::ifstream inputFile(
|
||||
@@ -161,7 +178,7 @@ public:
|
||||
n++;
|
||||
}
|
||||
headerPtr = n; // set pointer to after comment
|
||||
Logger() << "Comment in IMD file:" << fmt::format("{}", comment);
|
||||
log("Comment in IMD file: {}", comment);
|
||||
|
||||
for (;;)
|
||||
{
|
||||
@@ -284,22 +301,19 @@ public:
|
||||
|
||||
switch (Status_Sector)
|
||||
{
|
||||
/*fluxengine knows of a few sector statussen but not all
|
||||
*of the statussen in IMD.
|
||||
* // the statussen are in sector.h. Translation to
|
||||
*fluxengine is as follows: Statussen fluxengine
|
||||
*| Status IMD
|
||||
*--------------------------------------------------------------------------------------------------------------------
|
||||
* OK,
|
||||
*| 1, 2 (Normal data: (Sector Size) of (compressed)
|
||||
*bytes follow) BAD_CHECKSUM,
|
||||
*| 5, 6, 7, 8 MISSING, sector not found
|
||||
*| 0 (Sector data unavailable - could not be read)
|
||||
* DATA_MISSING, sector present but no data found
|
||||
*| 3, 4 CONFLICT,
|
||||
*| INTERNAL_ERROR
|
||||
*|
|
||||
*/
|
||||
// clang-format off
|
||||
/* fluxengine knows of a few sector statussen but not all of the statussen in IMD.
|
||||
* // the statussen are in sector.h. Translation to fluxengine is as follows:
|
||||
* Statussen fluxengine | Status IMD
|
||||
*--------------------------------------------------------------------------------------------------------------------
|
||||
* OK, | 1, 2 (Normal data: (Sector Size) of (compressed) bytes follow)
|
||||
* BAD_CHECKSUM, | 5, 6, 7, 8
|
||||
* MISSING, sector not found | 0 (Sector data unavailable - could not be read)
|
||||
* DATA_MISSING, sector present but no data found | 3, 4
|
||||
* CONFLICT, |
|
||||
* INTERNAL_ERROR |
|
||||
*/
|
||||
// clang-format on
|
||||
case 0: /* Sector data unavailable - could not be read */
|
||||
|
||||
sector->status = Sector::MISSING;
|
||||
@@ -431,24 +445,22 @@ public:
|
||||
|
||||
if (config.encoder().format_case() !=
|
||||
EncoderProto::FormatCase::FORMAT_NOT_SET)
|
||||
Logger() << "IMD: overriding configured format";
|
||||
log("IMD: overriding configured format");
|
||||
|
||||
image->calculateSize();
|
||||
const Geometry& geometry = image->getGeometry();
|
||||
size_t headSize = ((header.numSectors) * (sectorSize));
|
||||
size_t trackSize = (headSize * (header.Head + 1));
|
||||
|
||||
Logger() << "IMD: read "
|
||||
<< fmt::format(
|
||||
"{} tracks, {} heads; {}; {} kbps; {} sectors; "
|
||||
"sectorsize {}; {} kB total.",
|
||||
header.track + 1,
|
||||
header.Head + 1,
|
||||
fm ? "FM" : "MFM",
|
||||
Modulation_Speed,
|
||||
header.numSectors,
|
||||
sectorSize,
|
||||
(header.track + 1) * trackSize / 1024);
|
||||
log("IMD: read {} tracks, {} heads; {}; {} kbps; {} sectors; "
|
||||
"sectorsize {}; {} kB total.",
|
||||
header.track + 1,
|
||||
header.Head + 1,
|
||||
fm ? "FM" : "MFM",
|
||||
Modulation_Speed,
|
||||
header.numSectors,
|
||||
sectorSize,
|
||||
(header.track + 1) * trackSize / 1024);
|
||||
|
||||
layout->set_tracks(geometry.numTracks);
|
||||
layout->set_sides(geometry.numSides);
|
||||
|
||||
@@ -53,8 +53,7 @@ public:
|
||||
|
||||
image->calculateSize();
|
||||
const Geometry& geometry = image->getGeometry();
|
||||
Logger() << fmt::format(
|
||||
"IMG: read {} tracks, {} sides, {} kB total from {}",
|
||||
log("IMG: read {} tracks, {} sides, {} kB total from {}",
|
||||
geometry.numTracks,
|
||||
geometry.numSides,
|
||||
inputFile.tellg() / 1024,
|
||||
|
||||
@@ -51,12 +51,12 @@ public:
|
||||
|
||||
if (config.encoder().format_case() !=
|
||||
EncoderProto::FormatCase::FORMAT_NOT_SET)
|
||||
Logger() << "NFD: overriding configured format";
|
||||
log("NFD: overriding configured format");
|
||||
|
||||
auto ibm = config.mutable_encoder()->mutable_ibm();
|
||||
auto layout = config.mutable_layout();
|
||||
Logger() << "NFD: HD 1.2MB mode";
|
||||
Logger() << "NFD: forcing hign density mode";
|
||||
log("NFD: HD 1.2MB mode");
|
||||
log("NFD: forcing hign density mode");
|
||||
config.mutable_drive()->set_high_density(true);
|
||||
config.set_tpi(96);
|
||||
|
||||
@@ -156,7 +156,7 @@ public:
|
||||
|
||||
image->calculateSize();
|
||||
const Geometry& geometry = image->getGeometry();
|
||||
Logger() << fmt::format("NFD: read {} tracks, {} sides",
|
||||
log("NFD: read {} tracks, {} sides",
|
||||
geometry.numTracks,
|
||||
geometry.numSides);
|
||||
return image;
|
||||
|
||||
@@ -28,8 +28,7 @@ public:
|
||||
const auto end = inputFile.tellg();
|
||||
const auto fsize = (end - begin);
|
||||
|
||||
Logger() << fmt::format(
|
||||
"NSI: Autodetecting geometry based on file size: {}", fsize);
|
||||
log("NSI: Autodetecting geometry based on file size: {}", fsize);
|
||||
|
||||
unsigned numTracks = 35;
|
||||
unsigned numSectors = 10;
|
||||
@@ -59,8 +58,7 @@ public:
|
||||
|
||||
size_t trackSize = numSectors * sectorSize;
|
||||
|
||||
Logger() << fmt::format(
|
||||
"reading {} tracks, {} heads, {} sectors, {} bytes per sector, {} "
|
||||
log("reading {} tracks, {} heads, {} sectors, {} bytes per sector, {} "
|
||||
"kB total",
|
||||
numTracks,
|
||||
numHeads,
|
||||
|
||||
@@ -97,8 +97,7 @@ public:
|
||||
comment.erase(nl.base(), comment.end());
|
||||
}
|
||||
|
||||
Logger() << fmt::format(
|
||||
"TD0: TeleDisk {}.{}: {}", version / 10, version % 10, comment);
|
||||
log("TD0: TeleDisk {}.{}: {}", version / 10, version % 10, comment);
|
||||
|
||||
unsigned totalSize = 0;
|
||||
std::unique_ptr<Image> image(new Image);
|
||||
@@ -193,8 +192,7 @@ public:
|
||||
|
||||
image->calculateSize();
|
||||
const Geometry& geometry = image->getGeometry();
|
||||
Logger() << fmt::format(
|
||||
"TD0: found {} tracks, {} sides, {} sectors, {} bytes per sector, "
|
||||
log("TD0: found {} tracks, {} sides, {} sectors, {} bytes per sector, "
|
||||
"{} kB total",
|
||||
geometry.numTracks,
|
||||
geometry.numSides,
|
||||
|
||||
@@ -28,7 +28,7 @@ public:
|
||||
|
||||
void writeImage(const Image& image)
|
||||
{
|
||||
Logger() << "D64: writing triangular image";
|
||||
log("D64: writing triangular image");
|
||||
|
||||
std::ofstream outputFile(
|
||||
_config.filename(), std::ios::out | std::ios::binary);
|
||||
|
||||
@@ -126,7 +126,7 @@ public:
|
||||
outputFile.seekp(0);
|
||||
header.writeTo(outputFile);
|
||||
|
||||
Logger() << fmt::format("D88: wrote {} tracks, {} sides, {} kB total",
|
||||
log("D88: wrote {} tracks, {} sides, {} kB total",
|
||||
tracks,
|
||||
sides,
|
||||
outputFile.tellp() / 1024);
|
||||
|
||||
@@ -53,15 +53,13 @@ public:
|
||||
"format");
|
||||
}
|
||||
|
||||
Logger() << "DC42: writing DiskCopy 4.2 image"
|
||||
<< fmt::format(
|
||||
"DC42: {} tracks, {} sides, {} sectors, {} bytes per "
|
||||
"sector; {}",
|
||||
geometry.numTracks,
|
||||
geometry.numSides,
|
||||
geometry.numSectors,
|
||||
geometry.sectorSize,
|
||||
mfm ? "MFM" : "GCR");
|
||||
log("DC42: writing DiskCopy 4.2 image");
|
||||
log("DC42: {} tracks, {} sides, {} sectors, {} bytes per sector; {}",
|
||||
geometry.numTracks,
|
||||
geometry.numSides,
|
||||
geometry.numSectors,
|
||||
geometry.sectorSize,
|
||||
mfm ? "MFM" : "GCR");
|
||||
|
||||
auto sectors_per_track = [&](int track) -> int
|
||||
{
|
||||
|
||||
@@ -206,8 +206,7 @@ void ImageWriter::writeMappedImage(const Image& image)
|
||||
{
|
||||
if (_config.filesystem_sector_order())
|
||||
{
|
||||
Logger()
|
||||
<< "WRITER: converting from disk sector order to filesystem order";
|
||||
log("WRITER: converting from disk sector order to filesystem order");
|
||||
|
||||
std::set<std::shared_ptr<const Sector>> sectors;
|
||||
for (const auto& e : image)
|
||||
|
||||
@@ -181,7 +181,7 @@ public:
|
||||
: ImdOutputProto::RATE_DD;
|
||||
if (geometry.sectorSize <= 256)
|
||||
dataRate = ImdOutputProto::RATE_SD;
|
||||
Logger() << fmt::format("IMD: guessing data rate as {}",
|
||||
log("IMD: guessing data rate as {}",
|
||||
ImdOutputProto::DataRate_Name(dataRate));
|
||||
}
|
||||
|
||||
@@ -190,7 +190,7 @@ public:
|
||||
if (recordingMode == ImdOutputProto::RECMODE_GUESS)
|
||||
{
|
||||
recordingMode = ImdOutputProto::RECMODE_MFM;
|
||||
Logger() << fmt::format("IMD: guessing recording mode as {}",
|
||||
log("IMD: guessing recording mode as {}",
|
||||
ImdOutputProto::RecordingMode_Name(recordingMode));
|
||||
}
|
||||
|
||||
@@ -238,8 +238,7 @@ public:
|
||||
{ // sector 0 doesnt exist exit with error
|
||||
// this track, head has no sectors
|
||||
Status_Sector = 0;
|
||||
Logger() << fmt::format(
|
||||
"IMD: sector {} not found on track {}, head {}\n",
|
||||
log("IMD: sector {} not found on track {}, head {}\n",
|
||||
sectorId + 1,
|
||||
track,
|
||||
head);
|
||||
@@ -394,7 +393,7 @@ public:
|
||||
* 7: Deleted data read with data error"
|
||||
* 8: Compressed, Deleted read with data error"
|
||||
* sector size of Sector data
|
||||
*/
|
||||
*/
|
||||
// clang-format on
|
||||
// read sector
|
||||
const auto& sector = image.get(track, head, sectorId + 1);
|
||||
@@ -516,8 +515,7 @@ public:
|
||||
}
|
||||
}
|
||||
imagenew.writeTo(outputFile);
|
||||
Logger() << fmt::format(
|
||||
"IMD: Written {} tracks, {} heads, {} sectors, {} bytes per "
|
||||
log("IMD: Written {} tracks, {} heads, {} sectors, {} bytes per "
|
||||
"sector, {} kB total",
|
||||
geometry.numTracks,
|
||||
numHeads,
|
||||
|
||||
@@ -47,8 +47,7 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
Logger() << fmt::format(
|
||||
"IMG: wrote {} tracks, {} sides, {} kB total to {}",
|
||||
log("IMG: wrote {} tracks, {} sides, {} kB total to {}",
|
||||
tracks,
|
||||
sides,
|
||||
outputFile.tellp() / 1024,
|
||||
|
||||
@@ -21,8 +21,7 @@ public:
|
||||
|
||||
const Geometry geometry = image.getGeometry();
|
||||
|
||||
Logger() << fmt::format(
|
||||
"LDBS: writing {} tracks, {} sides, {} sectors, {} bytes per "
|
||||
log("LDBS: writing {} tracks, {} sides, {} sectors, {} bytes per "
|
||||
"sector",
|
||||
geometry.numTracks,
|
||||
geometry.numSides,
|
||||
@@ -41,7 +40,7 @@ public:
|
||||
: LDBSOutputProto::RATE_DD;
|
||||
if (geometry.sectorSize <= 256)
|
||||
dataRate = LDBSOutputProto::RATE_SD;
|
||||
Logger() << fmt::format("LDBS: guessing data rate as {}",
|
||||
log("LDBS: guessing data rate as {}",
|
||||
LDBSOutputProto::DataRate_Name(dataRate));
|
||||
}
|
||||
|
||||
@@ -50,7 +49,7 @@ public:
|
||||
if (recordingMode == LDBSOutputProto::RECMODE_GUESS)
|
||||
{
|
||||
recordingMode = LDBSOutputProto::RECMODE_MFM;
|
||||
Logger() << fmt::format("LDBS: guessing recording mode as {}",
|
||||
log("LDBS: guessing recording mode as {}",
|
||||
LDBSOutputProto::RecordingMode_Name(recordingMode));
|
||||
}
|
||||
|
||||
|
||||
@@ -25,13 +25,11 @@ public:
|
||||
|
||||
if (geometry.numTracks * trackSize == 0)
|
||||
{
|
||||
Logger()
|
||||
<< "No sectors in output; skipping .nsi image file generation.";
|
||||
log("No sectors in output; skipping .nsi image file generation.");
|
||||
return;
|
||||
}
|
||||
|
||||
Logger() << fmt::format(
|
||||
"Writing {} tracks, {} sides, {} sectors, {} ({} bytes/sector), {} "
|
||||
log("Writing {} tracks, {} sides, {} sectors, {} ({} bytes/sector), {} "
|
||||
"kB total",
|
||||
geometry.numTracks,
|
||||
geometry.numSides,
|
||||
@@ -91,8 +89,8 @@ public:
|
||||
memset(fill, ' ', sizeof(fill));
|
||||
if (mixedDensity == false)
|
||||
{
|
||||
Logger() << "Warning: Disk contains mixed "
|
||||
"single/double-density sectors.";
|
||||
log("Warning: Disk contains mixed "
|
||||
"single/double-density sectors.");
|
||||
}
|
||||
mixedDensity = true;
|
||||
sector->data.slice(0, 256).writeTo(outputFile);
|
||||
|
||||
@@ -24,12 +24,11 @@ public:
|
||||
|
||||
if (geometry.numTracks * trackSize == 0)
|
||||
{
|
||||
Logger()
|
||||
<< "RAW: no sectors in output; skipping image file generation.";
|
||||
log("RAW: no sectors in output; skipping image file generation.");
|
||||
return;
|
||||
}
|
||||
|
||||
Logger() << fmt::format("RAW: writing {} tracks, {} sides",
|
||||
log("RAW: writing {} tracks, {} sides",
|
||||
geometry.numTracks,
|
||||
geometry.numSides);
|
||||
|
||||
|
||||
@@ -6,13 +6,16 @@
|
||||
#include "logger.h"
|
||||
|
||||
static bool indented = false;
|
||||
static std::function<void(std::shared_ptr<const AnyLogMessage>)> loggerImpl =
|
||||
Logger::textLogger;
|
||||
|
||||
Logger& Logger::operator<<(std::shared_ptr<const AnyLogMessage> message)
|
||||
static std::function<void(std::shared_ptr<const AnyLogMessage>)> loggerImpl =
|
||||
[](auto message)
|
||||
{
|
||||
std::cout << Logger::toString(*message) << std::flush;
|
||||
};
|
||||
|
||||
void log(std::shared_ptr<const AnyLogMessage> message)
|
||||
{
|
||||
loggerImpl(message);
|
||||
return *this;
|
||||
}
|
||||
|
||||
void Logger::setLogger(
|
||||
@@ -21,11 +24,6 @@ void Logger::setLogger(
|
||||
loggerImpl = cb;
|
||||
}
|
||||
|
||||
void Logger::textLogger(std::shared_ptr<const AnyLogMessage> message)
|
||||
{
|
||||
std::cout << toString(*message) << std::flush;
|
||||
}
|
||||
|
||||
std::string Logger::toString(const AnyLogMessage& message)
|
||||
{
|
||||
std::stringstream stream;
|
||||
|
||||
28
lib/logger.h
28
lib/logger.h
@@ -91,22 +91,26 @@ typedef std::variant<std::string,
|
||||
OperationProgressLogMessage>
|
||||
AnyLogMessage;
|
||||
|
||||
class Logger
|
||||
template <class T>
|
||||
inline void log(const T& message)
|
||||
{
|
||||
public:
|
||||
Logger& operator<<(std::shared_ptr<const AnyLogMessage> message);
|
||||
log(std::make_shared<const AnyLogMessage>(message));
|
||||
}
|
||||
|
||||
template <class T>
|
||||
Logger& operator<<(const T& message)
|
||||
{
|
||||
return *this << std::make_shared<const AnyLogMessage>(message);
|
||||
}
|
||||
extern void log(std::shared_ptr<const AnyLogMessage> message);
|
||||
|
||||
static void setLogger(
|
||||
template <typename... Args>
|
||||
inline void log(fmt::string_view fstr, const Args&... args)
|
||||
{
|
||||
log(fmt::format(fstr, args...));
|
||||
}
|
||||
|
||||
namespace Logger
|
||||
{
|
||||
extern void setLogger(
|
||||
std::function<void(std::shared_ptr<const AnyLogMessage>)> cb);
|
||||
|
||||
static std::string toString(const AnyLogMessage&);
|
||||
static void textLogger(std::shared_ptr<const AnyLogMessage>);
|
||||
};
|
||||
extern std::string toString(const AnyLogMessage&);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -58,7 +58,7 @@ private:
|
||||
void measureDiskRotation(
|
||||
nanoseconds_t& oneRevolution, nanoseconds_t& hardSectorThreshold)
|
||||
{
|
||||
Logger() << BeginSpeedOperationLogMessage();
|
||||
log(BeginSpeedOperationLogMessage());
|
||||
|
||||
int retries = 5;
|
||||
usbSetDrive(config.drive().drive(),
|
||||
@@ -73,8 +73,7 @@ void measureDiskRotation(
|
||||
|
||||
if (oneRevolution == 0)
|
||||
{
|
||||
Logger() << BeginOperationLogMessage{
|
||||
"Measuring drive rotational speed"};
|
||||
log(BeginOperationLogMessage{"Measuring drive rotational speed"});
|
||||
do
|
||||
{
|
||||
oneRevolution =
|
||||
@@ -86,13 +85,13 @@ void measureDiskRotation(
|
||||
retries--;
|
||||
} while ((oneRevolution == 0) && (retries > 0));
|
||||
config.mutable_drive()->set_rotational_period_ms(oneRevolution / 1e6);
|
||||
Logger() << EndOperationLogMessage{};
|
||||
log(EndOperationLogMessage{});
|
||||
}
|
||||
|
||||
if (oneRevolution == 0)
|
||||
error("Failed\nIs a disk in the drive?");
|
||||
|
||||
Logger() << EndSpeedOperationLogMessage{oneRevolution};
|
||||
log(EndSpeedOperationLogMessage{oneRevolution});
|
||||
}
|
||||
|
||||
/* Given a set of sectors, deduplicates them sensibly (e.g. if there is a good
|
||||
@@ -223,15 +222,15 @@ ReadResult readGroup(FluxSourceIteratorHolder& fluxSourceIteratorHolder,
|
||||
if (!fluxSourceIterator.hasNext())
|
||||
continue;
|
||||
|
||||
Logger() << BeginReadOperationLogMessage{
|
||||
trackInfo->physicalTrack + offset, trackInfo->physicalSide};
|
||||
log(BeginReadOperationLogMessage{
|
||||
trackInfo->physicalTrack + offset, trackInfo->physicalSide});
|
||||
std::shared_ptr<const Fluxmap> fluxmap = fluxSourceIterator.next();
|
||||
// ->rescale(
|
||||
// 1.0 / config.flux_source().rescale());
|
||||
Logger() << EndReadOperationLogMessage()
|
||||
<< fmt::format("{0} ms in {1} bytes",
|
||||
(int)(fluxmap->duration() / 1e6),
|
||||
fluxmap->bytes());
|
||||
log(EndReadOperationLogMessage());
|
||||
log("{0} ms in {1} bytes",
|
||||
(int)(fluxmap->duration() / 1e6),
|
||||
fluxmap->bytes());
|
||||
|
||||
auto trackdataflux = decoder.decodeToSectors(fluxmap, trackInfo);
|
||||
trackFlux.trackDatas.push_back(trackdataflux);
|
||||
@@ -255,13 +254,13 @@ void writeTracks(FluxSink& fluxSink,
|
||||
std::function<bool(std::shared_ptr<const TrackInfo>& trackInfo)> verifier,
|
||||
std::vector<std::shared_ptr<const TrackInfo>>& trackInfos)
|
||||
{
|
||||
Logger() << BeginOperationLogMessage{"Encoding and writing to disk"};
|
||||
log(BeginOperationLogMessage{"Encoding and writing to disk"});
|
||||
|
||||
int index = 0;
|
||||
for (auto& trackInfo : trackInfos)
|
||||
{
|
||||
Logger() << OperationProgressLogMessage{
|
||||
index * 100 / (unsigned)trackInfos.size()};
|
||||
log(OperationProgressLogMessage{
|
||||
index * 100 / (unsigned)trackInfos.size()});
|
||||
index++;
|
||||
|
||||
testForEmergencyStop();
|
||||
@@ -274,8 +273,8 @@ void writeTracks(FluxSink& fluxSink,
|
||||
{
|
||||
unsigned physicalTrack = trackInfo->physicalTrack + offset;
|
||||
|
||||
Logger() << BeginWriteOperationLogMessage{
|
||||
physicalTrack, trackInfo->physicalSide};
|
||||
log(BeginWriteOperationLogMessage{
|
||||
physicalTrack, trackInfo->physicalSide});
|
||||
|
||||
if (offset == config.drive().group_offset())
|
||||
{
|
||||
@@ -285,7 +284,7 @@ void writeTracks(FluxSink& fluxSink,
|
||||
|
||||
fluxSink.writeFlux(
|
||||
physicalTrack, trackInfo->physicalSide, *fluxmap);
|
||||
Logger() << fmt::format("writing {0} ms in {1} bytes",
|
||||
log("writing {0} ms in {1} bytes",
|
||||
int(fluxmap->duration() / 1e6),
|
||||
fluxmap->bytes());
|
||||
}
|
||||
@@ -297,10 +296,10 @@ void writeTracks(FluxSink& fluxSink,
|
||||
Fluxmap blank;
|
||||
fluxSink.writeFlux(
|
||||
physicalTrack, trackInfo->physicalSide, blank);
|
||||
Logger() << "erased";
|
||||
log("erased");
|
||||
}
|
||||
|
||||
Logger() << EndWriteOperationLogMessage();
|
||||
log(EndWriteOperationLogMessage());
|
||||
}
|
||||
|
||||
if (verifier(trackInfo))
|
||||
@@ -309,13 +308,12 @@ void writeTracks(FluxSink& fluxSink,
|
||||
if (retriesRemaining == 0)
|
||||
error("fatal error on write");
|
||||
|
||||
Logger() << fmt::format(
|
||||
"retrying; {} retries remaining", retriesRemaining);
|
||||
log("retrying; {} retries remaining", retriesRemaining);
|
||||
retriesRemaining--;
|
||||
}
|
||||
}
|
||||
|
||||
Logger() << EndOperationLogMessage{"Write complete"};
|
||||
log(EndOperationLogMessage{"Write complete"});
|
||||
}
|
||||
|
||||
void writeTracks(FluxSink& fluxSink,
|
||||
@@ -358,12 +356,12 @@ void writeTracksAndVerify(FluxSink& fluxSink,
|
||||
FluxSourceIteratorHolder fluxSourceIteratorHolder(fluxSource);
|
||||
auto result = readGroup(
|
||||
fluxSourceIteratorHolder, trackInfo, *trackFlux, decoder);
|
||||
Logger() << TrackReadLogMessage{trackFlux};
|
||||
log(TrackReadLogMessage{trackFlux});
|
||||
|
||||
if (result != GOOD_READ)
|
||||
{
|
||||
adjustTrackOnError(fluxSource, trackInfo->physicalTrack);
|
||||
Logger() << "bad read";
|
||||
log("bad read");
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -382,12 +380,12 @@ void writeTracksAndVerify(FluxSink& fluxSink,
|
||||
sector->logicalSector);
|
||||
if (!s)
|
||||
{
|
||||
Logger() << "spurious sector on verify";
|
||||
log("spurious sector on verify");
|
||||
return false;
|
||||
}
|
||||
if (s->data != sector->data.slice(0, s->data.size()))
|
||||
{
|
||||
Logger() << "data mismatch on verify";
|
||||
log("data mismatch on verify");
|
||||
return false;
|
||||
}
|
||||
wanted.erase(sector->logicalTrack,
|
||||
@@ -396,7 +394,7 @@ void writeTracksAndVerify(FluxSink& fluxSink,
|
||||
}
|
||||
if (!wanted.empty())
|
||||
{
|
||||
Logger() << "missing sector on verify";
|
||||
log("missing sector on verify");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@@ -463,21 +461,20 @@ std::shared_ptr<TrackFlux> readAndDecodeTrack(FluxSource& fluxSource,
|
||||
break;
|
||||
if (result == BAD_AND_CAN_NOT_RETRY)
|
||||
{
|
||||
Logger() << fmt::format("no more data; giving up");
|
||||
log("no more data; giving up");
|
||||
break;
|
||||
}
|
||||
|
||||
if (retriesRemaining == 0)
|
||||
{
|
||||
Logger() << fmt::format("giving up");
|
||||
log("giving up");
|
||||
break;
|
||||
}
|
||||
|
||||
if (fluxSource.isHardware())
|
||||
{
|
||||
adjustTrackOnError(fluxSource, trackInfo->physicalTrack);
|
||||
Logger() << fmt::format(
|
||||
"retrying; {} retries remaining", retriesRemaining);
|
||||
log("retrying; {} retries remaining", retriesRemaining);
|
||||
retriesRemaining--;
|
||||
}
|
||||
}
|
||||
@@ -494,13 +491,13 @@ std::shared_ptr<const DiskFlux> readDiskCommand(
|
||||
|
||||
auto diskflux = std::make_shared<DiskFlux>();
|
||||
|
||||
Logger() << BeginOperationLogMessage{"Reading and decoding disk"};
|
||||
log(BeginOperationLogMessage{"Reading and decoding disk"});
|
||||
auto locations = Layout::computeLocations();
|
||||
unsigned index = 0;
|
||||
for (auto& trackInfo : locations)
|
||||
{
|
||||
Logger() << OperationProgressLogMessage{
|
||||
index * 100 / (unsigned)locations.size()};
|
||||
log(OperationProgressLogMessage{
|
||||
index * 100 / (unsigned)locations.size()});
|
||||
index++;
|
||||
|
||||
testForEmergencyStop();
|
||||
@@ -573,7 +570,7 @@ std::shared_ptr<const DiskFlux> readDiskCommand(
|
||||
}
|
||||
|
||||
/* track can't be modified below this point. */
|
||||
Logger() << TrackReadLogMessage{trackFlux};
|
||||
log(TrackReadLogMessage{trackFlux});
|
||||
}
|
||||
|
||||
std::set<std::shared_ptr<const Sector>> all_sectors;
|
||||
@@ -584,8 +581,8 @@ std::shared_ptr<const DiskFlux> readDiskCommand(
|
||||
diskflux->image = std::make_shared<Image>(all_sectors);
|
||||
|
||||
/* diskflux can't be modified below this point. */
|
||||
Logger() << DiskReadLogMessage{diskflux};
|
||||
Logger() << EndOperationLogMessage{"Read complete"};
|
||||
log(DiskReadLogMessage{diskflux});
|
||||
log(EndOperationLogMessage{"Read complete"});
|
||||
return diskflux;
|
||||
}
|
||||
|
||||
@@ -602,33 +599,32 @@ void readDiskCommand(
|
||||
|
||||
void rawReadDiskCommand(FluxSource& fluxsource, FluxSink& fluxsink)
|
||||
{
|
||||
Logger() << BeginOperationLogMessage{"Performing raw read of disk"};
|
||||
log(BeginOperationLogMessage{"Performing raw read of disk"});
|
||||
|
||||
auto locations = Layout::computeLocations();
|
||||
unsigned index = 0;
|
||||
for (auto& trackInfo : locations)
|
||||
{
|
||||
Logger() << OperationProgressLogMessage{
|
||||
index * 100 / (int)locations.size()};
|
||||
log(OperationProgressLogMessage{index * 100 / (int)locations.size()});
|
||||
index++;
|
||||
|
||||
testForEmergencyStop();
|
||||
auto fluxSourceIterator = fluxsource.readFlux(
|
||||
trackInfo->physicalTrack, trackInfo->physicalSide);
|
||||
|
||||
Logger() << BeginReadOperationLogMessage{
|
||||
trackInfo->physicalTrack, trackInfo->physicalSide};
|
||||
log(BeginReadOperationLogMessage{
|
||||
trackInfo->physicalTrack, trackInfo->physicalSide});
|
||||
auto fluxmap = fluxSourceIterator->next();
|
||||
Logger() << EndReadOperationLogMessage()
|
||||
<< fmt::format("{0} ms in {1} bytes",
|
||||
(int)(fluxmap->duration() / 1e6),
|
||||
fluxmap->bytes());
|
||||
log(EndReadOperationLogMessage());
|
||||
log("{0} ms in {1} bytes",
|
||||
(int)(fluxmap->duration() / 1e6),
|
||||
fluxmap->bytes());
|
||||
|
||||
fluxsink.writeFlux(
|
||||
trackInfo->physicalTrack, trackInfo->physicalSide, *fluxmap);
|
||||
}
|
||||
|
||||
Logger() << EndOperationLogMessage{"Raw read complete"};
|
||||
log(EndOperationLogMessage{"Raw read complete"});
|
||||
}
|
||||
|
||||
void fillBitmapTo(std::vector<bool>& bitmap,
|
||||
|
||||
@@ -67,8 +67,7 @@ USB* get_usb_impl()
|
||||
config.usb().greaseweazle().has_port())
|
||||
{
|
||||
const auto& conf = config.usb().greaseweazle();
|
||||
Logger() << fmt::format(
|
||||
"Using GreaseWeazle on serial port {}", conf.port());
|
||||
log("Using GreaseWeazle on serial port {}", conf.port());
|
||||
return createGreaseWeazleUsb(conf.port(), conf);
|
||||
}
|
||||
|
||||
@@ -78,11 +77,11 @@ USB* get_usb_impl()
|
||||
switch (candidate->id)
|
||||
{
|
||||
case FLUXENGINE_ID:
|
||||
Logger() << fmt::format("Using FluxEngine {}", candidate->serial);
|
||||
log("Using FluxEngine {}", candidate->serial);
|
||||
return createFluxengineUsb(candidate->device);
|
||||
|
||||
case GREASEWEAZLE_ID:
|
||||
Logger() << fmt::format("Using GreaseWeazle {} on {}",
|
||||
log("Using GreaseWeazle {} on {}",
|
||||
candidate->serial,
|
||||
candidate->serialPort);
|
||||
return createGreaseWeazleUsb(
|
||||
|
||||
@@ -419,7 +419,7 @@ private:
|
||||
|
||||
static void onAdfWarning(char* message)
|
||||
{
|
||||
Logger() << message;
|
||||
log(message);
|
||||
}
|
||||
|
||||
static void onAdfError(char* message)
|
||||
|
||||
@@ -69,11 +69,11 @@ wxThread::ExitCode FluxEngineApp::Entry()
|
||||
}
|
||||
catch (const ErrorException& e)
|
||||
{
|
||||
Logger() << ErrorLogMessage{e.message + '\n'};
|
||||
log(ErrorLogMessage{e.message + '\n'});
|
||||
}
|
||||
catch (const EmergencyStopException& e)
|
||||
{
|
||||
Logger() << EmergencyStopMessage();
|
||||
log(EmergencyStopMessage());
|
||||
}
|
||||
|
||||
postToUiThread(
|
||||
|
||||
Reference in New Issue
Block a user