mirror of
https://github.com/davidgiven/fluxengine.git
synced 2025-10-31 11:17:01 -07:00
92 lines
2.0 KiB
C++
92 lines
2.0 KiB
C++
#include "globals.h"
|
|
#include "flags.h"
|
|
#include "fluxmap.h"
|
|
#include "usb.h"
|
|
#include "fluxsource/fluxsource.h"
|
|
#include "fmt/format.h"
|
|
|
|
FlagGroup hardwareFluxSourceFlags;
|
|
|
|
static DoubleFlag revolutions(
|
|
{ "--revolutions" },
|
|
"read this many revolutions of the disk",
|
|
1.25);
|
|
|
|
static BoolFlag synced(
|
|
{ "--sync-with-index" },
|
|
"whether to wait for an index pulse before started to read",
|
|
false);
|
|
|
|
static IntFlag indexMode(
|
|
{ "--index-mode" },
|
|
"index pulse source (0=drive, 1=300 RPM fake source, 2=360 RPM fake source",
|
|
0);
|
|
|
|
static bool high_density = false;
|
|
|
|
void setHardwareFluxSourceDensity(bool high_density)
|
|
{
|
|
::high_density = high_density;
|
|
}
|
|
|
|
class HardwareFluxSource : public FluxSource
|
|
{
|
|
public:
|
|
HardwareFluxSource(unsigned drive):
|
|
_drive(drive)
|
|
{
|
|
usbSetDrive(_drive, high_density, indexMode);
|
|
std::cerr << "Measuring rotational speed... " << std::flush;
|
|
_oneRevolution = usbGetRotationalPeriod();
|
|
std::cerr << fmt::format("{}ms\n", _oneRevolution / 1e6);
|
|
}
|
|
|
|
~HardwareFluxSource()
|
|
{
|
|
}
|
|
|
|
public:
|
|
std::unique_ptr<Fluxmap> readFlux(int track, int side)
|
|
{
|
|
usbSetDrive(_drive, high_density, indexMode);
|
|
usbSeek(track);
|
|
Bytes data = usbRead(side, synced, revolutions * _oneRevolution);
|
|
auto fluxmap = std::make_unique<Fluxmap>();
|
|
fluxmap->appendBytes(data);
|
|
return fluxmap;
|
|
}
|
|
|
|
void recalibrate()
|
|
{
|
|
usbRecalibrate();
|
|
}
|
|
|
|
bool retryable()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
private:
|
|
unsigned _drive;
|
|
unsigned _revolutions;
|
|
nanoseconds_t _oneRevolution;
|
|
};
|
|
|
|
void setHardwareFluxSourceRevolutions(double revolutions)
|
|
{
|
|
::revolutions.setDefaultValue(revolutions);
|
|
}
|
|
|
|
void setHardwareFluxSourceSynced(bool synced)
|
|
{
|
|
::synced.setDefaultValue(synced);
|
|
}
|
|
|
|
std::unique_ptr<FluxSource> FluxSource::createHardwareFluxSource(unsigned drive)
|
|
{
|
|
return std::unique_ptr<FluxSource>(new HardwareFluxSource(drive));
|
|
}
|
|
|
|
|
|
|