From d97e72edb644274d9bfad864b0ded5ff69537086 Mon Sep 17 00:00:00 2001 From: David Given Date: Sun, 27 Feb 2022 00:27:44 +0100 Subject: [PATCH] The image writers now log to the logger. --- lib/imagereader/imagereader.cc | 190 ++++++++--------------- lib/imagereader/imdimagereader.cc | 199 ++++++++++++------------- lib/imagewriter/d64imagewriter.cc | 3 +- lib/imagewriter/diskcopyimagewriter.cc | 5 +- lib/imagewriter/imgimagewriter.cc | 3 +- lib/imagewriter/ldbsimagewriter.cc | 10 +- lib/imagewriter/nsiimagewriter.cc | 10 +- lib/imagewriter/rawimagewriter.cc | 5 +- 8 files changed, 174 insertions(+), 251 deletions(-) diff --git a/lib/imagereader/imagereader.cc b/lib/imagereader/imagereader.cc index 2144a5a9..cd3b3ccd 100644 --- a/lib/imagereader/imagereader.cc +++ b/lib/imagereader/imagereader.cc @@ -12,149 +12,83 @@ std::unique_ptr ImageReader::create(const ImageReaderProto& config) { - switch (config.format_case()) - { - case ImageReaderProto::kDim: - return ImageReader::createDimImageReader(config); + switch (config.format_case()) + { + case ImageReaderProto::kDim: + return ImageReader::createDimImageReader(config); - case ImageReaderProto::kD88: - return ImageReader::createD88ImageReader(config); + case ImageReaderProto::kD88: + return ImageReader::createD88ImageReader(config); - case ImageReaderProto::kFdi: - return ImageReader::createFdiImageReader(config); + case ImageReaderProto::kFdi: + return ImageReader::createFdiImageReader(config); - case ImageReaderProto::kImd: - return ImageReader::createIMDImageReader(config); + case ImageReaderProto::kImd: + return ImageReader::createIMDImageReader(config); - case ImageReaderProto::kImg: - return ImageReader::createImgImageReader(config); + case ImageReaderProto::kImg: + return ImageReader::createImgImageReader(config); - case ImageReaderProto::kDiskcopy: - return ImageReader::createDiskCopyImageReader(config); + case ImageReaderProto::kDiskcopy: + return ImageReader::createDiskCopyImageReader(config); - case ImageReaderProto::kJv3: - return ImageReader::createJv3ImageReader(config); + case ImageReaderProto::kJv3: + return ImageReader::createJv3ImageReader(config); - case ImageReaderProto::kD64: - return ImageReader::createD64ImageReader(config); + case ImageReaderProto::kD64: + return ImageReader::createD64ImageReader(config); - case ImageReaderProto::kNfd: - return ImageReader::createNFDImageReader(config); + case ImageReaderProto::kNfd: + return ImageReader::createNFDImageReader(config); - case ImageReaderProto::kNsi: - return ImageReader::createNsiImageReader(config); + case ImageReaderProto::kNsi: + return ImageReader::createNsiImageReader(config); - case ImageReaderProto::kTd0: - return ImageReader::createTd0ImageReader(config); + case ImageReaderProto::kTd0: + return ImageReader::createTd0ImageReader(config); - default: - Error() << "bad input file config"; - return std::unique_ptr(); - } + default: + Error() << "bad input file config"; + return std::unique_ptr(); + } } -void ImageReader::updateConfigForFilename( - ImageReaderProto* proto, const std::string& filename) +void ImageReader::updateConfigForFilename(ImageReaderProto* proto, const std::string& filename) { - static const std::map> formats = { - {".adf", - [&]() - { - proto->mutable_img(); - }}, - {".d64", - [&]() - { - proto->mutable_d64(); - }}, - {".d81", - [&]() - { - proto->mutable_img(); - }}, - {".d88", - [&]() - { - proto->mutable_d88(); - }}, - {".dim", - [&]() - { - proto->mutable_dim(); - }}, - {".diskcopy", - [&]() - { - proto->mutable_diskcopy(); - }}, - {".dsk", - [&]() - { - proto->mutable_img(); - }}, - {".fdi", - [&]() - { - proto->mutable_fdi(); - }}, - {".imd", - [&]() - { - proto->mutable_imd(); - }}, - {".img", - [&]() - { - proto->mutable_img(); - }}, - {".jv3", - [&]() - { - proto->mutable_jv3(); - }}, - {".nfd", - [&]() - { - proto->mutable_nfd(); - }}, - {".nsi", - [&]() - { - proto->mutable_nsi(); - }}, - {".st", - [&]() - { - proto->mutable_img(); - }}, - {".td0", - [&]() - { - proto->mutable_td0(); - }}, - {".vgi", - [&]() - { - proto->mutable_img(); - }}, - {".xdf", - [&]() - { - proto->mutable_img(); - }}, - }; + static const std::map> formats = + { + {".adf", [&]() { proto->mutable_img(); }}, + {".d64", [&]() { proto->mutable_d64(); }}, + {".d81", [&]() { proto->mutable_img(); }}, + {".d88", [&]() { proto->mutable_d88(); }}, + {".dim", [&]() { proto->mutable_dim(); }}, + {".diskcopy", [&]() { proto->mutable_diskcopy(); }}, + {".dsk", [&]() { proto->mutable_img(); }}, + {".fdi", [&]() { proto->mutable_fdi(); }}, + {".imd", [&]() { proto->mutable_imd(); }}, + {".img", [&]() { proto->mutable_img(); }}, + {".jv3", [&]() { proto->mutable_jv3(); }}, + {".nfd", [&]() { proto->mutable_nfd(); }}, + {".nsi", [&]() { proto->mutable_nsi(); }}, + {".st", [&]() { proto->mutable_img(); }}, + {".td0", [&]() { proto->mutable_td0(); }}, + {".vgi", [&]() { proto->mutable_img(); }}, + {".xdf", [&]() { proto->mutable_img(); }}, + }; - for (const auto& it : formats) - { - if (endsWith(filename, it.first)) - { - it.second(); - proto->set_filename(filename); - return; - } - } + for (const auto& it : formats) + { + if (endsWith(filename, it.first)) + { + it.second(); + proto->set_filename(filename); + return; + } + } - Error() << fmt::format("unrecognised image filename '{}'", filename); + Error() << fmt::format("unrecognised image filename '{}'", filename); } -ImageReader::ImageReader(const ImageReaderProto& config): _config(config) {} +ImageReader::ImageReader(const ImageReaderProto& config): + _config(config) +{} diff --git a/lib/imagereader/imdimagereader.cc b/lib/imagereader/imdimagereader.cc index bc83f02d..a6af8b9d 100644 --- a/lib/imagereader/imdimagereader.cc +++ b/lib/imagereader/imdimagereader.cc @@ -11,48 +11,46 @@ #include #include -static unsigned getModulationandSpeed(uint8_t flags, bool* mfm) +static unsigned getModulationandSpeed(uint8_t flags, bool *mfm) { switch (flags) - { - case 0: /* 500 kbps FM */ - // clockRateKhz.setDefaultValue(250); - *mfm = false; - return 500; - break; + { + case 0: /* 500 kbps FM */ + //clockRateKhz.setDefaultValue(250); + *mfm = false; + return 500; + break; - case 1: /* 300 kbps FM */ - *mfm = false; - return 300; + case 1: /* 300 kbps FM */ + *mfm = false; + return 300; + + break; - break; + case 2: /* 250 kbps FM */ + *mfm = false; + return 250; + break; - case 2: /* 250 kbps FM */ - *mfm = false; - return 250; - break; + case 3: /* 500 kbps MFM */ + *mfm = true; + return 500; + break; - case 3: /* 500 kbps MFM */ - *mfm = true; - return 500; - break; + case 4: /* 300 kbps MFM */ + *mfm = true; + return 300; + break; - case 4: /* 300 kbps MFM */ - *mfm = true; - return 300; - break; + case 5: /* 250 kbps MFM */ + *mfm = true; + return 250; + break; - case 5: /* 250 kbps MFM */ - *mfm = true; - return 250; - break; - - default: - Error() << fmt::format( - "don't understand IMD disks with this modulation and speed {}", - flags); - throw 0; - } + default: + Error() << fmt::format("don't understand IMD disks with this modulation and speed {}", flags); + throw 0; + } } struct TrackHeader @@ -68,33 +66,30 @@ static unsigned getSectorSize(uint8_t flags) { switch (flags) { - case 0: - return 128; - case 1: - return 256; - case 2: - return 512; - case 3: - return 1024; - case 4: - return 2048; - case 5: - return 4096; - case 6: - return 8192; + case 0: return 128; + case 1: return 256; + case 2: return 512; + case 3: return 1024; + case 4: return 2048; + case 5: return 4096; + case 6: return 8192; } Error() << "not reachable"; } -#define SEC_CYL_MAP_FLAG 0x80 + +#define SEC_CYL_MAP_FLAG 0x80 #define SEC_HEAD_MAP_FLAG 0x40 -#define HEAD_MASK 0x3F -#define END_OF_FILE 0x1A +#define HEAD_MASK 0x3F +#define END_OF_FILE 0x1A + class IMDImageReader : public ImageReader { public: - IMDImageReader(const ImageReaderProto& config): ImageReader(config) {} + IMDImageReader(const ImageReaderProto& config): + ImageReader(config) + {} std::unique_ptr readImage() /* @@ -104,26 +99,26 @@ public: 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 Cylinder 1 byte Head 1 byte number of sectors in track 1 - byte sector size see getsectorsize for definition + 1 byte Mode value see getModulationspeed for definition + 1 byte Cylinder + 1 byte Head + 1 byte number of sectors in track + 1 byte sector size see getsectorsize for definition sector numbering map - 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 + 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 + */ { - // Read File - std::ifstream inputFile( - _config.filename(), std::ios::in | std::ios::binary); + //Read File + std::ifstream inputFile(_config.filename(), std::ios::in | std::ios::binary); if (!inputFile.is_open()) Error() << "cannot open input file"; - // define some variables - bool mfm = false; // define coding just to show in comment for setting - // the right write parameters + //define some variables + bool mfm = false; //define coding just to show in comment for setting the right write parameters inputFile.seekg(0, inputFile.end); - int inputFileSize = inputFile.tellg(); // determine filesize + int inputFileSize = inputFile.tellg(); // determine filesize inputFile.seekg(0, inputFile.beg); Bytes data; data.writer() += inputFile; @@ -136,24 +131,22 @@ public: unsigned Modulation_Speed = 0; unsigned sectorSize = 0; std::string sector_skew; - int b; - unsigned char - comment[8192]; // i choose a fixed value. dont know how to make - // dynamic arrays in C++. This should be enough + int b; + unsigned char comment[8192]; //i choose a fixed value. dont know how to make dynamic arrays in C++. This should be enough // Read comment while ((b = br.read_8()) != EOF && b != 0x1A) { comment[n++] = (unsigned char)b; } - headerPtr = n; // set pointer to after comment + headerPtr = n; //set pointer to after comment comment[n] = '\0'; // null-terminate the string - // write comment to screen - Logger() << fmt::format("IMD: comment: {}", comment); + //write comment to screen + Logger() << fmt::format("IMD: comment: {}", comment); - // first read header + //first read header for (;;) { - if (headerPtr >= inputFileSize - 1) + if (headerPtr >= inputFileSize-1) { break; } @@ -170,26 +163,25 @@ public: headerPtr++; sectorSize = getSectorSize(header.SectorSize); - // Read optional cylinder map To Do + //Read optional cylinder map To Do - // Read optional sector head map To Do + //Read optional sector head map To Do - // read sector numbering map + //read sector numbering map std::vector sector_map(header.numSectors); sector_skew.clear(); - for (int b = 0; b < header.numSectors; b++) - { + for (int b = 0; b < header.numSectors; b++) + { sector_map[b] = br.read_8(); headerPtr++; } - // read the sectors + //read the sectors for (int s = 0; s < header.numSectors; s++) { Bytes sectordata; - const auto& sector = - image->put(header.track, header.Head, sector_map[s]); - // read the status of the sector + const auto& sector = image->put(header.track, header.Head, sector_map[s]); + //read the status of the sector unsigned int Status_Sector = br.read_8(); headerPtr++; @@ -204,15 +196,14 @@ public: sector->data.writer().append(sectordata); break; - case 2: /* Compressed: All bytes in sector have same value - (xx) */ + case 2: /* Compressed: All bytes in sector have same value (xx) */ sectordata = br.read(1); headerPtr++; sector->data.writer().append(sectordata); for (int k = 1; k < sectorSize; k++) { - // fill data till sector is full + //fill data till sector is full sector->data.writer().append(sectordata); } break; @@ -224,38 +215,32 @@ public: case 7: /* Deleted data read with data error" */ case 8: /* Compressed, Deleted read with data error" */ default: - Error() << fmt::format( - "don't understand IMD disks with sector status {}", - Status_Sector); - } + Error() << fmt::format("don't understand IMD disks with sector status {}", Status_Sector); + } sector->status = Sector::OK; sector->logicalTrack = sector->physicalCylinder = header.track; sector->logicalSide = sector->physicalHead = header.Head; sector->logicalSector = (sector_map[s]); } - } - // Write format detected in IMD image to screen to help user set the - // right write parameters - image->setGeometry({.numTracks = header.track, + } + //Write format detected in IMD image to screen to help user set the right write parameters + + image->setGeometry({ + .numTracks = header.track, .numSides = header.Head + 1U, .numSectors = header.numSectors, - .sectorSize = sectorSize}); + .sectorSize = sectorSize + }); size_t headSize = header.numSectors * sectorSize; size_t trackSize = headSize * (header.Head + 1); - Logger() << fmt::format( - "IMD: {} tracks, {} heads; {}; {} kbps; {} sectors; sectorsize {};" - " sectormap {}; {} kB total\n", - header.track, - header.Head + 1, - mfm ? "MFM" : "FM", - Modulation_Speed, - header.numSectors, - sectorSize, - sector_skew, - (header.track + 1) * trackSize / 1024); + Logger() << fmt::format("IMD: {} tracks, {} heads; {}; {} kbps; {} sectors; sectorsize {};" + " sectormap {}; {} kB total\n", + header.track, header.Head + 1, + mfm ? "MFM" : "FM", + Modulation_Speed, header.numSectors, sectorSize, sector_skew, (header.track+1) * trackSize / 1024); return image; } diff --git a/lib/imagewriter/d64imagewriter.cc b/lib/imagewriter/d64imagewriter.cc index 4474381c..aaff6dd4 100644 --- a/lib/imagewriter/d64imagewriter.cc +++ b/lib/imagewriter/d64imagewriter.cc @@ -5,6 +5,7 @@ #include "fmt/format.h" #include "image.h" #include "ldbs.h" +#include "logger.h" #include "lib/config.pb.h" #include #include @@ -30,7 +31,7 @@ public: void writeImage(const Image& image) { - std::cout << "writing D64 triangular image\n"; + Logger() << "D64: writing triangular image"; std::ofstream outputFile(_config.filename(), std::ios::out | std::ios::binary); if (!outputFile.is_open()) diff --git a/lib/imagewriter/diskcopyimagewriter.cc b/lib/imagewriter/diskcopyimagewriter.cc index 3e246c1e..7a62b059 100644 --- a/lib/imagewriter/diskcopyimagewriter.cc +++ b/lib/imagewriter/diskcopyimagewriter.cc @@ -5,6 +5,7 @@ #include "fmt/format.h" #include "ldbs.h" #include "image.h" +#include "logger.h" #include "lib/config.pb.h" #include #include @@ -52,8 +53,8 @@ public: Error() << "this image is not compatible with the DiskCopy 4.2 format"; } - std::cout << "writing DiskCopy 4.2 image\n" - << fmt::format("{} tracks, {} sides, {} sectors, {} bytes per sector; {}\n", + 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"); diff --git a/lib/imagewriter/imgimagewriter.cc b/lib/imagewriter/imgimagewriter.cc index 1bb163f7..58ca1e48 100644 --- a/lib/imagewriter/imgimagewriter.cc +++ b/lib/imagewriter/imgimagewriter.cc @@ -6,6 +6,7 @@ #include "lib/config.pb.h" #include "imginputoutpututils.h" #include "fmt/format.h" +#include "logger.h" #include #include #include @@ -56,7 +57,7 @@ public: } } - std::cout << fmt::format("IMG: wrote {} tracks, {} sides, {} kB total\n", + Logger() << fmt::format("IMG: wrote {} tracks, {} sides, {} kB total", tracks, sides, outputFile.tellp() / 1024); } diff --git a/lib/imagewriter/ldbsimagewriter.cc b/lib/imagewriter/ldbsimagewriter.cc index 89923a37..6cfc8f3d 100644 --- a/lib/imagewriter/ldbsimagewriter.cc +++ b/lib/imagewriter/ldbsimagewriter.cc @@ -5,6 +5,7 @@ #include "fmt/format.h" #include "ldbs.h" #include "image.h" +#include "logger.h" #include "lib/config.pb.h" #include #include @@ -23,10 +24,9 @@ public: const Geometry geometry = image.getGeometry(); - std::cout << fmt::format("LDBS: writing {} tracks, {} sides, {} sectors, {} bytes per sector", + Logger() << fmt::format("LDBS: writing {} tracks, {} sides, {} sectors, {} bytes per sector", geometry.numTracks, geometry.numSides, geometry.numSectors, - geometry.sectorSize) - << std::endl; + geometry.sectorSize); Bytes trackDirectory; ByteWriter trackDirectoryWriter(trackDirectory); @@ -39,14 +39,14 @@ public: dataRate = (geometry.numSectors > 10) ? LDBSOutputProto::RATE_HD : LDBSOutputProto::RATE_DD; if (geometry.sectorSize <= 256) dataRate = LDBSOutputProto::RATE_SD; - std::cout << fmt::format("LDBS: guessing data rate as {}\n", LDBSOutputProto::DataRate_Name(dataRate)); + Logger() << fmt::format("LDBS: guessing data rate as {}", LDBSOutputProto::DataRate_Name(dataRate)); } LDBSOutputProto::RecordingMode recordingMode = _config.ldbs().recording_mode(); if (recordingMode == LDBSOutputProto::RECMODE_GUESS) { recordingMode = LDBSOutputProto::RECMODE_MFM; - std::cout << fmt::format("LDBS: guessing recording mode as {}\n", LDBSOutputProto::RecordingMode_Name(recordingMode)); + Logger() << fmt::format("LDBS: guessing recording mode as {}", LDBSOutputProto::RecordingMode_Name(recordingMode)); } for (int track = 0; track < geometry.numTracks; track++) diff --git a/lib/imagewriter/nsiimagewriter.cc b/lib/imagewriter/nsiimagewriter.cc index 61f4fafa..c2e6cb53 100644 --- a/lib/imagewriter/nsiimagewriter.cc +++ b/lib/imagewriter/nsiimagewriter.cc @@ -5,6 +5,7 @@ #include "fmt/format.h" #include "decoders/decoders.h" #include "image.h" +#include "logger.h" #include "arch/northstar/northstar.h" #include "lib/imagewriter/imagewriter.pb.h" #include @@ -26,15 +27,14 @@ public: size_t trackSize = geometry.numSectors * geometry.sectorSize; if (geometry.numTracks * trackSize == 0) { - std::cout << "No sectors in output; skipping .nsi image file generation." << std::endl; + Logger() << "No sectors in output; skipping .nsi image file generation."; return; } - std::cout << fmt::format("Writing {} cylinders, {} sides, {} sectors, {} ({} bytes/sector), {} kB total", + Logger() << fmt::format("Writing {} cylinders, {} sides, {} sectors, {} ({} bytes/sector), {} kB total", geometry.numTracks, geometry.numSides, geometry.numSectors, geometry.sectorSize == 256 ? "SD" : "DD", geometry.sectorSize, - geometry.numTracks * geometry.numSides * geometry.numSectors * geometry.sectorSize / 1024) - << std::endl; + geometry.numTracks * geometry.numSides * geometry.numSectors * geometry.sectorSize / 1024); std::ofstream outputFile(_config.filename(), std::ios::out | std::ios::binary); if (!outputFile.is_open()) @@ -69,7 +69,7 @@ public: char fill[256]; memset(fill, ' ', sizeof(fill)); if (mixedDensity == false) { - std::cout << "Warning: Disk contains mixed single/double-density sectors." << std::endl; + Logger() << "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 b97512cd..ba814c1d 100644 --- a/lib/imagewriter/rawimagewriter.cc +++ b/lib/imagewriter/rawimagewriter.cc @@ -5,6 +5,7 @@ #include "fmt/format.h" #include "decoders/decoders.h" #include "image.h" +#include "logger.h" #include "arch/northstar/northstar.h" #include "lib/imagewriter/imagewriter.pb.h" #include @@ -25,11 +26,11 @@ public: size_t trackSize = geometry.numSectors * geometry.sectorSize; if (geometry.numTracks * trackSize == 0) { - std::cout << "RAW: no sectors in output; skipping image file generation." << std::endl; + Logger() << "RAW: no sectors in output; skipping image file generation."; return; } - std::cout << fmt::format("RAW: writing {} cylinders, {} sides\n", + Logger() << fmt::format("RAW: writing {} cylinders, {} sides", geometry.numTracks, geometry.numSides); std::ofstream outputFile(_config.filename(), std::ios::out | std::ios::binary);