diff --git a/lib/build.mk b/lib/build.mk index c0d56cb0..ca1b7559 100644 --- a/lib/build.mk +++ b/lib/build.mk @@ -22,6 +22,7 @@ LIBFLUXENGINE_SRCS = \ lib/fluxsource/erasefluxsource.cc \ lib/fluxsource/fl2fluxsource.cc \ lib/fluxsource/fluxsource.cc \ + lib/fluxsource/flxfluxsource.cc \ lib/fluxsource/hardwarefluxsource.cc \ lib/fluxsource/kryoflux.cc \ lib/fluxsource/kryofluxfluxsource.cc \ diff --git a/lib/fluxsource/fluxsource.cc b/lib/fluxsource/fluxsource.cc index 24c96c00..5751a89d 100644 --- a/lib/fluxsource/fluxsource.cc +++ b/lib/fluxsource/fluxsource.cc @@ -40,6 +40,9 @@ std::unique_ptr FluxSource::create(const FluxSourceProto& config) case FluxSourceProto::FLUX: return createFl2FluxSource(config.fl2()); + case FluxSourceProto::FLX: + return createFlxFluxSource(config.flx()); + default: Error() << "bad input disk configuration"; return std::unique_ptr(); @@ -93,6 +96,12 @@ void FluxSource::updateConfigForFilename( proto->set_type(FluxSourceProto::DRIVE); 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) diff --git a/lib/fluxsource/fluxsource.h b/lib/fluxsource/fluxsource.h index f24a952f..811952b3 100644 --- a/lib/fluxsource/fluxsource.h +++ b/lib/fluxsource/fluxsource.h @@ -14,6 +14,7 @@ class HardwareFluxSourceProto; class KryofluxFluxSourceProto; class ScpFluxSourceProto; class TestPatternFluxSourceProto; +class FlxFluxSourceProto; class FluxSourceIterator { @@ -33,6 +34,7 @@ private: static std::unique_ptr createCwfFluxSource(const CwfFluxSourceProto& config); static std::unique_ptr createEraseFluxSource(const EraseFluxSourceProto& config); static std::unique_ptr createFl2FluxSource(const Fl2FluxSourceProto& config); + static std::unique_ptr createFlxFluxSource(const FlxFluxSourceProto& config); static std::unique_ptr createHardwareFluxSource(const HardwareFluxSourceProto& config); static std::unique_ptr createKryofluxFluxSource(const KryofluxFluxSourceProto& config); static std::unique_ptr createScpFluxSource(const ScpFluxSourceProto& config); diff --git a/lib/fluxsource/fluxsource.proto b/lib/fluxsource/fluxsource.proto index 233fa2e5..6b30342e 100644 --- a/lib/fluxsource/fluxsource.proto +++ b/lib/fluxsource/fluxsource.proto @@ -30,7 +30,11 @@ message Fl2FluxSourceProto { (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 { enum FluxSourceType { NOT_SET = 0; @@ -41,6 +45,7 @@ message FluxSourceProto { SCP = 5; CWF = 6; FLUX = 7; + FLX = 8; } optional FluxSourceType type = 9 [default = NOT_SET, (help) = "flux source type"]; @@ -52,5 +57,6 @@ message FluxSourceProto { optional ScpFluxSourceProto scp = 6; optional CwfFluxSourceProto cwf = 7; optional Fl2FluxSourceProto fl2 = 8; + optional FlxFluxSourceProto flx = 10; } diff --git a/lib/fluxsource/flxfluxsource.cc b/lib/fluxsource/flxfluxsource.cc new file mode 100644 index 00000000..0ebf015a --- /dev/null +++ b/lib/fluxsource/flxfluxsource.cc @@ -0,0 +1,53 @@ +#include "globals.h" +#include "fluxmap.h" +#include "lib/fluxsource/fluxsource.pb.h" +#include "fluxsource/fluxsource.h" +#include + +class FlxFluxSource : public TrivialFluxSource +{ +public: + FlxFluxSource(const FlxFluxSourceProto& config): _path(config.directory()) + { + } + +public: + std::unique_ptr 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 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::createFlxFluxSource( + const FlxFluxSourceProto& config) +{ + return std::make_unique(config); +}