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)
{
/* 5.25" with quarter stepping. */
_fluxConfig.mutable_drive()->set_tracks(160);
_fluxConfig.mutable_drive()->set_heads(1);
_fluxConfig.mutable_drive()->set_head_width(4);
_fluxConfig.mutable_drive()->set_tpi(48 * 4);
_extraConfig.mutable_drive()->set_tracks(160);
_extraConfig.mutable_drive()->set_heads(1);
_extraConfig.mutable_drive()->set_head_width(4);
_extraConfig.mutable_drive()->set_tpi(48 * 4);
}
else
{
/* 3.5". */
_fluxConfig.mutable_drive()->set_tpi(135);
_extraConfig.mutable_drive()->set_tpi(135);
}
Bytes stream = findChunk("STRM");

View File

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

View File

@@ -59,26 +59,30 @@ public:
static std::unique_ptr<FluxSource> create(const FluxSourceProto& spec);
public:
/* Returns any configuration this flux source might be carrying (e.g. tpi
* of the drive which made the capture). */
/* Returns any configuration this flux source might be carrying (e.g. tpi
* of the drive which made the capture). */
const ConfigProto& getConfig() const
{ return _fluxConfig; }
const ConfigProto& getExtraConfig() const
{
return _extraConfig;
}
/* Read flux from a given track and side. */
/* Read flux from a given track and side. */
virtual std::unique_ptr<FluxSourceIterator> readFlux(
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() {}
/* Seeks to a given track (without recalibrating). */
/* Seeks to a given track (without recalibrating). */
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()
{
@@ -86,7 +90,7 @@ public:
}
protected:
ConfigProto _fluxConfig;
ConfigProto _extraConfig;
};
class EmptyFluxSourceIterator : public FluxSourceIterator

View File

@@ -43,7 +43,7 @@ public:
error("input not a SCP file");
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);
int startSide = (_header.heads == 2) ? 1 : 0;

View File

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

View File

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

View File

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

View File

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

View File

@@ -157,7 +157,7 @@ public:
TrackHeader header = {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 headerPtr = 0;
@@ -259,7 +259,7 @@ public:
headerPtr++;
}
auto ibm = globalConfig()->mutable_encoder()->mutable_ibm();
auto ibm = _extraConfig.mutable_encoder()->mutable_ibm();
auto trackdata = ibm->add_trackdata();
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)
log("IMD: overriding configured format");

View File

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

View File

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