mirror of
				https://github.com/davidgiven/fluxengine.git
				synced 2025-10-24 11:11:02 -07:00 
			
		
		
		
	ImageReaders can now contribute config.
This commit is contained in:
		| @@ -78,15 +78,15 @@ public: | ||||
|                 if (disktype == 1) | ||||
|                 { | ||||
|                     /* 5.25" with quarter stepping. */ | ||||
|                     _fluxConfig.mutable_drive()->set_tracks(160); | ||||
|                     _fluxConfig.mutable_drive()->set_heads(1); | ||||
|                     _fluxConfig.mutable_drive()->set_head_width(4); | ||||
|                     _fluxConfig.mutable_drive()->set_tpi(48 * 4); | ||||
|                     _extraConfig.mutable_drive()->set_tracks(160); | ||||
|                     _extraConfig.mutable_drive()->set_heads(1); | ||||
|                     _extraConfig.mutable_drive()->set_head_width(4); | ||||
|                     _extraConfig.mutable_drive()->set_tpi(48 * 4); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     /* 3.5". */ | ||||
|                     _fluxConfig.mutable_drive()->set_tpi(135); | ||||
|                     _extraConfig.mutable_drive()->set_tpi(135); | ||||
|                 } | ||||
|  | ||||
|                 Bytes stream = findChunk("STRM"); | ||||
|   | ||||
| @@ -37,7 +37,7 @@ public: | ||||
|     { | ||||
|         _proto = loadFl2File(_config.filename()); | ||||
|  | ||||
|         *_fluxConfig.mutable_drive() = _proto.drive(); | ||||
|         *_extraConfig.mutable_drive() = _proto.drive(); | ||||
|     } | ||||
|  | ||||
| public: | ||||
|   | ||||
| @@ -59,26 +59,30 @@ public: | ||||
|     static std::unique_ptr<FluxSource> create(const FluxSourceProto& spec); | ||||
|  | ||||
| public: | ||||
| 	/* Returns any configuration this flux source might be carrying (e.g. tpi | ||||
| 	 * of the drive which made the capture). */ | ||||
|     /* Returns any configuration this flux source might be carrying (e.g. tpi | ||||
|      * of the drive which made the capture). */ | ||||
|  | ||||
| 	const ConfigProto& getConfig() const | ||||
| 	{ return _fluxConfig; } | ||||
|     const ConfigProto& getExtraConfig() const | ||||
|     { | ||||
|         return _extraConfig; | ||||
|     } | ||||
|  | ||||
| 	/* Read flux from a given track and side. */ | ||||
|     /* Read flux from a given track and side. */ | ||||
|  | ||||
|     virtual std::unique_ptr<FluxSourceIterator> readFlux( | ||||
|         int track, int side) = 0; | ||||
|  | ||||
| 	/* Recalibrates; seeks to track 0 and ensures the head is in the right place. */ | ||||
|     /* Recalibrates; seeks to track 0 and ensures the head is in the right | ||||
|      * place. */ | ||||
|  | ||||
|     virtual void recalibrate() {} | ||||
|  | ||||
| 	/* Seeks to a given track (without recalibrating). */ | ||||
|     /* Seeks to a given track (without recalibrating). */ | ||||
|  | ||||
|     virtual void seek(int track) {} | ||||
|  | ||||
| 	/* Is this real hardware? If so, then flux can be read indefinitely (among other things). */ | ||||
|     /* Is this real hardware? If so, then flux can be read indefinitely (among | ||||
|      * other things). */ | ||||
|  | ||||
|     virtual bool isHardware() | ||||
|     { | ||||
| @@ -86,7 +90,7 @@ public: | ||||
|     } | ||||
|  | ||||
| protected: | ||||
| 	ConfigProto _fluxConfig; | ||||
|     ConfigProto _extraConfig; | ||||
| }; | ||||
|  | ||||
| class EmptyFluxSourceIterator : public FluxSourceIterator | ||||
|   | ||||
| @@ -43,7 +43,7 @@ public: | ||||
|             error("input not a SCP file"); | ||||
|  | ||||
|         int tpi = (_header.flags & SCP_FLAG_96TPI) ? 96 : 48; | ||||
|         _fluxConfig.mutable_drive()->set_tpi(tpi); | ||||
|         _extraConfig.mutable_drive()->set_tpi(tpi); | ||||
|  | ||||
|         _resolution = 25 * (_header.resolution + 1); | ||||
|         int startSide = (_header.heads == 2) ? 1 : 0; | ||||
|   | ||||
| @@ -56,27 +56,21 @@ public: | ||||
|         inputFile.read((char*)trackTable.begin(), trackTable.size()); | ||||
|         ByteReader trackTableReader(trackTable); | ||||
|  | ||||
|         if (globalConfig()->encoder().format_case() != | ||||
|             EncoderProto::FormatCase::FORMAT_NOT_SET) | ||||
|             log("D88: overriding configured format"); | ||||
|  | ||||
|         auto ibm = globalConfig()->mutable_encoder()->mutable_ibm(); | ||||
|         auto ibm = _extraConfig.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); | ||||
|             _extraConfig.mutable_drive()->set_high_density(true); | ||||
|             _extraConfig.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); | ||||
|             _extraConfig.mutable_drive()->set_high_density(false); | ||||
|             _extraConfig.mutable_layout()->set_tpi(48); | ||||
|         } | ||||
|  | ||||
|         auto layout = globalConfig()->mutable_layout(); | ||||
|         auto layout = _extraConfig.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(); | ||||
|         auto layout = _extraConfig.mutable_layout(); | ||||
|         if (globalConfig()->encoder().format_case() == | ||||
|             EncoderProto::FormatCase::FORMAT_NOT_SET) | ||||
|         { | ||||
|             auto ibm = globalConfig()->mutable_encoder()->mutable_ibm(); | ||||
|             auto ibm = _extraConfig.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(); | ||||
|             _extraConfig.mutable_decoder()->mutable_ibm(); | ||||
|         } | ||||
|  | ||||
|         image->calculateSize(); | ||||
|   | ||||
| @@ -70,11 +70,11 @@ public: | ||||
|             trackCount++; | ||||
|         } | ||||
|  | ||||
|         auto layout = globalConfig()->mutable_layout(); | ||||
|         auto layout = _extraConfig.mutable_layout(); | ||||
|         if (globalConfig()->encoder().format_case() == | ||||
|             EncoderProto::FormatCase::FORMAT_NOT_SET) | ||||
|         { | ||||
|             auto ibm = globalConfig()->mutable_encoder()->mutable_ibm(); | ||||
|             auto ibm = _extraConfig.mutable_encoder()->mutable_ibm(); | ||||
|             auto trackdata = ibm->add_trackdata(); | ||||
|             trackdata->set_target_clock_period_us(2); | ||||
|  | ||||
|   | ||||
| @@ -2,9 +2,11 @@ | ||||
| #define IMAGEREADER_H | ||||
|  | ||||
| #include "image.h" | ||||
| #include "lib/config.pb.h" | ||||
|  | ||||
| class ImageSpec; | ||||
| class ImageReaderProto; | ||||
| class ConfigProto; | ||||
|  | ||||
| class ImageReader | ||||
| { | ||||
| @@ -40,15 +42,22 @@ public: | ||||
|         const ImageReaderProto& config); | ||||
|  | ||||
| public: | ||||
|     /* Returns any extra config the image might want to contribute. */ | ||||
|  | ||||
|     const ConfigProto& getContributedConfig() const; | ||||
|  | ||||
|     /* Directly reads the image. */ | ||||
|  | ||||
|     virtual std::unique_ptr<Image> readImage() = 0; | ||||
|  | ||||
|     /* Reads the image, and then applies any optional mapping to go from | ||||
|      * filesystem ordering to disk ordering. */ | ||||
|  | ||||
|     std::unique_ptr<Image> readMappedImage(); | ||||
|  | ||||
| protected: | ||||
|     const ImageReaderProto& _config; | ||||
|     ConfigProto _extraConfig; | ||||
| }; | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -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 = _extraConfig.mutable_layout(); | ||||
|  | ||||
|         unsigned n = 0; | ||||
|         unsigned headerPtr = 0; | ||||
| @@ -259,7 +259,7 @@ public: | ||||
|                 headerPtr++; | ||||
|             } | ||||
|  | ||||
|             auto ibm = globalConfig()->mutable_encoder()->mutable_ibm(); | ||||
|             auto ibm = _extraConfig.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 (_extraConfig.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(); | ||||
|         const 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 (_extraConfig.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 = _extraConfig.mutable_encoder()->mutable_ibm(); | ||||
|         auto layout = _extraConfig.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); | ||||
|         _extraConfig.mutable_drive()->set_high_density(true); | ||||
|         _extraConfig.mutable_layout()->set_tpi(96); | ||||
|  | ||||
|         std::unique_ptr<Image> image(new Image); | ||||
|         for (int track = 0; track < 163; track++) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user