mirror of
https://github.com/davidgiven/fluxengine.git
synced 2025-10-31 11:17:01 -07:00
Split the FluxmapReader and FluxPattern files.
This commit is contained in:
@@ -4,6 +4,7 @@
|
|||||||
#include "lib/core/crc.h"
|
#include "lib/core/crc.h"
|
||||||
#include "lib/fluxmap.h"
|
#include "lib/fluxmap.h"
|
||||||
#include "lib/decoders/fluxmapreader.h"
|
#include "lib/decoders/fluxmapreader.h"
|
||||||
|
#include "lib/decoders/fluxpattern.h"
|
||||||
#include "lib/sector.h"
|
#include "lib/sector.h"
|
||||||
#include "lib/core/bytes.h"
|
#include "lib/core/bytes.h"
|
||||||
#include "fmt/format.h"
|
#include "fmt/format.h"
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#include "lib/core/crc.h"
|
#include "lib/core/crc.h"
|
||||||
#include "lib/fluxmap.h"
|
#include "lib/fluxmap.h"
|
||||||
#include "lib/decoders/fluxmapreader.h"
|
#include "lib/decoders/fluxmapreader.h"
|
||||||
|
#include "lib/decoders/fluxpattern.h"
|
||||||
#include "lib/sector.h"
|
#include "lib/sector.h"
|
||||||
#include "lib/core/bytes.h"
|
#include "lib/core/bytes.h"
|
||||||
#include "fmt/format.h"
|
#include "fmt/format.h"
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "lib/core/globals.h"
|
#include "lib/core/globals.h"
|
||||||
#include "lib/fluxmap.h"
|
#include "lib/fluxmap.h"
|
||||||
#include "lib/decoders/fluxmapreader.h"
|
#include "lib/decoders/fluxmapreader.h"
|
||||||
|
#include "lib/decoders/fluxpattern.h"
|
||||||
#include "protocol.h"
|
#include "protocol.h"
|
||||||
#include "lib/decoders/decoders.h"
|
#include "lib/decoders/decoders.h"
|
||||||
#include "lib/sector.h"
|
#include "lib/sector.h"
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "lib/core/globals.h"
|
#include "lib/core/globals.h"
|
||||||
#include "lib/fluxmap.h"
|
#include "lib/fluxmap.h"
|
||||||
#include "lib/decoders/fluxmapreader.h"
|
#include "lib/decoders/fluxmapreader.h"
|
||||||
|
#include "lib/decoders/fluxpattern.h"
|
||||||
#include "protocol.h"
|
#include "protocol.h"
|
||||||
#include "lib/decoders/decoders.h"
|
#include "lib/decoders/decoders.h"
|
||||||
#include "lib/sector.h"
|
#include "lib/sector.h"
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "lib/core/globals.h"
|
#include "lib/core/globals.h"
|
||||||
#include "lib/fluxmap.h"
|
#include "lib/fluxmap.h"
|
||||||
#include "lib/decoders/fluxmapreader.h"
|
#include "lib/decoders/fluxmapreader.h"
|
||||||
|
#include "lib/decoders/fluxpattern.h"
|
||||||
#include "lib/decoders/decoders.h"
|
#include "lib/decoders/decoders.h"
|
||||||
#include "lib/encoders/encoders.h"
|
#include "lib/encoders/encoders.h"
|
||||||
#include "brother.h"
|
#include "brother.h"
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "lib/core/globals.h"
|
#include "lib/core/globals.h"
|
||||||
#include "lib/fluxmap.h"
|
#include "lib/fluxmap.h"
|
||||||
#include "lib/decoders/fluxmapreader.h"
|
#include "lib/decoders/fluxmapreader.h"
|
||||||
|
#include "lib/decoders/fluxpattern.h"
|
||||||
#include "protocol.h"
|
#include "protocol.h"
|
||||||
#include "lib/decoders/decoders.h"
|
#include "lib/decoders/decoders.h"
|
||||||
#include "lib/sector.h"
|
#include "lib/sector.h"
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "lib/core/globals.h"
|
#include "lib/core/globals.h"
|
||||||
#include "lib/fluxmap.h"
|
#include "lib/fluxmap.h"
|
||||||
#include "lib/decoders/fluxmapreader.h"
|
#include "lib/decoders/fluxmapreader.h"
|
||||||
|
#include "lib/decoders/fluxpattern.h"
|
||||||
#include "protocol.h"
|
#include "protocol.h"
|
||||||
#include "lib/decoders/decoders.h"
|
#include "lib/decoders/decoders.h"
|
||||||
#include "lib/sector.h"
|
#include "lib/sector.h"
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "lib/core/globals.h"
|
#include "lib/core/globals.h"
|
||||||
#include "lib/fluxmap.h"
|
#include "lib/fluxmap.h"
|
||||||
#include "lib/decoders/fluxmapreader.h"
|
#include "lib/decoders/fluxmapreader.h"
|
||||||
|
#include "lib/decoders/fluxpattern.h"
|
||||||
#include "protocol.h"
|
#include "protocol.h"
|
||||||
#include "lib/decoders/decoders.h"
|
#include "lib/decoders/decoders.h"
|
||||||
#include "lib/sector.h"
|
#include "lib/sector.h"
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#include "lib/core/crc.h"
|
#include "lib/core/crc.h"
|
||||||
#include "lib/fluxmap.h"
|
#include "lib/fluxmap.h"
|
||||||
#include "lib/decoders/fluxmapreader.h"
|
#include "lib/decoders/fluxmapreader.h"
|
||||||
|
#include "lib/decoders/fluxpattern.h"
|
||||||
#include "lib/sector.h"
|
#include "lib/sector.h"
|
||||||
#include "arch/ibm/ibm.pb.h"
|
#include "arch/ibm/ibm.pb.h"
|
||||||
#include "lib/proto.h"
|
#include "lib/proto.h"
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "lib/core/globals.h"
|
#include "lib/core/globals.h"
|
||||||
#include "lib/fluxmap.h"
|
#include "lib/fluxmap.h"
|
||||||
#include "lib/decoders/fluxmapreader.h"
|
#include "lib/decoders/fluxmapreader.h"
|
||||||
|
#include "lib/decoders/fluxpattern.h"
|
||||||
#include "protocol.h"
|
#include "protocol.h"
|
||||||
#include "lib/decoders/decoders.h"
|
#include "lib/decoders/decoders.h"
|
||||||
#include "lib/sector.h"
|
#include "lib/sector.h"
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "lib/core/globals.h"
|
#include "lib/core/globals.h"
|
||||||
#include "lib/fluxmap.h"
|
#include "lib/fluxmap.h"
|
||||||
#include "lib/decoders/fluxmapreader.h"
|
#include "lib/decoders/fluxmapreader.h"
|
||||||
|
#include "lib/decoders/fluxpattern.h"
|
||||||
#include "lib/decoders/decoders.h"
|
#include "lib/decoders/decoders.h"
|
||||||
#include "lib/sector.h"
|
#include "lib/sector.h"
|
||||||
#include "micropolis.h"
|
#include "micropolis.h"
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#include "lib/core/crc.h"
|
#include "lib/core/crc.h"
|
||||||
#include "lib/fluxmap.h"
|
#include "lib/fluxmap.h"
|
||||||
#include "lib/decoders/fluxmapreader.h"
|
#include "lib/decoders/fluxmapreader.h"
|
||||||
|
#include "lib/decoders/fluxpattern.h"
|
||||||
#include "lib/sector.h"
|
#include "lib/sector.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
#include "lib/core/globals.h"
|
#include "lib/core/globals.h"
|
||||||
#include "lib/fluxmap.h"
|
#include "lib/fluxmap.h"
|
||||||
#include "lib/decoders/fluxmapreader.h"
|
#include "lib/decoders/fluxmapreader.h"
|
||||||
|
#include "lib/decoders/fluxpattern.h"
|
||||||
#include "lib/decoders/decoders.h"
|
#include "lib/decoders/decoders.h"
|
||||||
#include "lib/sector.h"
|
#include "lib/sector.h"
|
||||||
#include "northstar.h"
|
#include "northstar.h"
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#include "lib/core/crc.h"
|
#include "lib/core/crc.h"
|
||||||
#include "lib/fluxmap.h"
|
#include "lib/fluxmap.h"
|
||||||
#include "lib/decoders/fluxmapreader.h"
|
#include "lib/decoders/fluxmapreader.h"
|
||||||
|
#include "lib/decoders/fluxpattern.h"
|
||||||
#include "lib/sector.h"
|
#include "lib/sector.h"
|
||||||
#include "lib/core/bytes.h"
|
#include "lib/core/bytes.h"
|
||||||
#include "rolandd20.h"
|
#include "rolandd20.h"
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "lib/core/globals.h"
|
#include "lib/core/globals.h"
|
||||||
#include "lib/fluxmap.h"
|
#include "lib/fluxmap.h"
|
||||||
#include "lib/decoders/fluxmapreader.h"
|
#include "lib/decoders/fluxmapreader.h"
|
||||||
|
#include "lib/decoders/fluxpattern.h"
|
||||||
#include "protocol.h"
|
#include "protocol.h"
|
||||||
#include "lib/decoders/decoders.h"
|
#include "lib/decoders/decoders.h"
|
||||||
#include "lib/sector.h"
|
#include "lib/sector.h"
|
||||||
|
|||||||
@@ -5,16 +5,20 @@
|
|||||||
#include "lib/core/crc.h"
|
#include "lib/core/crc.h"
|
||||||
#include "lib/fluxmap.h"
|
#include "lib/fluxmap.h"
|
||||||
#include "lib/decoders/fluxmapreader.h"
|
#include "lib/decoders/fluxmapreader.h"
|
||||||
|
#include "lib/decoders/fluxpattern.h"
|
||||||
#include "lib/sector.h"
|
#include "lib/sector.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
constexpr uint64_t HEADER_BITS = 0xaaaaaaaa44895554LL;
|
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 HEADER_PATTERN(64, HEADER_BITS);
|
||||||
static const FluxPattern DATA_PATTERN(64, DATA_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
|
class TartuDecoder : public Decoder
|
||||||
{
|
{
|
||||||
@@ -25,7 +29,9 @@ public:
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void beginTrack() override {}
|
void beginTrack() override
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
nanoseconds_t advanceToNextRecord() override
|
nanoseconds_t advanceToNextRecord() override
|
||||||
{
|
{
|
||||||
@@ -39,7 +45,7 @@ public:
|
|||||||
|
|
||||||
auto bits = readRawBits(16 * 4);
|
auto bits = readRawBits(16 * 4);
|
||||||
auto bytes = decodeFmMfm(bits).slice(0, 4);
|
auto bytes = decodeFmMfm(bits).slice(0, 4);
|
||||||
|
|
||||||
ByteReader br(bytes);
|
ByteReader br(bytes);
|
||||||
uint8_t track = br.read_8();
|
uint8_t track = br.read_8();
|
||||||
_sector->logicalTrack = track >> 1;
|
_sector->logicalTrack = track >> 1;
|
||||||
@@ -48,7 +54,7 @@ public:
|
|||||||
_sector->logicalSector = br.read_8();
|
_sector->logicalSector = br.read_8();
|
||||||
uint8_t wantChecksum = br.read_8();
|
uint8_t wantChecksum = br.read_8();
|
||||||
uint8_t gotChecksum = ~sumBytes(bytes.slice(0, 3));
|
uint8_t gotChecksum = ~sumBytes(bytes.slice(0, 3));
|
||||||
|
|
||||||
if (wantChecksum == gotChecksum)
|
if (wantChecksum == gotChecksum)
|
||||||
_sector->status = Sector::DATA_MISSING;
|
_sector->status = Sector::DATA_MISSING;
|
||||||
|
|
||||||
@@ -59,15 +65,14 @@ public:
|
|||||||
{
|
{
|
||||||
if (readRaw64() != DATA_BITS)
|
if (readRaw64() != DATA_BITS)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const auto& bits = readRawBits(129 * 16);
|
const auto& bits = readRawBits(129 * 16);
|
||||||
const auto& bytes = decodeFmMfm(bits).slice(0, 129);
|
const auto& bytes = decodeFmMfm(bits).slice(0, 129);
|
||||||
_sector->data = bytes.slice(0, 128);
|
_sector->data = bytes.slice(0, 128);
|
||||||
|
|
||||||
uint8_t wantChecksum = bytes.reader().seek(128).read_8();
|
uint8_t wantChecksum = bytes.reader().seek(128).read_8();
|
||||||
uint8_t gotChecksum = ~sumBytes(_sector->data);
|
uint8_t gotChecksum = ~sumBytes(_sector->data);
|
||||||
_sector->status =
|
_sector->status = (wantChecksum == gotChecksum) ? Sector::OK : Sector::BAD_CHECKSUM;
|
||||||
(wantChecksum == gotChecksum) ? Sector::OK : Sector::BAD_CHECKSUM;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -78,3 +83,4 @@ std::unique_ptr<Decoder> createTartuDecoder(const DecoderProto& config)
|
|||||||
{
|
{
|
||||||
return std::unique_ptr<Decoder>(new TartuDecoder(config));
|
return std::unique_ptr<Decoder>(new TartuDecoder(config));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
#include "lib/core/crc.h"
|
#include "lib/core/crc.h"
|
||||||
#include "lib/fluxmap.h"
|
#include "lib/fluxmap.h"
|
||||||
#include "lib/decoders/fluxmapreader.h"
|
#include "lib/decoders/fluxmapreader.h"
|
||||||
|
#include "lib/decoders/fluxpattern.h"
|
||||||
#include "lib/sector.h"
|
#include "lib/sector.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "lib/core/globals.h"
|
#include "lib/core/globals.h"
|
||||||
#include "lib/fluxmap.h"
|
#include "lib/fluxmap.h"
|
||||||
#include "lib/decoders/fluxmapreader.h"
|
#include "lib/decoders/fluxmapreader.h"
|
||||||
|
#include "lib/decoders/fluxpattern.h"
|
||||||
#include "protocol.h"
|
#include "protocol.h"
|
||||||
#include "lib/decoders/decoders.h"
|
#include "lib/decoders/decoders.h"
|
||||||
#include "lib/sector.h"
|
#include "lib/sector.h"
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "lib/core/globals.h"
|
#include "lib/core/globals.h"
|
||||||
#include "lib/fluxmap.h"
|
#include "lib/fluxmap.h"
|
||||||
#include "lib/decoders/fluxmapreader.h"
|
#include "lib/decoders/fluxmapreader.h"
|
||||||
|
#include "lib/decoders/fluxpattern.h"
|
||||||
#include "protocol.h"
|
#include "protocol.h"
|
||||||
#include "lib/decoders/decoders.h"
|
#include "lib/decoders/decoders.h"
|
||||||
#include "lib/sector.h"
|
#include "lib/sector.h"
|
||||||
|
|||||||
2
build.py
2
build.py
@@ -29,6 +29,7 @@ cxxlibrary(
|
|||||||
"./lib/decoders/decoders.cc",
|
"./lib/decoders/decoders.cc",
|
||||||
"./lib/decoders/fluxdecoder.cc",
|
"./lib/decoders/fluxdecoder.cc",
|
||||||
"./lib/decoders/fluxmapreader.cc",
|
"./lib/decoders/fluxmapreader.cc",
|
||||||
|
"./lib/decoders/fluxpattern.cc",
|
||||||
"./lib/decoders/fmmfm.cc",
|
"./lib/decoders/fmmfm.cc",
|
||||||
"./lib/encoders/encoders.cc",
|
"./lib/encoders/encoders.cc",
|
||||||
"./lib/fl2.cc",
|
"./lib/fl2.cc",
|
||||||
@@ -159,6 +160,7 @@ cxxlibrary(
|
|||||||
"lib/decoders/decoders.h": "./lib/decoders/decoders.h",
|
"lib/decoders/decoders.h": "./lib/decoders/decoders.h",
|
||||||
"lib/decoders/fluxdecoder.h": "./lib/decoders/fluxdecoder.h",
|
"lib/decoders/fluxdecoder.h": "./lib/decoders/fluxdecoder.h",
|
||||||
"lib/decoders/fluxmapreader.h": "./lib/decoders/fluxmapreader.h",
|
"lib/decoders/fluxmapreader.h": "./lib/decoders/fluxmapreader.h",
|
||||||
|
"lib/decoders/fluxpattern.h": "./lib/decoders/fluxpattern.h",
|
||||||
"lib/decoders/rawbits.h": "./lib/decoders/rawbits.h",
|
"lib/decoders/rawbits.h": "./lib/decoders/rawbits.h",
|
||||||
"lib/encoders/encoders.h": "./lib/encoders/encoders.h",
|
"lib/encoders/encoders.h": "./lib/encoders/encoders.h",
|
||||||
"lib/scp.h": "./lib/scp.h",
|
"lib/scp.h": "./lib/scp.h",
|
||||||
|
|||||||
@@ -220,3 +220,17 @@ uint32_t unbcd(uint32_t bcd)
|
|||||||
|
|
||||||
return dec;
|
return dec;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int findLowestSetBit(uint64_t value)
|
||||||
|
{
|
||||||
|
if (!value)
|
||||||
|
return 0;
|
||||||
|
int bit = 1;
|
||||||
|
while (!(value & 1))
|
||||||
|
{
|
||||||
|
value >>= 1;
|
||||||
|
bit++;
|
||||||
|
}
|
||||||
|
return bit;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ extern std::string tohex(const std::string& s);
|
|||||||
extern bool doesFileExist(const std::string& filename);
|
extern bool doesFileExist(const std::string& filename);
|
||||||
extern int countSetBits(uint32_t word);
|
extern int countSetBits(uint32_t word);
|
||||||
extern uint32_t unbcd(uint32_t bcd);
|
extern uint32_t unbcd(uint32_t bcd);
|
||||||
|
extern int findLowestSetBit(uint64_t value);
|
||||||
|
|
||||||
template <class K, class V>
|
template <class K, class V>
|
||||||
std::map<V, K> reverseMap(const std::map<K, V>& map)
|
std::map<V, K> reverseMap(const std::map<K, V>& map)
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
class Sector;
|
class Sector;
|
||||||
class Fluxmap;
|
class Fluxmap;
|
||||||
|
class FluxMatcher;
|
||||||
class FluxmapReader;
|
class FluxmapReader;
|
||||||
class RawBits;
|
class RawBits;
|
||||||
class DecoderProto;
|
class DecoderProto;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#include "lib/config.h"
|
#include "lib/config.h"
|
||||||
#include "lib/fluxmap.h"
|
#include "lib/fluxmap.h"
|
||||||
#include "lib/decoders/fluxmapreader.h"
|
#include "lib/decoders/fluxmapreader.h"
|
||||||
#include "lib/flags.h"
|
#include "lib/decoders/fluxpattern.h"
|
||||||
#include "lib/proto.h"
|
#include "lib/proto.h"
|
||||||
#include "protocol.h"
|
#include "protocol.h"
|
||||||
#include <numeric>
|
#include <numeric>
|
||||||
@@ -81,110 +81,6 @@ unsigned FluxmapReader::readInterval(nanoseconds_t clock)
|
|||||||
return ticks;
|
return ticks;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int findLowestSetBit(uint64_t value)
|
|
||||||
{
|
|
||||||
if (!value)
|
|
||||||
return 0;
|
|
||||||
int bit = 1;
|
|
||||||
while (!(value & 1))
|
|
||||||
{
|
|
||||||
value >>= 1;
|
|
||||||
bit++;
|
|
||||||
}
|
|
||||||
return bit;
|
|
||||||
}
|
|
||||||
|
|
||||||
FluxPattern::FluxPattern(unsigned bits, uint64_t pattern): _bits(bits)
|
|
||||||
{
|
|
||||||
const uint64_t TOPBIT = 1ULL << 63;
|
|
||||||
|
|
||||||
assert(pattern != 0);
|
|
||||||
|
|
||||||
unsigned lowbit = findLowestSetBit(pattern) - 1;
|
|
||||||
|
|
||||||
pattern <<= 64 - bits;
|
|
||||||
_highzeroes = 0;
|
|
||||||
while (!(pattern & TOPBIT))
|
|
||||||
{
|
|
||||||
pattern <<= 1;
|
|
||||||
_highzeroes++;
|
|
||||||
}
|
|
||||||
|
|
||||||
_length = 0;
|
|
||||||
while (pattern != TOPBIT)
|
|
||||||
{
|
|
||||||
unsigned interval = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
pattern <<= 1;
|
|
||||||
interval++;
|
|
||||||
} while (!(pattern & TOPBIT));
|
|
||||||
_intervals.push_back(interval);
|
|
||||||
_length += interval;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lowbit)
|
|
||||||
{
|
|
||||||
_lowzero = true;
|
|
||||||
/* Note that length does *not* include this interval. */
|
|
||||||
_intervals.push_back(lowbit + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool FluxPattern::matches(const unsigned* end, FluxMatch& match) const
|
|
||||||
{
|
|
||||||
const double clockDecodeThreshold =
|
|
||||||
globalConfig()->decoder().bit_error_threshold();
|
|
||||||
const unsigned* start = end - _intervals.size();
|
|
||||||
unsigned candidatelength = std::accumulate(start, end - _lowzero, 0);
|
|
||||||
if (!candidatelength)
|
|
||||||
return false;
|
|
||||||
match.clock = (double)candidatelength / (double)_length;
|
|
||||||
|
|
||||||
unsigned exactIntervals = _intervals.size() - _lowzero;
|
|
||||||
for (unsigned i = 0; i < exactIntervals; i++)
|
|
||||||
{
|
|
||||||
double ii = match.clock * (double)_intervals[i];
|
|
||||||
double ci = (double)start[i];
|
|
||||||
double error = fabs((ii - ci) / match.clock);
|
|
||||||
if (error > clockDecodeThreshold)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_lowzero)
|
|
||||||
{
|
|
||||||
double ii = match.clock * (double)_intervals[exactIntervals];
|
|
||||||
double ci = (double)start[exactIntervals];
|
|
||||||
double error = (ii - ci) / match.clock;
|
|
||||||
if (error > clockDecodeThreshold)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
match.matcher = this;
|
|
||||||
match.intervals = _intervals.size();
|
|
||||||
match.zeroes = _highzeroes;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
FluxMatchers::FluxMatchers(
|
|
||||||
const std::initializer_list<const FluxMatcher*> matchers):
|
|
||||||
_matchers(matchers)
|
|
||||||
{
|
|
||||||
_intervals = 0;
|
|
||||||
for (const auto* matcher : matchers)
|
|
||||||
_intervals = std::max(_intervals, matcher->intervals());
|
|
||||||
}
|
|
||||||
|
|
||||||
bool FluxMatchers::matches(const unsigned* intervals, FluxMatch& match) const
|
|
||||||
{
|
|
||||||
for (const auto* matcher : _matchers)
|
|
||||||
{
|
|
||||||
if (matcher->matches(intervals, match))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void FluxmapReader::seek(nanoseconds_t ns)
|
void FluxmapReader::seek(nanoseconds_t ns)
|
||||||
{
|
{
|
||||||
unsigned ticks = ns / NS_PER_TICK;
|
unsigned ticks = ns / NS_PER_TICK;
|
||||||
|
|||||||
@@ -5,67 +5,8 @@
|
|||||||
#include "lib/flags.h"
|
#include "lib/flags.h"
|
||||||
#include "protocol.h"
|
#include "protocol.h"
|
||||||
|
|
||||||
class FluxMatcher;
|
|
||||||
class DecoderProto;
|
class DecoderProto;
|
||||||
|
class FluxMatcher;
|
||||||
struct FluxMatch
|
|
||||||
{
|
|
||||||
const FluxMatcher* matcher;
|
|
||||||
unsigned intervals;
|
|
||||||
double clock;
|
|
||||||
unsigned zeroes;
|
|
||||||
};
|
|
||||||
|
|
||||||
class FluxMatcher
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual ~FluxMatcher() {}
|
|
||||||
|
|
||||||
/* Returns the number of intervals matched */
|
|
||||||
virtual bool matches(const unsigned* intervals, FluxMatch& match) const = 0;
|
|
||||||
virtual unsigned intervals() const = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
class FluxPattern : public FluxMatcher
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
FluxPattern(unsigned bits, uint64_t patterns);
|
|
||||||
|
|
||||||
bool matches(const unsigned* intervals, FluxMatch& match) const override;
|
|
||||||
|
|
||||||
unsigned intervals() const override
|
|
||||||
{
|
|
||||||
return _intervals.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::vector<unsigned> _intervals;
|
|
||||||
unsigned _length;
|
|
||||||
unsigned _bits;
|
|
||||||
unsigned _highzeroes;
|
|
||||||
bool _lowzero = false;
|
|
||||||
|
|
||||||
public:
|
|
||||||
friend void test_patternconstruction();
|
|
||||||
friend void test_patternmatching();
|
|
||||||
};
|
|
||||||
|
|
||||||
class FluxMatchers : public FluxMatcher
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
FluxMatchers(const std::initializer_list<const FluxMatcher*> matchers);
|
|
||||||
|
|
||||||
bool matches(const unsigned* intervals, FluxMatch& match) const override;
|
|
||||||
|
|
||||||
unsigned intervals() const override
|
|
||||||
{
|
|
||||||
return _intervals;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
unsigned _intervals;
|
|
||||||
std::vector<const FluxMatcher*> _matchers;
|
|
||||||
};
|
|
||||||
|
|
||||||
class FluxmapReader
|
class FluxmapReader
|
||||||
{
|
{
|
||||||
|
|||||||
100
lib/decoders/fluxpattern.cc
Normal file
100
lib/decoders/fluxpattern.cc
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
#include "lib/core/globals.h"
|
||||||
|
#include "lib/config.h"
|
||||||
|
#include "lib/fluxmap.h"
|
||||||
|
#include "lib/decoders/fluxpattern.h"
|
||||||
|
#include "lib/proto.h"
|
||||||
|
#include "protocol.h"
|
||||||
|
#include <numeric>
|
||||||
|
#include <math.h>
|
||||||
|
#include <strings.h>
|
||||||
|
|
||||||
|
FluxPattern::FluxPattern(unsigned bits, uint64_t pattern): _bits(bits)
|
||||||
|
{
|
||||||
|
const uint64_t TOPBIT = 1ULL << 63;
|
||||||
|
|
||||||
|
assert(pattern != 0);
|
||||||
|
|
||||||
|
unsigned lowbit = findLowestSetBit(pattern) - 1;
|
||||||
|
|
||||||
|
pattern <<= 64 - bits;
|
||||||
|
_highzeroes = 0;
|
||||||
|
while (!(pattern & TOPBIT))
|
||||||
|
{
|
||||||
|
pattern <<= 1;
|
||||||
|
_highzeroes++;
|
||||||
|
}
|
||||||
|
|
||||||
|
_length = 0;
|
||||||
|
while (pattern != TOPBIT)
|
||||||
|
{
|
||||||
|
unsigned interval = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
pattern <<= 1;
|
||||||
|
interval++;
|
||||||
|
} while (!(pattern & TOPBIT));
|
||||||
|
_intervals.push_back(interval);
|
||||||
|
_length += interval;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lowbit)
|
||||||
|
{
|
||||||
|
_lowzero = true;
|
||||||
|
/* Note that length does *not* include this interval. */
|
||||||
|
_intervals.push_back(lowbit + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FluxPattern::matches(const unsigned* end, FluxMatch& match) const
|
||||||
|
{
|
||||||
|
const double clockDecodeThreshold =
|
||||||
|
globalConfig()->decoder().bit_error_threshold();
|
||||||
|
const unsigned* start = end - _intervals.size();
|
||||||
|
unsigned candidatelength = std::accumulate(start, end - _lowzero, 0);
|
||||||
|
if (!candidatelength)
|
||||||
|
return false;
|
||||||
|
match.clock = (double)candidatelength / (double)_length;
|
||||||
|
|
||||||
|
unsigned exactIntervals = _intervals.size() - _lowzero;
|
||||||
|
for (unsigned i = 0; i < exactIntervals; i++)
|
||||||
|
{
|
||||||
|
double ii = match.clock * (double)_intervals[i];
|
||||||
|
double ci = (double)start[i];
|
||||||
|
double error = fabs((ii - ci) / match.clock);
|
||||||
|
if (error > clockDecodeThreshold)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_lowzero)
|
||||||
|
{
|
||||||
|
double ii = match.clock * (double)_intervals[exactIntervals];
|
||||||
|
double ci = (double)start[exactIntervals];
|
||||||
|
double error = (ii - ci) / match.clock;
|
||||||
|
if (error > clockDecodeThreshold)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
match.matcher = this;
|
||||||
|
match.intervals = _intervals.size();
|
||||||
|
match.zeroes = _highzeroes;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
FluxMatchers::FluxMatchers(
|
||||||
|
const std::initializer_list<const FluxMatcher*> matchers):
|
||||||
|
_matchers(matchers)
|
||||||
|
{
|
||||||
|
_intervals = 0;
|
||||||
|
for (const auto* matcher : matchers)
|
||||||
|
_intervals = std::max(_intervals, matcher->intervals());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FluxMatchers::matches(const unsigned* intervals, FluxMatch& match) const
|
||||||
|
{
|
||||||
|
for (const auto* matcher : _matchers)
|
||||||
|
{
|
||||||
|
if (matcher->matches(intervals, match))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
68
lib/decoders/fluxpattern.h
Normal file
68
lib/decoders/fluxpattern.h
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "lib/core/utils.h"
|
||||||
|
#include "lib/fluxmap.h"
|
||||||
|
#include "lib/flags.h"
|
||||||
|
#include "protocol.h"
|
||||||
|
|
||||||
|
class FluxMatcher;
|
||||||
|
class DecoderProto;
|
||||||
|
|
||||||
|
struct FluxMatch
|
||||||
|
{
|
||||||
|
const FluxMatcher* matcher;
|
||||||
|
unsigned intervals;
|
||||||
|
double clock;
|
||||||
|
unsigned zeroes;
|
||||||
|
};
|
||||||
|
|
||||||
|
class FluxMatcher
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual ~FluxMatcher() {}
|
||||||
|
|
||||||
|
/* Returns the number of intervals matched */
|
||||||
|
virtual bool matches(const unsigned* intervals, FluxMatch& match) const = 0;
|
||||||
|
virtual unsigned intervals() const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
class FluxPattern : public FluxMatcher
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FluxPattern(unsigned bits, uint64_t patterns);
|
||||||
|
|
||||||
|
bool matches(const unsigned* intervals, FluxMatch& match) const override;
|
||||||
|
|
||||||
|
unsigned intervals() const override
|
||||||
|
{
|
||||||
|
return _intervals.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::vector<unsigned> _intervals;
|
||||||
|
unsigned _length;
|
||||||
|
unsigned _bits;
|
||||||
|
unsigned _highzeroes;
|
||||||
|
bool _lowzero = false;
|
||||||
|
|
||||||
|
public:
|
||||||
|
friend void test_patternconstruction();
|
||||||
|
friend void test_patternmatching();
|
||||||
|
};
|
||||||
|
|
||||||
|
class FluxMatchers : public FluxMatcher
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FluxMatchers(const std::initializer_list<const FluxMatcher*> matchers);
|
||||||
|
|
||||||
|
bool matches(const unsigned* intervals, FluxMatch& match) const override;
|
||||||
|
|
||||||
|
unsigned intervals() const override
|
||||||
|
{
|
||||||
|
return _intervals;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
unsigned _intervals;
|
||||||
|
std::vector<const FluxMatcher*> _matchers;
|
||||||
|
};
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#include "lib/core/globals.h"
|
#include "lib/core/globals.h"
|
||||||
#include "lib/fluxmap.h"
|
#include "lib/fluxmap.h"
|
||||||
#include "lib/decoders/fluxmapreader.h"
|
#include "lib/decoders/fluxpattern.h"
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
typedef std::vector<unsigned> ivector;
|
typedef std::vector<unsigned> ivector;
|
||||||
|
|||||||
Reference in New Issue
Block a user