mirror of
https://github.com/davidgiven/fluxengine.git
synced 2025-10-31 11:17:01 -07:00
Boilerplate for a FLX file reader.
This commit is contained in:
@@ -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 \
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
53
lib/fluxsource/flxfluxsource.cc
Normal file
53
lib/fluxsource/flxfluxsource.cc
Normal 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);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user