mirror of
				https://github.com/davidgiven/fluxengine.git
				synced 2025-10-24 11:11:02 -07:00 
			
		
		
		
	Migrate to a new global config object.
This commit is contained in:
		| @@ -1,6 +1,7 @@ | ||||
| LIBFLUXENGINE_SRCS = \ | ||||
| 	lib/bitmap.cc \ | ||||
| 	lib/bytes.cc \ | ||||
| 	lib/config.cc \ | ||||
| 	lib/crc.cc \ | ||||
| 	lib/csvreader.cc \ | ||||
| 	lib/decoders/decoders.cc \ | ||||
|   | ||||
							
								
								
									
										25
									
								
								lib/config.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								lib/config.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| #include "lib/globals.h" | ||||
| #include "lib/config.h" | ||||
| #include "lib/proto.h" | ||||
|  | ||||
| static Config config; | ||||
|  | ||||
| Config& globalConfig() | ||||
| { | ||||
|     return config; | ||||
| } | ||||
|  | ||||
| ConfigProto* Config::operator->() const | ||||
| { | ||||
|     return &globalConfigProto(); | ||||
| } | ||||
|  | ||||
| Config::operator ConfigProto*() const | ||||
| { | ||||
|     return &globalConfigProto(); | ||||
| } | ||||
|  | ||||
| Config::operator ConfigProto&() const | ||||
| { | ||||
|     return globalConfigProto(); | ||||
| } | ||||
							
								
								
									
										14
									
								
								lib/config.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								lib/config.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| #pragma once | ||||
|  | ||||
| class ConfigProto; | ||||
|  | ||||
| class Config | ||||
| { | ||||
| public: | ||||
| 	ConfigProto* operator -> () const; | ||||
| 	operator ConfigProto* () const; | ||||
| 	operator ConfigProto& () const; | ||||
| }; | ||||
|  | ||||
| extern Config& globalConfig(); | ||||
|  | ||||
| @@ -12,7 +12,7 @@ FluxmapReader::FluxmapReader(const Fluxmap& fluxmap): | ||||
|     _fluxmap(fluxmap), | ||||
|     _bytes(fluxmap.ptr()), | ||||
|     _size(fluxmap.bytes()), | ||||
|     _config(globalConfig().decoder()) | ||||
|     _config(globalConfig()->decoder()) | ||||
| { | ||||
|     rewind(); | ||||
| } | ||||
| @@ -133,7 +133,7 @@ FluxPattern::FluxPattern(unsigned bits, uint64_t pattern): _bits(bits) | ||||
| bool FluxPattern::matches(const unsigned* end, FluxMatch& match) const | ||||
| { | ||||
|     const double clockDecodeThreshold = | ||||
|         globalConfig().decoder().bit_error_threshold(); | ||||
|         globalConfig()->decoder().bit_error_threshold(); | ||||
|     const unsigned* start = end - _intervals.size(); | ||||
|     unsigned candidatelength = std::accumulate(start, end - _lowzero, 0); | ||||
|     if (!candidatelength) | ||||
|   | ||||
| @@ -48,7 +48,7 @@ nanoseconds_t Encoder::calculatePhysicalClockPeriod( | ||||
|     nanoseconds_t targetClockPeriod, nanoseconds_t targetRotationalPeriod) | ||||
| { | ||||
|     nanoseconds_t currentRotationalPeriod = | ||||
|         globalConfig().drive().rotational_period_ms() * 1e6; | ||||
|         globalConfig()->drive().rotational_period_ms() * 1e6; | ||||
|     if (currentRotationalPeriod == 0) | ||||
|         error( | ||||
|             "you must set --drive.rotational_period_ms as it can't be " | ||||
|   | ||||
							
								
								
									
										10
									
								
								lib/fl2.cc
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								lib/fl2.cc
									
									
									
									
									
								
							| @@ -26,12 +26,12 @@ static void upgradeFluxFile(FluxFileProto& proto) | ||||
|         proto.set_version(FluxFileVersion::VERSION_2); | ||||
|     } | ||||
|  | ||||
| 	if (proto.version() == FluxFileVersion::VERSION_2) | ||||
| 	{ | ||||
| 		proto.mutable_drive()->set_rotational_period_ms( | ||||
| 			proto.rotational_period_ms()); | ||||
|     if (proto.version() == FluxFileVersion::VERSION_2) | ||||
|     { | ||||
|         proto.mutable_drive()->set_rotational_period_ms( | ||||
|             proto.rotational_period_ms()); | ||||
|         proto.set_version(FluxFileVersion::VERSION_3); | ||||
| 	} | ||||
|     } | ||||
|  | ||||
|     if (proto.version() > FluxFileVersion::VERSION_3) | ||||
|         error( | ||||
|   | ||||
							
								
								
									
										18
									
								
								lib/flags.cc
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								lib/flags.cc
									
									
									
									
									
								
							| @@ -52,7 +52,7 @@ void FlagGroup::applyOption(const OptionProto& option) | ||||
|     log("OPTION: {}", | ||||
|         option.has_message() ? option.message() : option.comment()); | ||||
|  | ||||
|     globalConfig().MergeFrom(option.config()); | ||||
|     globalConfig()->MergeFrom(option.config()); | ||||
| } | ||||
|  | ||||
| bool FlagGroup::applyOption(const std::string& optionName) | ||||
| @@ -70,10 +70,10 @@ bool FlagGroup::applyOption(const std::string& optionName) | ||||
|         return false; | ||||
|     }; | ||||
|  | ||||
|     if (searchOptionList(globalConfig().option())) | ||||
|     if (searchOptionList(globalConfig()->option())) | ||||
|         return true; | ||||
|  | ||||
|     for (const auto& optionGroup : globalConfig().option_group()) | ||||
|     for (const auto& optionGroup : globalConfig()->option_group()) | ||||
|     { | ||||
|         if (searchOptionList(optionGroup.option())) | ||||
|             return true; | ||||
| @@ -213,7 +213,7 @@ std::vector<std::string> FlagGroup::parseFlagsWithFilenames(int argc, | ||||
|  | ||||
|     /* Apply any default options in groups. */ | ||||
|  | ||||
|     for (auto& group : globalConfig().option_group()) | ||||
|     for (auto& group : globalConfig()->option_group()) | ||||
|     { | ||||
|         const OptionProto* defaultOption = &*group.option().begin(); | ||||
|         bool isSet = false; | ||||
| @@ -232,7 +232,7 @@ std::vector<std::string> FlagGroup::parseFlagsWithFilenames(int argc, | ||||
|  | ||||
|     /* Next, any standalone options. */ | ||||
|  | ||||
|     for (auto& option : globalConfig().option()) | ||||
|     for (auto& option : globalConfig()->option()) | ||||
|     { | ||||
|         if (options.find(option.name()) != options.end()) | ||||
|         { | ||||
| @@ -249,7 +249,7 @@ std::vector<std::string> FlagGroup::parseFlagsWithFilenames(int argc, | ||||
|  | ||||
|     for (auto [k, v] : overrides) | ||||
|     { | ||||
|         ProtoField protoField = resolveProtoPath(&globalConfig(), k); | ||||
|         ProtoField protoField = resolveProtoPath(globalConfig(), k); | ||||
|         setProtoFieldFromString(protoField, v); | ||||
|     } | ||||
|  | ||||
| @@ -296,7 +296,7 @@ ConfigProto FlagGroup::parseSingleConfigFile(const std::string& filename, | ||||
|  | ||||
|         ConfigProto config; | ||||
|         if (!google::protobuf::TextFormat::MergeFromString( | ||||
|                 ss.str(), &globalConfig())) | ||||
|                 ss.str(), globalConfig())) | ||||
|             error("couldn't load external config proto"); | ||||
|         return config; | ||||
|     } | ||||
| @@ -305,7 +305,7 @@ ConfigProto FlagGroup::parseSingleConfigFile(const std::string& filename, | ||||
| void FlagGroup::parseConfigFile(const std::string& filename, | ||||
|     const std::map<std::string, const ConfigProto*>& configFiles) | ||||
| { | ||||
|     globalConfig().MergeFrom(parseSingleConfigFile(filename, configFiles)); | ||||
|     globalConfig()->MergeFrom(parseSingleConfigFile(filename, configFiles)); | ||||
| } | ||||
|  | ||||
| void FlagGroup::checkInitialised() const | ||||
| @@ -377,7 +377,7 @@ static void doShowConfig() | ||||
|  | ||||
| static void doDoc() | ||||
| { | ||||
|     const auto fields = findAllProtoFields(&globalConfig()); | ||||
|     const auto fields = findAllProtoFields(globalConfig()); | ||||
|     for (const auto field : fields) | ||||
|     { | ||||
|         const std::string& path = field.first; | ||||
|   | ||||
| @@ -24,7 +24,7 @@ namespace | ||||
|  | ||||
|     bool singlesided(void) | ||||
|     { | ||||
|         return globalConfig().heads().start() == globalConfig().heads().end(); | ||||
|         return globalConfig()->heads().start() == globalConfig()->heads().end(); | ||||
|     } | ||||
|  | ||||
|     class A2RFluxSink : public FluxSink | ||||
| @@ -38,8 +38,8 @@ namespace | ||||
|  | ||||
|             log("A2R: writing A2R {} file containing {} tracks\n", | ||||
|                 singlesided() ? "single sided" : "double sided", | ||||
|                 globalConfig().tracks().end() - | ||||
|                     globalConfig().tracks().start() + 1); | ||||
|                 globalConfig()->tracks().end() - | ||||
|                     globalConfig()->tracks().start() + 1); | ||||
|  | ||||
|             time_t now{std::time(nullptr)}; | ||||
|             auto t = gmtime(&now); | ||||
|   | ||||
| @@ -43,7 +43,7 @@ public: | ||||
|                 track->add_flux(fluxBytes); | ||||
|         } | ||||
|  | ||||
|         proto.mutable_drive()->MergeFrom(globalConfig().drive()); | ||||
|         proto.mutable_drive()->MergeFrom(globalConfig()->drive()); | ||||
|         saveFl2File(_filename, proto); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -74,7 +74,7 @@ void FluxSink::updateConfigForFilename( | ||||
|              [](auto& s, auto* proto) | ||||
|                 { | ||||
|                     proto->set_type(FluxSinkProto::DRIVE); | ||||
|                     globalConfig().mutable_drive()->set_drive(std::stoi(s)); | ||||
|                     globalConfig()->mutable_drive()->set_drive(std::stoi(s)); | ||||
|                 }}, | ||||
|     }; | ||||
|  | ||||
|   | ||||
| @@ -22,9 +22,9 @@ public: | ||||
| public: | ||||
|     void writeFlux(int track, int side, const Fluxmap& fluxmap) override | ||||
|     { | ||||
|         usbSetDrive(globalConfig().drive().drive(), | ||||
|             globalConfig().drive().high_density(), | ||||
|             globalConfig().drive().index_mode()); | ||||
|         usbSetDrive(globalConfig()->drive().drive(), | ||||
|             globalConfig()->drive().high_density(), | ||||
|             globalConfig()->drive().index_mode()); | ||||
| #if 0 | ||||
| 		if (fluxSourceSinkFortyTrack) | ||||
| 		{ | ||||
| @@ -41,7 +41,7 @@ public: | ||||
|  | ||||
|     operator std::string() const | ||||
|     { | ||||
|         return fmt::format("drive {}", globalConfig().drive().drive()); | ||||
|         return fmt::format("drive {}", globalConfig()->drive().drive()); | ||||
|     } | ||||
|  | ||||
| private: | ||||
|   | ||||
| @@ -55,7 +55,7 @@ public: | ||||
|         _fileheader.start_track = strackno(minTrack, minSide); | ||||
|         _fileheader.end_track = strackno(maxTrack, maxSide); | ||||
|         _fileheader.flags = SCP_FLAG_INDEXED; | ||||
|         if (globalConfig().drive().tpi() != 48) | ||||
|         if (globalConfig()->drive().tpi() != 48) | ||||
|             _fileheader.flags |= SCP_FLAG_96TPI; | ||||
|         _fileheader.cell_width = 0; | ||||
|         if ((minSide == 0) && (maxSide == 0)) | ||||
|   | ||||
| @@ -78,15 +78,15 @@ public: | ||||
|                 if (disktype == 1) | ||||
|                 { | ||||
|                     /* 5.25" with quarter stepping. */ | ||||
|                     ::globalConfig().mutable_drive()->set_tracks(160); | ||||
|                     ::globalConfig().mutable_drive()->set_heads(1); | ||||
|                     ::globalConfig().mutable_drive()->set_head_width(4); | ||||
|                     ::globalConfig().mutable_drive()->set_tpi(48 * 4); | ||||
|                     ::globalConfig()->mutable_drive()->set_tracks(160); | ||||
|                     ::globalConfig()->mutable_drive()->set_heads(1); | ||||
|                     ::globalConfig()->mutable_drive()->set_head_width(4); | ||||
|                     ::globalConfig()->mutable_drive()->set_tpi(48 * 4); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     /* 3.5". */ | ||||
|                     ::globalConfig().mutable_drive()->set_tpi(135); | ||||
|                     ::globalConfig()->mutable_drive()->set_tpi(135); | ||||
|                 } | ||||
|  | ||||
|                 Bytes stream = findChunk("STRM"); | ||||
|   | ||||
| @@ -37,10 +37,10 @@ public: | ||||
|     { | ||||
|         _proto = loadFl2File(_config.filename()); | ||||
|  | ||||
|         if (::globalConfig().has_drive()) | ||||
|         if (::globalConfig()->has_drive()) | ||||
|             warning( | ||||
|                 "FLUX: overriding drive configuration with flux file contents"); | ||||
|         ::globalConfig().mutable_drive()->MergeFrom(_proto.drive()); | ||||
|         ::globalConfig()->mutable_drive()->MergeFrom(_proto.drive()); | ||||
|     } | ||||
|  | ||||
| public: | ||||
|   | ||||
| @@ -102,7 +102,7 @@ void FluxSource::updateConfigForFilename( | ||||
|              [](auto& s, auto* proto) | ||||
|                 { | ||||
|                     proto->set_type(FluxSourceProto::DRIVE); | ||||
|                     globalConfig().mutable_drive()->set_drive(std::stoi(s)); | ||||
|                     globalConfig()->mutable_drive()->set_drive(std::stoi(s)); | ||||
|                 }}, | ||||
|             {std::regex("^flx:(.*)$"), | ||||
|              [](auto& s, auto* proto) | ||||
|   | ||||
| @@ -29,14 +29,14 @@ private: | ||||
|  | ||||
|         std::unique_ptr<const Fluxmap> next() | ||||
|         { | ||||
|             usbSetDrive(globalConfig().drive().drive(), | ||||
|                 globalConfig().drive().high_density(), | ||||
|                 globalConfig().drive().index_mode()); | ||||
|             usbSetDrive(globalConfig()->drive().drive(), | ||||
|                 globalConfig()->drive().high_density(), | ||||
|                 globalConfig()->drive().index_mode()); | ||||
|             usbSeek(_track); | ||||
|  | ||||
|             Bytes data = usbRead(_head, | ||||
|                 globalConfig().drive().sync_with_index(), | ||||
|                 globalConfig().drive().revolutions() * | ||||
|                 globalConfig()->drive().sync_with_index(), | ||||
|                 globalConfig()->drive().revolutions() * | ||||
|                     _fluxsource._oneRevolution, | ||||
|                 _fluxsource._hardSectorThreshold); | ||||
|             auto fluxmap = std::make_unique<Fluxmap>(); | ||||
|   | ||||
| @@ -43,8 +43,8 @@ public: | ||||
|             error("input not a SCP file"); | ||||
|  | ||||
|         int tpi = (_header.flags & SCP_FLAG_96TPI) ? 96 : 48; | ||||
|         if (!::globalConfig().drive().has_tpi()) | ||||
|             ::globalConfig().mutable_drive()->set_tpi(tpi); | ||||
|         if (!::globalConfig()->drive().has_tpi()) | ||||
|             ::globalConfig()->mutable_drive()->set_tpi(tpi); | ||||
|  | ||||
|         _resolution = 25 * (_header.resolution + 1); | ||||
|         int startSide = (_header.heads == 2) ? 1 : 0; | ||||
|   | ||||
| @@ -13,7 +13,6 @@ double getCurrentTime(void) | ||||
|  | ||||
| void warning(const std::string msg) | ||||
| { | ||||
| 	log(msg); | ||||
| 	fmt::print("Warning: {}\n", msg); | ||||
|     log(msg); | ||||
|     fmt::print("Warning: {}\n", msg); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -60,4 +60,6 @@ inline void warning(fmt::string_view fstr, const Args&... args) | ||||
| template <class... Ts> struct overloaded : Ts...  { using Ts::operator()...; }; | ||||
| template <class... Ts> overloaded(Ts...) -> overloaded<Ts...>; | ||||
|  | ||||
| #include "lib/config.h" | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -56,27 +56,27 @@ public: | ||||
|         inputFile.read((char*)trackTable.begin(), trackTable.size()); | ||||
|         ByteReader trackTableReader(trackTable); | ||||
|  | ||||
|         if (globalConfig().encoder().format_case() != | ||||
|         if (globalConfig()->encoder().format_case() != | ||||
|             EncoderProto::FormatCase::FORMAT_NOT_SET) | ||||
|             log("D88: overriding configured format"); | ||||
|  | ||||
|         auto ibm = globalConfig().mutable_encoder()->mutable_ibm(); | ||||
|         auto ibm = globalConfig()->mutable_encoder()->mutable_ibm(); | ||||
|         int clockRate = 500; | ||||
|         if (mediaFlag == 0x20) | ||||
|         { | ||||
|             log("D88: forcing high density mode"); | ||||
|             globalConfig().mutable_drive()->set_high_density(true); | ||||
|             globalConfig().mutable_layout()->set_tpi(96); | ||||
|             globalConfig()->mutable_drive()->set_high_density(true); | ||||
|             globalConfig()->mutable_layout()->set_tpi(96); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             log("D88: forcing single/double density mode"); | ||||
|             clockRate = 300; | ||||
|             globalConfig().mutable_drive()->set_high_density(false); | ||||
|             globalConfig().mutable_layout()->set_tpi(48); | ||||
|             globalConfig()->mutable_drive()->set_high_density(false); | ||||
|             globalConfig()->mutable_layout()->set_tpi(48); | ||||
|         } | ||||
|  | ||||
|         auto layout = globalConfig().mutable_layout(); | ||||
|         auto layout = globalConfig()->mutable_layout(); | ||||
|         std::unique_ptr<Image> image(new Image); | ||||
|         for (int track = 0; track < trackTableSize / 4; track++) | ||||
|         { | ||||
|   | ||||
| @@ -91,11 +91,11 @@ public: | ||||
|             trackCount++; | ||||
|         } | ||||
|  | ||||
|         auto layout = globalConfig().mutable_layout(); | ||||
|         if (globalConfig().encoder().format_case() == | ||||
|         auto layout = globalConfig()->mutable_layout(); | ||||
|         if (globalConfig()->encoder().format_case() == | ||||
|             EncoderProto::FormatCase::FORMAT_NOT_SET) | ||||
|         { | ||||
|             auto ibm = globalConfig().mutable_encoder()->mutable_ibm(); | ||||
|             auto ibm = globalConfig()->mutable_encoder()->mutable_ibm(); | ||||
|             auto trackdata = ibm->add_trackdata(); | ||||
|             trackdata->set_target_clock_period_us(2); | ||||
|  | ||||
| @@ -134,7 +134,7 @@ public: | ||||
|                     break; | ||||
|             } | ||||
|  | ||||
|             globalConfig().mutable_decoder()->mutable_ibm(); | ||||
|             globalConfig()->mutable_decoder()->mutable_ibm(); | ||||
|         } | ||||
|  | ||||
|         image->calculateSize(); | ||||
|   | ||||
| @@ -70,11 +70,11 @@ public: | ||||
|             trackCount++; | ||||
|         } | ||||
|  | ||||
|         auto layout = globalConfig().mutable_layout(); | ||||
|         if (globalConfig().encoder().format_case() == | ||||
|         auto layout = globalConfig()->mutable_layout(); | ||||
|         if (globalConfig()->encoder().format_case() == | ||||
|             EncoderProto::FormatCase::FORMAT_NOT_SET) | ||||
|         { | ||||
|             auto ibm = globalConfig().mutable_encoder()->mutable_ibm(); | ||||
|             auto ibm = globalConfig()->mutable_encoder()->mutable_ibm(); | ||||
|             auto trackdata = ibm->add_trackdata(); | ||||
|             trackdata->set_target_clock_period_us(2); | ||||
|  | ||||
|   | ||||
| @@ -157,7 +157,7 @@ public: | ||||
|         TrackHeader header = {0, 0, 0, 0, 0}; | ||||
|         TrackHeader previousheader = {0, 0, 0, 0, 0}; | ||||
|  | ||||
|         auto layout = globalConfig().mutable_layout(); | ||||
|         auto layout = globalConfig()->mutable_layout(); | ||||
|  | ||||
|         unsigned n = 0; | ||||
|         unsigned headerPtr = 0; | ||||
| @@ -259,7 +259,7 @@ public: | ||||
|                 headerPtr++; | ||||
|             } | ||||
|  | ||||
|             auto ibm = globalConfig().mutable_encoder()->mutable_ibm(); | ||||
|             auto ibm = globalConfig()->mutable_encoder()->mutable_ibm(); | ||||
|             auto trackdata = ibm->add_trackdata(); | ||||
|  | ||||
|             auto layoutdata = layout->add_layoutdata(); | ||||
| @@ -443,7 +443,7 @@ public: | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (globalConfig().encoder().format_case() != | ||||
|         if (globalConfig()->encoder().format_case() != | ||||
|             EncoderProto::FormatCase::FORMAT_NOT_SET) | ||||
|             log("IMD: overriding configured format"); | ||||
|  | ||||
|   | ||||
| @@ -24,7 +24,7 @@ public: | ||||
|         if (!inputFile.is_open()) | ||||
|             error("cannot open input file"); | ||||
|  | ||||
|         auto layout = globalConfig().layout(); | ||||
|         auto layout = globalConfig()->layout(); | ||||
|         if (!layout.tracks() || !layout.sides()) | ||||
|             error( | ||||
|                 "IMG: bad configuration; did you remember to set the " | ||||
|   | ||||
| @@ -49,16 +49,16 @@ public: | ||||
|             error("NFD: unsupported number of heads"); | ||||
|         } | ||||
|  | ||||
|         if (globalConfig().encoder().format_case() != | ||||
|         if (globalConfig()->encoder().format_case() != | ||||
|             EncoderProto::FormatCase::FORMAT_NOT_SET) | ||||
|             log("NFD: overriding configured format"); | ||||
|  | ||||
|         auto ibm = globalConfig().mutable_encoder()->mutable_ibm(); | ||||
|         auto layout = globalConfig().mutable_layout(); | ||||
|         auto ibm = globalConfig()->mutable_encoder()->mutable_ibm(); | ||||
|         auto layout = globalConfig()->mutable_layout(); | ||||
|         log("NFD: HD 1.2MB mode"); | ||||
|         log("NFD: forcing hign density mode"); | ||||
|         globalConfig().mutable_drive()->set_high_density(true); | ||||
|         globalConfig().mutable_layout()->set_tpi(96); | ||||
|         globalConfig()->mutable_drive()->set_high_density(true); | ||||
|         globalConfig()->mutable_layout()->set_tpi(96); | ||||
|  | ||||
|         std::unique_ptr<Image> image(new Image); | ||||
|         for (int track = 0; track < 163; track++) | ||||
|   | ||||
| @@ -21,7 +21,7 @@ public: | ||||
|     { | ||||
|         const Geometry geometry = image.getGeometry(); | ||||
|  | ||||
|         auto& layout = globalConfig().layout(); | ||||
|         auto& layout = globalConfig()->layout(); | ||||
|         int tracks = layout.has_tracks() ? layout.tracks() : geometry.numTracks; | ||||
|         int sides = layout.has_sides() ? layout.sides() : geometry.numSides; | ||||
|  | ||||
|   | ||||
| @@ -10,16 +10,16 @@ bool approximatelyEqual(float a, float b, float epsilon) | ||||
|  | ||||
| static unsigned getTrackStep() | ||||
| { | ||||
|     if (!globalConfig().layout().tpi()) | ||||
|     if (!globalConfig()->layout().tpi()) | ||||
|         error("no layout TPI set"); | ||||
|     if (!globalConfig().drive().tpi()) | ||||
|     if (!globalConfig()->drive().tpi()) | ||||
|         error("no drive TPI set"); | ||||
|  | ||||
|     if (globalConfig().layout().tpi() == 0.0) | ||||
|     if (globalConfig()->layout().tpi() == 0.0) | ||||
|         error("layout TPI is zero; this shouldn't happen?"); | ||||
|  | ||||
|     float trackStepFactor = | ||||
|         globalConfig().drive().tpi() / globalConfig().layout().tpi(); | ||||
|         globalConfig()->drive().tpi() / globalConfig()->layout().tpi(); | ||||
|  | ||||
|     if (!approximatelyEqual(trackStepFactor, round(trackStepFactor), 0.001)) | ||||
|         error( | ||||
| @@ -34,37 +34,37 @@ static unsigned getTrackStep() | ||||
|  | ||||
| unsigned Layout::remapTrackPhysicalToLogical(unsigned ptrack) | ||||
| { | ||||
|     return (ptrack - globalConfig().drive().head_bias()) / getTrackStep(); | ||||
|     return (ptrack - globalConfig()->drive().head_bias()) / getTrackStep(); | ||||
| } | ||||
|  | ||||
| unsigned Layout::remapTrackLogicalToPhysical(unsigned ltrack) | ||||
| { | ||||
|     return globalConfig().drive().head_bias() + ltrack * getTrackStep(); | ||||
|     return globalConfig()->drive().head_bias() + ltrack * getTrackStep(); | ||||
| } | ||||
|  | ||||
| unsigned Layout::remapSidePhysicalToLogical(unsigned pside) | ||||
| { | ||||
|     return pside ^ globalConfig().layout().swap_sides(); | ||||
|     return pside ^ globalConfig()->layout().swap_sides(); | ||||
| } | ||||
|  | ||||
| unsigned Layout::remapSideLogicalToPhysical(unsigned lside) | ||||
| { | ||||
|     return lside ^ globalConfig().layout().swap_sides(); | ||||
|     return lside ^ globalConfig()->layout().swap_sides(); | ||||
| } | ||||
|  | ||||
| std::vector<std::shared_ptr<const TrackInfo>> Layout::computeLocations() | ||||
| { | ||||
|     std::set<unsigned> tracks; | ||||
|     if (globalConfig().has_tracks()) | ||||
|         tracks = iterate(globalConfig().tracks()); | ||||
|     if (globalConfig()->has_tracks()) | ||||
|         tracks = iterate(globalConfig()->tracks()); | ||||
|     else | ||||
|         tracks = iterate(0, globalConfig().layout().tracks()); | ||||
|         tracks = iterate(0, globalConfig()->layout().tracks()); | ||||
|  | ||||
|     std::set<unsigned> heads; | ||||
|     if (globalConfig().has_heads()) | ||||
|         heads = iterate(globalConfig().heads()); | ||||
|     if (globalConfig()->has_heads()) | ||||
|         heads = iterate(globalConfig()->heads()); | ||||
|     else | ||||
|         heads = iterate(0, globalConfig().layout().sides()); | ||||
|         heads = iterate(0, globalConfig()->layout().sides()); | ||||
|  | ||||
|     std::vector<std::shared_ptr<const TrackInfo>> locations; | ||||
|     for (unsigned logicalTrack : tracks) | ||||
| @@ -97,7 +97,7 @@ void Layout::getBounds( | ||||
| std::vector<std::pair<int, int>> Layout::getTrackOrdering( | ||||
|     unsigned guessedTracks, unsigned guessedSides) | ||||
| { | ||||
|     auto layout = globalConfig().layout(); | ||||
|     auto layout = globalConfig()->layout(); | ||||
|     int tracks = layout.has_tracks() ? layout.tracks() : guessedTracks; | ||||
|     int sides = layout.has_sides() ? layout.sides() : guessedSides; | ||||
|  | ||||
| @@ -179,7 +179,7 @@ std::shared_ptr<const TrackInfo> Layout::getLayoutOfTrack( | ||||
|     auto trackInfo = std::make_shared<TrackInfo>(); | ||||
|  | ||||
|     LayoutProto::LayoutdataProto layoutdata; | ||||
|     for (const auto& f : globalConfig().layout().layoutdata()) | ||||
|     for (const auto& f : globalConfig()->layout().layoutdata()) | ||||
|     { | ||||
|         if (f.has_track() && f.has_up_to_track() && | ||||
|             ((logicalTrack < f.track()) || (logicalTrack > f.up_to_track()))) | ||||
| @@ -193,14 +193,14 @@ std::shared_ptr<const TrackInfo> Layout::getLayoutOfTrack( | ||||
|         layoutdata.MergeFrom(f); | ||||
|     } | ||||
|  | ||||
|     trackInfo->numTracks = globalConfig().layout().tracks(); | ||||
|     trackInfo->numSides = globalConfig().layout().sides(); | ||||
|     trackInfo->numTracks = globalConfig()->layout().tracks(); | ||||
|     trackInfo->numSides = globalConfig()->layout().sides(); | ||||
|     trackInfo->sectorSize = layoutdata.sector_size(); | ||||
|     trackInfo->logicalTrack = logicalTrack; | ||||
|     trackInfo->logicalSide = logicalSide; | ||||
|     trackInfo->physicalTrack = remapTrackLogicalToPhysical(logicalTrack); | ||||
|     trackInfo->physicalSide = | ||||
|         logicalSide ^ globalConfig().layout().swap_sides(); | ||||
|         logicalSide ^ globalConfig()->layout().swap_sides(); | ||||
|     trackInfo->groupSize = getTrackStep(); | ||||
|     trackInfo->diskSectorOrder = expandSectorList(layoutdata.physical()); | ||||
|     trackInfo->naturalSectorOrder = trackInfo->diskSectorOrder; | ||||
|   | ||||
| @@ -11,7 +11,7 @@ static ConfigProto config = []() | ||||
|     return config; | ||||
| }(); | ||||
|  | ||||
| ConfigProto& globalConfig() | ||||
| ConfigProto& globalConfigProto() | ||||
| { | ||||
|     return config; | ||||
| } | ||||
|   | ||||
| @@ -28,6 +28,6 @@ extern ConfigProto parseConfigBytes(const std::string_view& bytes); | ||||
|  | ||||
| extern const std::map<std::string, const ConfigProto*> formats; | ||||
|  | ||||
| extern ConfigProto& globalConfig(); | ||||
| extern ConfigProto& globalConfigProto(); | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -61,13 +61,13 @@ void measureDiskRotation( | ||||
|     log(BeginSpeedOperationLogMessage()); | ||||
|  | ||||
|     int retries = 5; | ||||
|     usbSetDrive(globalConfig().drive().drive(), | ||||
|         globalConfig().drive().high_density(), | ||||
|         globalConfig().drive().index_mode()); | ||||
|     oneRevolution = globalConfig().drive().rotational_period_ms() * 1e6; | ||||
|     if (globalConfig().drive().hard_sector_count() != 0) | ||||
|     usbSetDrive(globalConfig()->drive().drive(), | ||||
|         globalConfig()->drive().high_density(), | ||||
|         globalConfig()->drive().index_mode()); | ||||
|     oneRevolution = globalConfig()->drive().rotational_period_ms() * 1e6; | ||||
|     if (globalConfig()->drive().hard_sector_count() != 0) | ||||
|         hardSectorThreshold = oneRevolution * 3 / | ||||
|                               (4 * globalConfig().drive().hard_sector_count()); | ||||
|                               (4 * globalConfig()->drive().hard_sector_count()); | ||||
|     else | ||||
|         hardSectorThreshold = 0; | ||||
|  | ||||
| @@ -77,15 +77,15 @@ void measureDiskRotation( | ||||
|         do | ||||
|         { | ||||
|             oneRevolution = usbGetRotationalPeriod( | ||||
|                 globalConfig().drive().hard_sector_count()); | ||||
|             if (globalConfig().drive().hard_sector_count() != 0) | ||||
|                 globalConfig()->drive().hard_sector_count()); | ||||
|             if (globalConfig()->drive().hard_sector_count() != 0) | ||||
|                 hardSectorThreshold = | ||||
|                     oneRevolution * 3 / | ||||
|                     (4 * globalConfig().drive().hard_sector_count()); | ||||
|                     (4 * globalConfig()->drive().hard_sector_count()); | ||||
|  | ||||
|             retries--; | ||||
|         } while ((oneRevolution == 0) && (retries > 0)); | ||||
|         globalConfig().mutable_drive()->set_rotational_period_ms( | ||||
|         globalConfig()->mutable_drive()->set_rotational_period_ms( | ||||
|             oneRevolution / 1e6); | ||||
|         log(EndOperationLogMessage{}); | ||||
|     } | ||||
| @@ -191,7 +191,7 @@ BadSectorsState combineRecordAndSectors(TrackFlux& trackFlux, | ||||
|  | ||||
| static void adjustTrackOnError(FluxSource& fluxSource, int baseTrack) | ||||
| { | ||||
|     switch (globalConfig().drive().error_behaviour()) | ||||
|     switch (globalConfig()->drive().error_behaviour()) | ||||
|     { | ||||
|         case DriveProto::NOTHING: | ||||
|             break; | ||||
| @@ -217,7 +217,7 @@ ReadResult readGroup(FluxSourceIteratorHolder& fluxSourceIteratorHolder, | ||||
|     ReadResult result = BAD_AND_CAN_NOT_RETRY; | ||||
|  | ||||
|     for (unsigned offset = 0; offset < trackInfo->groupSize; | ||||
|          offset += globalConfig().drive().head_width()) | ||||
|          offset += globalConfig()->drive().head_width()) | ||||
|     { | ||||
|         auto& fluxSourceIterator = fluxSourceIteratorHolder.getIterator( | ||||
|             trackInfo->physicalTrack + offset, trackInfo->physicalSide); | ||||
| @@ -228,7 +228,7 @@ ReadResult readGroup(FluxSourceIteratorHolder& fluxSourceIteratorHolder, | ||||
|             trackInfo->physicalTrack + offset, trackInfo->physicalSide}); | ||||
|         std::shared_ptr<const Fluxmap> fluxmap = fluxSourceIterator.next(); | ||||
|         // ->rescale( | ||||
|         //     1.0 / globalConfig().flux_source().rescale()); | ||||
|         //     1.0 / globalConfig()->flux_source().rescale()); | ||||
|         log(EndReadOperationLogMessage()); | ||||
|         log("{0} ms in {1} bytes", | ||||
|             (int)(fluxmap->duration() / 1e6), | ||||
| @@ -240,7 +240,7 @@ ReadResult readGroup(FluxSourceIteratorHolder& fluxSourceIteratorHolder, | ||||
|             HAS_NO_BAD_SECTORS) | ||||
|         { | ||||
|             result = GOOD_READ; | ||||
|             if (globalConfig().decoder().skip_unnecessary_tracks()) | ||||
|             if (globalConfig()->decoder().skip_unnecessary_tracks()) | ||||
|                 return result; | ||||
|         } | ||||
|         else if (fluxSourceIterator.hasNext()) | ||||
| @@ -267,18 +267,18 @@ void writeTracks(FluxSink& fluxSink, | ||||
|  | ||||
|         testForEmergencyStop(); | ||||
|  | ||||
|         int retriesRemaining = globalConfig().decoder().retries(); | ||||
|         int retriesRemaining = globalConfig()->decoder().retries(); | ||||
|         for (;;) | ||||
|         { | ||||
|             for (int offset = 0; offset < trackInfo->groupSize; | ||||
|                  offset += globalConfig().drive().head_width()) | ||||
|                  offset += globalConfig()->drive().head_width()) | ||||
|             { | ||||
|                 unsigned physicalTrack = trackInfo->physicalTrack + offset; | ||||
|  | ||||
|                 log(BeginWriteOperationLogMessage{ | ||||
|                     physicalTrack, trackInfo->physicalSide}); | ||||
|  | ||||
|                 if (offset == globalConfig().drive().group_offset()) | ||||
|                 if (offset == globalConfig()->drive().group_offset()) | ||||
|                 { | ||||
|                     auto fluxmap = producer(trackInfo); | ||||
|                     if (!fluxmap) | ||||
| @@ -454,7 +454,7 @@ std::shared_ptr<TrackFlux> readAndDecodeTrack(FluxSource& fluxSource, | ||||
|     trackFlux->trackInfo = trackInfo; | ||||
|  | ||||
|     FluxSourceIteratorHolder fluxSourceIteratorHolder(fluxSource); | ||||
|     int retriesRemaining = globalConfig().decoder().retries(); | ||||
|     int retriesRemaining = globalConfig()->decoder().retries(); | ||||
|     for (;;) | ||||
|     { | ||||
|         auto result = | ||||
| @@ -488,9 +488,9 @@ std::shared_ptr<const DiskFlux> readDiskCommand( | ||||
|     FluxSource& fluxSource, Decoder& decoder) | ||||
| { | ||||
|     std::unique_ptr<FluxSink> outputFluxSink; | ||||
|     if (globalConfig().decoder().has_copy_flux_to()) | ||||
|     if (globalConfig()->decoder().has_copy_flux_to()) | ||||
|         outputFluxSink = | ||||
|             FluxSink::create(globalConfig().decoder().copy_flux_to()); | ||||
|             FluxSink::create(globalConfig()->decoder().copy_flux_to()); | ||||
|  | ||||
|     auto diskflux = std::make_shared<DiskFlux>(); | ||||
|  | ||||
| @@ -516,7 +516,7 @@ std::shared_ptr<const DiskFlux> readDiskCommand( | ||||
|                     *data->fluxmap); | ||||
|         } | ||||
|  | ||||
|         if (globalConfig().decoder().dump_records()) | ||||
|         if (globalConfig()->decoder().dump_records()) | ||||
|         { | ||||
|             std::vector<std::shared_ptr<const Record>> sorted_records; | ||||
|  | ||||
| @@ -543,7 +543,7 @@ std::shared_ptr<const DiskFlux> readDiskCommand( | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (globalConfig().decoder().dump_sectors()) | ||||
|         if (globalConfig()->decoder().dump_sectors()) | ||||
|         { | ||||
|             auto collected_sectors = collectSectors(trackFlux->sectors, false); | ||||
|             std::vector<std::shared_ptr<const Sector>> sorted_sectors( | ||||
| @@ -595,9 +595,9 @@ void readDiskCommand( | ||||
|     auto diskflux = readDiskCommand(fluxsource, decoder); | ||||
|  | ||||
|     writer.printMap(*diskflux->image); | ||||
|     if (globalConfig().decoder().has_write_csv_to()) | ||||
|     if (globalConfig()->decoder().has_write_csv_to()) | ||||
|         writer.writeCsv( | ||||
|             *diskflux->image, globalConfig().decoder().write_csv_to()); | ||||
|             *diskflux->image, globalConfig()->decoder().write_csv_to()); | ||||
|     writer.writeMappedImage(*diskflux->image); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -23,9 +23,9 @@ static std::shared_ptr<CandidateDevice> selectDevice() | ||||
|             "no devices found (is one plugged in? Do you have the " | ||||
|             "appropriate permissions?"); | ||||
|  | ||||
|     if (globalConfig().usb().has_serial()) | ||||
|     if (globalConfig()->usb().has_serial()) | ||||
|     { | ||||
|         auto wantedSerial = globalConfig().usb().serial(); | ||||
|         auto wantedSerial = globalConfig()->usb().serial(); | ||||
|         for (auto& c : candidates) | ||||
|         { | ||||
|             if (c->serial == wantedSerial) | ||||
| @@ -63,10 +63,10 @@ USB* get_usb_impl() | ||||
| { | ||||
|     /* Special case for certain configurations. */ | ||||
|  | ||||
|     if (globalConfig().usb().has_greaseweazle() && | ||||
|         globalConfig().usb().greaseweazle().has_port()) | ||||
|     if (globalConfig()->usb().has_greaseweazle() && | ||||
|         globalConfig()->usb().greaseweazle().has_port()) | ||||
|     { | ||||
|         const auto& conf = globalConfig().usb().greaseweazle(); | ||||
|         const auto& conf = globalConfig()->usb().greaseweazle(); | ||||
|         log("Using GreaseWeazle on serial port {}", conf.port()); | ||||
|         return createGreaseWeazleUsb(conf.port(), conf); | ||||
|     } | ||||
| @@ -85,7 +85,7 @@ USB* get_usb_impl() | ||||
|                 candidate->serial, | ||||
|                 candidate->serialPort); | ||||
|             return createGreaseWeazleUsb( | ||||
|                 candidate->serialPort, globalConfig().usb().greaseweazle()); | ||||
|                 candidate->serialPort, globalConfig()->usb().greaseweazle()); | ||||
|  | ||||
|         default: | ||||
|             error("internal"); | ||||
|   | ||||
| @@ -88,8 +88,8 @@ public: | ||||
|         dev.readOnly = false; | ||||
|         dev.isNativeDev = true; | ||||
|         dev.devType = DEVTYPE_FLOPDD; | ||||
|         dev.cylinders = globalConfig().layout().tracks(); | ||||
|         dev.heads = globalConfig().layout().sides(); | ||||
|         dev.cylinders = globalConfig()->layout().tracks(); | ||||
|         dev.heads = globalConfig()->layout().sides(); | ||||
|         dev.sectors = Layout::getLayoutOfTrack(0, 0)->numSectors; | ||||
|         adfInitDevice(&dev, nullptr, false); | ||||
|         int res = adfCreateFlop(&dev, (char*)volumeName.c_str(), 0); | ||||
|   | ||||
| @@ -126,7 +126,7 @@ class CbmfsFilesystem : public Filesystem | ||||
|             bam.resize(fs->getLogicalSectorCount()); | ||||
|             usedBlocks = 0; | ||||
|             unsigned block = 0; | ||||
|             for (int track = 0; track < globalConfig().layout().tracks(); | ||||
|             for (int track = 0; track < globalConfig()->layout().tracks(); | ||||
|                  track++) | ||||
|             { | ||||
|                 uint8_t blocks = br.read_8(); | ||||
|   | ||||
| @@ -151,7 +151,7 @@ void Filesystem::discardChanges() | ||||
| Filesystem::Filesystem(std::shared_ptr<SectorInterface> sectors): | ||||
|     _sectors(sectors) | ||||
| { | ||||
|     auto& layout = globalConfig().layout(); | ||||
|     auto& layout = globalConfig()->layout(); | ||||
|     if (!layout.has_tracks() || !layout.has_sides()) | ||||
|         error( | ||||
|             "FS: filesystem support cannot be used without concrete layout " | ||||
|   | ||||
| @@ -7,16 +7,16 @@ extern const std::map<std::string, const ConfigProto*> formats; | ||||
|  | ||||
| static std::string supportStatus(SupportStatus status) | ||||
| { | ||||
| 	switch (status) | ||||
| 	{ | ||||
| 		case SupportStatus::DINOSAUR: | ||||
| 			return "🦖"; | ||||
|     switch (status) | ||||
|     { | ||||
|         case SupportStatus::DINOSAUR: | ||||
|             return "🦖"; | ||||
|  | ||||
| 		case SupportStatus::UNICORN: | ||||
|         case SupportStatus::UNICORN: | ||||
|             return "🦄"; | ||||
| 	} | ||||
|     } | ||||
|  | ||||
| 	return ""; | ||||
|     return ""; | ||||
| } | ||||
|  | ||||
| int main(int argc, const char* argv[]) | ||||
| @@ -24,7 +24,7 @@ int main(int argc, const char* argv[]) | ||||
|     fmt::print("<!-- FORMATSSTART -->\n"); | ||||
|     fmt::print( | ||||
|         "<!-- This section is automatically generated. Do not edit. -->\n"); | ||||
| 	fmt::print("\n"); | ||||
|     fmt::print("\n"); | ||||
|     fmt::print("| Profile | Format | Read? | Write? | Filesystem? |\n"); | ||||
|     fmt::print("|:--------|:-------|:-----:|:------:|:------------|\n"); | ||||
|  | ||||
|   | ||||
| @@ -20,7 +20,7 @@ static StringFlag destFlux({"--dest", "-d"}, | ||||
|     [](const auto& value) | ||||
|     { | ||||
|         FluxSink::updateConfigForFilename( | ||||
|             globalConfig().mutable_flux_sink(), value); | ||||
|             globalConfig()->mutable_flux_sink(), value); | ||||
|     }); | ||||
|  | ||||
| static IntFlag destTrack({"--cylinder", "-c"}, "track to write to", 0); | ||||
| @@ -247,15 +247,15 @@ static void draw_x_graticules(Agg2D& painter, | ||||
|  | ||||
| int mainAnalyseDriveResponse(int argc, const char* argv[]) | ||||
| { | ||||
|     globalConfig().mutable_flux_source()->set_type(FluxSourceProto::DRIVE); | ||||
|     globalConfig()->mutable_flux_source()->set_type(FluxSourceProto::DRIVE); | ||||
|     flags.parseFlagsWithConfigFiles(argc, argv, {}); | ||||
|  | ||||
|     if (globalConfig().flux_sink().type() != FluxSinkProto::DRIVE) | ||||
|     if (globalConfig()->flux_sink().type() != FluxSinkProto::DRIVE) | ||||
|         error("this only makes sense with a real disk drive"); | ||||
|  | ||||
|     usbSetDrive(globalConfig().drive().drive(), | ||||
|         globalConfig().drive().high_density(), | ||||
|         globalConfig().drive().index_mode()); | ||||
|     usbSetDrive(globalConfig()->drive().drive(), | ||||
|         globalConfig()->drive().high_density(), | ||||
|         globalConfig()->drive().index_mode()); | ||||
|     usbSeek(destTrack); | ||||
|  | ||||
|     std::cout << "Measuring rotational speed...\n"; | ||||
|   | ||||
| @@ -19,7 +19,7 @@ static StringFlag sourceFlux({"--source", "-s"}, | ||||
|     [](const auto& value) | ||||
|     { | ||||
|         FluxSource::updateConfigForFilename( | ||||
|             globalConfig().mutable_flux_source(), value); | ||||
|             globalConfig()->mutable_flux_source(), value); | ||||
|     }); | ||||
|  | ||||
| static IntFlag trackFlag({"--cylinder", "-c"}, "Track to read.", 0); | ||||
| @@ -132,11 +132,11 @@ static nanoseconds_t guessClock(const Fluxmap& fluxmap) | ||||
|  | ||||
| int mainInspect(int argc, const char* argv[]) | ||||
| { | ||||
|     globalConfig().mutable_flux_source()->set_type(FluxSourceProto::DRIVE); | ||||
|     globalConfig()->mutable_flux_source()->set_type(FluxSourceProto::DRIVE); | ||||
|     flags.parseFlagsWithConfigFiles(argc, argv, {}); | ||||
|  | ||||
|     std::unique_ptr<FluxSource> fluxSource( | ||||
|         FluxSource::create(globalConfig().flux_source())); | ||||
|         FluxSource::create(globalConfig()->flux_source())); | ||||
|     const auto fluxmap = fluxSource->readFlux(trackFlag, headFlag)->next(); | ||||
|  | ||||
|     std::cout << fmt::format("0x{:x} bytes of data in {:.3f}ms\n", | ||||
| @@ -220,7 +220,7 @@ int mainInspect(int argc, const char* argv[]) | ||||
|             "\n\nAligned bitstream from {:.3f}ms follows:\n", | ||||
|             fmr.tell().ns() / 1000000.0); | ||||
|  | ||||
|         FluxDecoder decoder(&fmr, clockPeriod, globalConfig().decoder()); | ||||
|         FluxDecoder decoder(&fmr, clockPeriod, globalConfig()->decoder()); | ||||
|         while (!fmr.eof()) | ||||
|         { | ||||
|             std::cout << fmt::format("{:06x} {: 10.3f} : ", | ||||
| @@ -245,7 +245,7 @@ int mainInspect(int argc, const char* argv[]) | ||||
|             dumpRawFlag.get(), | ||||
|             fmr.tell().ns() / 1000000.0); | ||||
|  | ||||
|         FluxDecoder decoder(&fmr, clockPeriod, globalConfig().decoder()); | ||||
|         FluxDecoder decoder(&fmr, clockPeriod, globalConfig()->decoder()); | ||||
|         for (int i = 0; i < dumpRawFlag; i++) | ||||
|             decoder.readBit(); | ||||
|  | ||||
|   | ||||
| @@ -23,7 +23,7 @@ static StringFlag sourceFlux({"-s", "--source"}, | ||||
|     [](const auto& value) | ||||
|     { | ||||
|         FluxSource::updateConfigForFilename( | ||||
|             globalConfig().mutable_flux_source(), value); | ||||
|             globalConfig()->mutable_flux_source(), value); | ||||
|     }); | ||||
|  | ||||
| static StringFlag destFlux({"-d", "--dest"}, | ||||
| @@ -32,7 +32,7 @@ static StringFlag destFlux({"-d", "--dest"}, | ||||
|     [](const auto& value) | ||||
|     { | ||||
|         FluxSink::updateConfigForFilename( | ||||
|             globalConfig().mutable_flux_sink(), value); | ||||
|             globalConfig()->mutable_flux_sink(), value); | ||||
|     }); | ||||
|  | ||||
| static StringFlag srcTracks({"--cylinders", "-c"}, | ||||
| @@ -40,7 +40,7 @@ static StringFlag srcTracks({"--cylinders", "-c"}, | ||||
|     "", | ||||
|     [](const auto& value) | ||||
|     { | ||||
|         setRange(globalConfig().mutable_tracks(), value); | ||||
|         setRange(globalConfig()->mutable_tracks(), value); | ||||
|     }); | ||||
|  | ||||
| static StringFlag srcHeads({"--heads", "-h"}, | ||||
| @@ -48,26 +48,26 @@ static StringFlag srcHeads({"--heads", "-h"}, | ||||
|     "", | ||||
|     [](const auto& value) | ||||
|     { | ||||
|         setRange(globalConfig().mutable_heads(), value); | ||||
|         setRange(globalConfig()->mutable_heads(), value); | ||||
|     }); | ||||
|  | ||||
| int mainRawRead(int argc, const char* argv[]) | ||||
| { | ||||
|     setRange(globalConfig().mutable_tracks(), "0-79"); | ||||
|     setRange(globalConfig().mutable_heads(), "0-1"); | ||||
|     setRange(globalConfig()->mutable_tracks(), "0-79"); | ||||
|     setRange(globalConfig()->mutable_heads(), "0-1"); | ||||
|  | ||||
|     if (argc == 1) | ||||
|         showProfiles("rawread", formats); | ||||
|     globalConfig().mutable_flux_source()->set_type(FluxSourceProto::DRIVE); | ||||
|     globalConfig()->mutable_flux_source()->set_type(FluxSourceProto::DRIVE); | ||||
|     flags.parseFlagsWithConfigFiles(argc, argv, formats); | ||||
|  | ||||
|     if (globalConfig().flux_sink().type() == FluxSinkProto::DRIVE) | ||||
|     if (globalConfig()->flux_sink().type() == FluxSinkProto::DRIVE) | ||||
|         error("you can't use rawread to write to hardware"); | ||||
|  | ||||
|     std::unique_ptr<FluxSource> fluxSource( | ||||
|         FluxSource::create(globalConfig().flux_source())); | ||||
|         FluxSource::create(globalConfig()->flux_source())); | ||||
|     std::unique_ptr<FluxSink> fluxSink( | ||||
|         FluxSink::create(globalConfig().flux_sink())); | ||||
|         FluxSink::create(globalConfig()->flux_sink())); | ||||
|  | ||||
|     rawReadDiskCommand(*fluxSource, *fluxSink); | ||||
|  | ||||
|   | ||||
| @@ -18,7 +18,7 @@ static StringFlag sourceFlux({"--source", "-s"}, | ||||
|     [](const auto& value) | ||||
|     { | ||||
|         FluxSource::updateConfigForFilename( | ||||
|             globalConfig().mutable_flux_source(), value); | ||||
|             globalConfig()->mutable_flux_source(), value); | ||||
|     }); | ||||
|  | ||||
| static StringFlag destFlux({"--dest", "-d"}, | ||||
| @@ -27,7 +27,7 @@ static StringFlag destFlux({"--dest", "-d"}, | ||||
|     [](const auto& value) | ||||
|     { | ||||
|         FluxSink::updateConfigForFilename( | ||||
|             globalConfig().mutable_flux_sink(), value); | ||||
|             globalConfig()->mutable_flux_sink(), value); | ||||
|     }); | ||||
|  | ||||
| static StringFlag destTracks({"--cylinders", "-c"}, | ||||
| @@ -35,7 +35,7 @@ static StringFlag destTracks({"--cylinders", "-c"}, | ||||
|     "", | ||||
|     [](const auto& value) | ||||
|     { | ||||
|         setRange(globalConfig().mutable_tracks(), value); | ||||
|         setRange(globalConfig()->mutable_tracks(), value); | ||||
|     }); | ||||
|  | ||||
| static StringFlag destHeads({"--heads", "-h"}, | ||||
| @@ -43,33 +43,33 @@ static StringFlag destHeads({"--heads", "-h"}, | ||||
|     "", | ||||
|     [](const auto& value) | ||||
|     { | ||||
|         setRange(globalConfig().mutable_heads(), value); | ||||
|         setRange(globalConfig()->mutable_heads(), value); | ||||
|     }); | ||||
|  | ||||
| static ActionFlag eraseFlag({"--erase"}, | ||||
|     "erases the destination", | ||||
|     []() | ||||
|     { | ||||
|         globalConfig().mutable_flux_source()->set_type(FluxSourceProto::ERASE); | ||||
|         globalConfig()->mutable_flux_source()->set_type(FluxSourceProto::ERASE); | ||||
|     }); | ||||
|  | ||||
| int mainRawWrite(int argc, const char* argv[]) | ||||
| { | ||||
|     setRange(globalConfig().mutable_tracks(), "0-79"); | ||||
|     setRange(globalConfig().mutable_heads(), "0-1"); | ||||
|     setRange(globalConfig()->mutable_tracks(), "0-79"); | ||||
|     setRange(globalConfig()->mutable_heads(), "0-1"); | ||||
|  | ||||
|     if (argc == 1) | ||||
|         showProfiles("rawwrite", formats); | ||||
|     globalConfig().mutable_flux_sink()->set_type(FluxSinkProto::DRIVE); | ||||
|     globalConfig()->mutable_flux_sink()->set_type(FluxSinkProto::DRIVE); | ||||
|     flags.parseFlagsWithConfigFiles(argc, argv, formats); | ||||
|  | ||||
|     if (globalConfig().flux_source().type() == FluxSourceProto::DRIVE) | ||||
|     if (globalConfig()->flux_source().type() == FluxSourceProto::DRIVE) | ||||
|         error("you can't use rawwrite to read from hardware"); | ||||
|  | ||||
|     std::unique_ptr<FluxSource> fluxSource( | ||||
|         FluxSource::create(globalConfig().flux_source())); | ||||
|         FluxSource::create(globalConfig()->flux_source())); | ||||
|     std::unique_ptr<FluxSink> fluxSink( | ||||
|         FluxSink::create(globalConfig().flux_sink())); | ||||
|         FluxSink::create(globalConfig()->flux_sink())); | ||||
|  | ||||
|     writeRawDiskCommand(*fluxSource, *fluxSink); | ||||
|     return 0; | ||||
|   | ||||
| @@ -23,7 +23,7 @@ static StringFlag sourceFlux({"-s", "--source"}, | ||||
|     [](const auto& value) | ||||
|     { | ||||
|         FluxSource::updateConfigForFilename( | ||||
|             globalConfig().mutable_flux_source(), value); | ||||
|             globalConfig()->mutable_flux_source(), value); | ||||
|     }); | ||||
|  | ||||
| static StringFlag destImage({"-o", "--output"}, | ||||
| @@ -32,7 +32,7 @@ static StringFlag destImage({"-o", "--output"}, | ||||
|     [](const auto& value) | ||||
|     { | ||||
|         ImageWriter::updateConfigForFilename( | ||||
|             globalConfig().mutable_image_writer(), value); | ||||
|             globalConfig()->mutable_image_writer(), value); | ||||
|     }); | ||||
|  | ||||
| static StringFlag copyFluxTo({"--copy-flux-to"}, | ||||
| @@ -41,7 +41,7 @@ static StringFlag copyFluxTo({"--copy-flux-to"}, | ||||
|     [](const auto& value) | ||||
|     { | ||||
|         FluxSink::updateConfigForFilename( | ||||
|             globalConfig().mutable_decoder()->mutable_copy_flux_to(), value); | ||||
|             globalConfig()->mutable_decoder()->mutable_copy_flux_to(), value); | ||||
|     }); | ||||
|  | ||||
| static StringFlag srcTracks({"--cylinders", "-c"}, | ||||
| @@ -49,7 +49,7 @@ static StringFlag srcTracks({"--cylinders", "-c"}, | ||||
|     "", | ||||
|     [](const auto& value) | ||||
|     { | ||||
|         setRange(globalConfig().mutable_tracks(), value); | ||||
|         setRange(globalConfig()->mutable_tracks(), value); | ||||
|     }); | ||||
|  | ||||
| static StringFlag srcHeads({"--heads", "-h"}, | ||||
| @@ -57,24 +57,25 @@ static StringFlag srcHeads({"--heads", "-h"}, | ||||
|     "", | ||||
|     [](const auto& value) | ||||
|     { | ||||
|         setRange(globalConfig().mutable_heads(), value); | ||||
|         setRange(globalConfig()->mutable_heads(), value); | ||||
|     }); | ||||
|  | ||||
| int mainRead(int argc, const char* argv[]) | ||||
| { | ||||
|     if (argc == 1) | ||||
|         showProfiles("read", formats); | ||||
|     globalConfig().mutable_flux_source()->set_type(FluxSourceProto::DRIVE); | ||||
|     globalConfig()->mutable_flux_source()->set_type(FluxSourceProto::DRIVE); | ||||
|     flags.parseFlagsWithConfigFiles(argc, argv, formats); | ||||
|  | ||||
|     if (globalConfig().decoder().copy_flux_to().type() == FluxSinkProto::DRIVE) | ||||
|     if (globalConfig()->decoder().copy_flux_to().type() == FluxSinkProto::DRIVE) | ||||
|         error("you cannot copy flux to a hardware device"); | ||||
|  | ||||
|     std::unique_ptr<FluxSource> fluxSource( | ||||
|         FluxSource::create(globalConfig().flux_source())); | ||||
|     std::unique_ptr<Decoder> decoder(Decoder::create(globalConfig().decoder())); | ||||
|         FluxSource::create(globalConfig()->flux_source())); | ||||
|     std::unique_ptr<Decoder> decoder( | ||||
|         Decoder::create(globalConfig()->decoder())); | ||||
|     std::unique_ptr<ImageWriter> writer( | ||||
|         ImageWriter::create(globalConfig().image_writer())); | ||||
|         ImageWriter::create(globalConfig()->image_writer())); | ||||
|  | ||||
|     readDiskCommand(*fluxSource, *decoder, *writer); | ||||
|  | ||||
|   | ||||
| @@ -13,21 +13,21 @@ static StringFlag sourceFlux({"-s", "--source"}, | ||||
|     [](const auto& value) | ||||
|     { | ||||
|         FluxSource::updateConfigForFilename( | ||||
|             globalConfig().mutable_flux_source(), value); | ||||
|             globalConfig()->mutable_flux_source(), value); | ||||
|     }); | ||||
|  | ||||
| int mainRpm(int argc, const char* argv[]) | ||||
| { | ||||
|     flags.parseFlagsWithConfigFiles(argc, argv, {}); | ||||
|  | ||||
|     if (globalConfig().flux_source().type() != FluxSourceProto::DRIVE) | ||||
|     if (globalConfig()->flux_source().type() != FluxSourceProto::DRIVE) | ||||
|         error("this only makes sense with a real disk drive"); | ||||
|  | ||||
|     usbSetDrive(globalConfig().drive().drive(), | ||||
|     usbSetDrive(globalConfig()->drive().drive(), | ||||
|         false, | ||||
|         globalConfig().drive().index_mode()); | ||||
|         globalConfig()->drive().index_mode()); | ||||
|     nanoseconds_t period = | ||||
|         usbGetRotationalPeriod(globalConfig().drive().hard_sector_count()); | ||||
|         usbGetRotationalPeriod(globalConfig()->drive().hard_sector_count()); | ||||
|     if (period != 0) | ||||
|         std::cout << "Rotational period is " << period / 1000000 << " ms (" | ||||
|                   << 60e9 / period << " rpm)" << std::endl; | ||||
|   | ||||
| @@ -13,7 +13,7 @@ static StringFlag sourceFlux({"-s", "--source"}, | ||||
|     [](const auto& value) | ||||
|     { | ||||
|         FluxSource::updateConfigForFilename( | ||||
|             globalConfig().mutable_flux_source(), value); | ||||
|             globalConfig()->mutable_flux_source(), value); | ||||
|     }); | ||||
|  | ||||
| static IntFlag track({"--cylinder", "-c"}, "track to seek to", 0); | ||||
| @@ -24,12 +24,12 @@ int mainSeek(int argc, const char* argv[]) | ||||
| { | ||||
|     flags.parseFlagsWithConfigFiles(argc, argv, {}); | ||||
|  | ||||
|     if (globalConfig().flux_source().type() != FluxSourceProto::DRIVE) | ||||
|     if (globalConfig()->flux_source().type() != FluxSourceProto::DRIVE) | ||||
|         error("this only makes sense with a real disk drive"); | ||||
|  | ||||
|     usbSetDrive(globalConfig().drive().drive(), | ||||
|     usbSetDrive(globalConfig()->drive().drive(), | ||||
|         false, | ||||
|         globalConfig().drive().index_mode()); | ||||
|         globalConfig()->drive().index_mode()); | ||||
|     usbSeek(track); | ||||
|     return 0; | ||||
| } | ||||
|   | ||||
| @@ -24,7 +24,7 @@ static StringFlag sourceImage({"--input", "-i"}, | ||||
|     [](const auto& value) | ||||
|     { | ||||
|         ImageReader::updateConfigForFilename( | ||||
|             globalConfig().mutable_image_reader(), value); | ||||
|             globalConfig()->mutable_image_reader(), value); | ||||
|     }); | ||||
|  | ||||
| static StringFlag destFlux({"--dest", "-d"}, | ||||
| @@ -33,9 +33,9 @@ static StringFlag destFlux({"--dest", "-d"}, | ||||
|     [](const auto& value) | ||||
|     { | ||||
|         FluxSink::updateConfigForFilename( | ||||
|             globalConfig().mutable_flux_sink(), value); | ||||
|             globalConfig()->mutable_flux_sink(), value); | ||||
|         FluxSource::updateConfigForFilename( | ||||
|             globalConfig().mutable_flux_source(), value); | ||||
|             globalConfig()->mutable_flux_source(), value); | ||||
|     }); | ||||
|  | ||||
| static StringFlag destTracks({"--cylinders", "-c"}, | ||||
| @@ -43,7 +43,7 @@ static StringFlag destTracks({"--cylinders", "-c"}, | ||||
|     "", | ||||
|     [](const auto& value) | ||||
|     { | ||||
|         setRange(globalConfig().mutable_tracks(), value); | ||||
|         setRange(globalConfig()->mutable_tracks(), value); | ||||
|     }); | ||||
|  | ||||
| static StringFlag destHeads({"--heads", "-h"}, | ||||
| @@ -51,7 +51,7 @@ static StringFlag destHeads({"--heads", "-h"}, | ||||
|     "", | ||||
|     [](const auto& value) | ||||
|     { | ||||
|         setRange(globalConfig().mutable_heads(), value); | ||||
|         setRange(globalConfig()->mutable_heads(), value); | ||||
|     }); | ||||
|  | ||||
| static ActionFlag noVerifyFlag({"--no-verify", "-n"}, | ||||
| @@ -65,27 +65,28 @@ int mainWrite(int argc, const char* argv[]) | ||||
| { | ||||
|     if (argc == 1) | ||||
|         showProfiles("write", formats); | ||||
|     globalConfig().mutable_flux_sink()->set_type(FluxSinkProto::DRIVE); | ||||
|     globalConfig()->mutable_flux_sink()->set_type(FluxSinkProto::DRIVE); | ||||
|     if (verify) | ||||
|         globalConfig().mutable_flux_source()->set_type(FluxSourceProto::DRIVE); | ||||
|         globalConfig()->mutable_flux_source()->set_type(FluxSourceProto::DRIVE); | ||||
|     flags.parseFlagsWithConfigFiles(argc, argv, formats); | ||||
|  | ||||
|     std::unique_ptr<ImageReader> reader( | ||||
|         ImageReader::create(globalConfig().image_reader())); | ||||
|         ImageReader::create(globalConfig()->image_reader())); | ||||
|     std::shared_ptr<Image> image = reader->readMappedImage(); | ||||
|  | ||||
|     std::unique_ptr<Encoder> encoder(Encoder::create(globalConfig().encoder())); | ||||
|     std::unique_ptr<Encoder> encoder( | ||||
|         Encoder::create(globalConfig()->encoder())); | ||||
|     std::unique_ptr<FluxSink> fluxSink( | ||||
|         FluxSink::create(globalConfig().flux_sink())); | ||||
|         FluxSink::create(globalConfig()->flux_sink())); | ||||
|  | ||||
|     std::unique_ptr<Decoder> decoder; | ||||
|     if (globalConfig().has_decoder() && verify) | ||||
|         decoder = Decoder::create(globalConfig().decoder()); | ||||
|     if (globalConfig()->has_decoder() && verify) | ||||
|         decoder = Decoder::create(globalConfig()->decoder()); | ||||
|  | ||||
|     std::unique_ptr<FluxSource> fluxSource; | ||||
|     if (verify && | ||||
|         (globalConfig().flux_source().type() == FluxSourceProto::DRIVE)) | ||||
|         fluxSource = FluxSource::create(globalConfig().flux_source()); | ||||
|         (globalConfig()->flux_source().type() == FluxSourceProto::DRIVE)) | ||||
|         fluxSource = FluxSource::create(globalConfig()->flux_source()); | ||||
|  | ||||
|     writeDiskCommand( | ||||
|         *image, *encoder, *fluxSink, decoder.get(), fluxSource.get()); | ||||
|   | ||||
| @@ -22,9 +22,9 @@ static StringFlag image({"-i", "--image"}, | ||||
|     [](const auto& value) | ||||
|     { | ||||
|         ImageReader::updateConfigForFilename( | ||||
|             globalConfig().mutable_image_reader(), value); | ||||
|             globalConfig()->mutable_image_reader(), value); | ||||
|         ImageWriter::updateConfigForFilename( | ||||
|             globalConfig().mutable_image_writer(), value); | ||||
|             globalConfig()->mutable_image_writer(), value); | ||||
|     }); | ||||
|  | ||||
| static StringFlag flux({"-f", "--flux"}, | ||||
| @@ -33,7 +33,7 @@ static StringFlag flux({"-f", "--flux"}, | ||||
|     [](const auto& value) | ||||
|     { | ||||
|         FluxSource::updateConfigForFilename( | ||||
|             globalConfig().mutable_flux_source(), value); | ||||
|             globalConfig()->mutable_flux_source(), value); | ||||
|         FluxSink::updateConfigForFilename( | ||||
|             globalConfig().mutable_flux_sink(), value); | ||||
|             globalConfig()->mutable_flux_sink(), value); | ||||
|     }); | ||||
|   | ||||
| @@ -164,7 +164,7 @@ private: | ||||
|                     (desiredSide != _explorerSide)) | ||||
|                 { | ||||
|                     auto fluxSource = | ||||
|                         FluxSource::create(globalConfig().flux_source()); | ||||
|                         FluxSource::create(globalConfig()->flux_source()); | ||||
|                     _explorerFluxmap = | ||||
|                         fluxSource->readFlux(desiredTrack, desiredSide)->next(); | ||||
|                     _explorerTrack = desiredTrack; | ||||
|   | ||||
| @@ -180,7 +180,7 @@ public: | ||||
|         if (formatSelection == wxNOT_FOUND) | ||||
|             error("no format selected"); | ||||
|  | ||||
|         globalConfig().Clear(); | ||||
|         globalConfig()->Clear(); | ||||
|         auto formatName = _formatNames[formatChoice->GetSelection()]; | ||||
|         FlagGroup::parseConfigFile(formatName, formats); | ||||
|  | ||||
| @@ -196,9 +196,9 @@ public: | ||||
|  | ||||
|         auto serial = _selectedDevice; | ||||
|         if (!serial.empty() && (serial[0] == '/')) | ||||
|             setProtoByString(&globalConfig(), "usb.greaseweazle.port", serial); | ||||
|             setProtoByString(globalConfig(), "usb.greaseweazle.port", serial); | ||||
|         else | ||||
|             setProtoByString(&globalConfig(), "usb.serial", serial); | ||||
|             setProtoByString(globalConfig(), "usb.serial", serial); | ||||
|  | ||||
|         ClearLog(); | ||||
|  | ||||
| @@ -208,15 +208,15 @@ public: | ||||
|         { | ||||
|             case SELECTEDSOURCE_REAL: | ||||
|             { | ||||
|                 globalConfig().mutable_drive()->set_high_density( | ||||
|                 globalConfig()->mutable_drive()->set_high_density( | ||||
|                     _selectedHighDensity); | ||||
|                 globalConfig().MergeFrom(*_selectedDriveType); | ||||
|                 globalConfig()->MergeFrom(*_selectedDriveType); | ||||
|  | ||||
|                 std::string filename = _selectedDrive ? "drive:1" : "drive:0"; | ||||
|                 FluxSink::updateConfigForFilename( | ||||
|                     globalConfig().mutable_flux_sink(), filename); | ||||
|                     globalConfig()->mutable_flux_sink(), filename); | ||||
|                 FluxSource::updateConfigForFilename( | ||||
|                     globalConfig().mutable_flux_source(), filename); | ||||
|                     globalConfig()->mutable_flux_source(), filename); | ||||
|  | ||||
|                 break; | ||||
|             } | ||||
| @@ -224,9 +224,9 @@ public: | ||||
|             case SELECTEDSOURCE_FLUX: | ||||
|             { | ||||
|                 FluxSink::updateConfigForFilename( | ||||
|                     globalConfig().mutable_flux_sink(), _selectedFluxfilename); | ||||
|                     globalConfig()->mutable_flux_sink(), _selectedFluxfilename); | ||||
|                 FluxSource::updateConfigForFilename( | ||||
|                     globalConfig().mutable_flux_source(), | ||||
|                     globalConfig()->mutable_flux_source(), | ||||
|                     _selectedFluxfilename); | ||||
|                 break; | ||||
|             } | ||||
| @@ -234,10 +234,10 @@ public: | ||||
|             case SELECTEDSOURCE_IMAGE: | ||||
|             { | ||||
|                 ImageReader::updateConfigForFilename( | ||||
|                     globalConfig().mutable_image_reader(), | ||||
|                     globalConfig()->mutable_image_reader(), | ||||
|                     _selectedImagefilename); | ||||
|                 ImageWriter::updateConfigForFilename( | ||||
|                     globalConfig().mutable_image_writer(), | ||||
|                     globalConfig()->mutable_image_writer(), | ||||
|                     _selectedImagefilename); | ||||
|                 break; | ||||
|             } | ||||
| @@ -258,7 +258,7 @@ public: | ||||
|             { | ||||
|                 auto key = setting.substr(0, equals); | ||||
|                 auto value = setting.substr(equals + 1); | ||||
|                 setProtoByString(&globalConfig(), key, value); | ||||
|                 setProtoByString(globalConfig(), key, value); | ||||
|             } | ||||
|             else | ||||
|                 FlagGroup::parseConfigFile(setting, formats); | ||||
| @@ -589,12 +589,12 @@ private: | ||||
|                     formatOptionsContainer, wxID_ANY, "(no format selected)")); | ||||
|             else | ||||
|             { | ||||
|                 globalConfig().Clear(); | ||||
|                 globalConfig()->Clear(); | ||||
|                 std::string formatName = | ||||
|                     _formatNames[formatChoice->GetSelection()]; | ||||
|                 FlagGroup::parseConfigFile(formatName, formats); | ||||
|  | ||||
|                 for (auto& group : globalConfig().option_group()) | ||||
|                 for (auto& group : globalConfig()->option_group()) | ||||
|                 { | ||||
|                     sizer->Add(new wxStaticText(formatOptionsContainer, | ||||
|                         wxID_ANY, | ||||
| @@ -646,7 +646,7 @@ private: | ||||
|  | ||||
|                 /* Anything that's _not_ in a group gets a checkbox. */ | ||||
|  | ||||
|                 for (auto& option : globalConfig().option()) | ||||
|                 for (auto& option : globalConfig()->option()) | ||||
|                 { | ||||
|                     auto* choice = new wxCheckBox( | ||||
|                         formatOptionsContainer, wxID_ANY, option.comment()); | ||||
| @@ -669,8 +669,8 @@ private: | ||||
|                         }); | ||||
|                 } | ||||
|  | ||||
|                 if (globalConfig().option().empty() && | ||||
|                     globalConfig().option_group().empty()) | ||||
|                 if (globalConfig()->option().empty() && | ||||
|                     globalConfig()->option_group().empty()) | ||||
|                     sizer->Add(new wxStaticText(formatOptionsContainer, | ||||
|                         wxID_ANY, | ||||
|                         "(no options for this format)")); | ||||
|   | ||||
| @@ -99,8 +99,8 @@ public: | ||||
|                     Environment::reset(); | ||||
|  | ||||
|                     auto fluxSource = | ||||
|                         FluxSource::create(globalConfig().flux_source()); | ||||
|                     auto decoder = Decoder::create(globalConfig().decoder()); | ||||
|                         FluxSource::create(globalConfig()->flux_source()); | ||||
|                     auto decoder = Decoder::create(globalConfig()->decoder()); | ||||
|                     auto diskflux = readDiskCommand(*fluxSource, *decoder); | ||||
|  | ||||
|                     runOnUiThread( | ||||
| @@ -124,15 +124,13 @@ public: | ||||
|         { | ||||
|             SetPage(MainWindow::PAGE_IMAGER); | ||||
|             PrepareConfig(); | ||||
|             if (!globalConfig().has_image_reader()) | ||||
|             if (!globalConfig()->has_image_reader()) | ||||
|                 error("This format cannot be read from images."); | ||||
|  | ||||
|             auto filename = wxFileSelector("Choose a image file to read", | ||||
|                 /* default_path= */ wxEmptyString, | ||||
|                 /* default_filename= */ | ||||
|                 globalConfig() | ||||
|                     .image_reader() | ||||
|                     .filename(), | ||||
|                 globalConfig()->image_reader().filename(), | ||||
|                 /* default_extension= */ wxEmptyString, | ||||
|                 /* wildcard= */ wxEmptyString, | ||||
|                 /* flags= */ wxFD_OPEN | wxFD_FILE_MUST_EXIST); | ||||
| @@ -140,9 +138,9 @@ public: | ||||
|                 return; | ||||
|  | ||||
|             ImageReader::updateConfigForFilename( | ||||
|                 globalConfig().mutable_image_reader(), filename.ToStdString()); | ||||
|                 globalConfig()->mutable_image_reader(), filename.ToStdString()); | ||||
|             ImageWriter::updateConfigForFilename( | ||||
|                 globalConfig().mutable_image_writer(), filename.ToStdString()); | ||||
|                 globalConfig()->mutable_image_writer(), filename.ToStdString()); | ||||
|             visualiser->Clear(); | ||||
|             _currentDisk = nullptr; | ||||
|  | ||||
| @@ -151,19 +149,19 @@ public: | ||||
|                 [this]() | ||||
|                 { | ||||
|                     auto image = | ||||
|                         ImageReader::create(globalConfig().image_reader()) | ||||
|                         ImageReader::create(globalConfig()->image_reader()) | ||||
|                             ->readMappedImage(); | ||||
|                     auto encoder = Encoder::create(globalConfig().encoder()); | ||||
|                     auto encoder = Encoder::create(globalConfig()->encoder()); | ||||
|                     auto fluxSink = | ||||
|                         FluxSink::create(globalConfig().flux_sink()); | ||||
|                         FluxSink::create(globalConfig()->flux_sink()); | ||||
|  | ||||
|                     std::unique_ptr<Decoder> decoder; | ||||
|                     std::unique_ptr<FluxSource> fluxSource; | ||||
|                     if (globalConfig().has_decoder()) | ||||
|                     if (globalConfig()->has_decoder()) | ||||
|                     { | ||||
|                         decoder = Decoder::create(globalConfig().decoder()); | ||||
|                         decoder = Decoder::create(globalConfig()->decoder()); | ||||
|                         fluxSource = | ||||
|                             FluxSource::create(globalConfig().flux_source()); | ||||
|                             FluxSource::create(globalConfig()->flux_source()); | ||||
|                     } | ||||
|  | ||||
|                     writeDiskCommand(*image, | ||||
| @@ -250,16 +248,14 @@ public: | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             if (!globalConfig().has_image_writer()) | ||||
|             if (!globalConfig()->has_image_writer()) | ||||
|                 error("This format cannot be saved."); | ||||
|  | ||||
|             auto filename = | ||||
|                 wxFileSelector("Choose the name of the image file to write", | ||||
|                     /* default_path= */ wxEmptyString, | ||||
|                     /* default_filename= */ | ||||
|                     globalConfig() | ||||
|                         .image_writer() | ||||
|                         .filename(), | ||||
|                     globalConfig()->image_writer().filename(), | ||||
|                     /* default_extension= */ wxEmptyString, | ||||
|                     /* wildcard= */ wxEmptyString, | ||||
|                     /* flags= */ wxFD_SAVE | wxFD_OVERWRITE_PROMPT); | ||||
| @@ -267,7 +263,7 @@ public: | ||||
|                 return; | ||||
|  | ||||
|             ImageWriter::updateConfigForFilename( | ||||
|                 globalConfig().mutable_image_writer(), filename.ToStdString()); | ||||
|                 globalConfig()->mutable_image_writer(), filename.ToStdString()); | ||||
|  | ||||
|             auto image = _currentDisk->image; | ||||
|  | ||||
| @@ -275,7 +271,7 @@ public: | ||||
|                 [image, this]() | ||||
|                 { | ||||
|                     auto imageWriter = | ||||
|                         ImageWriter::create(globalConfig().image_writer()); | ||||
|                         ImageWriter::create(globalConfig()->image_writer()); | ||||
|                     imageWriter->writeMappedImage(*image); | ||||
|                 }); | ||||
|         } | ||||
| @@ -300,7 +296,7 @@ public: | ||||
|                 return; | ||||
|  | ||||
|             FluxSink::updateConfigForFilename( | ||||
|                 globalConfig().mutable_flux_sink(), filename.ToStdString()); | ||||
|                 globalConfig()->mutable_flux_sink(), filename.ToStdString()); | ||||
|  | ||||
|             QueueJob( | ||||
|                 [this]() | ||||
| @@ -308,7 +304,7 @@ public: | ||||
|                     auto fluxSource = | ||||
|                         FluxSource::createMemoryFluxSource(*_currentDisk); | ||||
|                     auto fluxSink = | ||||
|                         FluxSink::create(globalConfig().flux_sink()); | ||||
|                         FluxSink::create(globalConfig()->flux_sink()); | ||||
|                     writeRawDiskCommand(*fluxSource, *fluxSink); | ||||
|                 }); | ||||
|         } | ||||
|   | ||||
| @@ -72,8 +72,8 @@ static void setBlock( | ||||
| static void testPartialExtent() | ||||
| { | ||||
|     auto sectors = std::make_shared<TestSectorInterface>(); | ||||
|     auto fs = | ||||
|         Filesystem::createCpmFsFilesystem(globalConfig().filesystem(), sectors); | ||||
|     auto fs = Filesystem::createCpmFsFilesystem( | ||||
|         globalConfig()->filesystem(), sectors); | ||||
|  | ||||
|     setBlock(sectors, | ||||
|         0, | ||||
| @@ -92,8 +92,8 @@ static void testPartialExtent() | ||||
| static void testLogicalExtents() | ||||
| { | ||||
|     auto sectors = std::make_shared<TestSectorInterface>(); | ||||
|     auto fs = | ||||
|         Filesystem::createCpmFsFilesystem(globalConfig().filesystem(), sectors); | ||||
|     auto fs = Filesystem::createCpmFsFilesystem( | ||||
|         globalConfig()->filesystem(), sectors); | ||||
|  | ||||
|     setBlock(sectors, | ||||
|         0, | ||||
| @@ -143,7 +143,7 @@ int main(void) | ||||
| 				} | ||||
| 			} | ||||
| 		)M"; | ||||
|         google::protobuf::TextFormat::MergeFromString(text, &globalConfig()); | ||||
|         google::protobuf::TextFormat::MergeFromString(text, globalConfig()); | ||||
|  | ||||
|         testPartialExtent(); | ||||
|         testLogicalExtents(); | ||||
|   | ||||
| @@ -19,9 +19,9 @@ static std::string cleanup(const std::string& s) | ||||
|  | ||||
| static void load_config(const std::string s) | ||||
| { | ||||
|     globalConfig().Clear(); | ||||
|     globalConfig()->Clear(); | ||||
|     if (!google::protobuf::TextFormat::MergeFromString( | ||||
|             cleanup(s), &globalConfig())) | ||||
|             cleanup(s), globalConfig())) | ||||
|         error("couldn't load test config"); | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user