mirror of
https://github.com/davidgiven/fluxengine.git
synced 2025-10-24 11:11:02 -07:00
Combine enums for flux source/sink types. config.cc now knows whether they're
read-only, write-only, and read-write.
This commit is contained in:
@@ -19,4 +19,19 @@ enum IndexMode {
|
||||
INDEXMODE_360 = 2;
|
||||
}
|
||||
|
||||
enum FluxSourceSinkType {
|
||||
NOT_SET = 0;
|
||||
A2R = 1;
|
||||
AU = 2;
|
||||
CWF = 3;
|
||||
DRIVE = 4;
|
||||
ERASE = 5;
|
||||
FLUX = 6;
|
||||
FLX = 7;
|
||||
KRYOFLUX = 8;
|
||||
SCP = 9;
|
||||
TEST_PATTERN = 10;
|
||||
VCD = 11;
|
||||
}
|
||||
|
||||
|
||||
|
||||
230
lib/config.cc
230
lib/config.cc
@@ -15,6 +15,114 @@
|
||||
|
||||
static Config config;
|
||||
|
||||
struct FluxConstructor
|
||||
{
|
||||
std::regex pattern;
|
||||
std::function<void(const std::string& filename, FluxSourceProto*)> source;
|
||||
std::function<void(const std::string& filename, FluxSinkProto*)> sink;
|
||||
};
|
||||
|
||||
static const std::vector<FluxConstructor> fluxConstructors = {
|
||||
{.pattern = std::regex("^(.*\\.flux)$"),
|
||||
.source =
|
||||
[](auto& s, auto* proto)
|
||||
{
|
||||
proto->set_type(FluxSourceSinkType::FLUX);
|
||||
proto->mutable_fl2()->set_filename(s);
|
||||
}, .sink =
|
||||
[](auto& s, auto* proto)
|
||||
{
|
||||
proto->set_type(FluxSourceSinkType::FLUX);
|
||||
proto->mutable_fl2()->set_filename(s);
|
||||
}},
|
||||
{
|
||||
.pattern = std::regex("^(.*\\.scp)$"),
|
||||
.source =
|
||||
[](auto& s, auto* proto)
|
||||
{
|
||||
proto->set_type(FluxSourceSinkType::SCP);
|
||||
proto->mutable_scp()->set_filename(s);
|
||||
}, .sink =
|
||||
[](auto& s, auto* proto)
|
||||
{
|
||||
proto->set_type(FluxSourceSinkType::SCP);
|
||||
proto->mutable_scp()->set_filename(s);
|
||||
}, },
|
||||
{.pattern = std::regex("^(.*\\.a2r)$"),
|
||||
.source =
|
||||
[](auto& s, auto* proto)
|
||||
{
|
||||
proto->set_type(FluxSourceSinkType::A2R);
|
||||
proto->mutable_a2r()->set_filename(s);
|
||||
}, .sink =
|
||||
[](auto& s, auto* proto)
|
||||
{
|
||||
proto->set_type(FluxSourceSinkType::A2R);
|
||||
proto->mutable_a2r()->set_filename(s);
|
||||
}},
|
||||
{.pattern = std::regex("^(.*\\.cwf)$"),
|
||||
.source =
|
||||
[](auto& s, auto* proto)
|
||||
{
|
||||
proto->set_type(FluxSourceSinkType::CWF);
|
||||
proto->mutable_cwf()->set_filename(s);
|
||||
}},
|
||||
{.pattern = std::regex("^erase:$"),
|
||||
.source =
|
||||
[](auto& s, auto* proto)
|
||||
{
|
||||
proto->set_type(FluxSourceSinkType::ERASE);
|
||||
}},
|
||||
{.pattern = std::regex("^kryoflux:(.*)$"),
|
||||
.source =
|
||||
[](auto& s, auto* proto)
|
||||
{
|
||||
proto->set_type(FluxSourceSinkType::KRYOFLUX);
|
||||
proto->mutable_kryoflux()->set_directory(s);
|
||||
}},
|
||||
{.pattern = std::regex("^testpattern:(.*)"),
|
||||
.source =
|
||||
[](auto& s, auto* proto)
|
||||
{
|
||||
proto->set_type(FluxSourceSinkType::TEST_PATTERN);
|
||||
}},
|
||||
{.pattern = std::regex("^drive:(.*)"),
|
||||
.source =
|
||||
[](auto& s, auto* proto)
|
||||
{
|
||||
proto->set_type(FluxSourceSinkType::DRIVE);
|
||||
globalConfig().overrides()->mutable_drive()->set_drive(
|
||||
std::stoi(s));
|
||||
}, .sink =
|
||||
[](auto& s, auto* proto)
|
||||
{
|
||||
proto->set_type(FluxSourceSinkType::DRIVE);
|
||||
globalConfig().overrides()->mutable_drive()->set_drive(
|
||||
std::stoi(s));
|
||||
}},
|
||||
{.pattern = std::regex("^flx:(.*)$"),
|
||||
.source =
|
||||
[](auto& s, auto* proto)
|
||||
{
|
||||
proto->set_type(FluxSourceSinkType::FLX);
|
||||
proto->mutable_flx()->set_directory(s);
|
||||
}},
|
||||
{.pattern = std::regex("^vcd:(.*)$"),
|
||||
.sink =
|
||||
[](auto& s, auto* proto)
|
||||
{
|
||||
proto->set_type(FluxSourceSinkType::VCD);
|
||||
proto->mutable_vcd()->set_directory(s);
|
||||
}},
|
||||
{.pattern = std::regex("^au:(.*)$"),
|
||||
.sink =
|
||||
[](auto& s, auto* proto)
|
||||
{
|
||||
proto->set_type(FluxSourceSinkType::AU);
|
||||
proto->mutable_au()->set_directory(s);
|
||||
}},
|
||||
};
|
||||
|
||||
Config& globalConfig()
|
||||
{
|
||||
return config;
|
||||
@@ -336,70 +444,14 @@ void Config::clearOptions()
|
||||
|
||||
static void setFluxSourceImpl(std::string filename, FluxSourceProto* proto)
|
||||
{
|
||||
static const std::vector<std::pair<std::regex,
|
||||
std::function<void(const std::string&, FluxSourceProto*)>>>
|
||||
formats = {
|
||||
{std::regex("^(.*\\.flux)$"),
|
||||
[](auto& s, auto* proto)
|
||||
{
|
||||
proto->set_type(FluxSourceProto::FLUX);
|
||||
proto->mutable_fl2()->set_filename(s);
|
||||
}},
|
||||
{std::regex("^(.*\\.scp)$"),
|
||||
[](auto& s, auto* proto)
|
||||
{
|
||||
proto->set_type(FluxSourceProto::SCP);
|
||||
proto->mutable_scp()->set_filename(s);
|
||||
}},
|
||||
{std::regex("^(.*\\.a2r)$"),
|
||||
[](auto& s, auto* proto)
|
||||
{
|
||||
proto->set_type(FluxSourceProto::A2R);
|
||||
proto->mutable_a2r()->set_filename(s);
|
||||
}},
|
||||
{std::regex("^(.*\\.cwf)$"),
|
||||
[](auto& s, auto* proto)
|
||||
{
|
||||
proto->set_type(FluxSourceProto::CWF);
|
||||
proto->mutable_cwf()->set_filename(s);
|
||||
}},
|
||||
{std::regex("^erase:$"),
|
||||
[](auto& s, auto* proto)
|
||||
{
|
||||
proto->set_type(FluxSourceProto::ERASE);
|
||||
}},
|
||||
{std::regex("^kryoflux:(.*)$"),
|
||||
[](auto& s, auto* proto)
|
||||
{
|
||||
proto->set_type(FluxSourceProto::KRYOFLUX);
|
||||
proto->mutable_kryoflux()->set_directory(s);
|
||||
}},
|
||||
{std::regex("^testpattern:(.*)"),
|
||||
[](auto& s, auto* proto)
|
||||
{
|
||||
proto->set_type(FluxSourceProto::TEST_PATTERN);
|
||||
}},
|
||||
{std::regex("^drive:(.*)"),
|
||||
[](auto& s, auto* proto)
|
||||
{
|
||||
proto->set_type(FluxSourceProto::DRIVE);
|
||||
globalConfig().overrides()->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 : fluxConstructors)
|
||||
{
|
||||
std::smatch match;
|
||||
if (std::regex_match(filename, match, it.first))
|
||||
if (std::regex_match(filename, match, it.pattern))
|
||||
{
|
||||
it.second(match[1], proto);
|
||||
if (!it.source)
|
||||
throw new InapplicableValueException();
|
||||
it.source(match[1], proto);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -414,54 +466,14 @@ void Config::setFluxSource(std::string filename)
|
||||
|
||||
static void setFluxSinkImpl(std::string filename, FluxSinkProto* proto)
|
||||
{
|
||||
static const std::vector<std::pair<std::regex,
|
||||
std::function<void(const std::string&, FluxSinkProto*)>>>
|
||||
formats = {
|
||||
{std::regex("^(.*\\.a2r)$"),
|
||||
[](auto& s, auto* proto)
|
||||
{
|
||||
proto->set_type(FluxSinkProto::A2R);
|
||||
proto->mutable_a2r()->set_filename(s);
|
||||
}},
|
||||
{std::regex("^(.*\\.flux)$"),
|
||||
[](auto& s, auto* proto)
|
||||
{
|
||||
proto->set_type(FluxSinkProto::FLUX);
|
||||
proto->mutable_fl2()->set_filename(s);
|
||||
}},
|
||||
{std::regex("^(.*\\.scp)$"),
|
||||
[](auto& s, auto* proto)
|
||||
{
|
||||
proto->set_type(FluxSinkProto::SCP);
|
||||
proto->mutable_scp()->set_filename(s);
|
||||
}},
|
||||
{std::regex("^vcd:(.*)$"),
|
||||
[](auto& s, auto* proto)
|
||||
{
|
||||
proto->set_type(FluxSinkProto::VCD);
|
||||
proto->mutable_vcd()->set_directory(s);
|
||||
}},
|
||||
{std::regex("^au:(.*)$"),
|
||||
[](auto& s, auto* proto)
|
||||
{
|
||||
proto->set_type(FluxSinkProto::AU);
|
||||
proto->mutable_au()->set_directory(s);
|
||||
}},
|
||||
{std::regex("^drive:(.*)"),
|
||||
[](auto& s, auto* proto)
|
||||
{
|
||||
proto->set_type(FluxSinkProto::DRIVE);
|
||||
globalConfig().overrides()->mutable_drive()->set_drive(
|
||||
std::stoi(s));
|
||||
}},
|
||||
};
|
||||
|
||||
for (const auto& it : formats)
|
||||
for (const auto& it : fluxConstructors)
|
||||
{
|
||||
std::smatch match;
|
||||
if (std::regex_match(filename, match, it.first))
|
||||
if (std::regex_match(filename, match, it.pattern))
|
||||
{
|
||||
it.second(match[1], proto);
|
||||
if (!it.sink)
|
||||
throw new InapplicableValueException();
|
||||
it.sink(match[1], proto);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -560,7 +572,7 @@ void Config::setImageWriter(std::string filename)
|
||||
|
||||
bool Config::hasFluxSource()
|
||||
{
|
||||
return (*this)->flux_source().type() != FluxSourceProto::NOT_SET;
|
||||
return (*this)->flux_source().type() != FluxSourceSinkType::NOT_SET;
|
||||
}
|
||||
|
||||
std::shared_ptr<FluxSource>& Config::getFluxSource()
|
||||
@@ -578,7 +590,7 @@ std::shared_ptr<FluxSource>& Config::getFluxSource()
|
||||
|
||||
bool Config::hasVerificationFluxSource() const
|
||||
{
|
||||
return _verificationFluxSourceProto.type() != FluxSourceProto::NOT_SET;
|
||||
return _verificationFluxSourceProto.type() != FluxSourceSinkType::NOT_SET;
|
||||
}
|
||||
|
||||
std::shared_ptr<FluxSource>& Config::getVerificationFluxSource()
|
||||
@@ -614,7 +626,7 @@ std::shared_ptr<ImageReader>& Config::getImageReader()
|
||||
|
||||
bool Config::hasFluxSink()
|
||||
{
|
||||
return (*this)->flux_sink().type() != FluxSinkProto::NOT_SET;
|
||||
return (*this)->flux_sink().type() != FluxSourceSinkType::NOT_SET;
|
||||
}
|
||||
|
||||
std::unique_ptr<FluxSink> Config::getFluxSink()
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
#include <google/protobuf/message.h>
|
||||
#include "lib/config.pb.h"
|
||||
#include "lib/common.pb.h"
|
||||
|
||||
class ConfigProto;
|
||||
class OptionProto;
|
||||
@@ -46,6 +47,14 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
class InapplicableValueException : public ErrorException
|
||||
{
|
||||
public:
|
||||
InapplicableValueException():
|
||||
ErrorException("selected format cannot be used here")
|
||||
{}
|
||||
};
|
||||
|
||||
class Config
|
||||
{
|
||||
public:
|
||||
|
||||
@@ -10,26 +10,25 @@ std::unique_ptr<FluxSink> FluxSink::create(const FluxSinkProto& config)
|
||||
{
|
||||
switch (config.type())
|
||||
{
|
||||
case FluxSinkProto::DRIVE:
|
||||
case FluxSourceSinkType::DRIVE:
|
||||
return createHardwareFluxSink(config.drive());
|
||||
|
||||
case FluxSinkProto::A2R:
|
||||
case FluxSourceSinkType::A2R:
|
||||
return createA2RFluxSink(config.a2r());
|
||||
|
||||
case FluxSinkProto::AU:
|
||||
case FluxSourceSinkType::AU:
|
||||
return createAuFluxSink(config.au());
|
||||
|
||||
case FluxSinkProto::VCD:
|
||||
case FluxSourceSinkType::VCD:
|
||||
return createVcdFluxSink(config.vcd());
|
||||
|
||||
case FluxSinkProto::SCP:
|
||||
case FluxSourceSinkType::SCP:
|
||||
return createScpFluxSink(config.scp());
|
||||
|
||||
case FluxSinkProto::FLUX:
|
||||
case FluxSourceSinkType::FLUX:
|
||||
return createFl2FluxSink(config.fl2());
|
||||
|
||||
default:
|
||||
error("bad output disk config");
|
||||
return std::unique_ptr<FluxSink>();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,17 +29,7 @@ message Fl2FluxSinkProto {
|
||||
|
||||
// Next: 10
|
||||
message FluxSinkProto {
|
||||
enum FluxSinkType {
|
||||
NOT_SET = 0;
|
||||
DRIVE = 1;
|
||||
A2R = 2;
|
||||
AU = 3;
|
||||
VCD = 4;
|
||||
SCP = 5;
|
||||
FLUX = 6;
|
||||
}
|
||||
|
||||
optional FluxSinkType type = 9 [default = NOT_SET, (help) = "flux sink type"];
|
||||
optional FluxSourceSinkType type = 9 [default = NOT_SET, (help) = "flux sink type"];
|
||||
|
||||
optional HardwareFluxSinkProto drive = 2;
|
||||
optional A2RFluxSinkProto a2r = 8;
|
||||
|
||||
@@ -10,35 +10,34 @@ std::unique_ptr<FluxSource> FluxSource::create(const FluxSourceProto& config)
|
||||
{
|
||||
switch (config.type())
|
||||
{
|
||||
case FluxSourceProto::DRIVE:
|
||||
case FluxSourceSinkType::DRIVE:
|
||||
return createHardwareFluxSource(config.drive());
|
||||
|
||||
case FluxSourceProto::ERASE:
|
||||
case FluxSourceSinkType::ERASE:
|
||||
return createEraseFluxSource(config.erase());
|
||||
|
||||
case FluxSourceProto::KRYOFLUX:
|
||||
case FluxSourceSinkType::KRYOFLUX:
|
||||
return createKryofluxFluxSource(config.kryoflux());
|
||||
|
||||
case FluxSourceProto::TEST_PATTERN:
|
||||
case FluxSourceSinkType::TEST_PATTERN:
|
||||
return createTestPatternFluxSource(config.test_pattern());
|
||||
|
||||
case FluxSourceProto::SCP:
|
||||
case FluxSourceSinkType::SCP:
|
||||
return createScpFluxSource(config.scp());
|
||||
|
||||
case FluxSourceProto::A2R:
|
||||
case FluxSourceSinkType::A2R:
|
||||
return createA2rFluxSource(config.a2r());
|
||||
|
||||
case FluxSourceProto::CWF:
|
||||
case FluxSourceSinkType::CWF:
|
||||
return createCwfFluxSource(config.cwf());
|
||||
|
||||
case FluxSourceProto::FLUX:
|
||||
case FluxSourceSinkType::FLUX:
|
||||
return createFl2FluxSource(config.fl2());
|
||||
|
||||
case FluxSourceProto::FLX:
|
||||
case FluxSourceSinkType::FLX:
|
||||
return createFlxFluxSource(config.flx());
|
||||
|
||||
default:
|
||||
error("bad input disk configuration");
|
||||
return std::unique_ptr<FluxSource>();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,20 +41,7 @@ message FlxFluxSourceProto {
|
||||
|
||||
// NEXT: 12
|
||||
message FluxSourceProto {
|
||||
enum FluxSourceType {
|
||||
NOT_SET = 0;
|
||||
DRIVE = 1;
|
||||
TEST_PATTERN = 2;
|
||||
ERASE = 3;
|
||||
KRYOFLUX = 4;
|
||||
SCP = 5;
|
||||
CWF = 6;
|
||||
FLUX = 7;
|
||||
FLX = 8;
|
||||
A2R = 9;
|
||||
}
|
||||
|
||||
optional FluxSourceType type = 9 [default = NOT_SET, (help) = "flux source type"];
|
||||
optional FluxSourceSinkType type = 9 [default = NOT_SET, (help) = "flux source type"];
|
||||
|
||||
optional A2rFluxSourceProto a2r = 11;
|
||||
optional CwfFluxSourceProto cwf = 7;
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#define PROTO_H
|
||||
|
||||
#include <google/protobuf/message.h>
|
||||
#include "lib/common.pb.h"
|
||||
#include "lib/config.pb.h"
|
||||
|
||||
class ProtoPathNotFoundException : public ErrorException
|
||||
|
||||
@@ -236,7 +236,7 @@ std::unique_ptr<Filesystem> Filesystem::createFilesystemFromConfig()
|
||||
fluxSource = globalConfig().getFluxSource();
|
||||
decoder = globalConfig().getDecoder();
|
||||
}
|
||||
if (globalConfig()->flux_sink().type() == FluxSinkProto::DRIVE)
|
||||
if (globalConfig()->flux_sink().type() == FluxSourceSinkType::DRIVE)
|
||||
{
|
||||
fluxSink = globalConfig().getFluxSink();
|
||||
encoder = globalConfig().getEncoder();
|
||||
|
||||
@@ -247,10 +247,10 @@ static void draw_x_graticules(Agg2D& painter,
|
||||
int mainAnalyseDriveResponse(int argc, const char* argv[])
|
||||
{
|
||||
globalConfig().overrides()->mutable_flux_source()->set_type(
|
||||
FluxSourceProto::DRIVE);
|
||||
FluxSourceSinkType::DRIVE);
|
||||
flags.parseFlagsWithConfigFiles(argc, argv, {});
|
||||
|
||||
if (globalConfig()->flux_sink().type() != FluxSinkProto::DRIVE)
|
||||
if (globalConfig()->flux_sink().type() != FluxSourceSinkType::DRIVE)
|
||||
error("this only makes sense with a real disk drive");
|
||||
|
||||
usbSetDrive(globalConfig()->drive().drive(),
|
||||
|
||||
@@ -132,7 +132,7 @@ static nanoseconds_t guessClock(const Fluxmap& fluxmap)
|
||||
int mainInspect(int argc, const char* argv[])
|
||||
{
|
||||
globalConfig().overrides()->mutable_flux_source()->set_type(
|
||||
FluxSourceProto::DRIVE);
|
||||
FluxSourceSinkType::DRIVE);
|
||||
flags.parseFlagsWithConfigFiles(argc, argv, {});
|
||||
|
||||
auto& fluxSource = globalConfig().getFluxSource();
|
||||
|
||||
@@ -57,10 +57,10 @@ int mainRawRead(int argc, const char* argv[])
|
||||
if (argc == 1)
|
||||
showProfiles("rawread", formats);
|
||||
globalConfig().overrides()->mutable_flux_source()->set_type(
|
||||
FluxSourceProto::DRIVE);
|
||||
FluxSourceSinkType::DRIVE);
|
||||
flags.parseFlagsWithConfigFiles(argc, argv, formats);
|
||||
|
||||
if (globalConfig()->flux_sink().type() == FluxSinkProto::DRIVE)
|
||||
if (globalConfig()->flux_sink().type() == FluxSourceSinkType::DRIVE)
|
||||
error("you can't use rawread to write to hardware");
|
||||
|
||||
std::shared_ptr<FluxSource> fluxSource = globalConfig().getFluxSource();
|
||||
|
||||
@@ -49,7 +49,7 @@ static ActionFlag eraseFlag({"--erase"},
|
||||
[]()
|
||||
{
|
||||
globalConfig().overrides()->mutable_flux_source()->set_type(
|
||||
FluxSourceProto::ERASE);
|
||||
FluxSourceSinkType::ERASE);
|
||||
});
|
||||
|
||||
int mainRawWrite(int argc, const char* argv[])
|
||||
@@ -60,10 +60,10 @@ int mainRawWrite(int argc, const char* argv[])
|
||||
if (argc == 1)
|
||||
showProfiles("rawwrite", formats);
|
||||
globalConfig().overrides()->mutable_flux_sink()->set_type(
|
||||
FluxSinkProto::DRIVE);
|
||||
FluxSourceSinkType::DRIVE);
|
||||
flags.parseFlagsWithConfigFiles(argc, argv, formats);
|
||||
|
||||
if (globalConfig()->flux_source().type() == FluxSourceProto::DRIVE)
|
||||
if (globalConfig()->flux_source().type() == FluxSourceSinkType::DRIVE)
|
||||
error("you can't use rawwrite to read from hardware");
|
||||
|
||||
auto& fluxSource = globalConfig().getFluxSource();
|
||||
|
||||
@@ -64,7 +64,7 @@ int mainRead(int argc, const char* argv[])
|
||||
globalConfig().set("flux_source.type", "DRIVE");
|
||||
flags.parseFlagsWithConfigFiles(argc, argv, formats);
|
||||
|
||||
if (globalConfig()->decoder().copy_flux_to().type() == FluxSinkProto::DRIVE)
|
||||
if (globalConfig()->decoder().copy_flux_to().type() == FluxSourceSinkType::DRIVE)
|
||||
error("you cannot copy flux to a hardware device");
|
||||
|
||||
auto& fluxSource = globalConfig().getFluxSource();
|
||||
|
||||
@@ -19,7 +19,7 @@ int mainRpm(int argc, const char* argv[])
|
||||
{
|
||||
flags.parseFlagsWithConfigFiles(argc, argv, {});
|
||||
|
||||
if (globalConfig()->flux_source().type() != FluxSourceProto::DRIVE)
|
||||
if (globalConfig()->flux_source().type() != FluxSourceSinkType::DRIVE)
|
||||
error("this only makes sense with a real disk drive");
|
||||
|
||||
usbSetDrive(globalConfig()->drive().drive(),
|
||||
|
||||
@@ -23,7 +23,7 @@ int mainSeek(int argc, const char* argv[])
|
||||
{
|
||||
flags.parseFlagsWithConfigFiles(argc, argv, {});
|
||||
|
||||
if (globalConfig()->flux_source().type() != FluxSourceProto::DRIVE)
|
||||
if (globalConfig()->flux_source().type() != FluxSourceSinkType::DRIVE)
|
||||
error("this only makes sense with a real disk drive");
|
||||
|
||||
usbSetDrive(globalConfig()->drive().drive(),
|
||||
|
||||
Reference in New Issue
Block a user