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,