Boilerplate for a FLX file reader.

This commit is contained in:
dg
2022-11-29 19:33:47 +00:00
parent f9f11b4966
commit d26940304b
5 changed files with 72 additions and 1 deletions

View File

@@ -22,6 +22,7 @@ LIBFLUXENGINE_SRCS = \
lib/fluxsource/erasefluxsource.cc \ lib/fluxsource/erasefluxsource.cc \
lib/fluxsource/fl2fluxsource.cc \ lib/fluxsource/fl2fluxsource.cc \
lib/fluxsource/fluxsource.cc \ lib/fluxsource/fluxsource.cc \
lib/fluxsource/flxfluxsource.cc \
lib/fluxsource/hardwarefluxsource.cc \ lib/fluxsource/hardwarefluxsource.cc \
lib/fluxsource/kryoflux.cc \ lib/fluxsource/kryoflux.cc \
lib/fluxsource/kryofluxfluxsource.cc \ lib/fluxsource/kryofluxfluxsource.cc \

View File

@@ -40,6 +40,9 @@ std::unique_ptr<FluxSource> FluxSource::create(const FluxSourceProto& config)
case FluxSourceProto::FLUX: case FluxSourceProto::FLUX:
return createFl2FluxSource(config.fl2()); return createFl2FluxSource(config.fl2());
case FluxSourceProto::FLX:
return createFlxFluxSource(config.flx());
default: default:
Error() << "bad input disk configuration"; Error() << "bad input disk configuration";
return std::unique_ptr<FluxSource>(); return std::unique_ptr<FluxSource>();
@@ -93,6 +96,12 @@ void FluxSource::updateConfigForFilename(
proto->set_type(FluxSourceProto::DRIVE); proto->set_type(FluxSourceProto::DRIVE);
config.mutable_drive()->set_drive(std::stoi(s)); config.mutable_drive()->set_drive(std::stoi(s));
}}, }},
{std::regex("^flx:(.*)$"),
[](auto& s, auto* proto)
{
proto->set_type(FluxSourceProto::FLX);
proto->mutable_flx()->set_directory(s);
}},
}; };
for (const auto& it : formats) for (const auto& it : formats)

View File

@@ -14,6 +14,7 @@ class HardwareFluxSourceProto;
class KryofluxFluxSourceProto; class KryofluxFluxSourceProto;
class ScpFluxSourceProto; class ScpFluxSourceProto;
class TestPatternFluxSourceProto; class TestPatternFluxSourceProto;
class FlxFluxSourceProto;
class FluxSourceIterator class FluxSourceIterator
{ {
@@ -33,6 +34,7 @@ private:
static std::unique_ptr<FluxSource> createCwfFluxSource(const CwfFluxSourceProto& config); static std::unique_ptr<FluxSource> createCwfFluxSource(const CwfFluxSourceProto& config);
static std::unique_ptr<FluxSource> createEraseFluxSource(const EraseFluxSourceProto& config); static std::unique_ptr<FluxSource> createEraseFluxSource(const EraseFluxSourceProto& config);
static std::unique_ptr<FluxSource> createFl2FluxSource(const Fl2FluxSourceProto& config); static std::unique_ptr<FluxSource> createFl2FluxSource(const Fl2FluxSourceProto& config);
static std::unique_ptr<FluxSource> createFlxFluxSource(const FlxFluxSourceProto& config);
static std::unique_ptr<FluxSource> createHardwareFluxSource(const HardwareFluxSourceProto& config); static std::unique_ptr<FluxSource> createHardwareFluxSource(const HardwareFluxSourceProto& config);
static std::unique_ptr<FluxSource> createKryofluxFluxSource(const KryofluxFluxSourceProto& config); static std::unique_ptr<FluxSource> createKryofluxFluxSource(const KryofluxFluxSourceProto& config);
static std::unique_ptr<FluxSource> createScpFluxSource(const ScpFluxSourceProto& config); static std::unique_ptr<FluxSource> createScpFluxSource(const ScpFluxSourceProto& config);

View File

@@ -30,7 +30,11 @@ message Fl2FluxSourceProto {
(help) = ".fl2 file to read flux from"]; (help) = ".fl2 file to read flux from"];
} }
// NEXT: 10 message FlxFluxSourceProto {
optional string directory = 1 [(help) = "path to FLX stream directory"];
}
// NEXT: 11
message FluxSourceProto { message FluxSourceProto {
enum FluxSourceType { enum FluxSourceType {
NOT_SET = 0; NOT_SET = 0;
@@ -41,6 +45,7 @@ message FluxSourceProto {
SCP = 5; SCP = 5;
CWF = 6; CWF = 6;
FLUX = 7; FLUX = 7;
FLX = 8;
} }
optional FluxSourceType type = 9 [default = NOT_SET, (help) = "flux source type"]; optional FluxSourceType type = 9 [default = NOT_SET, (help) = "flux source type"];
@@ -52,5 +57,6 @@ message FluxSourceProto {
optional ScpFluxSourceProto scp = 6; optional ScpFluxSourceProto scp = 6;
optional CwfFluxSourceProto cwf = 7; optional CwfFluxSourceProto cwf = 7;
optional Fl2FluxSourceProto fl2 = 8; optional Fl2FluxSourceProto fl2 = 8;
optional FlxFluxSourceProto flx = 10;
} }

View File

@@ -0,0 +1,53 @@
#include "globals.h"
#include "fluxmap.h"
#include "lib/fluxsource/fluxsource.pb.h"
#include "fluxsource/fluxsource.h"
#include <fstream>
class FlxFluxSource : public TrivialFluxSource
{
public:
FlxFluxSource(const FlxFluxSourceProto& config): _path(config.directory())
{
}
public:
std::unique_ptr<const Fluxmap> readSingleFlux(int track, int side) override
{
std::string path = fmt::format("{}/@TR{:02}S{}.FLX", _path, track, side + 1);
std::ifstream is(path);
if (!is.good())
Error() << fmt::format("cannot access path '{}'", _path);
return convertStream(is);
}
void recalibrate() {}
private:
std::unique_ptr<const Fluxmap> convertStream(std::ifstream& is)
{
/* Skip header. */
for (;;)
{
int c = is.get();
if (!c)
break;
if (is.eof())
Error() << fmt::format("malformed FLX stream");
}
return nullptr;
}
private:
const std::string _path;
};
std::unique_ptr<FluxSource> FluxSource::createFlxFluxSource(
const FlxFluxSourceProto& config)
{
return std::make_unique<FlxFluxSource>(config);
}