From d394b21920a0c27d7cbef34adc1ee9c3a9ad3ec2 Mon Sep 17 00:00:00 2001 From: David Given Date: Sat, 28 Sep 2024 23:39:30 +0200 Subject: [PATCH] Got our first track read! --- build.py | 1 + lib/usb/applesauce.cc | 34 ++++++++++++++++++++++++++++++++++ lib/usb/applesauce.h | 2 ++ lib/usb/applesauceusb.cc | 3 +-- 4 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 lib/usb/applesauce.cc diff --git a/build.py b/build.py index 42403bc0..33b98192 100644 --- a/build.py +++ b/build.py @@ -90,6 +90,7 @@ cxxlibrary( "./lib/proto.cc", "./lib/readerwriter.cc", "./lib/sector.cc", + "./lib/usb/applesauce.cc", "./lib/usb/applesauceusb.cc", "./lib/usb/fluxengineusb.cc", "./lib/usb/greaseweazle.cc", diff --git a/lib/usb/applesauce.cc b/lib/usb/applesauce.cc new file mode 100644 index 00000000..fb3e4677 --- /dev/null +++ b/lib/usb/applesauce.cc @@ -0,0 +1,34 @@ +#include "lib/globals.h" +#include "usb.h" +#include "protocol.h" +#include "lib/bytes.h" +#include "greaseweazle.h" +#include "lib/fluxmap.h" +#include "lib/a2r.h" + +static uint32_t a2r_to_ticks(uint32_t a2rticks) +{ + return a2rticks * A2R_NS_PER_TICK / NS_PER_TICK; +} + +Bytes applesauceToFluxEngine(const Bytes& asdata) +{ + ByteReader br(asdata); + Fluxmap fluxmap; + + unsigned a2rTicksSinceLastPulse = 0; + while (!br.eof()) + { + uint8_t b = br.read_8(); + a2rTicksSinceLastPulse += b; + if (b != 255) + { + fluxmap.appendInterval(a2r_to_ticks(a2rTicksSinceLastPulse)); + fluxmap.appendPulse(); + a2rTicksSinceLastPulse = 0; + } + } + + return fluxmap.rawBytes(); +} + diff --git a/lib/usb/applesauce.h b/lib/usb/applesauce.h index 9c080075..87837a3d 100644 --- a/lib/usb/applesauce.h +++ b/lib/usb/applesauce.h @@ -4,3 +4,5 @@ #define APPLESAUCE_PID 0x0483 #define APPLESAUCE_ID ((APPLESAUCE_VID << 16) | APPLESAUCE_PID) + +extern Bytes applesauceToFluxEngine(const Bytes& asdata); diff --git a/lib/usb/applesauceusb.cc b/lib/usb/applesauceusb.cc index 8b1ff289..6f5d0a7d 100644 --- a/lib/usb/applesauceusb.cc +++ b/lib/usb/applesauceusb.cc @@ -188,8 +188,7 @@ public: doCommand(fmt::format("data:<{}", bufferSize)); Bytes rawData = _serial->readBytes(bufferSize); - - return Bytes(); + return applesauceToFluxEngine(rawData); } void write(int side,