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)
|
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");
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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++)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|
||||||
|
|||||||
@@ -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 "
|
||||||
|
|||||||
@@ -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++)
|
||||||
|
|||||||
Reference in New Issue
Block a user