#ifndef DECODERS_H #define DECODERS_H #include "lib/core/bytes.h" #include "lib/data/sector.h" #include "lib/data/fluxmapreader.h" #include "lib/decoders/fluxdecoder.h" class Sector; class Fluxmap; class FluxMatcher; class FluxmapReader; class RawBits; class DecoderProto; class Config; #include "lib/data/flux.h" extern void setDecoderManualClockRate(double clockrate_us); extern Bytes decodeFmMfm(std::vector::const_iterator start, std::vector::const_iterator end); extern void encodeMfm(std::vector& bits, unsigned& cursor, const Bytes& input, bool& lastBit); extern void encodeFm( std::vector& bits, unsigned& cursor, const Bytes& input); extern Bytes encodeMfm(const Bytes& input, bool& lastBit); static inline Bytes decodeFmMfm(const std::vector bits) { return decodeFmMfm(bits.begin(), bits.end()); } class Decoder { public: Decoder(const DecoderProto& config): _config(config) {} virtual ~Decoder() {} static std::unique_ptr create(Config& config); static std::unique_ptr create(const DecoderProto& config); public: enum RecordType { SECTOR_RECORD, DATA_RECORD, UNKNOWN_RECORD }; public: std::shared_ptr decodeToSectors( std::shared_ptr fluxmap, std::shared_ptr& trackInfo); void pushRecord( const Fluxmap::Position& start, const Fluxmap::Position& end); void resetFluxDecoder(); std::vector readRawBits(unsigned count); uint8_t readRaw8(); uint16_t readRaw16(); uint32_t readRaw20(); uint32_t readRaw24(); uint32_t readRaw32(); uint64_t readRaw48(); uint64_t readRaw64(); Fluxmap::Position tell() { return _fmr->tell(); } void rewind() { _fmr->rewind(); } void seek(const Fluxmap::Position& pos) { return _fmr->seek(pos); } nanoseconds_t seekToPattern(const FluxMatcher& pattern); void seekToIndexMark(); bool eof() const { return _fmr->eof(); } nanoseconds_t getFluxmapDuration() const { return _fmr->getDuration(); } protected: virtual void beginTrack() {}; virtual nanoseconds_t advanceToNextRecord() = 0; virtual void decodeSectorRecord() = 0; virtual void decodeDataRecord() {}; const DecoderProto& _config; std::shared_ptr _trackdata; std::shared_ptr _sector; std::unique_ptr _decoder; std::vector _recordBits; private: FluxmapReader* _fmr = nullptr; }; #endif