mirror of
https://github.com/davidgiven/fluxengine.git
synced 2025-10-31 11:17:01 -07:00
Add missing files...
This commit is contained in:
36
lib/fluxsource/catweasel.cc
Normal file
36
lib/fluxsource/catweasel.cc
Normal file
@@ -0,0 +1,36 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/fluxsource/catweasel.h"
|
||||
|
||||
std::unique_ptr<Fluxmap> decodeCatweaselData(
|
||||
const Bytes& bytes, nanoseconds_t clock)
|
||||
{
|
||||
std::unique_ptr<Fluxmap> fluxmap(new Fluxmap);
|
||||
uint32_t pending = 0;
|
||||
bool oldindex = true;
|
||||
const uint8_t* ptr = bytes.begin();
|
||||
while (ptr != bytes.end())
|
||||
{
|
||||
uint32_t b = *ptr++;
|
||||
bool index = !!(b & 0x80);
|
||||
b &= 0x7f;
|
||||
if (b == 0x7f)
|
||||
{
|
||||
pending += 0x7f;
|
||||
continue;
|
||||
}
|
||||
b += pending;
|
||||
pending = 0;
|
||||
|
||||
double interval_ns = b * clock;
|
||||
fluxmap->appendInterval(interval_ns / NS_PER_TICK);
|
||||
fluxmap->appendPulse();
|
||||
|
||||
if (index && !oldindex)
|
||||
fluxmap->appendIndex();
|
||||
oldindex = index;
|
||||
}
|
||||
|
||||
return fluxmap;
|
||||
}
|
||||
10
lib/fluxsource/catweasel.h
Normal file
10
lib/fluxsource/catweasel.h
Normal file
@@ -0,0 +1,10 @@
|
||||
#ifndef CATWEASEL_H
|
||||
#define CATWEASEL_H
|
||||
|
||||
class Fluxmap;
|
||||
class Bytes;
|
||||
|
||||
extern std::unique_ptr<Fluxmap> decodeCatweaselData(
|
||||
const Bytes& bytes, nanoseconds_t clock);
|
||||
|
||||
#endif
|
||||
77
lib/fluxsource/dmkfluxsource.cc
Normal file
77
lib/fluxsource/dmkfluxsource.cc
Normal file
@@ -0,0 +1,77 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/fluxsource/fluxsource.pb.h"
|
||||
#include "lib/fluxsource/fluxsource.h"
|
||||
#include "lib/fluxsource/catweasel.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/logger.h"
|
||||
#include <fstream>
|
||||
#include <filesystem>
|
||||
|
||||
class DmkFluxSourceIterator : public FluxSourceIterator
|
||||
{
|
||||
public:
|
||||
DmkFluxSourceIterator(const std::string& path, int track, int side):
|
||||
_path(path),
|
||||
_track(track),
|
||||
_side(side)
|
||||
{
|
||||
}
|
||||
|
||||
bool hasNext() const override
|
||||
{
|
||||
std::string p = getPath();
|
||||
return std::filesystem::exists(getPath());
|
||||
}
|
||||
|
||||
std::unique_ptr<const Fluxmap> next() override
|
||||
{
|
||||
std::string path = getPath();
|
||||
log("DMK: reading {}", path);
|
||||
std::ifstream ifstream(getPath(), std::ios::binary);
|
||||
if (!ifstream)
|
||||
return std::make_unique<Fluxmap>();
|
||||
_count++;
|
||||
|
||||
Bytes bytes(ifstream);
|
||||
return decodeCatweaselData(bytes, 1e9 / 7080500.0);
|
||||
}
|
||||
|
||||
private:
|
||||
const std::string getPath() const
|
||||
{
|
||||
return fmt::format(
|
||||
"{}/C_S{:01}T{:02}.{:03}", _path, _side, _track, _count);
|
||||
}
|
||||
|
||||
private:
|
||||
const std::string _path;
|
||||
const int _track;
|
||||
const int _side;
|
||||
int _count = 0;
|
||||
};
|
||||
|
||||
class DmkFluxSource : public FluxSource
|
||||
{
|
||||
public:
|
||||
DmkFluxSource(const DmkFluxSourceProto& config): _path(config.directory())
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
std::unique_ptr<FluxSourceIterator> readFlux(int track, int side) override
|
||||
{
|
||||
return std::make_unique<DmkFluxSourceIterator>(_path, track, side);
|
||||
}
|
||||
|
||||
void recalibrate() override {}
|
||||
|
||||
private:
|
||||
const std::string _path;
|
||||
};
|
||||
|
||||
std::unique_ptr<FluxSource> FluxSource::createDmkFluxSource(
|
||||
const DmkFluxSourceProto& config)
|
||||
{
|
||||
return std::unique_ptr<FluxSource>(new DmkFluxSource(config));
|
||||
}
|
||||
Reference in New Issue
Block a user