ImageReaders can now contribute config.

This commit is contained in:
dg
2023-05-12 22:20:13 +00:00
parent ff5f019ac1
commit 1d77ba6429
11 changed files with 49 additions and 42 deletions

View File

@@ -78,15 +78,15 @@ public:
if (disktype == 1) if (disktype == 1)
{ {
/* 5.25" with quarter stepping. */ /* 5.25" with quarter stepping. */
_fluxConfig.mutable_drive()->set_tracks(160); _extraConfig.mutable_drive()->set_tracks(160);
_fluxConfig.mutable_drive()->set_heads(1); _extraConfig.mutable_drive()->set_heads(1);
_fluxConfig.mutable_drive()->set_head_width(4); _extraConfig.mutable_drive()->set_head_width(4);
_fluxConfig.mutable_drive()->set_tpi(48 * 4); _extraConfig.mutable_drive()->set_tpi(48 * 4);
} }
else else
{ {
/* 3.5". */ /* 3.5". */
_fluxConfig.mutable_drive()->set_tpi(135); _extraConfig.mutable_drive()->set_tpi(135);
} }
Bytes stream = findChunk("STRM"); Bytes stream = findChunk("STRM");

View File

@@ -37,7 +37,7 @@ public:
{ {
_proto = loadFl2File(_config.filename()); _proto = loadFl2File(_config.filename());
*_fluxConfig.mutable_drive() = _proto.drive(); *_extraConfig.mutable_drive() = _proto.drive();
} }
public: public:

View File

@@ -62,15 +62,18 @@ public:
/* Returns any configuration this flux source might be carrying (e.g. tpi /* Returns any configuration this flux source might be carrying (e.g. tpi
* of the drive which made the capture). */ * of the drive which made the capture). */
const ConfigProto& getConfig() const const ConfigProto& getExtraConfig() const
{ return _fluxConfig; } {
return _extraConfig;
}
/* Read flux from a given track and side. */ /* Read flux from a given track and side. */
virtual std::unique_ptr<FluxSourceIterator> readFlux( virtual std::unique_ptr<FluxSourceIterator> readFlux(
int track, int side) = 0; int track, int side) = 0;
/* Recalibrates; seeks to track 0 and ensures the head is in the right place. */ /* Recalibrates; seeks to track 0 and ensures the head is in the right
* place. */
virtual void recalibrate() {} virtual void recalibrate() {}
@@ -78,7 +81,8 @@ public:
virtual void seek(int track) {} virtual void seek(int track) {}
/* Is this real hardware? If so, then flux can be read indefinitely (among other things). */ /* Is this real hardware? If so, then flux can be read indefinitely (among
* other things). */
virtual bool isHardware() virtual bool isHardware()
{ {
@@ -86,7 +90,7 @@ public:
} }
protected: protected:
ConfigProto _fluxConfig; ConfigProto _extraConfig;
}; };
class EmptyFluxSourceIterator : public FluxSourceIterator class EmptyFluxSourceIterator : public FluxSourceIterator

View File

@@ -43,7 +43,7 @@ public:
error("input not a SCP file"); error("input not a SCP file");
int tpi = (_header.flags & SCP_FLAG_96TPI) ? 96 : 48; int tpi = (_header.flags & SCP_FLAG_96TPI) ? 96 : 48;
_fluxConfig.mutable_drive()->set_tpi(tpi); _extraConfig.mutable_drive()->set_tpi(tpi);
_resolution = 25 * (_header.resolution + 1); _resolution = 25 * (_header.resolution + 1);
int startSide = (_header.heads == 2) ? 1 : 0; int startSide = (_header.heads == 2) ? 1 : 0;

View File

@@ -56,27 +56,21 @@ public:
inputFile.read((char*)trackTable.begin(), trackTable.size()); inputFile.read((char*)trackTable.begin(), trackTable.size());
ByteReader trackTableReader(trackTable); ByteReader trackTableReader(trackTable);
if (globalConfig()->encoder().format_case() != auto ibm = _extraConfig.mutable_encoder()->mutable_ibm();
EncoderProto::FormatCase::FORMAT_NOT_SET)
log("D88: overriding configured format");
auto ibm = globalConfig()->mutable_encoder()->mutable_ibm();
int clockRate = 500; int clockRate = 500;
if (mediaFlag == 0x20) if (mediaFlag == 0x20)
{ {
log("D88: forcing high density mode"); _extraConfig.mutable_drive()->set_high_density(true);
globalConfig()->mutable_drive()->set_high_density(true); _extraConfig.mutable_layout()->set_tpi(96);
globalConfig()->mutable_layout()->set_tpi(96);
} }
else else
{ {
log("D88: forcing single/double density mode");
clockRate = 300; clockRate = 300;
globalConfig()->mutable_drive()->set_high_density(false); _extraConfig.mutable_drive()->set_high_density(false);
globalConfig()->mutable_layout()->set_tpi(48); _extraConfig.mutable_layout()->set_tpi(48);
} }
auto layout = globalConfig()->mutable_layout(); auto layout = _extraConfig.mutable_layout();
std::unique_ptr<Image> image(new Image); std::unique_ptr<Image> image(new Image);
for (int track = 0; track < trackTableSize / 4; track++) for (int track = 0; track < trackTableSize / 4; track++)
{ {

View File

@@ -91,11 +91,11 @@ public:
trackCount++; trackCount++;
} }
auto layout = globalConfig()->mutable_layout(); auto layout = _extraConfig.mutable_layout();
if (globalConfig()->encoder().format_case() == if (globalConfig()->encoder().format_case() ==
EncoderProto::FormatCase::FORMAT_NOT_SET) EncoderProto::FormatCase::FORMAT_NOT_SET)
{ {
auto ibm = globalConfig()->mutable_encoder()->mutable_ibm(); auto ibm = _extraConfig.mutable_encoder()->mutable_ibm();
auto trackdata = ibm->add_trackdata(); auto trackdata = ibm->add_trackdata();
trackdata->set_target_clock_period_us(2); trackdata->set_target_clock_period_us(2);
@@ -134,7 +134,7 @@ public:
break; break;
} }
globalConfig()->mutable_decoder()->mutable_ibm(); _extraConfig.mutable_decoder()->mutable_ibm();
} }
image->calculateSize(); image->calculateSize();

View File

@@ -70,11 +70,11 @@ public:
trackCount++; trackCount++;
} }
auto layout = globalConfig()->mutable_layout(); auto layout = _extraConfig.mutable_layout();
if (globalConfig()->encoder().format_case() == if (globalConfig()->encoder().format_case() ==
EncoderProto::FormatCase::FORMAT_NOT_SET) EncoderProto::FormatCase::FORMAT_NOT_SET)
{ {
auto ibm = globalConfig()->mutable_encoder()->mutable_ibm(); auto ibm = _extraConfig.mutable_encoder()->mutable_ibm();
auto trackdata = ibm->add_trackdata(); auto trackdata = ibm->add_trackdata();
trackdata->set_target_clock_period_us(2); trackdata->set_target_clock_period_us(2);

View File

@@ -2,9 +2,11 @@
#define IMAGEREADER_H #define IMAGEREADER_H
#include "image.h" #include "image.h"
#include "lib/config.pb.h"
class ImageSpec; class ImageSpec;
class ImageReaderProto; class ImageReaderProto;
class ConfigProto;
class ImageReader class ImageReader
{ {
@@ -40,15 +42,22 @@ public:
const ImageReaderProto& config); const ImageReaderProto& config);
public: public:
/* Returns any extra config the image might want to contribute. */
const ConfigProto& getContributedConfig() const;
/* Directly reads the image. */ /* Directly reads the image. */
virtual std::unique_ptr<Image> readImage() = 0; virtual std::unique_ptr<Image> readImage() = 0;
/* Reads the image, and then applies any optional mapping to go from /* Reads the image, and then applies any optional mapping to go from
* filesystem ordering to disk ordering. */ * filesystem ordering to disk ordering. */
std::unique_ptr<Image> readMappedImage(); std::unique_ptr<Image> readMappedImage();
protected: protected:
const ImageReaderProto& _config; const ImageReaderProto& _config;
ConfigProto _extraConfig;
}; };
#endif #endif

View File

@@ -157,7 +157,7 @@ public:
TrackHeader header = {0, 0, 0, 0, 0}; TrackHeader header = {0, 0, 0, 0, 0};
TrackHeader previousheader = {0, 0, 0, 0, 0}; TrackHeader previousheader = {0, 0, 0, 0, 0};
auto layout = globalConfig()->mutable_layout(); auto layout = _extraConfig.mutable_layout();
unsigned n = 0; unsigned n = 0;
unsigned headerPtr = 0; unsigned headerPtr = 0;
@@ -259,7 +259,7 @@ public:
headerPtr++; headerPtr++;
} }
auto ibm = globalConfig()->mutable_encoder()->mutable_ibm(); auto ibm = _extraConfig.mutable_encoder()->mutable_ibm();
auto trackdata = ibm->add_trackdata(); auto trackdata = ibm->add_trackdata();
auto layoutdata = layout->add_layoutdata(); auto layoutdata = layout->add_layoutdata();
@@ -443,7 +443,7 @@ public:
} }
} }
if (globalConfig()->encoder().format_case() != if (_extraConfig.encoder().format_case() !=
EncoderProto::FormatCase::FORMAT_NOT_SET) EncoderProto::FormatCase::FORMAT_NOT_SET)
log("IMD: overriding configured format"); log("IMD: overriding configured format");

View File

@@ -24,7 +24,7 @@ public:
if (!inputFile.is_open()) if (!inputFile.is_open())
error("cannot open input file"); error("cannot open input file");
auto layout = globalConfig()->layout(); const auto& layout = globalConfig()->layout();
if (!layout.tracks() || !layout.sides()) if (!layout.tracks() || !layout.sides())
error( error(
"IMG: bad configuration; did you remember to set the " "IMG: bad configuration; did you remember to set the "

View File

@@ -49,16 +49,16 @@ public:
error("NFD: unsupported number of heads"); error("NFD: unsupported number of heads");
} }
if (globalConfig()->encoder().format_case() != if (_extraConfig.encoder().format_case() !=
EncoderProto::FormatCase::FORMAT_NOT_SET) EncoderProto::FormatCase::FORMAT_NOT_SET)
log("NFD: overriding configured format"); log("NFD: overriding configured format");
auto ibm = globalConfig()->mutable_encoder()->mutable_ibm(); auto ibm = _extraConfig.mutable_encoder()->mutable_ibm();
auto layout = globalConfig()->mutable_layout(); auto layout = _extraConfig.mutable_layout();
log("NFD: HD 1.2MB mode"); log("NFD: HD 1.2MB mode");
log("NFD: forcing hign density mode"); log("NFD: forcing hign density mode");
globalConfig()->mutable_drive()->set_high_density(true); _extraConfig.mutable_drive()->set_high_density(true);
globalConfig()->mutable_layout()->set_tpi(96); _extraConfig.mutable_layout()->set_tpi(96);
std::unique_ptr<Image> image(new Image); std::unique_ptr<Image> image(new Image);
for (int track = 0; track < 163; track++) for (int track = 0; track < 163; track++)