mirror of
https://github.com/davidgiven/fluxengine.git
synced 2025-10-31 11:17:01 -07:00
ImageReaders can now contribute config.
This commit is contained in:
@@ -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");
|
||||
|
||||
@@ -37,7 +37,7 @@ public:
|
||||
{
|
||||
_proto = loadFl2File(_config.filename());
|
||||
|
||||
*_fluxConfig.mutable_drive() = _proto.drive();
|
||||
*_extraConfig.mutable_drive() = _proto.drive();
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
@@ -62,15 +62,18 @@ public:
|
||||
/* 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. */
|
||||
|
||||
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() {}
|
||||
|
||||
@@ -78,7 +81,8 @@ public:
|
||||
|
||||
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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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++)
|
||||
{
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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");
|
||||
|
||||
|
||||
@@ -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 "
|
||||
|
||||
@@ -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++)
|
||||
|
||||
Reference in New Issue
Block a user