mirror of
https://github.com/davidgiven/fluxengine.git
synced 2025-10-31 11:17:01 -07:00
Merge pull request #778 from davidgiven/refactor
Even more cleanup refactoring.
This commit is contained in:
@@ -2,10 +2,10 @@
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "aeslanier.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/decoders/fluxpattern.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "fmt/format.h"
|
||||
#include <string.h>
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "agat.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/decoders/fluxpattern.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "fmt/format.h"
|
||||
#include <string.h>
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
#include "agat.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/readerwriter.h"
|
||||
#include "lib/image.h"
|
||||
#include "lib/layout.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include "arch/agat/agat.pb.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/decoders/fluxpattern.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "amiga.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "fmt/format.h"
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#include "amiga.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/readerwriter.h"
|
||||
#include "lib/image.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "arch/amiga/amiga.pb.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/decoders/fluxpattern.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "apple2.h"
|
||||
#include "arch/apple2/apple2.pb.h"
|
||||
#include "lib/decoders/decoders.pb.h"
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
#include "arch/apple2/apple2.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/readerwriter.h"
|
||||
#include "lib/image.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "fmt/format.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
#include <ctype.h>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/decoders/fluxpattern.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "brother.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include <ctype.h>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#include "brother.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/readerwriter.h"
|
||||
#include "lib/image.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "arch/brother/brother.pb.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/decoders/fluxpattern.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "c64.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/core/bytes.h"
|
||||
|
||||
@@ -3,13 +3,13 @@
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "c64.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/readerwriter.h"
|
||||
#include "lib/image.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "fmt/format.h"
|
||||
#include "arch/c64/c64.pb.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
#include "lib/layout.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include <ctype.h>
|
||||
#include "lib/core/bytes.h"
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/decoders/fluxpattern.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "f85.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/core/bytes.h"
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/decoders/fluxpattern.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "fb100.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/core/bytes.h"
|
||||
|
||||
@@ -2,13 +2,13 @@
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "ibm.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/decoders/fluxpattern.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "arch/ibm/ibm.pb.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/layout.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include <string.h>
|
||||
|
||||
static_assert(std::is_trivially_copyable<IbmIdam>::value,
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/config.h"
|
||||
#include "lib/config/config.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "ibm.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/readerwriter.h"
|
||||
#include "lib/image.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "arch/ibm/ibm.pb.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
#include "fmt/format.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/layout.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include <ctype.h>
|
||||
|
||||
/* IAM record separator:
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/decoders/fluxpattern.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "macintosh.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "fmt/format.h"
|
||||
|
||||
@@ -4,10 +4,10 @@
|
||||
#include "macintosh.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/readerwriter.h"
|
||||
#include "lib/image.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "fmt/format.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
#include "lib/layout.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include "arch/macintosh/macintosh.pb.h"
|
||||
#include <ctype.h>
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/decoders/fluxpattern.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "micropolis.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "fmt/format.h"
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "micropolis.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "lib/image.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
|
||||
static void write_sector(std::vector<bool>& bits,
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "arch/mx/mx.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/decoders/fluxpattern.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include <string.h>
|
||||
|
||||
const int SECTOR_SIZE = 256;
|
||||
|
||||
@@ -12,11 +12,11 @@
|
||||
*/
|
||||
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/decoders/fluxpattern.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "northstar.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "lib/decoders/decoders.pb.h"
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "northstar.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "lib/image.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
|
||||
#define GAP_FILL_SIZE_SD 30
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/decoders/fluxpattern.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "rolandd20.h"
|
||||
#include <string.h>
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/decoders/fluxpattern.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "smaky6.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "lib/core/crc.h"
|
||||
|
||||
@@ -1,24 +1,21 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/config.h"
|
||||
#include "lib/config/config.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "arch/tartu/tartu.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/decoders/fluxpattern.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include <string.h>
|
||||
|
||||
constexpr uint64_t HEADER_BITS = 0xaaaaaaaa44895554LL;
|
||||
constexpr uint64_t DATA_BITS = 0xaaaaaaaa44895545LL;
|
||||
constexpr uint64_t DATA_BITS = 0xaaaaaaaa44895545LL;
|
||||
|
||||
static const FluxPattern HEADER_PATTERN(64, HEADER_BITS);
|
||||
static const FluxPattern DATA_PATTERN(64, DATA_BITS);
|
||||
|
||||
const FluxMatchers ANY_RECORD_PATTERN {
|
||||
&HEADER_PATTERN,
|
||||
&DATA_PATTERN
|
||||
};
|
||||
const FluxMatchers ANY_RECORD_PATTERN{&HEADER_PATTERN, &DATA_PATTERN};
|
||||
|
||||
class TartuDecoder : public Decoder
|
||||
{
|
||||
@@ -29,9 +26,7 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
void beginTrack() override
|
||||
{
|
||||
}
|
||||
void beginTrack() override {}
|
||||
|
||||
nanoseconds_t advanceToNextRecord() override
|
||||
{
|
||||
@@ -45,7 +40,7 @@ public:
|
||||
|
||||
auto bits = readRawBits(16 * 4);
|
||||
auto bytes = decodeFmMfm(bits).slice(0, 4);
|
||||
|
||||
|
||||
ByteReader br(bytes);
|
||||
uint8_t track = br.read_8();
|
||||
_sector->logicalTrack = track >> 1;
|
||||
@@ -54,7 +49,7 @@ public:
|
||||
_sector->logicalSector = br.read_8();
|
||||
uint8_t wantChecksum = br.read_8();
|
||||
uint8_t gotChecksum = ~sumBytes(bytes.slice(0, 3));
|
||||
|
||||
|
||||
if (wantChecksum == gotChecksum)
|
||||
_sector->status = Sector::DATA_MISSING;
|
||||
|
||||
@@ -65,14 +60,15 @@ public:
|
||||
{
|
||||
if (readRaw64() != DATA_BITS)
|
||||
return;
|
||||
|
||||
|
||||
const auto& bits = readRawBits(129 * 16);
|
||||
const auto& bytes = decodeFmMfm(bits).slice(0, 129);
|
||||
_sector->data = bytes.slice(0, 128);
|
||||
|
||||
uint8_t wantChecksum = bytes.reader().seek(128).read_8();
|
||||
uint8_t gotChecksum = ~sumBytes(_sector->data);
|
||||
_sector->status = (wantChecksum == gotChecksum) ? Sector::OK : Sector::BAD_CHECKSUM;
|
||||
_sector->status =
|
||||
(wantChecksum == gotChecksum) ? Sector::OK : Sector::BAD_CHECKSUM;
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -83,4 +79,3 @@ std::unique_ptr<Decoder> createTartuDecoder(const DecoderProto& config)
|
||||
{
|
||||
return std::unique_ptr<Decoder>(new TartuDecoder(config));
|
||||
}
|
||||
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/config.h"
|
||||
#include "lib/config/config.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "arch/tartu/tartu.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include <string.h>
|
||||
|
||||
class TartuEncoder : public Encoder
|
||||
|
||||
@@ -3,10 +3,10 @@
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "arch/tids990/tids990.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/decoders/fluxpattern.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include <string.h>
|
||||
#include "fmt/format.h"
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#include "tids990.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/readerwriter.h"
|
||||
#include "lib/image.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "arch/tids990/tids990.pb.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
#include "fmt/format.h"
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/decoders/fluxpattern.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "victor9k.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/core/bytes.h"
|
||||
|
||||
@@ -3,13 +3,13 @@
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "victor9k.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/readerwriter.h"
|
||||
#include "lib/image.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "fmt/format.h"
|
||||
#include "arch/victor9k/victor9k.pb.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
#include "lib/layout.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include <ctype.h>
|
||||
#include "lib/core/bytes.h"
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/decoders/fluxpattern.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "zilogmcz.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "lib/core/crc.h"
|
||||
|
||||
22
build.py
22
build.py
@@ -25,16 +25,13 @@ protocc(name="fl2_proto_lib", srcs=["+fl2_proto"])
|
||||
cxxlibrary(
|
||||
name="lib",
|
||||
srcs=[
|
||||
"./lib/config.cc",
|
||||
"./lib/decoders/decoders.cc",
|
||||
"./lib/fl2.cc",
|
||||
"./lib/decoders/fluxdecoder.cc",
|
||||
"./lib/decoders/fluxmapreader.cc",
|
||||
"./lib/decoders/fluxpattern.cc",
|
||||
"./lib/decoders/fmmfm.cc",
|
||||
"./lib/encoders/encoders.cc",
|
||||
"./lib/fl2.cc",
|
||||
"./lib/flags.cc",
|
||||
"./lib/fluxmap.cc",
|
||||
"./lib/fluxsink/a2rfluxsink.cc",
|
||||
"./lib/fluxsink/aufluxsink.cc",
|
||||
"./lib/fluxsink/fl2fluxsink.cc",
|
||||
@@ -58,7 +55,6 @@ cxxlibrary(
|
||||
"./lib/fluxsource/scpfluxsource.cc",
|
||||
"./lib/fluxsource/testpatternfluxsource.cc",
|
||||
"./lib/globals.cc",
|
||||
"./lib/image.cc",
|
||||
"./lib/imagereader/d64imagereader.cc",
|
||||
"./lib/imagereader/d88imagereader.cc",
|
||||
"./lib/imagereader/dimimagereader.cc",
|
||||
@@ -80,12 +76,8 @@ cxxlibrary(
|
||||
"./lib/imagewriter/ldbsimagewriter.cc",
|
||||
"./lib/imagewriter/nsiimagewriter.cc",
|
||||
"./lib/imagewriter/rawimagewriter.cc",
|
||||
"./lib/layout.cc",
|
||||
"./lib/ldbs.cc",
|
||||
"./lib/logger.cc",
|
||||
"./lib/proto.cc",
|
||||
"./lib/readerwriter.cc",
|
||||
"./lib/sector.cc",
|
||||
"./lib/usb/applesauceusb.cc",
|
||||
"./lib/usb/fluxengineusb.cc",
|
||||
"./lib/usb/greaseweazle.cc",
|
||||
@@ -156,7 +148,6 @@ cxxlibrary(
|
||||
"arch/c64/c64.h": "./arch/c64/c64.h",
|
||||
"arch/tartu/tartu.h": "./arch/tartu/tartu.h",
|
||||
"lib/a2r.h": "./lib/a2r.h",
|
||||
"lib/config.h": "./lib/config.h",
|
||||
"lib/decoders/decoders.h": "./lib/decoders/decoders.h",
|
||||
"lib/decoders/fluxdecoder.h": "./lib/decoders/fluxdecoder.h",
|
||||
"lib/decoders/fluxmapreader.h": "./lib/decoders/fluxmapreader.h",
|
||||
@@ -165,24 +156,16 @@ cxxlibrary(
|
||||
"lib/encoders/encoders.h": "./lib/encoders/encoders.h",
|
||||
"lib/scp.h": "./lib/scp.h",
|
||||
"lib/fl2.h": "./lib/fl2.h",
|
||||
"lib/flags.h": "./lib/flags.h",
|
||||
"lib/flux.h": "./lib/flux.h",
|
||||
"lib/fluxmap.h": "./lib/fluxmap.h",
|
||||
"lib/fluxsink/fluxsink.h": "./lib/fluxsink/fluxsink.h",
|
||||
"lib/fluxsource/catweasel.h": "lib/fluxsource/catweasel.h",
|
||||
"lib/fluxsource/fluxsource.h": "lib/fluxsource/fluxsource.h",
|
||||
"lib/fluxsource/flx.h": "lib/fluxsource/flx.h",
|
||||
"lib/fluxsource/kryoflux.h": "lib/fluxsource/kryoflux.h",
|
||||
"lib/globals.h": "./lib/globals.h",
|
||||
"lib/image.h": "./lib/image.h",
|
||||
"lib/imagereader/imagereader.h": "./lib/imagereader/imagereader.h",
|
||||
"lib/imagewriter/imagewriter.h": "./lib/imagewriter/imagewriter.h",
|
||||
"lib/layout.h": "./lib/layout.h",
|
||||
"lib/ldbs.h": "./lib/ldbs.h",
|
||||
"lib/logger.h": "./lib/logger.h",
|
||||
"lib/proto.h": "./lib/proto.h",
|
||||
"lib/readerwriter.h": "./lib/readerwriter.h",
|
||||
"lib/sector.h": "./lib/sector.h",
|
||||
"lib/usb/applesauce.h": "./lib/usb/applesauce.h",
|
||||
"lib/usb/greaseweazle.h": "./lib/usb/greaseweazle.h",
|
||||
"lib/usb/usb.h": "./lib/usb/usb.h",
|
||||
@@ -197,8 +180,9 @@ cxxlibrary(
|
||||
"dep/hfsutils",
|
||||
"dep/libusbp",
|
||||
"dep/stb",
|
||||
"lib+config_proto_lib",
|
||||
"lib/core",
|
||||
"lib/config",
|
||||
"lib/data",
|
||||
"lib/fluxsource+proto_lib",
|
||||
],
|
||||
)
|
||||
|
||||
@@ -186,7 +186,6 @@ def libraryimpl(
|
||||
name=f"{self.localname}_hdr",
|
||||
ins=ins,
|
||||
outs=outs,
|
||||
deps=deps,
|
||||
commands=cs,
|
||||
label="CHEADERS",
|
||||
)
|
||||
|
||||
@@ -15,4 +15,5 @@ clibrary(
|
||||
"ffconf.h": "./source/ffconf.h",
|
||||
"diskio.h": "./source/diskio.h",
|
||||
},
|
||||
cflags=["-Wno-pointer-sign"],
|
||||
)
|
||||
|
||||
@@ -22,4 +22,5 @@ clibrary(
|
||||
"libhfs.h": "./libhfs/libhfs.h",
|
||||
"os.h": "./libhfs/os.h",
|
||||
},
|
||||
cflags=["-Wno-pointer-sign"],
|
||||
)
|
||||
|
||||
@@ -60,7 +60,11 @@ else:
|
||||
clibrary(
|
||||
name="libusbp",
|
||||
srcs=srcs,
|
||||
cflags=["-Idep/libusbp/include", "-Idep/libusbp/src"],
|
||||
cflags=[
|
||||
"-Idep/libusbp/include",
|
||||
"-Idep/libusbp/src",
|
||||
"-Wno-deprecated-declarations",
|
||||
],
|
||||
caller_ldflags=ldflags,
|
||||
deps=deps,
|
||||
hdrs={
|
||||
|
||||
35
lib/build.py
35
lib/build.py
@@ -25,38 +25,3 @@ protocc(
|
||||
srcs=[".+drive_proto"],
|
||||
deps=[".+common_proto_lib", "+fl2_proto_lib", ".+layout_proto_lib"],
|
||||
)
|
||||
|
||||
proto(
|
||||
name="config_proto",
|
||||
srcs=["./config.proto"],
|
||||
deps=[
|
||||
".+common_proto",
|
||||
".+layout_proto",
|
||||
".+drive_proto",
|
||||
"+fl2_proto",
|
||||
"lib/fluxsource+proto",
|
||||
"lib/fluxsink+proto",
|
||||
"lib/vfs+proto",
|
||||
"lib/usb+proto",
|
||||
"lib/encoders+proto",
|
||||
"lib/decoders+proto",
|
||||
"lib/imagereader+proto",
|
||||
"lib/imagewriter+proto",
|
||||
],
|
||||
)
|
||||
|
||||
protocc(
|
||||
name="config_proto_lib",
|
||||
srcs=[".+common_proto", ".+config_proto", "arch+proto", "+fl2_proto"],
|
||||
deps=[
|
||||
"lib/fluxsource+proto_lib",
|
||||
"lib/fluxsink+proto_lib",
|
||||
"lib/vfs+proto_lib",
|
||||
"lib/usb+proto_lib",
|
||||
"lib/encoders+proto_lib",
|
||||
"lib/decoders+proto_lib",
|
||||
"lib/imagereader+proto_lib",
|
||||
"lib/imagewriter+proto_lib",
|
||||
"lib+drive_proto_lib",
|
||||
],
|
||||
)
|
||||
|
||||
56
lib/config/build.py
Normal file
56
lib/config/build.py
Normal file
@@ -0,0 +1,56 @@
|
||||
from build.c import cxxlibrary
|
||||
from build.protobuf import proto, protocc
|
||||
|
||||
proto(
|
||||
name="proto",
|
||||
srcs=["./config.proto"],
|
||||
deps=[
|
||||
"lib+common_proto",
|
||||
"lib+layout_proto",
|
||||
"lib+drive_proto",
|
||||
"+fl2_proto",
|
||||
"lib/fluxsource+proto",
|
||||
"lib/fluxsink+proto",
|
||||
"lib/vfs+proto",
|
||||
"lib/usb+proto",
|
||||
"lib/encoders+proto",
|
||||
"lib/decoders+proto",
|
||||
"lib/imagereader+proto",
|
||||
"lib/imagewriter+proto",
|
||||
],
|
||||
)
|
||||
|
||||
protocc(
|
||||
name="proto_lib",
|
||||
srcs=[".+proto", "arch+proto", "+fl2_proto"],
|
||||
deps=[
|
||||
"lib/fluxsource+proto_lib",
|
||||
"lib/fluxsink+proto_lib",
|
||||
"lib/vfs+proto_lib",
|
||||
"lib/usb+proto_lib",
|
||||
"lib/encoders+proto_lib",
|
||||
"lib/decoders+proto_lib",
|
||||
"lib/imagereader+proto_lib",
|
||||
"lib/imagewriter+proto_lib",
|
||||
"lib+drive_proto_lib",
|
||||
],
|
||||
)
|
||||
|
||||
cxxlibrary(
|
||||
name="config",
|
||||
srcs=[
|
||||
"./config.cc",
|
||||
"./proto.cc",
|
||||
"./flags.cc",
|
||||
],
|
||||
hdrs={
|
||||
"lib/config/config.h": "./config.h",
|
||||
"lib/config/proto.h": "./proto.h",
|
||||
"lib/config/flags.h": "./flags.h",
|
||||
},
|
||||
deps=[
|
||||
"lib/core",
|
||||
".+proto_lib",
|
||||
"+fmt_lib",
|
||||
],
|
||||
)
|
||||
@@ -1,14 +1,8 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/config.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/logger.h"
|
||||
#include "lib/config/config.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include "lib/core/logger.h"
|
||||
#include "lib/core/utils.h"
|
||||
#include "lib/imagewriter/imagewriter.h"
|
||||
#include "lib/imagereader/imagereader.h"
|
||||
#include "lib/fluxsink/fluxsink.h"
|
||||
#include "lib/fluxsource/fluxsource.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include <fstream>
|
||||
#include <google/protobuf/text_format.h>
|
||||
|
||||
@@ -166,6 +160,16 @@ static const std::vector<ImageConstructor> imageConstructors = {
|
||||
{".xdf", IMAGETYPE_IMG, MODE_RW},
|
||||
};
|
||||
|
||||
struct OptionLogMessage
|
||||
{
|
||||
std::string message;
|
||||
};
|
||||
|
||||
void renderLogMessage(LogRenderer& r, std::shared_ptr<const OptionLogMessage> m)
|
||||
{
|
||||
r.newline().add("OPTION:").add(m->message).newline();
|
||||
}
|
||||
|
||||
Config& globalConfig()
|
||||
{
|
||||
return config;
|
||||
@@ -211,24 +215,10 @@ ConfigProto* Config::combined()
|
||||
|
||||
_combinedConfig.MergeFrom(_overridesConfig);
|
||||
|
||||
/* At this point the config is mostly valid. We're about to make calls
|
||||
* that will want to call combined() reentrantly, so to prevent infinite
|
||||
* loop we mark the config as valid now. */
|
||||
/* At this point the config is valid, although when fluxsources or
|
||||
* imagereaders are loaded it may be adjusted again. */
|
||||
|
||||
_configValid = true;
|
||||
|
||||
/* We should now be more or less done, but we still need to add in any
|
||||
* config contributed by the flux source and image readers. This will
|
||||
* open the files. */
|
||||
|
||||
if (hasFluxSource())
|
||||
_combinedConfig.MergeFrom(getFluxSource()->getExtraConfig());
|
||||
if (hasImageReader())
|
||||
_combinedConfig.MergeFrom(getImageReader()->getExtraConfig());
|
||||
|
||||
/* Merge in the overrides once again. */
|
||||
|
||||
_combinedConfig.MergeFrom(_overridesConfig);
|
||||
}
|
||||
return &_combinedConfig;
|
||||
}
|
||||
@@ -244,11 +234,6 @@ void Config::clear()
|
||||
_baseConfig.Clear();
|
||||
_overridesConfig.Clear();
|
||||
_combinedConfig.Clear();
|
||||
_fluxSource.reset();
|
||||
_verificationFluxSource.reset();
|
||||
_imageReader.reset();
|
||||
_encoder.reset();
|
||||
_decoder.reset();
|
||||
_appliedOptions.clear();
|
||||
}
|
||||
|
||||
@@ -467,8 +452,8 @@ bool Config::isOptionValid(std::string option)
|
||||
|
||||
void Config::applyOption(const OptionProto& option)
|
||||
{
|
||||
log("OPTION: {}",
|
||||
option.has_message() ? option.message() : option.comment());
|
||||
log(OptionLogMessage{
|
||||
option.has_message() ? option.message() : option.comment()});
|
||||
|
||||
_appliedOptions.insert(option.name());
|
||||
}
|
||||
@@ -581,115 +566,36 @@ bool Config::hasFluxSource()
|
||||
return (*this)->flux_source().type() != FLUXTYPE_NOT_SET;
|
||||
}
|
||||
|
||||
std::shared_ptr<FluxSource>& Config::getFluxSource()
|
||||
{
|
||||
if (!_fluxSource)
|
||||
{
|
||||
if (!hasFluxSource())
|
||||
error("no flux source configured");
|
||||
|
||||
_fluxSource =
|
||||
std::shared_ptr(FluxSource::create((*this)->flux_source()));
|
||||
}
|
||||
return _fluxSource;
|
||||
}
|
||||
|
||||
bool Config::hasVerificationFluxSource() const
|
||||
{
|
||||
return _verificationFluxSourceProto.type() != FLUXTYPE_NOT_SET;
|
||||
}
|
||||
|
||||
std::shared_ptr<FluxSource>& Config::getVerificationFluxSource()
|
||||
{
|
||||
if (!_verificationFluxSource)
|
||||
{
|
||||
if (!hasVerificationFluxSource())
|
||||
error("no verification flux source configured");
|
||||
|
||||
_verificationFluxSource =
|
||||
std::shared_ptr(FluxSource::create(_verificationFluxSourceProto));
|
||||
}
|
||||
return _verificationFluxSource;
|
||||
}
|
||||
|
||||
bool Config::hasImageReader()
|
||||
{
|
||||
return (*this)->image_reader().type() != IMAGETYPE_NOT_SET;
|
||||
}
|
||||
|
||||
std::shared_ptr<ImageReader>& Config::getImageReader()
|
||||
{
|
||||
if (!_imageReader)
|
||||
{
|
||||
if (!hasImageReader())
|
||||
error("no image reader configured");
|
||||
|
||||
_imageReader =
|
||||
std::shared_ptr(ImageReader::create((*this)->image_reader()));
|
||||
}
|
||||
return _imageReader;
|
||||
}
|
||||
|
||||
bool Config::hasFluxSink()
|
||||
{
|
||||
return (*this)->flux_sink().type() != FLUXTYPE_NOT_SET;
|
||||
}
|
||||
|
||||
std::unique_ptr<FluxSink> Config::getFluxSink()
|
||||
{
|
||||
if (!hasFluxSink())
|
||||
error("no flux sink configured");
|
||||
|
||||
return FluxSink::create((*this)->flux_sink());
|
||||
}
|
||||
|
||||
bool Config::hasImageWriter()
|
||||
{
|
||||
return (*this)->image_writer().type() != IMAGETYPE_NOT_SET;
|
||||
}
|
||||
|
||||
std::unique_ptr<ImageWriter> Config::getImageWriter()
|
||||
{
|
||||
if (!hasImageWriter())
|
||||
error("no image writer configured");
|
||||
|
||||
return ImageWriter::create((*this)->image_writer());
|
||||
}
|
||||
|
||||
bool Config::hasEncoder()
|
||||
{
|
||||
return (*this)->has_encoder();
|
||||
}
|
||||
|
||||
std::shared_ptr<Encoder>& Config::getEncoder()
|
||||
{
|
||||
if (!_encoder)
|
||||
{
|
||||
if (!hasEncoder())
|
||||
error("no encoder configured");
|
||||
|
||||
_encoder = Encoder::create((*this)->encoder());
|
||||
}
|
||||
return _encoder;
|
||||
}
|
||||
|
||||
bool Config::hasDecoder()
|
||||
{
|
||||
return _combinedConfig.has_decoder();
|
||||
}
|
||||
|
||||
std::shared_ptr<Decoder>& Config::getDecoder()
|
||||
{
|
||||
if (!_decoder)
|
||||
{
|
||||
if (!hasDecoder())
|
||||
error("no decoder configured");
|
||||
|
||||
_decoder = Decoder::create((*this)->decoder());
|
||||
}
|
||||
return _decoder;
|
||||
}
|
||||
|
||||
const std::vector<FluxConstructor>& Config::getFluxFormats()
|
||||
{
|
||||
return fluxConstructors;
|
||||
@@ -3,7 +3,7 @@
|
||||
#ifdef __cplusplus
|
||||
|
||||
#include <google/protobuf/message.h>
|
||||
#include "lib/config.pb.h"
|
||||
#include "lib/config/config.pb.h"
|
||||
#include "lib/common.pb.h"
|
||||
|
||||
class ConfigProto;
|
||||
@@ -141,28 +141,21 @@ public:
|
||||
void setImageReader(std::string value);
|
||||
void setImageWriter(std::string value);
|
||||
|
||||
/* Fetch the sources, opening them if necessary. */
|
||||
/* Query useful things about the config. */
|
||||
|
||||
bool hasFluxSource();
|
||||
std::shared_ptr<FluxSource>& getFluxSource();
|
||||
bool hasImageReader();
|
||||
std::shared_ptr<ImageReader>& getImageReader();
|
||||
bool hasVerificationFluxSource() const;
|
||||
std::shared_ptr<FluxSource>& getVerificationFluxSource();
|
||||
|
||||
/* Fetch the encoder and decoder, creating them if necessary. */
|
||||
const FluxSourceProto& getVerificationFluxSourceProto() const
|
||||
{
|
||||
return _verificationFluxSourceProto;
|
||||
}
|
||||
|
||||
bool hasEncoder();
|
||||
std::shared_ptr<Encoder>& getEncoder();
|
||||
bool hasDecoder();
|
||||
std::shared_ptr<Decoder>& getDecoder();
|
||||
|
||||
/* Create the sinks: these are not cached. */
|
||||
|
||||
bool hasFluxSink();
|
||||
std::unique_ptr<FluxSink> getFluxSink();
|
||||
bool hasImageWriter();
|
||||
std::unique_ptr<ImageWriter> getImageWriter();
|
||||
|
||||
public:
|
||||
static const std::vector<FluxConstructor>& getFluxFormats();
|
||||
@@ -175,11 +168,6 @@ private:
|
||||
std::set<std::string> _appliedOptions;
|
||||
bool _configValid;
|
||||
|
||||
std::shared_ptr<FluxSource> _fluxSource;
|
||||
std::shared_ptr<ImageReader> _imageReader;
|
||||
std::shared_ptr<FluxSource> _verificationFluxSource;
|
||||
std::shared_ptr<Encoder> _encoder;
|
||||
std::shared_ptr<Decoder> _decoder;
|
||||
FluxSourceProto _verificationFluxSourceProto;
|
||||
};
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/config.h"
|
||||
#include "lib/flags.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/config/config.h"
|
||||
#include "lib/config/flags.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include "lib/core/utils.h"
|
||||
#include "lib/logger.h"
|
||||
#include "lib/fluxsource/fluxsource.h"
|
||||
#include "lib/imagereader/imagereader.h"
|
||||
#include "lib/core/logger.h"
|
||||
#include <google/protobuf/text_format.h>
|
||||
#include <regex>
|
||||
#include <fstream>
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include "lib/common.pb.h"
|
||||
#include <regex>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
#include <google/protobuf/message.h>
|
||||
#include "lib/common.pb.h"
|
||||
#include "lib/config.pb.h"
|
||||
#include "lib/config/config.pb.h"
|
||||
|
||||
class ProtoPathNotFoundException : public ErrorException
|
||||
{
|
||||
@@ -9,6 +9,8 @@ cxxlibrary(
|
||||
"./csvreader.cc",
|
||||
"./hexdump.cc",
|
||||
"./utils.cc",
|
||||
"./logger.cc",
|
||||
"./logrenderer.cc",
|
||||
],
|
||||
hdrs={
|
||||
"lib/core/bitmap.h": "./bitmap.h",
|
||||
@@ -17,6 +19,7 @@ cxxlibrary(
|
||||
"lib/core/csvreader.h": "./csvreader.h",
|
||||
"lib/core/globals.h": "./globals.h",
|
||||
"lib/core/utils.h": "./utils.h",
|
||||
"lib/core/logger.h": "./logger.h",
|
||||
},
|
||||
deps=[
|
||||
"dep/agg",
|
||||
|
||||
56
lib/core/logger.cc
Normal file
56
lib/core/logger.cc
Normal file
@@ -0,0 +1,56 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "lib/core/logger.h"
|
||||
|
||||
static bool indented = false;
|
||||
|
||||
static std::function<void(const AnyLogMessage&)> loggerImpl =
|
||||
[](const auto& message)
|
||||
{
|
||||
static auto r = LogRenderer::create(std::cout);
|
||||
r->add(message);
|
||||
};
|
||||
|
||||
void log(const char* m)
|
||||
{
|
||||
log(std::string(m));
|
||||
}
|
||||
|
||||
void log(const AnyLogMessage& message)
|
||||
{
|
||||
loggerImpl(message);
|
||||
}
|
||||
|
||||
void Logger::setLogger(std::function<void(const AnyLogMessage&)> cb)
|
||||
{
|
||||
loggerImpl = cb;
|
||||
}
|
||||
|
||||
void renderLogMessage(
|
||||
LogRenderer& r, std::shared_ptr<const ErrorLogMessage> msg)
|
||||
{
|
||||
r.newline().add("Error:").add(msg->message).newline();
|
||||
}
|
||||
|
||||
void renderLogMessage(
|
||||
LogRenderer& r, std::shared_ptr<const EmergencyStopMessage> msg)
|
||||
{
|
||||
r.newline().add("Stop!").newline();
|
||||
}
|
||||
|
||||
void renderLogMessage(LogRenderer& r, std::shared_ptr<const std::string> msg)
|
||||
{
|
||||
r.newline().add(*msg).newline();
|
||||
}
|
||||
|
||||
LogRenderer& LogRenderer::add(const AnyLogMessage& message)
|
||||
{
|
||||
std::visit(
|
||||
[&](const auto& arg)
|
||||
{
|
||||
renderLogMessage(*this, arg);
|
||||
},
|
||||
message);
|
||||
|
||||
return *this;
|
||||
}
|
||||
119
lib/core/logger.h
Normal file
119
lib/core/logger.h
Normal file
@@ -0,0 +1,119 @@
|
||||
#ifndef LOGGER_H
|
||||
#define LOGGER_H
|
||||
|
||||
#include "fmt/format.h"
|
||||
#include <type_traits>
|
||||
|
||||
class DiskFlux;
|
||||
class TrackDataFlux;
|
||||
class TrackFlux;
|
||||
class Sector;
|
||||
class LogRenderer;
|
||||
|
||||
struct ErrorLogMessage;
|
||||
struct EmergencyStopMessage;
|
||||
struct BeginSpeedOperationLogMessage;
|
||||
struct EndSpeedOperationLogMessage;
|
||||
struct TrackReadLogMessage;
|
||||
struct DiskReadLogMessage;
|
||||
struct BeginReadOperationLogMessage;
|
||||
struct EndReadOperationLogMessage;
|
||||
struct BeginWriteOperationLogMessage;
|
||||
struct EndWriteOperationLogMessage;
|
||||
struct BeginOperationLogMessage;
|
||||
struct EndOperationLogMessage;
|
||||
struct OperationProgressLogMessage;
|
||||
struct OptionLogMessage;
|
||||
|
||||
struct ErrorLogMessage
|
||||
{
|
||||
std::string message;
|
||||
};
|
||||
|
||||
struct EmergencyStopMessage
|
||||
{
|
||||
};
|
||||
|
||||
extern void renderLogMessage(
|
||||
LogRenderer& r, std::shared_ptr<const ErrorLogMessage> m);
|
||||
extern void renderLogMessage(
|
||||
LogRenderer& r, std::shared_ptr<const EmergencyStopMessage> m);
|
||||
extern void renderLogMessage(
|
||||
LogRenderer& r, std::shared_ptr<const TrackReadLogMessage> m);
|
||||
extern void renderLogMessage(
|
||||
LogRenderer& r, std::shared_ptr<const DiskReadLogMessage> m);
|
||||
extern void renderLogMessage(
|
||||
LogRenderer& r, std::shared_ptr<const BeginSpeedOperationLogMessage> m);
|
||||
extern void renderLogMessage(
|
||||
LogRenderer& r, std::shared_ptr<const EndSpeedOperationLogMessage> m);
|
||||
extern void renderLogMessage(
|
||||
LogRenderer& r, std::shared_ptr<const BeginReadOperationLogMessage> m);
|
||||
extern void renderLogMessage(
|
||||
LogRenderer& r, std::shared_ptr<const EndReadOperationLogMessage> m);
|
||||
extern void renderLogMessage(
|
||||
LogRenderer& r, std::shared_ptr<const BeginWriteOperationLogMessage> m);
|
||||
extern void renderLogMessage(
|
||||
LogRenderer& r, std::shared_ptr<const EndWriteOperationLogMessage> m);
|
||||
extern void renderLogMessage(
|
||||
LogRenderer& r, std::shared_ptr<const BeginOperationLogMessage> m);
|
||||
extern void renderLogMessage(
|
||||
LogRenderer& r, std::shared_ptr<const EndOperationLogMessage> m);
|
||||
extern void renderLogMessage(
|
||||
LogRenderer& r, std::shared_ptr<const OperationProgressLogMessage> m);
|
||||
extern void renderLogMessage(
|
||||
LogRenderer& r, std::shared_ptr<const OptionLogMessage> m);
|
||||
|
||||
typedef std::variant<std::shared_ptr<const std::string>,
|
||||
std::shared_ptr<const ErrorLogMessage>,
|
||||
std::shared_ptr<const EmergencyStopMessage>,
|
||||
std::shared_ptr<const TrackReadLogMessage>,
|
||||
std::shared_ptr<const DiskReadLogMessage>,
|
||||
std::shared_ptr<const BeginSpeedOperationLogMessage>,
|
||||
std::shared_ptr<const EndSpeedOperationLogMessage>,
|
||||
std::shared_ptr<const BeginReadOperationLogMessage>,
|
||||
std::shared_ptr<const EndReadOperationLogMessage>,
|
||||
std::shared_ptr<const BeginWriteOperationLogMessage>,
|
||||
std::shared_ptr<const EndWriteOperationLogMessage>,
|
||||
std::shared_ptr<const BeginOperationLogMessage>,
|
||||
std::shared_ptr<const EndOperationLogMessage>,
|
||||
std::shared_ptr<const OperationProgressLogMessage>,
|
||||
std::shared_ptr<const OptionLogMessage>>
|
||||
AnyLogMessage;
|
||||
|
||||
extern void log(const char* ptr);
|
||||
extern void log(const AnyLogMessage& message);
|
||||
|
||||
template <class T>
|
||||
inline void log(const T& message)
|
||||
{
|
||||
log(AnyLogMessage(std::make_shared<T>(message)));
|
||||
}
|
||||
|
||||
template <typename... Args>
|
||||
inline void log(fmt::string_view fstr, const Args&... args)
|
||||
{
|
||||
log(fmt::format(fstr, args...));
|
||||
}
|
||||
|
||||
class LogRenderer
|
||||
{
|
||||
public:
|
||||
static std::unique_ptr<LogRenderer> create(std::ostream& stream);
|
||||
virtual ~LogRenderer() {}
|
||||
|
||||
public:
|
||||
LogRenderer& add(const AnyLogMessage& message);
|
||||
|
||||
public:
|
||||
virtual LogRenderer& add(const std::string& m) = 0;
|
||||
virtual LogRenderer& comma() = 0;
|
||||
virtual LogRenderer& header(const std::string& h) = 0;
|
||||
virtual LogRenderer& newline() = 0;
|
||||
};
|
||||
|
||||
namespace Logger
|
||||
{
|
||||
extern void setLogger(std::function<void(const AnyLogMessage&)> cb);
|
||||
}
|
||||
|
||||
#endif
|
||||
95
lib/core/logrenderer.cc
Normal file
95
lib/core/logrenderer.cc
Normal file
@@ -0,0 +1,95 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "lib/core/logger.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
class LogRendererImpl : public LogRenderer
|
||||
{
|
||||
public:
|
||||
LogRendererImpl(std::ostream& stream): _stream(stream) {}
|
||||
|
||||
private:
|
||||
void indent()
|
||||
{
|
||||
_stream << " ";
|
||||
_lineLen = 7;
|
||||
_space = true;
|
||||
}
|
||||
|
||||
public:
|
||||
LogRenderer& add(const std::string& m) override
|
||||
{
|
||||
if (_newline && !_header)
|
||||
indent();
|
||||
|
||||
if (!_space)
|
||||
{
|
||||
_stream << ' ';
|
||||
_lineLen++;
|
||||
}
|
||||
|
||||
_newline = false;
|
||||
_header = false;
|
||||
|
||||
_lineLen += m.size();
|
||||
if (_lineLen >= 80)
|
||||
{
|
||||
_stream << '\n';
|
||||
indent();
|
||||
}
|
||||
_stream << m;
|
||||
_space = !m.empty() && isspace(m[m.size() - 1]);
|
||||
return *this;
|
||||
}
|
||||
|
||||
LogRenderer& header(const std::string& m) override
|
||||
{
|
||||
if (!_newline)
|
||||
_stream << '\n';
|
||||
_stream << m;
|
||||
_lineLen = m.size();
|
||||
_header = true;
|
||||
_newline = true;
|
||||
_space = !m.empty() && isspace(m[m.size() - 1]);
|
||||
return *this;
|
||||
}
|
||||
|
||||
LogRenderer& comma() override
|
||||
{
|
||||
if (!_newline || _header)
|
||||
{
|
||||
_stream << ';';
|
||||
_space = false;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
LogRenderer& newline() override
|
||||
{
|
||||
if (!_header)
|
||||
{
|
||||
if (!_newline)
|
||||
_stream << '\n';
|
||||
|
||||
_lineLen = 0;
|
||||
_header = false;
|
||||
_newline = true;
|
||||
_space = true;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
private:
|
||||
bool _header = false;
|
||||
bool _newline = false;
|
||||
bool _space = false;
|
||||
int _lineLen = 0;
|
||||
std::ostream& _stream;
|
||||
};
|
||||
}
|
||||
|
||||
std::unique_ptr<LogRenderer> LogRenderer::create(std::ostream& stream)
|
||||
{
|
||||
return std::make_unique<LogRendererImpl>(stream);
|
||||
}
|
||||
@@ -233,4 +233,3 @@ int findLowestSetBit(uint64_t value)
|
||||
}
|
||||
return bit;
|
||||
}
|
||||
|
||||
|
||||
14
lib/data/build.py
Normal file
14
lib/data/build.py
Normal file
@@ -0,0 +1,14 @@
|
||||
from build.c import cxxlibrary
|
||||
|
||||
cxxlibrary(
|
||||
name="data",
|
||||
srcs=["./fluxmap.cc", "./sector.cc", "./layout.cc", "./image.cc"],
|
||||
hdrs={
|
||||
"lib/data/flux.h": "./flux.h",
|
||||
"lib/data/fluxmap.h": "./fluxmap.h",
|
||||
"lib/data/sector.h": "./sector.h",
|
||||
"lib/data/layout.h": "./layout.h",
|
||||
"lib/data/image.h": "./image.h",
|
||||
},
|
||||
deps=["lib/core", "lib/config", "+protocol"],
|
||||
)
|
||||
77
lib/data/fluxmap.cc
Normal file
77
lib/data/fluxmap.cc
Normal file
@@ -0,0 +1,77 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "protocol.h"
|
||||
|
||||
Fluxmap& Fluxmap::appendBytes(const Bytes& bytes)
|
||||
{
|
||||
if (bytes.size() == 0)
|
||||
return *this;
|
||||
|
||||
return appendBytes(&bytes[0], bytes.size());
|
||||
}
|
||||
|
||||
Fluxmap& Fluxmap::appendBytes(const uint8_t* ptr, size_t len)
|
||||
{
|
||||
ByteWriter bw(_bytes);
|
||||
bw.seekToEnd();
|
||||
|
||||
while (len--)
|
||||
{
|
||||
uint8_t byte = *ptr++;
|
||||
_ticks += byte & 0x3f;
|
||||
bw.write_8(byte);
|
||||
}
|
||||
|
||||
_duration = _ticks * NS_PER_TICK;
|
||||
return *this;
|
||||
}
|
||||
|
||||
uint8_t& Fluxmap::findLastByte()
|
||||
{
|
||||
if (_bytes.empty())
|
||||
appendByte(0x00);
|
||||
return *(_bytes.end() - 1);
|
||||
}
|
||||
|
||||
Fluxmap& Fluxmap::appendInterval(uint32_t ticks)
|
||||
{
|
||||
while (ticks >= 0x3f)
|
||||
{
|
||||
appendByte(0x3f);
|
||||
ticks -= 0x3f;
|
||||
}
|
||||
appendByte((uint8_t)ticks);
|
||||
return *this;
|
||||
}
|
||||
|
||||
Fluxmap& Fluxmap::appendPulse()
|
||||
{
|
||||
findLastByte() |= 0x80;
|
||||
return *this;
|
||||
}
|
||||
|
||||
Fluxmap& Fluxmap::appendIndex()
|
||||
{
|
||||
findLastByte() |= 0x40;
|
||||
return *this;
|
||||
}
|
||||
|
||||
Fluxmap& Fluxmap::appendDesync()
|
||||
{
|
||||
appendByte(F_DESYNC);
|
||||
return *this;
|
||||
}
|
||||
|
||||
std::vector<std::unique_ptr<const Fluxmap>> Fluxmap::split() const
|
||||
{
|
||||
std::vector<std::unique_ptr<const Fluxmap>> maps;
|
||||
auto bytesVector = rawBytes().split(F_DESYNC);
|
||||
|
||||
for (auto bytes : bytesVector)
|
||||
{
|
||||
if (bytes.size() != 0)
|
||||
maps.push_back(std::move(std::make_unique<Fluxmap>(bytes)));
|
||||
}
|
||||
|
||||
return maps;
|
||||
}
|
||||
@@ -83,19 +83,6 @@ public:
|
||||
int threshold_ticks, int amount_ticks);
|
||||
std::vector<std::unique_ptr<const Fluxmap>> split() const;
|
||||
|
||||
struct ClockData
|
||||
{
|
||||
nanoseconds_t median;
|
||||
uint32_t noiseFloor;
|
||||
uint32_t signalLevel;
|
||||
nanoseconds_t peakStart;
|
||||
nanoseconds_t peakEnd;
|
||||
uint32_t buckets[256];
|
||||
};
|
||||
|
||||
ClockData guessClock(
|
||||
double noiseFloorFactor = 0.01, double signalLevelFactor = 0.05) const;
|
||||
|
||||
private:
|
||||
uint8_t& findLastByte();
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/image.h"
|
||||
#include "lib/layout.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "lib/data/layout.h"
|
||||
|
||||
Image::Image() {}
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/config.h"
|
||||
#include "lib/layout.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/logger.h"
|
||||
#include "lib/fl2.h"
|
||||
#include "lib/config/config.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include "lib/core/logger.h"
|
||||
|
||||
static unsigned getTrackStep()
|
||||
{
|
||||
@@ -1,7 +1,7 @@
|
||||
#ifndef LAYOUT_H
|
||||
#define LAYOUT_H
|
||||
|
||||
#include "lib/flux.h"
|
||||
#include "lib/data/flux.h"
|
||||
|
||||
class SectorListProto;
|
||||
class TrackInfo;
|
||||
@@ -1,7 +1,7 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/flux.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/layout.h"
|
||||
#include "lib/data/flux.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/data/layout.h"
|
||||
|
||||
Sector::Sector(const LogicalLocation& location):
|
||||
LogicalLocation(location),
|
||||
@@ -2,7 +2,7 @@
|
||||
#define SECTOR_H
|
||||
|
||||
#include "lib/core/bytes.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
|
||||
class Record;
|
||||
class TrackInfo;
|
||||
@@ -1,6 +1,7 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/flags.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/config/flags.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/config/config.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "arch/agat/agat.h"
|
||||
@@ -23,15 +24,22 @@
|
||||
#include "arch/victor9k/victor9k.h"
|
||||
#include "arch/zilogmcz/zilogmcz.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/flux.h"
|
||||
#include "lib/data/flux.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/decoders/rawbits.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/image.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "lib/decoders/decoders.pb.h"
|
||||
#include "lib/layout.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include <numeric>
|
||||
|
||||
std::unique_ptr<Decoder> Decoder::create(Config& config)
|
||||
{
|
||||
if (!config.hasDecoder())
|
||||
error("no decoder configured");
|
||||
return create(config->decoder());
|
||||
}
|
||||
|
||||
std::unique_ptr<Decoder> Decoder::create(const DecoderProto& config)
|
||||
{
|
||||
static const std::map<int,
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#define DECODERS_H
|
||||
|
||||
#include "lib/core/bytes.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/decoders/fluxdecoder.h"
|
||||
|
||||
@@ -12,8 +12,9 @@ class FluxMatcher;
|
||||
class FluxmapReader;
|
||||
class RawBits;
|
||||
class DecoderProto;
|
||||
class Config;
|
||||
|
||||
#include "lib/flux.h"
|
||||
#include "lib/data/flux.h"
|
||||
|
||||
extern void setDecoderManualClockRate(double clockrate_us);
|
||||
|
||||
@@ -39,6 +40,7 @@ public:
|
||||
|
||||
virtual ~Decoder() {}
|
||||
|
||||
static std::unique_ptr<Decoder> create(Config& config);
|
||||
static std::unique_ptr<Decoder> create(const DecoderProto& config);
|
||||
|
||||
public:
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/decoders/fluxdecoder.h"
|
||||
#include "lib/decoders/decoders.pb.h"
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/config.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/config/config.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/decoders/fluxpattern.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include "protocol.h"
|
||||
#include <numeric>
|
||||
#include <math.h>
|
||||
@@ -166,3 +166,87 @@ void FluxmapReader::seekToIndexMark()
|
||||
skipToEvent(F_BIT_INDEX);
|
||||
_pos.zeroes = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Tries to guess the clock by finding the smallest common interval.
|
||||
* Returns nanoseconds.
|
||||
*/
|
||||
FluxmapReader::ClockData FluxmapReader::guessClock(
|
||||
double noiseFloorFactor, double signalLevelFactor)
|
||||
{
|
||||
ClockData data = {};
|
||||
|
||||
while (!eof())
|
||||
{
|
||||
unsigned interval;
|
||||
findEvent(F_BIT_PULSE, interval);
|
||||
if (interval > 0xff)
|
||||
continue;
|
||||
data.buckets[interval]++;
|
||||
}
|
||||
|
||||
uint32_t max =
|
||||
*std::max_element(std::begin(data.buckets), std::end(data.buckets));
|
||||
uint32_t min =
|
||||
*std::min_element(std::begin(data.buckets), std::end(data.buckets));
|
||||
data.noiseFloor = min + (max - min) * noiseFloorFactor;
|
||||
data.signalLevel = min + (max - min) * signalLevelFactor;
|
||||
|
||||
/* Find a point solidly within the first pulse. */
|
||||
|
||||
int pulseindex = 0;
|
||||
while (pulseindex < 256)
|
||||
{
|
||||
if (data.buckets[pulseindex] > data.signalLevel)
|
||||
break;
|
||||
pulseindex++;
|
||||
}
|
||||
if (pulseindex == -1)
|
||||
return data;
|
||||
|
||||
/* Find the upper and lower bounds of the pulse. */
|
||||
|
||||
int peaklo = pulseindex;
|
||||
while (peaklo > 0)
|
||||
{
|
||||
if (data.buckets[peaklo] < data.noiseFloor)
|
||||
break;
|
||||
peaklo--;
|
||||
}
|
||||
|
||||
int peakhi = pulseindex;
|
||||
while (peakhi < 255)
|
||||
{
|
||||
if (data.buckets[peakhi] < data.noiseFloor)
|
||||
break;
|
||||
peakhi++;
|
||||
}
|
||||
|
||||
/* Find the total accumulated size of the pulse. */
|
||||
|
||||
uint32_t total_size = 0;
|
||||
for (int i = peaklo; i < peakhi; i++)
|
||||
total_size += data.buckets[i];
|
||||
|
||||
/* Now find the median. */
|
||||
|
||||
uint32_t count = 0;
|
||||
int median = peaklo;
|
||||
while (median < peakhi)
|
||||
{
|
||||
count += data.buckets[median];
|
||||
if (count > (total_size / 2))
|
||||
break;
|
||||
median++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Okay, the median should now be a good candidate for the (or a) clock.
|
||||
* How this maps onto the actual clock rate depends on the encoding.
|
||||
*/
|
||||
|
||||
data.peakStart = peaklo * NS_PER_TICK;
|
||||
data.peakEnd = peakhi * NS_PER_TICK;
|
||||
data.median = median * NS_PER_TICK;
|
||||
return data;
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#ifndef FLUXMAPREADER_H
|
||||
#define FLUXMAPREADER_H
|
||||
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/flags.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/config/flags.h"
|
||||
#include "protocol.h"
|
||||
|
||||
class DecoderProto;
|
||||
@@ -56,6 +56,19 @@ public:
|
||||
nanoseconds_t seekToPattern(
|
||||
const FluxMatcher& pattern, const FluxMatcher*& matching);
|
||||
|
||||
struct ClockData
|
||||
{
|
||||
nanoseconds_t median;
|
||||
uint32_t noiseFloor;
|
||||
uint32_t signalLevel;
|
||||
nanoseconds_t peakStart;
|
||||
nanoseconds_t peakEnd;
|
||||
uint32_t buckets[256];
|
||||
};
|
||||
|
||||
ClockData guessClock(
|
||||
double noiseFloorFactor = 0.01, double signalLevelFactor = 0.05);
|
||||
|
||||
private:
|
||||
const Fluxmap& _fluxmap;
|
||||
const uint8_t* _bytes;
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/config.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/config/config.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/decoders/fluxpattern.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include "protocol.h"
|
||||
#include <numeric>
|
||||
#include <math.h>
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#pragma once
|
||||
|
||||
#include "lib/core/utils.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/flags.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/config/flags.h"
|
||||
#include "protocol.h"
|
||||
|
||||
class FluxMatcher;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/config.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/config/config.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "arch/agat/agat.h"
|
||||
@@ -16,11 +16,18 @@
|
||||
#include "arch/tids990/tids990.h"
|
||||
#include "arch/victor9k/victor9k.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/layout.h"
|
||||
#include "lib/image.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "protocol.h"
|
||||
|
||||
std::unique_ptr<Encoder> Encoder::create(Config& config)
|
||||
{
|
||||
if (!config.hasEncoder())
|
||||
error("no encoder configured");
|
||||
return create(config->encoder());
|
||||
}
|
||||
|
||||
std::unique_ptr<Encoder> Encoder::create(const EncoderProto& config)
|
||||
{
|
||||
static const std::map<int,
|
||||
|
||||
@@ -7,6 +7,7 @@ class Image;
|
||||
class Layout;
|
||||
class Sector;
|
||||
class TrackInfo;
|
||||
class Config;
|
||||
|
||||
class Encoder
|
||||
{
|
||||
@@ -14,6 +15,7 @@ public:
|
||||
Encoder(const EncoderProto& config) {}
|
||||
virtual ~Encoder() {}
|
||||
|
||||
static std::unique_ptr<Encoder> create(Config& config);
|
||||
static std::unique_ptr<Encoder> create(const EncoderProto& config);
|
||||
|
||||
public:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/fl2.pb.h"
|
||||
#include <fstream>
|
||||
|
||||
|
||||
164
lib/fluxmap.cc
164
lib/fluxmap.cc
@@ -1,164 +0,0 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "protocol.h"
|
||||
|
||||
Fluxmap& Fluxmap::appendBytes(const Bytes& bytes)
|
||||
{
|
||||
if (bytes.size() == 0)
|
||||
return *this;
|
||||
|
||||
return appendBytes(&bytes[0], bytes.size());
|
||||
}
|
||||
|
||||
Fluxmap& Fluxmap::appendBytes(const uint8_t* ptr, size_t len)
|
||||
{
|
||||
ByteWriter bw(_bytes);
|
||||
bw.seekToEnd();
|
||||
|
||||
while (len--)
|
||||
{
|
||||
uint8_t byte = *ptr++;
|
||||
_ticks += byte & 0x3f;
|
||||
bw.write_8(byte);
|
||||
}
|
||||
|
||||
_duration = _ticks * NS_PER_TICK;
|
||||
return *this;
|
||||
}
|
||||
|
||||
uint8_t& Fluxmap::findLastByte()
|
||||
{
|
||||
if (_bytes.empty())
|
||||
appendByte(0x00);
|
||||
return *(_bytes.end() - 1);
|
||||
}
|
||||
|
||||
Fluxmap& Fluxmap::appendInterval(uint32_t ticks)
|
||||
{
|
||||
while (ticks >= 0x3f)
|
||||
{
|
||||
appendByte(0x3f);
|
||||
ticks -= 0x3f;
|
||||
}
|
||||
appendByte((uint8_t)ticks);
|
||||
return *this;
|
||||
}
|
||||
|
||||
Fluxmap& Fluxmap::appendPulse()
|
||||
{
|
||||
findLastByte() |= 0x80;
|
||||
return *this;
|
||||
}
|
||||
|
||||
Fluxmap& Fluxmap::appendIndex()
|
||||
{
|
||||
findLastByte() |= 0x40;
|
||||
return *this;
|
||||
}
|
||||
|
||||
Fluxmap& Fluxmap::appendDesync()
|
||||
{
|
||||
appendByte(F_DESYNC);
|
||||
return *this;
|
||||
}
|
||||
|
||||
std::vector<std::unique_ptr<const Fluxmap>> Fluxmap::split() const
|
||||
{
|
||||
std::vector<std::unique_ptr<const Fluxmap>> maps;
|
||||
auto bytesVector = rawBytes().split(F_DESYNC);
|
||||
|
||||
for (auto bytes : bytesVector)
|
||||
{
|
||||
if (bytes.size() != 0)
|
||||
maps.push_back(std::move(std::make_unique<Fluxmap>(bytes)));
|
||||
}
|
||||
|
||||
return maps;
|
||||
}
|
||||
|
||||
/*
|
||||
* Tries to guess the clock by finding the smallest common interval.
|
||||
* Returns nanoseconds.
|
||||
*/
|
||||
Fluxmap::ClockData Fluxmap::guessClock(
|
||||
double noiseFloorFactor, double signalLevelFactor) const
|
||||
{
|
||||
ClockData data = {};
|
||||
|
||||
FluxmapReader fr(*this);
|
||||
|
||||
while (!fr.eof())
|
||||
{
|
||||
unsigned interval;
|
||||
fr.findEvent(F_BIT_PULSE, interval);
|
||||
if (interval > 0xff)
|
||||
continue;
|
||||
data.buckets[interval]++;
|
||||
}
|
||||
|
||||
uint32_t max =
|
||||
*std::max_element(std::begin(data.buckets), std::end(data.buckets));
|
||||
uint32_t min =
|
||||
*std::min_element(std::begin(data.buckets), std::end(data.buckets));
|
||||
data.noiseFloor = min + (max - min) * noiseFloorFactor;
|
||||
data.signalLevel = min + (max - min) * signalLevelFactor;
|
||||
|
||||
/* Find a point solidly within the first pulse. */
|
||||
|
||||
int pulseindex = 0;
|
||||
while (pulseindex < 256)
|
||||
{
|
||||
if (data.buckets[pulseindex] > data.signalLevel)
|
||||
break;
|
||||
pulseindex++;
|
||||
}
|
||||
if (pulseindex == -1)
|
||||
return data;
|
||||
|
||||
/* Find the upper and lower bounds of the pulse. */
|
||||
|
||||
int peaklo = pulseindex;
|
||||
while (peaklo > 0)
|
||||
{
|
||||
if (data.buckets[peaklo] < data.noiseFloor)
|
||||
break;
|
||||
peaklo--;
|
||||
}
|
||||
|
||||
int peakhi = pulseindex;
|
||||
while (peakhi < 255)
|
||||
{
|
||||
if (data.buckets[peakhi] < data.noiseFloor)
|
||||
break;
|
||||
peakhi++;
|
||||
}
|
||||
|
||||
/* Find the total accumulated size of the pulse. */
|
||||
|
||||
uint32_t total_size = 0;
|
||||
for (int i = peaklo; i < peakhi; i++)
|
||||
total_size += data.buckets[i];
|
||||
|
||||
/* Now find the median. */
|
||||
|
||||
uint32_t count = 0;
|
||||
int median = peaklo;
|
||||
while (median < peakhi)
|
||||
{
|
||||
count += data.buckets[median];
|
||||
if (count > (total_size / 2))
|
||||
break;
|
||||
median++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Okay, the median should now be a good candidate for the (or a) clock.
|
||||
* How this maps onto the actual clock rate depends on the encoding.
|
||||
*/
|
||||
|
||||
data.peakStart = peaklo * NS_PER_TICK;
|
||||
data.peakEnd = peakhi * NS_PER_TICK;
|
||||
data.median = median * NS_PER_TICK;
|
||||
return data;
|
||||
}
|
||||
@@ -1,15 +1,15 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/flags.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/config/flags.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/fluxsink/fluxsink.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/fluxsink/fluxsink.pb.h"
|
||||
#include "lib/logger.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/layout.h"
|
||||
#include "lib/core/logger.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include "lib/a2r.h"
|
||||
#include <fstream>
|
||||
#include <sys/stat.h>
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/flags.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/config/flags.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/fluxsink/fluxsink.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/fluxsink/fluxsink.pb.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include <fstream>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/config.h"
|
||||
#include "lib/flags.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/config/config.h"
|
||||
#include "lib/config/flags.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/fluxsink/fluxsink.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/fluxsink/fluxsink.pb.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include "lib/fl2.pb.h"
|
||||
#include "lib/fl2.h"
|
||||
#include <fstream>
|
||||
|
||||
@@ -1,11 +1,19 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/flags.h"
|
||||
#include "lib/config/flags.h"
|
||||
#include "lib/config/config.h"
|
||||
#include "lib/fluxsink/fluxsink.h"
|
||||
#include "lib/config.pb.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/config/config.pb.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include "lib/core/utils.h"
|
||||
#include <regex>
|
||||
|
||||
std::unique_ptr<FluxSink> FluxSink::create(Config& config)
|
||||
{
|
||||
if (!config.hasFluxSink())
|
||||
error("no flux sink configured");
|
||||
return create(config->flux_sink());
|
||||
}
|
||||
|
||||
std::unique_ptr<FluxSink> FluxSink::create(const FluxSinkProto& config)
|
||||
{
|
||||
switch (config.type())
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#ifndef FLUXSINK_H
|
||||
#define FLUXSINK_H
|
||||
|
||||
#include "lib/flags.h"
|
||||
#include "lib/config/flags.h"
|
||||
#include <ostream>
|
||||
|
||||
class Fluxmap;
|
||||
@@ -12,6 +12,7 @@ class A2RFluxSinkProto;
|
||||
class VcdFluxSinkProto;
|
||||
class ScpFluxSinkProto;
|
||||
class Fl2FluxSinkProto;
|
||||
class Config;
|
||||
|
||||
class FluxSink
|
||||
{
|
||||
@@ -34,6 +35,7 @@ public:
|
||||
static std::unique_ptr<FluxSink> createFl2FluxSink(
|
||||
const std::string& filename);
|
||||
|
||||
static std::unique_ptr<FluxSink> create(Config& config);
|
||||
static std::unique_ptr<FluxSink> create(const FluxSinkProto& config);
|
||||
|
||||
public:
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/config.h"
|
||||
#include "lib/flags.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/logger.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/config/config.h"
|
||||
#include "lib/config/flags.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/core/logger.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include "lib/usb/usb.h"
|
||||
#include "lib/fluxsink/fluxsink.h"
|
||||
#include "lib/fluxsink/fluxsink.pb.h"
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/config.h"
|
||||
#include "lib/flags.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/config/config.h"
|
||||
#include "lib/config/flags.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/fluxsink/fluxsink.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/fluxsink/fluxsink.pb.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/layout.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include "lib/scp.h"
|
||||
#include "lib/logger.h"
|
||||
#include "lib/core/logger.h"
|
||||
#include <fstream>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/flags.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/config/flags.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/fluxsink/fluxsink.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/fluxsink/fluxsink.pb.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include <fstream>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/fluxsource/fluxsource.pb.h"
|
||||
#include "lib/fluxsource/fluxsource.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include <fstream>
|
||||
|
||||
struct A2Rv2Flux
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "lib/fluxsource/catweasel.h"
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/fluxsource/fluxsource.pb.h"
|
||||
#include "lib/fluxsource/fluxsource.h"
|
||||
#include "lib/fluxsource/catweasel.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include <fstream>
|
||||
|
||||
struct CwfHeader
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/fluxsource/fluxsource.pb.h"
|
||||
#include "lib/fluxsource/fluxsource.h"
|
||||
#include "lib/fluxsource/catweasel.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/logger.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include "lib/core/logger.h"
|
||||
#include <fstream>
|
||||
#include <filesystem>
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/fluxsource/fluxsource.h"
|
||||
#include "lib/fluxsource/fluxsource.pb.h"
|
||||
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/fluxsource/fluxsource.pb.h"
|
||||
#include "lib/fl2.pb.h"
|
||||
#include "lib/fluxsource/fluxsource.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include "lib/fl2.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include <fstream>
|
||||
|
||||
class Fl2FluxSourceIterator : public FluxSourceIterator
|
||||
|
||||
@@ -1,11 +1,19 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/flags.h"
|
||||
#include "lib/config/config.h"
|
||||
#include "lib/config/flags.h"
|
||||
#include "lib/fluxsource/fluxsource.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/config.pb.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/config/config.pb.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include "lib/core/utils.h"
|
||||
|
||||
std::unique_ptr<FluxSource> FluxSource::create(Config& config)
|
||||
{
|
||||
if (!config.hasFluxSource())
|
||||
error("no flux source configured");
|
||||
return create(config->flux_source());
|
||||
}
|
||||
|
||||
std::unique_ptr<FluxSource> FluxSource::create(const FluxSourceProto& config)
|
||||
{
|
||||
switch (config.type())
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#ifndef FLUXSOURCE_H
|
||||
#define FLUXSOURCE_H
|
||||
|
||||
#include "lib/flags.h"
|
||||
#include "lib/config.pb.h"
|
||||
#include "lib/config/flags.h"
|
||||
#include "lib/config/config.pb.h"
|
||||
|
||||
class A2rFluxSourceProto;
|
||||
class CwfFluxSourceProto;
|
||||
@@ -17,6 +17,7 @@ class KryofluxFluxSourceProto;
|
||||
class ScpFluxSourceProto;
|
||||
class TestPatternFluxSourceProto;
|
||||
class FlxFluxSourceProto;
|
||||
class Config;
|
||||
|
||||
class FluxSourceIterator
|
||||
{
|
||||
@@ -58,6 +59,7 @@ public:
|
||||
static std::unique_ptr<FluxSource> createMemoryFluxSource(
|
||||
const DiskFlux& flux);
|
||||
|
||||
static std::unique_ptr<FluxSource> create(Config& config);
|
||||
static std::unique_ptr<FluxSource> create(const FluxSourceProto& spec);
|
||||
|
||||
public:
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "kryoflux.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/fluxsource/flx.h"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/fluxsource/fluxsource.pb.h"
|
||||
#include "lib/fluxsource/fluxsource.h"
|
||||
#include "lib/fluxsource/flx.h"
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/config.h"
|
||||
#include "lib/flags.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/logger.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/config/config.h"
|
||||
#include "lib/config/flags.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/core/logger.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include "lib/usb/usb.h"
|
||||
#include "lib/fluxsource/fluxsource.h"
|
||||
#include "lib/fluxsource/fluxsource.pb.h"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "kryoflux.h"
|
||||
#include "protocol.h"
|
||||
#include <fstream>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "kryoflux.h"
|
||||
#include "lib/fluxsource/fluxsource.pb.h"
|
||||
#include "lib/fluxsource/fluxsource.h"
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/flux.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/flux.h"
|
||||
#include "lib/fluxsource/fluxsource.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/layout.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include <fstream>
|
||||
|
||||
class MemoryFluxSourceIterator : public FluxSourceIterator
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "kryoflux.h"
|
||||
#include "lib/fluxsource/fluxsource.pb.h"
|
||||
#include "lib/core/utils.h"
|
||||
#include "lib/fluxsource/fluxsource.h"
|
||||
#include "lib/scp.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/logger.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include "lib/core/logger.h"
|
||||
#include <fstream>
|
||||
|
||||
static int trackno(int strack)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/fluxsource/fluxsource.h"
|
||||
#include "lib/fluxsource/fluxsource.pb.h"
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/logger.h"
|
||||
#include "lib/core/logger.h"
|
||||
#include <sys/time.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
|
||||
@@ -67,6 +67,6 @@ struct overloaded : Ts...
|
||||
template <class... Ts>
|
||||
overloaded(Ts...) -> overloaded<Ts...>;
|
||||
|
||||
#include "lib/config.h"
|
||||
#include "lib/config/config.h"
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/flags.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/config/flags.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/imagereader/imagereader.h"
|
||||
#include "lib/image.h"
|
||||
#include "lib/logger.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "lib/core/logger.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/flags.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/config/flags.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/imagereader/imagereader.h"
|
||||
#include "lib/image.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/logger.h"
|
||||
#include "lib/config.pb.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include "lib/core/logger.h"
|
||||
#include "lib/config/config.pb.h"
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/config.h"
|
||||
#include "lib/flags.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/config/config.h"
|
||||
#include "lib/config/flags.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/imagereader/imagereader.h"
|
||||
#include "lib/image.h"
|
||||
#include "lib/logger.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/config.pb.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "lib/core/logger.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include "lib/config/config.pb.h"
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user