diff --git a/lib/flags.cc b/lib/flags.cc index 68ae0f0c..4fe604df 100644 --- a/lib/flags.cc +++ b/lib/flags.cc @@ -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()); diff --git a/lib/fluxsink/a2rfluxsink.cc b/lib/fluxsink/a2rfluxsink.cc index 00f2e6c5..fa83e087 100644 --- a/lib/fluxsink/a2rfluxsink.cc +++ b/lib/fluxsink/a2rfluxsink.cc @@ -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()) diff --git a/lib/fluxsink/scpfluxsink.cc b/lib/fluxsink/scpfluxsink.cc index 269e9c37..443952be 100644 --- a/lib/fluxsink/scpfluxsink.cc +++ b/lib/fluxsink/scpfluxsink.cc @@ -10,6 +10,7 @@ #include "fluxmap.h" #include "layout.h" #include "scp.h" +#include "lib/logger.h" #include #include #include @@ -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; diff --git a/lib/fluxsource/scpfluxsource.cc b/lib/fluxsource/scpfluxsource.cc index a8405252..9f1dace8 100644 --- a/lib/fluxsource/scpfluxsource.cc +++ b/lib/fluxsource/scpfluxsource.cc @@ -6,6 +6,7 @@ #include "fluxsource/fluxsource.h" #include "scp.h" #include "proto.h" +#include "lib/logger.h" #include 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: diff --git a/lib/imagereader/d64imagereader.cc b/lib/imagereader/d64imagereader.cc index 05a6592d..20d1381e 100644 --- a/lib/imagereader/d64imagereader.cc +++ b/lib/imagereader/d64imagereader.cc @@ -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; diff --git a/lib/imagereader/d88imagereader.cc b/lib/imagereader/d88imagereader.cc index dac5129b..cf3b6f14 100644 --- a/lib/imagereader/d88imagereader.cc +++ b/lib/imagereader/d88imagereader.cc @@ -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); diff --git a/lib/imagereader/dimimagereader.cc b/lib/imagereader/dimimagereader.cc index 337d8099..7ee75e5a 100644 --- a/lib/imagereader/dimimagereader.cc +++ b/lib/imagereader/dimimagereader.cc @@ -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); diff --git a/lib/imagereader/diskcopyimagereader.cc b/lib/imagereader/diskcopyimagereader.cc index 7a8de0fd..4f952ea2 100644 --- a/lib/imagereader/diskcopyimagereader.cc +++ b/lib/imagereader/diskcopyimagereader.cc @@ -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", diff --git a/lib/imagereader/fdiimagereader.cc b/lib/imagereader/fdiimagereader.cc index 77871ba1..13f966d0 100644 --- a/lib/imagereader/fdiimagereader.cc +++ b/lib/imagereader/fdiimagereader.cc @@ -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); diff --git a/lib/imagereader/imagereader.cc b/lib/imagereader/imagereader.cc index 50fe7d78..38bd2a34 100644 --- a/lib/imagereader/imagereader.cc +++ b/lib/imagereader/imagereader.cc @@ -102,7 +102,7 @@ std::unique_ptr 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> sectors; for (const auto& e : *rawImage) { diff --git a/lib/imagereader/imdimagereader.cc b/lib/imagereader/imdimagereader.cc index 4290d613..f0b9880d 100644 --- a/lib/imagereader/imdimagereader.cc +++ b/lib/imagereader/imdimagereader.cc @@ -106,21 +106,38 @@ class IMDImageReader : public ImageReader public: IMDImageReader(const ImageReaderProto& config): ImageReader(config) {} - std::unique_ptr 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 - */ + * 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 + * + */ + // clang-format on + std::unique_ptr 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); diff --git a/lib/imagereader/imgimagereader.cc b/lib/imagereader/imgimagereader.cc index a9d5f586..f237313e 100644 --- a/lib/imagereader/imgimagereader.cc +++ b/lib/imagereader/imgimagereader.cc @@ -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, diff --git a/lib/imagereader/nfdimagereader.cc b/lib/imagereader/nfdimagereader.cc index 115ea429..4507192b 100644 --- a/lib/imagereader/nfdimagereader.cc +++ b/lib/imagereader/nfdimagereader.cc @@ -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; diff --git a/lib/imagereader/nsiimagereader.cc b/lib/imagereader/nsiimagereader.cc index b6938c79..e1fc3308 100644 --- a/lib/imagereader/nsiimagereader.cc +++ b/lib/imagereader/nsiimagereader.cc @@ -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, diff --git a/lib/imagereader/td0imagereader.cc b/lib/imagereader/td0imagereader.cc index c04f253c..ed99b253 100644 --- a/lib/imagereader/td0imagereader.cc +++ b/lib/imagereader/td0imagereader.cc @@ -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(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, diff --git a/lib/imagewriter/d64imagewriter.cc b/lib/imagewriter/d64imagewriter.cc index baabb284..7501d787 100644 --- a/lib/imagewriter/d64imagewriter.cc +++ b/lib/imagewriter/d64imagewriter.cc @@ -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); diff --git a/lib/imagewriter/d88imagewriter.cc b/lib/imagewriter/d88imagewriter.cc index fd656c9e..0494f6b6 100644 --- a/lib/imagewriter/d88imagewriter.cc +++ b/lib/imagewriter/d88imagewriter.cc @@ -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); diff --git a/lib/imagewriter/diskcopyimagewriter.cc b/lib/imagewriter/diskcopyimagewriter.cc index 30b282d7..256d7184 100644 --- a/lib/imagewriter/diskcopyimagewriter.cc +++ b/lib/imagewriter/diskcopyimagewriter.cc @@ -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 { diff --git a/lib/imagewriter/imagewriter.cc b/lib/imagewriter/imagewriter.cc index 0a8c5a3d..2a27b089 100644 --- a/lib/imagewriter/imagewriter.cc +++ b/lib/imagewriter/imagewriter.cc @@ -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> sectors; for (const auto& e : image) diff --git a/lib/imagewriter/imdimagewriter.cc b/lib/imagewriter/imdimagewriter.cc index 07183a49..e071492b 100644 --- a/lib/imagewriter/imdimagewriter.cc +++ b/lib/imagewriter/imdimagewriter.cc @@ -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, diff --git a/lib/imagewriter/imgimagewriter.cc b/lib/imagewriter/imgimagewriter.cc index e1a95de5..19797d5c 100644 --- a/lib/imagewriter/imgimagewriter.cc +++ b/lib/imagewriter/imgimagewriter.cc @@ -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, diff --git a/lib/imagewriter/ldbsimagewriter.cc b/lib/imagewriter/ldbsimagewriter.cc index a22f9408..54e3a3a0 100644 --- a/lib/imagewriter/ldbsimagewriter.cc +++ b/lib/imagewriter/ldbsimagewriter.cc @@ -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)); } diff --git a/lib/imagewriter/nsiimagewriter.cc b/lib/imagewriter/nsiimagewriter.cc index 27a07321..06d1d915 100644 --- a/lib/imagewriter/nsiimagewriter.cc +++ b/lib/imagewriter/nsiimagewriter.cc @@ -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); diff --git a/lib/imagewriter/rawimagewriter.cc b/lib/imagewriter/rawimagewriter.cc index aeda0e23..1b01547a 100644 --- a/lib/imagewriter/rawimagewriter.cc +++ b/lib/imagewriter/rawimagewriter.cc @@ -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); diff --git a/lib/logger.cc b/lib/logger.cc index 4fcabb62..2eca7ebb 100644 --- a/lib/logger.cc +++ b/lib/logger.cc @@ -6,13 +6,16 @@ #include "logger.h" static bool indented = false; -static std::function)> loggerImpl = - Logger::textLogger; -Logger& Logger::operator<<(std::shared_ptr message) +static std::function)> loggerImpl = + [](auto message) +{ + std::cout << Logger::toString(*message) << std::flush; +}; + +void log(std::shared_ptr message) { loggerImpl(message); - return *this; } void Logger::setLogger( @@ -21,11 +24,6 @@ void Logger::setLogger( loggerImpl = cb; } -void Logger::textLogger(std::shared_ptr message) -{ - std::cout << toString(*message) << std::flush; -} - std::string Logger::toString(const AnyLogMessage& message) { std::stringstream stream; diff --git a/lib/logger.h b/lib/logger.h index a3847d20..ca94f94b 100644 --- a/lib/logger.h +++ b/lib/logger.h @@ -91,22 +91,26 @@ typedef std::variant AnyLogMessage; -class Logger +template +inline void log(const T& message) { -public: - Logger& operator<<(std::shared_ptr message); + log(std::make_shared(message)); +} - template - Logger& operator<<(const T& message) - { - return *this << std::make_shared(message); - } +extern void log(std::shared_ptr message); - static void setLogger( +template +inline void log(fmt::string_view fstr, const Args&... args) +{ + log(fmt::format(fstr, args...)); +} + +namespace Logger +{ + extern void setLogger( std::function)> cb); - static std::string toString(const AnyLogMessage&); - static void textLogger(std::shared_ptr); -}; + extern std::string toString(const AnyLogMessage&); +} #endif diff --git a/lib/readerwriter.cc b/lib/readerwriter.cc index 704c7fa5..2ff3b5b3 100644 --- a/lib/readerwriter.cc +++ b/lib/readerwriter.cc @@ -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 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& trackInfo)> verifier, std::vector>& 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 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 readDiskCommand( auto diskflux = std::make_shared(); - 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 readDiskCommand( } /* track can't be modified below this point. */ - Logger() << TrackReadLogMessage{trackFlux}; + log(TrackReadLogMessage{trackFlux}); } std::set> all_sectors; @@ -584,8 +581,8 @@ std::shared_ptr readDiskCommand( diskflux->image = std::make_shared(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& bitmap, diff --git a/lib/usb/usb.cc b/lib/usb/usb.cc index d5a5c2b8..44da87a6 100644 --- a/lib/usb/usb.cc +++ b/lib/usb/usb.cc @@ -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( diff --git a/lib/vfs/amigaffs.cc b/lib/vfs/amigaffs.cc index c7dfe2df..bcde87d4 100644 --- a/lib/vfs/amigaffs.cc +++ b/lib/vfs/amigaffs.cc @@ -419,7 +419,7 @@ private: static void onAdfWarning(char* message) { - Logger() << message; + log(message); } static void onAdfError(char* message) diff --git a/src/gui/main.cc b/src/gui/main.cc index 1ba66b91..44a40455 100644 --- a/src/gui/main.cc +++ b/src/gui/main.cc @@ -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(