From f5a3f184784889c53778719c8cc42aa77fd08668 Mon Sep 17 00:00:00 2001 From: David Given Date: Fri, 22 Feb 2019 20:25:28 +0100 Subject: [PATCH] Cleanup (the Fluxmap doesn't store intervals any more, just byte opcode things). --- lib/decoders/decoders.cc | 8 +++++++- lib/encoder.cc | 10 ++++++---- lib/fluxmap.cc | 22 +++++++++++----------- lib/fluxmap.h | 16 ++++++++-------- lib/sql.cc | 2 +- lib/stream/stream.cc | 4 ++-- lib/usb.cc | 2 +- src/fe-writetestpattern.cc | 2 +- 8 files changed, 37 insertions(+), 29 deletions(-) diff --git a/lib/decoders/decoders.cc b/lib/decoders/decoders.cc index 6e49ba11..498b9e5c 100644 --- a/lib/decoders/decoders.cc +++ b/lib/decoders/decoders.cc @@ -21,8 +21,14 @@ static SettableFlag showClockHistogram( nanoseconds_t Fluxmap::guessClock() const { uint32_t buckets[256] = {}; - for (uint8_t interval : _intervals) + size_t cursor = 0; + while (cursor < bytes()) + { + uint32_t interval = getAndIncrement(cursor); + if (interval > 0xff) + continue; buckets[interval]++; + } uint32_t max = *std::max_element(std::begin(buckets), std::end(buckets)); uint32_t min = *std::min_element(std::begin(buckets), std::end(buckets)); diff --git a/lib/encoder.cc b/lib/encoder.cc index 0245f3c9..89ec9b84 100644 --- a/lib/encoder.cc +++ b/lib/encoder.cc @@ -11,12 +11,14 @@ Fluxmap& Fluxmap::appendBits(const std::vector& bits, nanoseconds_t clock) if (bits[i]) { unsigned delta = (now - duration()) / NS_PER_TICK; - while (delta > 255) + while (delta >= 0x80) { - appendIntervals({ 255 }); - delta -= 255; + appendByte(0x80); + delta -= 0x80; } - appendIntervals({ (uint8_t)delta }); + if (delta == 0x00) + delta++; + appendByte(delta); } } diff --git a/lib/fluxmap.cc b/lib/fluxmap.cc index 0fca002a..2e10341f 100644 --- a/lib/fluxmap.cc +++ b/lib/fluxmap.cc @@ -6,9 +6,9 @@ uint32_t Fluxmap::getAndIncrement(size_t& index) const { uint32_t ticks = 0; - while (index < _intervals.size()) + while (index < _bytes.size()) { - uint8_t b = _intervals[index++]; + uint8_t b = _bytes[index++]; ticks += b; if (!(b & 0x80)) break; @@ -17,18 +17,18 @@ uint32_t Fluxmap::getAndIncrement(size_t& index) const return ticks; } -Fluxmap& Fluxmap::appendIntervals(const std::vector& intervals) +Fluxmap& Fluxmap::appendBytes(const std::vector& bytes) { - return appendIntervals(&intervals[0], intervals.size()); + return appendBytes(&bytes[0], bytes.size()); } -Fluxmap& Fluxmap::appendIntervals(const uint8_t* ptr, size_t len) +Fluxmap& Fluxmap::appendBytes(const uint8_t* ptr, size_t len) { while (len--) { - uint8_t interval = *ptr++; - _ticks += interval ? interval : 0x100; - _intervals.push_back(interval); + uint8_t byte = *ptr++; + _ticks += byte ? byte : 0x100; + _bytes.push_back(byte); } _duration = _ticks * NS_PER_TICK; @@ -40,10 +40,10 @@ void Fluxmap::precompensate(int threshold_ticks, int amount_ticks) { uint8_t junk = 0xff; - for (unsigned i=0; i<_intervals.size(); i++) + for (unsigned i=0; i<_bytes.size(); i++) { - uint8_t& prev = (i == 0) ? junk : _intervals[i-1]; - uint8_t& curr = _intervals[i]; + uint8_t& prev = (i == 0) ? junk : _bytes[i-1]; + uint8_t& curr = _bytes[i]; if ((prev <= threshold_ticks) && (curr > threshold_ticks)) { diff --git a/lib/fluxmap.h b/lib/fluxmap.h index 91e4870b..7b7d5633 100644 --- a/lib/fluxmap.h +++ b/lib/fluxmap.h @@ -7,21 +7,21 @@ public: uint32_t getAndIncrement(size_t& index) const; nanoseconds_t duration() const { return _duration; } - size_t bytes() const { return _intervals.size(); } + size_t bytes() const { return _bytes.size(); } const uint8_t* ptr() const { - if (!_intervals.empty()) - return &_intervals.at(0); + if (!_bytes.empty()) + return &_bytes.at(0); return NULL; } - Fluxmap& appendIntervals(const std::vector& intervals); - Fluxmap& appendIntervals(const uint8_t* ptr, size_t len); + Fluxmap& appendBytes(const std::vector& bytes); + Fluxmap& appendBytes(const uint8_t* ptr, size_t len); - Fluxmap& appendInterval(uint8_t interval) + Fluxmap& appendByte(uint8_t byte) { - return appendIntervals(&interval, 1); + return appendBytes(&byte, 1); } nanoseconds_t guessClock() const; @@ -34,7 +34,7 @@ public: private: nanoseconds_t _duration = 0; int _ticks = 0; - std::vector _intervals; + std::vector _bytes; }; #endif diff --git a/lib/sql.cc b/lib/sql.cc index b9d1a6c4..ecb94f35 100644 --- a/lib/sql.cc +++ b/lib/sql.cc @@ -92,7 +92,7 @@ std::unique_ptr sqlReadFlux(sqlite3* db, int track, int side) const uint8_t* blobptr = (const uint8_t*) sqlite3_column_blob(stmt, 0); size_t bloblen = sqlite3_column_bytes(stmt, 0); - fluxmap->appendIntervals(blobptr, bloblen); + fluxmap->appendBytes(blobptr, bloblen); } sqlCheck(db, sqlite3_finalize(stmt)); return fluxmap; diff --git a/lib/stream/stream.cc b/lib/stream/stream.cc index 6ae6e4e6..3c0ac243 100644 --- a/lib/stream/stream.cc +++ b/lib/stream/stream.cc @@ -31,10 +31,10 @@ std::unique_ptr readStream(const std::string& path, unsigned track, uns int ticks = (double)sclk * TICKS_PER_SCLK; while (ticks >= 0x100) { - fluxmap->appendInterval(0); + fluxmap->appendByte(0); ticks -= 0x100; } - fluxmap->appendInterval((uint8_t)ticks); + fluxmap->appendByte((uint8_t)ticks); }; uint32_t extrasclks = 0; diff --git a/lib/usb.cc b/lib/usb.cc index 508f2b4a..92f8ff22 100644 --- a/lib/usb.cc +++ b/lib/usb.cc @@ -203,7 +203,7 @@ std::unique_ptr usbRead(int side, int revolutions) int len = large_bulk_transfer(FLUXENGINE_DATA_IN_EP, buffer); buffer.resize(len); - fluxmap->appendIntervals(buffer); + fluxmap->appendBytes(buffer); await_reply(F_FRAME_READ_REPLY); return fluxmap; diff --git a/src/fe-writetestpattern.cc b/src/fe-writetestpattern.cc index 220469c1..92e0a94d 100644 --- a/src/fe-writetestpattern.cc +++ b/src/fe-writetestpattern.cc @@ -33,7 +33,7 @@ int main(int argc, const char* argv[]) std::unique_ptr fluxmap(new Fluxmap); while (fluxmap->duration() < (sequenceLength*1000000.0)) - fluxmap->appendIntervals({ (uint8_t)ticksPerInterval }); + fluxmap->appendByte(ticksPerInterval); return fluxmap; }